From 368f192107645a7e313b9049f4d90e0a84613118 Mon Sep 17 00:00:00 2001 From: Stonesoft Date: Thu, 31 Aug 2023 10:05:32 -0500 Subject: [PATCH] [IMP] update versions --- Dockerfile | 4 +- bin/Activate.ps1 | 247 + bin/activate | 69 + bin/activate.csh | 26 + bin/activate.fish | 69 + bin/flask | 8 + bin/mid3cp | 8 + bin/mid3iconv | 8 + bin/mid3v2 | 8 + bin/moggsplit | 8 + bin/mutagen-inspect | 8 + bin/mutagen-pony | 8 + bin/normalizer | 8 + bin/pip | 8 + bin/pip3 | 8 + bin/pip3.11 | 8 + bin/pysondb | 8 + bin/python | 1 + bin/python3 | 1 + bin/python3.11 | 1 + bin/tldextract | 8 + bin/yt-dlp | 8 + docker-compose.yml | 15 - .../APScheduler-3.10.1.dist-info/INSTALLER | 1 + .../APScheduler-3.10.1.dist-info/LICENSE.txt | 19 + .../APScheduler-3.10.1.dist-info/METADATA | 138 + .../APScheduler-3.10.1.dist-info/RECORD | 84 + .../APScheduler-3.10.1.dist-info/REQUESTED | 0 .../APScheduler-3.10.1.dist-info/WHEEL | 5 + .../entry_points.txt | 23 + .../top_level.txt | 1 + .../Brotli-1.0.9.dist-info/INSTALLER | 1 + .../Brotli-1.0.9.dist-info/LICENSE | 19 + .../Brotli-1.0.9.dist-info/METADATA | 35 + .../Brotli-1.0.9.dist-info/RECORD | 10 + .../Brotli-1.0.9.dist-info/REQUESTED | 0 .../Brotli-1.0.9.dist-info/WHEEL | 6 + .../Brotli-1.0.9.dist-info/top_level.txt | 2 + .../site-packages/Cryptodome/Cipher/AES.py | 234 + .../site-packages/Cryptodome/Cipher/AES.pyi | 154 + .../site-packages/Cryptodome/Cipher/ARC2.py | 175 + .../site-packages/Cryptodome/Cipher/ARC2.pyi | 33 + .../site-packages/Cryptodome/Cipher/ARC4.py | 136 + .../site-packages/Cryptodome/Cipher/ARC4.pyi | 14 + .../Cryptodome/Cipher/Blowfish.py | 159 + .../Cryptodome/Cipher/Blowfish.pyi | 33 + .../site-packages/Cryptodome/Cipher/CAST.py | 159 + .../site-packages/Cryptodome/Cipher/CAST.pyi | 33 + .../Cryptodome/Cipher/ChaCha20.py | 287 + .../Cryptodome/Cipher/ChaCha20.pyi | 23 + .../Cryptodome/Cipher/ChaCha20_Poly1305.py | 336 + .../Cryptodome/Cipher/ChaCha20_Poly1305.pyi | 26 + .../site-packages/Cryptodome/Cipher/DES.py | 158 + .../site-packages/Cryptodome/Cipher/DES.pyi | 33 + .../site-packages/Cryptodome/Cipher/DES3.py | 187 + .../site-packages/Cryptodome/Cipher/DES3.pyi | 35 + .../Cryptodome/Cipher/PKCS1_OAEP.py | 239 + .../Cryptodome/Cipher/PKCS1_OAEP.pyi | 35 + .../Cryptodome/Cipher/PKCS1_v1_5.py | 217 + .../Cryptodome/Cipher/PKCS1_v1_5.pyi | 20 + .../Cryptodome/Cipher/Salsa20.py | 167 + .../Cryptodome/Cipher/Salsa20.pyi | 24 + .../Cryptodome/Cipher/_ARC4.abi3.so | Bin 0 -> 21016 bytes .../Cryptodome/Cipher/_EKSBlowfish.py | 131 + .../Cryptodome/Cipher/_EKSBlowfish.pyi | 15 + .../Cryptodome/Cipher/_Salsa20.abi3.so | Bin 0 -> 27016 bytes .../Cryptodome/Cipher/__init__.py | 79 + .../Cryptodome/Cipher/__init__.pyi | 0 .../Cryptodome/Cipher/_chacha20.abi3.so | Bin 0 -> 30624 bytes .../Cryptodome/Cipher/_mode_cbc.py | 293 + .../Cryptodome/Cipher/_mode_cbc.pyi | 25 + .../Cryptodome/Cipher/_mode_ccm.py | 650 + .../Cryptodome/Cipher/_mode_ccm.pyi | 47 + .../Cryptodome/Cipher/_mode_cfb.py | 293 + .../Cryptodome/Cipher/_mode_cfb.pyi | 26 + .../Cryptodome/Cipher/_mode_ctr.py | 393 + .../Cryptodome/Cipher/_mode_ctr.pyi | 27 + .../Cryptodome/Cipher/_mode_eax.py | 408 + .../Cryptodome/Cipher/_mode_eax.pyi | 45 + .../Cryptodome/Cipher/_mode_ecb.py | 220 + .../Cryptodome/Cipher/_mode_ecb.pyi | 19 + .../Cryptodome/Cipher/_mode_gcm.py | 620 + .../Cryptodome/Cipher/_mode_gcm.pyi | 45 + .../Cryptodome/Cipher/_mode_ocb.py | 532 + .../Cryptodome/Cipher/_mode_ocb.pyi | 36 + .../Cryptodome/Cipher/_mode_ofb.py | 282 + .../Cryptodome/Cipher/_mode_ofb.pyi | 25 + .../Cryptodome/Cipher/_mode_openpgp.py | 206 + .../Cryptodome/Cipher/_mode_openpgp.pyi | 20 + .../Cryptodome/Cipher/_mode_siv.py | 392 + .../Cryptodome/Cipher/_mode_siv.pyi | 38 + .../Cryptodome/Cipher/_pkcs1_decode.abi3.so | Bin 0 -> 35688 bytes .../Cryptodome/Cipher/_raw_aes.abi3.so | Bin 0 -> 106808 bytes .../Cryptodome/Cipher/_raw_aesni.abi3.so | Bin 0 -> 106384 bytes .../Cryptodome/Cipher/_raw_arc2.abi3.so | Bin 0 -> 46464 bytes .../Cryptodome/Cipher/_raw_blowfish.abi3.so | Bin 0 -> 78640 bytes .../Cryptodome/Cipher/_raw_cast.abi3.so | Bin 0 -> 57408 bytes .../Cryptodome/Cipher/_raw_cbc.abi3.so | Bin 0 -> 23000 bytes .../Cryptodome/Cipher/_raw_cfb.abi3.so | Bin 0 -> 26864 bytes .../Cryptodome/Cipher/_raw_ctr.abi3.so | Bin 0 -> 31336 bytes .../Cryptodome/Cipher/_raw_des.abi3.so | Bin 0 -> 71560 bytes .../Cryptodome/Cipher/_raw_des3.abi3.so | Bin 0 -> 72520 bytes .../Cryptodome/Cipher/_raw_ecb.abi3.so | Bin 0 -> 19016 bytes .../Cipher/_raw_eksblowfish.abi3.so | Bin 0 -> 181192 bytes .../Cryptodome/Cipher/_raw_ocb.abi3.so | Bin 0 -> 45856 bytes .../Cryptodome/Cipher/_raw_ofb.abi3.so | Bin 0 -> 22128 bytes .../site-packages/Cryptodome/Hash/BLAKE2b.py | 247 + .../site-packages/Cryptodome/Hash/BLAKE2b.pyi | 32 + .../site-packages/Cryptodome/Hash/BLAKE2s.py | 247 + .../site-packages/Cryptodome/Hash/BLAKE2s.pyi | 26 + .../site-packages/Cryptodome/Hash/CMAC.py | 302 + .../site-packages/Cryptodome/Hash/CMAC.pyi | 30 + .../site-packages/Cryptodome/Hash/HMAC.py | 213 + .../site-packages/Cryptodome/Hash/HMAC.pyi | 25 + .../site-packages/Cryptodome/Hash/KMAC128.py | 179 + .../site-packages/Cryptodome/Hash/KMAC128.pyi | 33 + .../site-packages/Cryptodome/Hash/KMAC256.py | 74 + .../site-packages/Cryptodome/Hash/KMAC256.pyi | 10 + .../Cryptodome/Hash/KangarooTwelve.py | 262 + .../Cryptodome/Hash/KangarooTwelve.pyi | 16 + .../site-packages/Cryptodome/Hash/MD2.py | 166 + .../site-packages/Cryptodome/Hash/MD2.pyi | 19 + .../site-packages/Cryptodome/Hash/MD4.py | 185 + .../site-packages/Cryptodome/Hash/MD4.pyi | 19 + .../site-packages/Cryptodome/Hash/MD5.py | 184 + .../site-packages/Cryptodome/Hash/MD5.pyi | 19 + .../site-packages/Cryptodome/Hash/Poly1305.py | 217 + .../Cryptodome/Hash/Poly1305.pyi | 24 + .../site-packages/Cryptodome/Hash/RIPEMD.py | 26 + .../site-packages/Cryptodome/Hash/RIPEMD.pyi | 3 + .../Cryptodome/Hash/RIPEMD160.py | 169 + .../Cryptodome/Hash/RIPEMD160.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA.py | 24 + .../site-packages/Cryptodome/Hash/SHA.pyi | 4 + .../site-packages/Cryptodome/Hash/SHA1.py | 185 + .../site-packages/Cryptodome/Hash/SHA1.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA224.py | 186 + .../site-packages/Cryptodome/Hash/SHA224.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA256.py | 185 + .../site-packages/Cryptodome/Hash/SHA256.pyi | 18 + .../site-packages/Cryptodome/Hash/SHA384.py | 186 + .../site-packages/Cryptodome/Hash/SHA384.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA3_224.py | 174 + .../Cryptodome/Hash/SHA3_224.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA3_256.py | 174 + .../Cryptodome/Hash/SHA3_256.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA3_384.py | 179 + .../Cryptodome/Hash/SHA3_384.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA3_512.py | 174 + .../Cryptodome/Hash/SHA3_512.pyi | 19 + .../site-packages/Cryptodome/Hash/SHA512.py | 204 + .../site-packages/Cryptodome/Hash/SHA512.pyi | 22 + .../site-packages/Cryptodome/Hash/SHAKE128.py | 129 + .../Cryptodome/Hash/SHAKE128.pyi | 13 + .../site-packages/Cryptodome/Hash/SHAKE256.py | 130 + .../Cryptodome/Hash/SHAKE256.pyi | 13 + .../Cryptodome/Hash/TupleHash128.py | 138 + .../Cryptodome/Hash/TupleHash128.pyi | 22 + .../Cryptodome/Hash/TupleHash256.py | 73 + .../Cryptodome/Hash/TupleHash256.pyi | 5 + .../Cryptodome/Hash/_BLAKE2b.abi3.so | Bin 0 -> 27424 bytes .../Cryptodome/Hash/_BLAKE2s.abi3.so | Bin 0 -> 26952 bytes .../Cryptodome/Hash/_MD2.abi3.so | Bin 0 -> 23136 bytes .../Cryptodome/Hash/_MD4.abi3.so | Bin 0 -> 27192 bytes .../Cryptodome/Hash/_MD5.abi3.so | Bin 0 -> 32008 bytes .../Cryptodome/Hash/_RIPEMD160.abi3.so | Bin 0 -> 60728 bytes .../Cryptodome/Hash/_SHA1.abi3.so | Bin 0 -> 72064 bytes .../Cryptodome/Hash/_SHA224.abi3.so | Bin 0 -> 45768 bytes .../Cryptodome/Hash/_SHA256.abi3.so | Bin 0 -> 45832 bytes .../Cryptodome/Hash/_SHA384.abi3.so | Bin 0 -> 54160 bytes .../Cryptodome/Hash/_SHA512.abi3.so | Bin 0 -> 54200 bytes .../site-packages/Cryptodome/Hash/__init__.py | 24 + .../Cryptodome/Hash/__init__.pyi | 0 .../Cryptodome/Hash/_ghash_clmul.abi3.so | Bin 0 -> 58376 bytes .../Cryptodome/Hash/_ghash_portable.abi3.so | Bin 0 -> 25024 bytes .../Cryptodome/Hash/_keccak.abi3.so | Bin 0 -> 41632 bytes .../Cryptodome/Hash/_poly1305.abi3.so | Bin 0 -> 33424 bytes .../Cryptodome/Hash/cSHAKE128.py | 187 + .../Cryptodome/Hash/cSHAKE128.pyi | 14 + .../Cryptodome/Hash/cSHAKE256.py | 56 + .../Cryptodome/Hash/cSHAKE256.pyi | 8 + .../site-packages/Cryptodome/Hash/keccak.py | 181 + .../site-packages/Cryptodome/Hash/keccak.pyi | 23 + .../site-packages/Cryptodome/IO/PEM.py | 189 + .../site-packages/Cryptodome/IO/PEM.pyi | 10 + .../site-packages/Cryptodome/IO/PKCS8.py | 239 + .../site-packages/Cryptodome/IO/PKCS8.pyi | 14 + .../site-packages/Cryptodome/IO/_PBES.py | 435 + .../site-packages/Cryptodome/IO/_PBES.pyi | 19 + .../site-packages/Cryptodome/IO/__init__.py | 31 + .../site-packages/Cryptodome/Math/Numbers.py | 42 + .../site-packages/Cryptodome/Math/Numbers.pyi | 2 + .../Cryptodome/Math/Primality.py | 369 + .../Cryptodome/Math/Primality.pyi | 18 + .../Cryptodome/Math/_IntegerBase.py | 392 + .../Cryptodome/Math/_IntegerBase.pyi | 63 + .../Cryptodome/Math/_IntegerCustom.py | 118 + .../Cryptodome/Math/_IntegerCustom.pyi | 8 + .../Cryptodome/Math/_IntegerGMP.py | 762 + .../Cryptodome/Math/_IntegerGMP.pyi | 3 + .../Cryptodome/Math/_IntegerNative.py | 370 + .../Cryptodome/Math/_IntegerNative.pyi | 3 + .../site-packages/Cryptodome/Math/__init__.py | 0 .../Cryptodome/Math/_modexp.abi3.so | Bin 0 -> 207672 bytes .../site-packages/Cryptodome/Protocol/KDF.py | 642 + .../site-packages/Cryptodome/Protocol/KDF.pyi | 40 + .../Cryptodome/Protocol/SecretSharing.py | 278 + .../Cryptodome/Protocol/SecretSharing.pyi | 22 + .../Cryptodome/Protocol/__init__.py | 31 + .../Cryptodome/Protocol/__init__.pyi | 1 + .../Cryptodome/Protocol/_scrypt.abi3.so | Bin 0 -> 26176 bytes .../site-packages/Cryptodome/PublicKey/DSA.py | 682 + .../Cryptodome/PublicKey/DSA.pyi | 31 + .../site-packages/Cryptodome/PublicKey/ECC.py | 1800 ++ .../Cryptodome/PublicKey/ECC.pyi | 66 + .../Cryptodome/PublicKey/ElGamal.py | 286 + .../Cryptodome/PublicKey/ElGamal.pyi | 18 + .../site-packages/Cryptodome/PublicKey/RSA.py | 833 + .../Cryptodome/PublicKey/RSA.pyi | 61 + .../Cryptodome/PublicKey/__init__.py | 94 + .../Cryptodome/PublicKey/__init__.pyi | 0 .../Cryptodome/PublicKey/_ec_ws.abi3.so | Bin 0 -> 960512 bytes .../Cryptodome/PublicKey/_ed25519.abi3.so | Bin 0 -> 220504 bytes .../Cryptodome/PublicKey/_ed448.abi3.so | Bin 0 -> 250552 bytes .../Cryptodome/PublicKey/_openssh.py | 135 + .../Cryptodome/PublicKey/_openssh.pyi | 7 + .../Cryptodome/PublicKey/_x25519.abi3.so | Bin 0 -> 79432 bytes .../Cryptodome/Random/__init__.py | 57 + .../Cryptodome/Random/__init__.pyi | 19 + .../site-packages/Cryptodome/Random/random.py | 138 + .../Cryptodome/Random/random.pyi | 22 + .../Cryptodome/SelfTest/Cipher/__init__.py | 60 + .../Cryptodome/SelfTest/Cipher/common.py | 510 + .../Cryptodome/SelfTest/Cipher/test_AES.py | 1351 ++ .../Cryptodome/SelfTest/Cipher/test_ARC2.py | 167 + .../Cryptodome/SelfTest/Cipher/test_ARC4.py | 471 + .../SelfTest/Cipher/test_Blowfish.py | 160 + .../Cryptodome/SelfTest/Cipher/test_CAST.py | 101 + .../Cryptodome/SelfTest/Cipher/test_CBC.py | 556 + .../Cryptodome/SelfTest/Cipher/test_CCM.py | 936 + .../Cryptodome/SelfTest/Cipher/test_CFB.py | 411 + .../Cryptodome/SelfTest/Cipher/test_CTR.py | 472 + .../SelfTest/Cipher/test_ChaCha20.py | 529 + .../SelfTest/Cipher/test_ChaCha20_Poly1305.py | 776 + .../Cryptodome/SelfTest/Cipher/test_DES.py | 374 + .../Cryptodome/SelfTest/Cipher/test_DES3.py | 195 + .../Cryptodome/SelfTest/Cipher/test_EAX.py | 773 + .../Cryptodome/SelfTest/Cipher/test_GCM.py | 951 + .../Cryptodome/SelfTest/Cipher/test_OCB.py | 845 + .../Cryptodome/SelfTest/Cipher/test_OFB.py | 238 + .../SelfTest/Cipher/test_OpenPGP.py | 218 + .../Cryptodome/SelfTest/Cipher/test_SIV.py | 552 + .../SelfTest/Cipher/test_Salsa20.py | 367 + .../SelfTest/Cipher/test_pkcs1_15.py | 283 + .../SelfTest/Cipher/test_pkcs1_oaep.py | 506 + .../Cryptodome/SelfTest/Hash/__init__.py | 61 + .../Cryptodome/SelfTest/Hash/common.py | 290 + .../Cryptodome/SelfTest/Hash/test_BLAKE2.py | 482 + .../Cryptodome/SelfTest/Hash/test_CMAC.py | 448 + .../Cryptodome/SelfTest/Hash/test_HMAC.py | 548 + .../Cryptodome/SelfTest/Hash/test_KMAC.py | 346 + .../SelfTest/Hash/test_KangarooTwelve.py | 324 + .../Cryptodome/SelfTest/Hash/test_MD2.py | 62 + .../Cryptodome/SelfTest/Hash/test_MD4.py | 64 + .../Cryptodome/SelfTest/Hash/test_MD5.py | 94 + .../Cryptodome/SelfTest/Hash/test_Poly1305.py | 542 + .../SelfTest/Hash/test_RIPEMD160.py | 71 + .../Cryptodome/SelfTest/Hash/test_SHA1.py | 84 + .../Cryptodome/SelfTest/Hash/test_SHA224.py | 63 + .../Cryptodome/SelfTest/Hash/test_SHA256.py | 94 + .../Cryptodome/SelfTest/Hash/test_SHA384.py | 61 + .../Cryptodome/SelfTest/Hash/test_SHA3_224.py | 79 + .../Cryptodome/SelfTest/Hash/test_SHA3_256.py | 80 + .../Cryptodome/SelfTest/Hash/test_SHA3_384.py | 79 + .../Cryptodome/SelfTest/Hash/test_SHA3_512.py | 79 + .../Cryptodome/SelfTest/Hash/test_SHA512.py | 140 + .../Cryptodome/SelfTest/Hash/test_SHAKE.py | 143 + .../SelfTest/Hash/test_TupleHash.py | 286 + .../Cryptodome/SelfTest/Hash/test_cSHAKE.py | 178 + .../Cryptodome/SelfTest/Hash/test_keccak.py | 250 + .../Cryptodome/SelfTest/IO/__init__.py | 47 + .../Cryptodome/SelfTest/IO/test_PBES.py | 93 + .../Cryptodome/SelfTest/IO/test_PKCS8.py | 425 + .../Cryptodome/SelfTest/Math/__init__.py | 49 + .../Cryptodome/SelfTest/Math/test_Numbers.py | 797 + .../SelfTest/Math/test_Primality.py | 118 + .../Cryptodome/SelfTest/Math/test_modexp.py | 201 + .../Cryptodome/SelfTest/Protocol/__init__.py | 44 + .../Cryptodome/SelfTest/Protocol/test_KDF.py | 807 + .../SelfTest/Protocol/test_SecretSharing.py | 267 + .../SelfTest/Protocol/test_rfc1751.py | 62 + .../Cryptodome/SelfTest/PublicKey/__init__.py | 53 + .../Cryptodome/SelfTest/PublicKey/test_DSA.py | 247 + .../SelfTest/PublicKey/test_ECC_25519.py | 333 + .../SelfTest/PublicKey/test_ECC_448.py | 333 + .../SelfTest/PublicKey/test_ECC_NIST.py | 1425 ++ .../SelfTest/PublicKey/test_ElGamal.py | 217 + .../Cryptodome/SelfTest/PublicKey/test_RSA.py | 320 + .../SelfTest/PublicKey/test_import_DSA.py | 554 + .../SelfTest/PublicKey/test_import_ECC.py | 2653 +++ .../SelfTest/PublicKey/test_import_RSA.py | 590 + .../Cryptodome/SelfTest/Random/__init__.py | 39 + .../Cryptodome/SelfTest/Random/test_random.py | 167 + .../Cryptodome/SelfTest/Signature/__init__.py | 41 + .../Cryptodome/SelfTest/Signature/test_dss.py | 1369 ++ .../SelfTest/Signature/test_eddsa.py | 578 + .../SelfTest/Signature/test_pkcs1_15.py | 348 + .../Cryptodome/SelfTest/Signature/test_pss.py | 377 + .../Cryptodome/SelfTest/Util/__init__.py | 46 + .../Cryptodome/SelfTest/Util/test_Counter.py | 67 + .../Cryptodome/SelfTest/Util/test_Padding.py | 154 + .../Cryptodome/SelfTest/Util/test_asn1.py | 851 + .../Cryptodome/SelfTest/Util/test_number.py | 192 + .../Cryptodome/SelfTest/Util/test_rfc1751.py | 38 + .../Cryptodome/SelfTest/Util/test_strxor.py | 280 + .../Cryptodome/SelfTest/__init__.py | 97 + .../Cryptodome/SelfTest/__main__.py | 38 + .../Cryptodome/SelfTest/loader.py | 235 + .../Cryptodome/SelfTest/st_common.py | 55 + .../site-packages/Cryptodome/Signature/DSS.py | 403 + .../Cryptodome/Signature/DSS.pyi | 27 + .../Cryptodome/Signature/PKCS1_PSS.py | 55 + .../Cryptodome/Signature/PKCS1_PSS.pyi | 28 + .../Cryptodome/Signature/PKCS1_v1_5.py | 53 + .../Cryptodome/Signature/PKCS1_v1_5.pyi | 16 + .../Cryptodome/Signature/__init__.py | 36 + .../Cryptodome/Signature/eddsa.py | 343 + .../Cryptodome/Signature/eddsa.pyi | 21 + .../Cryptodome/Signature/pkcs1_15.py | 222 + .../Cryptodome/Signature/pkcs1_15.pyi | 17 + .../site-packages/Cryptodome/Signature/pss.py | 386 + .../Cryptodome/Signature/pss.pyi | 30 + .../site-packages/Cryptodome/Util/Counter.py | 77 + .../site-packages/Cryptodome/Util/Counter.pyi | 5 + .../site-packages/Cryptodome/Util/Padding.py | 108 + .../site-packages/Cryptodome/Util/Padding.pyi | 6 + .../site-packages/Cryptodome/Util/RFC1751.py | 386 + .../site-packages/Cryptodome/Util/RFC1751.pyi | 7 + .../site-packages/Cryptodome/Util/__init__.py | 41 + .../Cryptodome/Util/_cpu_features.py | 46 + .../Cryptodome/Util/_cpu_features.pyi | 2 + .../Cryptodome/Util/_cpuid_c.abi3.so | Bin 0 -> 19304 bytes .../Cryptodome/Util/_file_system.py | 54 + .../Cryptodome/Util/_file_system.pyi | 4 + .../site-packages/Cryptodome/Util/_raw_api.py | 319 + .../Cryptodome/Util/_raw_api.pyi | 27 + .../Cryptodome/Util/_strxor.abi3.so | Bin 0 -> 20376 bytes .../site-packages/Cryptodome/Util/asn1.py | 1064 ++ .../site-packages/Cryptodome/Util/asn1.pyi | 80 + .../site-packages/Cryptodome/Util/number.py | 1525 ++ .../site-packages/Cryptodome/Util/number.pyi | 19 + .../Cryptodome/Util/py3compat.py | 174 + .../Cryptodome/Util/py3compat.pyi | 33 + .../site-packages/Cryptodome/Util/strxor.py | 146 + .../site-packages/Cryptodome/Util/strxor.pyi | 6 + .../site-packages/Cryptodome/__init__.py | 6 + .../site-packages/Cryptodome/__init__.pyi | 4 + .../site-packages/Cryptodome/py.typed | 0 .../Flask-2.2.5.dist-info/INSTALLER | 1 + .../Flask-2.2.5.dist-info/LICENSE.rst | 28 + .../Flask-2.2.5.dist-info/METADATA | 123 + .../Flask-2.2.5.dist-info/RECORD | 54 + .../Flask-2.2.5.dist-info/REQUESTED | 0 .../site-packages/Flask-2.2.5.dist-info/WHEEL | 5 + .../Flask-2.2.5.dist-info/entry_points.txt | 2 + .../Flask-2.2.5.dist-info/top_level.txt | 1 + .../Jinja2-3.1.2.dist-info/INSTALLER | 1 + .../Jinja2-3.1.2.dist-info/LICENSE.rst | 28 + .../Jinja2-3.1.2.dist-info/METADATA | 113 + .../Jinja2-3.1.2.dist-info/RECORD | 59 + .../Jinja2-3.1.2.dist-info/REQUESTED | 0 .../Jinja2-3.1.2.dist-info/WHEEL | 5 + .../Jinja2-3.1.2.dist-info/entry_points.txt | 2 + .../Jinja2-3.1.2.dist-info/top_level.txt | 1 + .../MarkupSafe-2.1.3.dist-info/INSTALLER | 1 + .../MarkupSafe-2.1.3.dist-info/LICENSE.rst | 28 + .../MarkupSafe-2.1.3.dist-info/METADATA | 93 + .../MarkupSafe-2.1.3.dist-info/RECORD | 15 + .../MarkupSafe-2.1.3.dist-info/REQUESTED | 0 .../MarkupSafe-2.1.3.dist-info/WHEEL | 6 + .../MarkupSafe-2.1.3.dist-info/top_level.txt | 1 + .../Werkzeug-2.2.3.dist-info/INSTALLER | 1 + .../Werkzeug-2.2.3.dist-info/LICENSE.rst | 28 + .../Werkzeug-2.2.3.dist-info/METADATA | 126 + .../Werkzeug-2.2.3.dist-info/RECORD | 99 + .../Werkzeug-2.2.3.dist-info/REQUESTED | 0 .../Werkzeug-2.2.3.dist-info/WHEEL | 5 + .../Werkzeug-2.2.3.dist-info/top_level.txt | 1 + .../_brotli.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 6625080 bytes .../site-packages/_distutils_hack/__init__.py | 222 + .../site-packages/_distutils_hack/override.py | 1 + .../site-packages/apscheduler/__init__.py | 10 + .../site-packages/apscheduler/events.py | 94 + .../apscheduler/executors/__init__.py | 0 .../apscheduler/executors/asyncio.py | 52 + .../apscheduler/executors/base.py | 146 + .../apscheduler/executors/base_py3.py | 43 + .../apscheduler/executors/debug.py | 20 + .../apscheduler/executors/gevent.py | 30 + .../apscheduler/executors/pool.py | 71 + .../apscheduler/executors/tornado.py | 54 + .../apscheduler/executors/twisted.py | 25 + .../site-packages/apscheduler/job.py | 302 + .../apscheduler/jobstores/__init__.py | 0 .../apscheduler/jobstores/base.py | 143 + .../apscheduler/jobstores/memory.py | 108 + .../apscheduler/jobstores/mongodb.py | 141 + .../apscheduler/jobstores/redis.py | 150 + .../apscheduler/jobstores/rethinkdb.py | 155 + .../apscheduler/jobstores/sqlalchemy.py | 161 + .../apscheduler/jobstores/zookeeper.py | 178 + .../apscheduler/schedulers/__init__.py | 12 + .../apscheduler/schedulers/asyncio.py | 66 + .../apscheduler/schedulers/background.py | 43 + .../apscheduler/schedulers/base.py | 1026 ++ .../apscheduler/schedulers/blocking.py | 35 + .../apscheduler/schedulers/gevent.py | 35 + .../apscheduler/schedulers/qt.py | 50 + .../apscheduler/schedulers/tornado.py | 63 + .../apscheduler/schedulers/twisted.py | 62 + .../apscheduler/triggers/__init__.py | 0 .../apscheduler/triggers/base.py | 37 + .../apscheduler/triggers/combining.py | 95 + .../apscheduler/triggers/cron/__init__.py | 239 + .../apscheduler/triggers/cron/expressions.py | 251 + .../apscheduler/triggers/cron/fields.py | 111 + .../apscheduler/triggers/date.py | 51 + .../apscheduler/triggers/interval.py | 108 + .../site-packages/apscheduler/util.py | 430 + .../async_timeout-4.0.2.dist-info/INSTALLER | 1 + .../async_timeout-4.0.2.dist-info/LICENSE | 13 + .../async_timeout-4.0.2.dist-info/METADATA | 133 + .../async_timeout-4.0.2.dist-info/RECORD | 11 + .../async_timeout-4.0.2.dist-info/REQUESTED | 0 .../async_timeout-4.0.2.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../async_timeout-4.0.2.dist-info/zip-safe | 1 + .../site-packages/async_timeout/__init__.py | 247 + .../site-packages/async_timeout/py.typed | 1 + .../beautifulsoup4-4.12.2.dist-info/INSTALLER | 1 + .../beautifulsoup4-4.12.2.dist-info/METADATA | 116 + .../beautifulsoup4-4.12.2.dist-info/RECORD | 72 + .../beautifulsoup4-4.12.2.dist-info/REQUESTED | 0 .../beautifulsoup4-4.12.2.dist-info/WHEEL | 4 + .../licenses/AUTHORS | 49 + .../licenses/LICENSE | 31 + lib/python3.11/site-packages/brotli.py | 56 + .../bs4-0.0.1-py3.11.egg-info/PKG-INFO | 21 + .../bs4-0.0.1-py3.11.egg-info/SOURCES.txt | 7 + .../dependency_links.txt | 1 + .../installed-files.txt | 5 + .../bs4-0.0.1-py3.11.egg-info/requires.txt | 1 + .../bs4-0.0.1-py3.11.egg-info/top_level.txt | 1 + lib/python3.11/site-packages/bs4/__init__.py | 840 + .../site-packages/bs4/builder/__init__.py | 631 + .../site-packages/bs4/builder/_html5lib.py | 479 + .../site-packages/bs4/builder/_htmlparser.py | 387 + .../site-packages/bs4/builder/_lxml.py | 386 + lib/python3.11/site-packages/bs4/css.py | 280 + lib/python3.11/site-packages/bs4/dammit.py | 1095 ++ lib/python3.11/site-packages/bs4/diagnose.py | 233 + lib/python3.11/site-packages/bs4/element.py | 2430 +++ lib/python3.11/site-packages/bs4/formatter.py | 185 + .../site-packages/bs4/tests/__init__.py | 1177 ++ ...mized-bs4_fuzzer-4818336571064320.testcase | 1 + ...mized-bs4_fuzzer-4999465949331456.testcase | 1 + ...mized-bs4_fuzzer-5167584867909632.testcase | Bin 0 -> 19469 bytes ...mized-bs4_fuzzer-5703933063462912.testcase | 2 + ...mized-bs4_fuzzer-5843991618256896.testcase | 1 + ...mized-bs4_fuzzer-5984173902397440.testcase | Bin 0 -> 51495 bytes ...mized-bs4_fuzzer-6124268085182464.testcase | 1 + ...mized-bs4_fuzzer-6241471367348224.testcase | 1 + ...mized-bs4_fuzzer-6450958476902400.testcase | Bin 0 -> 3546 bytes ...mized-bs4_fuzzer-6600557255327744.testcase | Bin 0 -> 124 bytes ...0c8ed8bcd0785b67000fcd5dea1d33f08.testcase | Bin 0 -> 2607 bytes .../site-packages/bs4/tests/test_builder.py | 29 + .../bs4/tests/test_builder_registry.py | 137 + .../site-packages/bs4/tests/test_css.py | 487 + .../site-packages/bs4/tests/test_dammit.py | 370 + .../site-packages/bs4/tests/test_docs.py | 38 + .../site-packages/bs4/tests/test_element.py | 74 + .../site-packages/bs4/tests/test_formatter.py | 113 + .../site-packages/bs4/tests/test_fuzz.py | 91 + .../site-packages/bs4/tests/test_html5lib.py | 224 + .../bs4/tests/test_htmlparser.py | 148 + .../site-packages/bs4/tests/test_lxml.py | 203 + .../bs4/tests/test_navigablestring.py | 144 + .../bs4/tests/test_pageelement.py | 378 + .../site-packages/bs4/tests/test_soup.py | 504 + .../site-packages/bs4/tests/test_tag.py | 221 + .../site-packages/bs4/tests/test_tree.py | 1304 ++ .../certifi-2023.5.7.dist-info/INSTALLER | 1 + .../certifi-2023.5.7.dist-info/LICENSE | 21 + .../certifi-2023.5.7.dist-info/METADATA | 69 + .../certifi-2023.5.7.dist-info/RECORD | 15 + .../certifi-2023.5.7.dist-info/REQUESTED | 0 .../certifi-2023.5.7.dist-info/WHEEL | 5 + .../certifi-2023.5.7.dist-info/top_level.txt | 1 + .../site-packages/certifi/__init__.py | 4 + .../site-packages/certifi/__main__.py | 12 + .../site-packages/certifi/cacert.pem | 4589 +++++ lib/python3.11/site-packages/certifi/core.py | 108 + lib/python3.11/site-packages/certifi/py.typed | 0 .../INSTALLER | 1 + .../LICENSE | 21 + .../METADATA | 616 + .../charset_normalizer-3.1.0.dist-info/RECORD | 36 + .../REQUESTED | 0 .../charset_normalizer-3.1.0.dist-info/WHEEL | 6 + .../entry_points.txt | 2 + .../top_level.txt | 1 + .../charset_normalizer/__init__.py | 45 + .../site-packages/charset_normalizer/api.py | 554 + .../charset_normalizer/assets/__init__.py | 1440 ++ .../site-packages/charset_normalizer/cd.py | 390 + .../charset_normalizer/cli/__init__.py | 0 .../charset_normalizer/cli/normalizer.py | 296 + .../charset_normalizer/constant.py | 495 + .../charset_normalizer/legacy.py | 54 + .../md.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 17496 bytes .../site-packages/charset_normalizer/md.py | 571 + .../md__mypyc.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 416920 bytes .../charset_normalizer/models.py | 337 + .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 414 + .../charset_normalizer/version.py | 6 + .../click-8.1.3.dist-info/INSTALLER | 1 + .../click-8.1.3.dist-info/LICENSE.rst | 28 + .../click-8.1.3.dist-info/METADATA | 111 + .../click-8.1.3.dist-info/RECORD | 40 + .../click-8.1.3.dist-info/REQUESTED | 0 .../site-packages/click-8.1.3.dist-info/WHEEL | 5 + .../click-8.1.3.dist-info/top_level.txt | 1 + .../site-packages/click/__init__.py | 73 + lib/python3.11/site-packages/click/_compat.py | 626 + .../site-packages/click/_termui_impl.py | 717 + .../site-packages/click/_textwrap.py | 49 + .../site-packages/click/_winconsole.py | 279 + lib/python3.11/site-packages/click/core.py | 2998 ++++ .../site-packages/click/decorators.py | 497 + .../site-packages/click/exceptions.py | 287 + .../site-packages/click/formatting.py | 301 + lib/python3.11/site-packages/click/globals.py | 68 + lib/python3.11/site-packages/click/parser.py | 529 + lib/python3.11/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 580 + lib/python3.11/site-packages/click/termui.py | 787 + lib/python3.11/site-packages/click/testing.py | 479 + lib/python3.11/site-packages/click/types.py | 1073 ++ lib/python3.11/site-packages/click/utils.py | 580 + .../site-packages/distutils-precedence.pth | 1 + .../filelock-3.12.2.dist-info/INSTALLER | 1 + .../filelock-3.12.2.dist-info/METADATA | 55 + .../filelock-3.12.2.dist-info/RECORD | 23 + .../filelock-3.12.2.dist-info/REQUESTED | 0 .../filelock-3.12.2.dist-info/WHEEL | 4 + .../licenses/LICENSE | 24 + .../site-packages/filelock/__init__.py | 51 + lib/python3.11/site-packages/filelock/_api.py | 281 + .../site-packages/filelock/_error.py | 30 + .../site-packages/filelock/_soft.py | 46 + .../site-packages/filelock/_unix.py | 63 + .../site-packages/filelock/_util.py | 37 + .../site-packages/filelock/_windows.py | 64 + .../site-packages/filelock/py.typed | 0 .../site-packages/filelock/version.py | 4 + .../site-packages/flask/__init__.py | 71 + .../site-packages/flask/__main__.py | 3 + lib/python3.11/site-packages/flask/app.py | 2552 +++ .../site-packages/flask/blueprints.py | 712 + lib/python3.11/site-packages/flask/cli.py | 1054 ++ lib/python3.11/site-packages/flask/config.py | 338 + lib/python3.11/site-packages/flask/ctx.py | 438 + .../site-packages/flask/debughelpers.py | 158 + lib/python3.11/site-packages/flask/globals.py | 107 + lib/python3.11/site-packages/flask/helpers.py | 705 + .../site-packages/flask/json/__init__.py | 342 + .../site-packages/flask/json/provider.py | 310 + .../site-packages/flask/json/tag.py | 312 + lib/python3.11/site-packages/flask/logging.py | 74 + lib/python3.11/site-packages/flask/py.typed | 0 .../site-packages/flask/scaffold.py | 936 + .../site-packages/flask/sessions.py | 421 + lib/python3.11/site-packages/flask/signals.py | 56 + .../site-packages/flask/templating.py | 212 + lib/python3.11/site-packages/flask/testing.py | 301 + lib/python3.11/site-packages/flask/typing.py | 80 + lib/python3.11/site-packages/flask/views.py | 188 + .../site-packages/flask/wrappers.py | 171 + .../idna-3.4.dist-info/INSTALLER | 1 + .../idna-3.4.dist-info/LICENSE.md | 29 + .../site-packages/idna-3.4.dist-info/METADATA | 242 + .../site-packages/idna-3.4.dist-info/RECORD | 23 + .../idna-3.4.dist-info/REQUESTED | 0 .../site-packages/idna-3.4.dist-info/WHEEL | 4 + lib/python3.11/site-packages/idna/__init__.py | 44 + lib/python3.11/site-packages/idna/codec.py | 112 + lib/python3.11/site-packages/idna/compat.py | 13 + lib/python3.11/site-packages/idna/core.py | 400 + lib/python3.11/site-packages/idna/idnadata.py | 2151 +++ .../site-packages/idna/intranges.py | 54 + .../site-packages/idna/package_data.py | 2 + lib/python3.11/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 8600 +++++++++ .../INSTALLER | 1 + .../LICENSE | 202 + .../METADATA | 135 + .../importlib_metadata-6.6.0.dist-info/RECORD | 26 + .../REQUESTED | 0 .../importlib_metadata-6.6.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../importlib_metadata/__init__.py | 987 + .../importlib_metadata/_adapters.py | 90 + .../importlib_metadata/_collections.py | 30 + .../importlib_metadata/_compat.py | 82 + .../importlib_metadata/_functools.py | 104 + .../importlib_metadata/_itertools.py | 73 + .../site-packages/importlib_metadata/_meta.py | 63 + .../importlib_metadata/_py39compat.py | 35 + .../site-packages/importlib_metadata/_text.py | 99 + .../site-packages/importlib_metadata/py.typed | 0 .../itsdangerous-2.1.2.dist-info/INSTALLER | 1 + .../itsdangerous-2.1.2.dist-info/LICENSE.rst | 28 + .../itsdangerous-2.1.2.dist-info/METADATA | 97 + .../itsdangerous-2.1.2.dist-info/RECORD | 24 + .../itsdangerous-2.1.2.dist-info/REQUESTED | 0 .../itsdangerous-2.1.2.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/itsdangerous/__init__.py | 19 + .../site-packages/itsdangerous/_json.py | 16 + .../site-packages/itsdangerous/encoding.py | 54 + .../site-packages/itsdangerous/exc.py | 107 + .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 295 + .../site-packages/itsdangerous/signer.py | 257 + .../site-packages/itsdangerous/timed.py | 234 + .../site-packages/itsdangerous/url_safe.py | 80 + .../site-packages/jinja2/__init__.py | 37 + .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/async_utils.py | 84 + .../site-packages/jinja2/bccache.py | 406 + .../site-packages/jinja2/compiler.py | 1957 ++ .../site-packages/jinja2/constants.py | 20 + lib/python3.11/site-packages/jinja2/debug.py | 191 + .../site-packages/jinja2/defaults.py | 48 + .../site-packages/jinja2/environment.py | 1667 ++ .../site-packages/jinja2/exceptions.py | 166 + lib/python3.11/site-packages/jinja2/ext.py | 859 + .../site-packages/jinja2/filters.py | 1840 ++ .../site-packages/jinja2/idtracking.py | 318 + lib/python3.11/site-packages/jinja2/lexer.py | 866 + .../site-packages/jinja2/loaders.py | 661 + lib/python3.11/site-packages/jinja2/meta.py | 111 + .../site-packages/jinja2/nativetypes.py | 130 + lib/python3.11/site-packages/jinja2/nodes.py | 1204 ++ .../site-packages/jinja2/optimizer.py | 47 + lib/python3.11/site-packages/jinja2/parser.py | 1032 ++ lib/python3.11/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1053 ++ .../site-packages/jinja2/sandbox.py | 428 + lib/python3.11/site-packages/jinja2/tests.py | 255 + lib/python3.11/site-packages/jinja2/utils.py | 755 + .../site-packages/jinja2/visitor.py | 92 + .../site-packages/markupsafe/__init__.py | 304 + .../site-packages/markupsafe/_native.py | 63 + .../site-packages/markupsafe/_speedups.c | 320 + .../_speedups.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 53656 bytes .../site-packages/markupsafe/_speedups.pyi | 9 + .../site-packages/markupsafe/py.typed | 0 .../mutagen-1.46.0.dist-info/COPYING | 339 + .../mutagen-1.46.0.dist-info/INSTALLER | 1 + .../mutagen-1.46.0.dist-info/METADATA | 43 + .../mutagen-1.46.0.dist-info/RECORD | 135 + .../mutagen-1.46.0.dist-info/REQUESTED | 0 .../mutagen-1.46.0.dist-info/WHEEL | 5 + .../mutagen-1.46.0.dist-info/entry_points.txt | 8 + .../mutagen-1.46.0.dist-info/top_level.txt | 1 + .../site-packages/mutagen/__init__.py | 43 + .../site-packages/mutagen/_constants.py | 203 + lib/python3.11/site-packages/mutagen/_file.py | 302 + lib/python3.11/site-packages/mutagen/_iff.py | 386 + lib/python3.11/site-packages/mutagen/_riff.py | 69 + lib/python3.11/site-packages/mutagen/_tags.py | 145 + .../site-packages/mutagen/_tools/__init__.py | 6 + .../site-packages/mutagen/_tools/_util.py | 89 + .../site-packages/mutagen/_tools/mid3cp.py | 134 + .../site-packages/mutagen/_tools/mid3iconv.py | 168 + .../site-packages/mutagen/_tools/mid3v2.py | 484 + .../site-packages/mutagen/_tools/moggsplit.py | 74 + .../mutagen/_tools/mutagen_inspect.py | 43 + .../mutagen/_tools/mutagen_pony.py | 113 + lib/python3.11/site-packages/mutagen/_util.py | 1040 ++ .../site-packages/mutagen/_vorbis.py | 307 + lib/python3.11/site-packages/mutagen/aac.py | 423 + lib/python3.11/site-packages/mutagen/ac3.py | 329 + lib/python3.11/site-packages/mutagen/aiff.py | 244 + lib/python3.11/site-packages/mutagen/apev2.py | 725 + .../site-packages/mutagen/asf/__init__.py | 331 + .../site-packages/mutagen/asf/_attrs.py | 428 + .../site-packages/mutagen/asf/_objects.py | 468 + .../site-packages/mutagen/asf/_util.py | 315 + .../site-packages/mutagen/dsdiff.py | 266 + lib/python3.11/site-packages/mutagen/dsf.py | 357 + .../site-packages/mutagen/easyid3.py | 558 + .../site-packages/mutagen/easymp4.py | 287 + lib/python3.11/site-packages/mutagen/flac.py | 941 + .../site-packages/mutagen/id3/__init__.py | 95 + .../site-packages/mutagen/id3/_file.py | 420 + .../site-packages/mutagen/id3/_frames.py | 2139 +++ .../site-packages/mutagen/id3/_id3v1.py | 217 + .../site-packages/mutagen/id3/_specs.py | 889 + .../site-packages/mutagen/id3/_tags.py | 629 + .../site-packages/mutagen/id3/_util.py | 170 + lib/python3.11/site-packages/mutagen/m4a.py | 102 + .../site-packages/mutagen/monkeysaudio.py | 100 + .../site-packages/mutagen/mp3/__init__.py | 481 + .../site-packages/mutagen/mp3/_util.py | 526 + .../site-packages/mutagen/mp4/__init__.py | 1272 ++ .../site-packages/mutagen/mp4/_as_entry.py | 546 + .../site-packages/mutagen/mp4/_atom.py | 191 + .../site-packages/mutagen/mp4/_util.py | 21 + .../site-packages/mutagen/musepack.py | 292 + lib/python3.11/site-packages/mutagen/ogg.py | 593 + .../site-packages/mutagen/oggflac.py | 181 + .../site-packages/mutagen/oggopus.py | 183 + .../site-packages/mutagen/oggspeex.py | 175 + .../site-packages/mutagen/oggtheora.py | 181 + .../site-packages/mutagen/oggvorbis.py | 193 + .../site-packages/mutagen/optimfrog.py | 107 + lib/python3.11/site-packages/mutagen/py.typed | 0 lib/python3.11/site-packages/mutagen/smf.py | 214 + lib/python3.11/site-packages/mutagen/tak.py | 237 + .../site-packages/mutagen/trueaudio.py | 100 + lib/python3.11/site-packages/mutagen/wave.py | 209 + .../site-packages/mutagen/wavpack.py | 140 + .../pip-22.3.1.dist-info/INSTALLER | 1 + .../pip-22.3.1.dist-info/LICENSE.txt | 20 + .../pip-22.3.1.dist-info/METADATA | 88 + .../site-packages/pip-22.3.1.dist-info/RECORD | 985 + .../pip-22.3.1.dist-info/REQUESTED | 0 .../site-packages/pip-22.3.1.dist-info/WHEEL | 5 + .../pip-22.3.1.dist-info/entry_points.txt | 4 + .../pip-22.3.1.dist-info/top_level.txt | 1 + lib/python3.11/site-packages/pip/__init__.py | 13 + lib/python3.11/site-packages/pip/__main__.py | 31 + .../site-packages/pip/__pip-runner__.py | 50 + .../site-packages/pip/_internal/__init__.py | 19 + .../site-packages/pip/_internal/build_env.py | 310 + .../site-packages/pip/_internal/cache.py | 293 + .../pip/_internal/cli/__init__.py | 4 + .../pip/_internal/cli/autocompletion.py | 171 + .../pip/_internal/cli/base_command.py | 216 + .../pip/_internal/cli/cmdoptions.py | 1055 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 70 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 502 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../pip/_internal/commands/cache.py | 223 + .../pip/_internal/commands/check.py | 53 + .../pip/_internal/commands/completion.py | 126 + .../pip/_internal/commands/configuration.py | 282 + .../pip/_internal/commands/debug.py | 199 + .../pip/_internal/commands/download.py | 149 + .../pip/_internal/commands/freeze.py | 97 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 138 + .../pip/_internal/commands/inspect.py | 97 + .../pip/_internal/commands/install.py | 860 + .../pip/_internal/commands/list.py | 365 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 183 + .../pip/_internal/commands/uninstall.py | 106 + .../pip/_internal/commands/wheel.py | 203 + .../pip/_internal/configuration.py | 374 + .../pip/_internal/distributions/__init__.py | 21 + .../pip/_internal/distributions/base.py | 39 + .../pip/_internal/distributions/installed.py | 23 + .../pip/_internal/distributions/sdist.py | 150 + .../pip/_internal/distributions/wheel.py | 34 + .../site-packages/pip/_internal/exceptions.py | 660 + .../pip/_internal/index/__init__.py | 2 + .../pip/_internal/index/collector.py | 505 + .../pip/_internal/index/package_finder.py | 1025 ++ .../pip/_internal/index/sources.py | 224 + .../pip/_internal/locations/__init__.py | 528 + .../pip/_internal/locations/_distutils.py | 180 + .../pip/_internal/locations/_sysconfig.py | 218 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 127 + .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 698 + .../_internal/metadata/importlib/__init__.py | 4 + .../_internal/metadata/importlib/_compat.py | 55 + .../_internal/metadata/importlib/_dists.py | 224 + .../pip/_internal/metadata/importlib/_envs.py | 188 + .../pip/_internal/metadata/pkg_resources.py | 270 + .../pip/_internal/models/__init__.py | 2 + .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 212 + .../pip/_internal/models/format_control.py | 80 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 53 + .../pip/_internal/models/link.py | 507 + .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 133 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../pip/_internal/network/auth.py | 323 + .../pip/_internal/network/cache.py | 69 + .../pip/_internal/network/download.py | 186 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 518 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 60 + .../pip/_internal/operations/__init__.py | 0 .../_internal/operations/build/__init__.py | 0 .../operations/build/build_tracker.py | 124 + .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 149 + .../pip/_internal/operations/freeze.py | 254 + .../_internal/operations/install/__init__.py | 2 + .../operations/install/editable_legacy.py | 47 + .../_internal/operations/install/legacy.py | 120 + .../pip/_internal/operations/install/wheel.py | 738 + .../pip/_internal/operations/prepare.py | 667 + .../site-packages/pip/_internal/pyproject.py | 175 + .../pip/_internal/req/__init__.py | 94 + .../pip/_internal/req/constructors.py | 501 + .../pip/_internal/req/req_file.py | 544 + .../pip/_internal/req/req_install.py | 942 + .../pip/_internal/req/req_set.py | 82 + .../pip/_internal/req/req_uninstall.py | 640 + .../pip/_internal/resolution/__init__.py | 0 .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../_internal/resolution/legacy/resolver.py | 602 + .../resolution/resolvelib/__init__.py | 0 .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 556 + .../resolution/resolvelib/factory.py | 743 + .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 248 + .../resolution/resolvelib/reporter.py | 68 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 296 + .../pip/_internal/self_outdated_check.py | 239 + .../pip/_internal/utils/__init__.py | 0 .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 188 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/distutils_args.py | 43 + .../pip/_internal/utils/egg_link.py | 75 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 85 + .../pip/_internal/utils/filesystem.py | 153 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 144 + .../_internal/utils/inject_securetransport.py | 35 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 723 + .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 195 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 246 + .../pip/_internal/utils/unpacking.py | 257 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 136 + .../pip/_internal/vcs/__init__.py | 15 + .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 + .../pip/_internal/wheel_builder.py | 382 + .../site-packages/pip/_vendor/__init__.py | 120 + .../pip/_vendor/cachecontrol/__init__.py | 18 + .../pip/_vendor/cachecontrol/_cmd.py | 61 + .../pip/_vendor/cachecontrol/adapter.py | 137 + .../pip/_vendor/cachecontrol/cache.py | 65 + .../_vendor/cachecontrol/caches/__init__.py | 9 + .../_vendor/cachecontrol/caches/file_cache.py | 188 + .../cachecontrol/caches/redis_cache.py | 39 + .../pip/_vendor/cachecontrol/compat.py | 32 + .../pip/_vendor/cachecontrol/controller.py | 439 + .../pip/_vendor/cachecontrol/filewrapper.py | 111 + .../pip/_vendor/cachecontrol/heuristics.py | 139 + .../pip/_vendor/cachecontrol/serialize.py | 190 + .../pip/_vendor/cachecontrol/wrapper.py | 33 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../site-packages/pip/_vendor/certifi/core.py | 15 + .../pip/_vendor/chardet/__init__.py | 93 + .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 259 + .../pip/_vendor/chardet/charsetgroupprober.py | 109 + .../pip/_vendor/chardet/charsetprober.py | 138 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../pip/_vendor/chardet/cli/chardetect.py | 86 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 82 + .../pip/_vendor/chardet/escprober.py | 102 + .../pip/_vendor/chardet/escsm.py | 260 + .../pip/_vendor/chardet/eucjpprober.py | 95 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 47 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 47 + .../pip/_vendor/chardet/hebrewprober.py | 302 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 +++ .../pip/_vendor/chardet/johabprober.py | 47 + .../pip/_vendor/chardet/jpcntx.py | 237 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 +++++ .../pip/_vendor/chardet/langgreekmodel.py | 4397 +++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 +++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 +++++ .../pip/_vendor/chardet/langrussianmodel.py | 5725 ++++++ .../pip/_vendor/chardet/langthaimodel.py | 4380 +++++ .../pip/_vendor/chardet/langturkishmodel.py | 4380 +++++ .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 95 + .../pip/_vendor/chardet/mbcsgroupprober.py | 56 + .../pip/_vendor/chardet/mbcssm.py | 660 + .../pip/_vendor/chardet/metadata/__init__.py | 0 .../pip/_vendor/chardet/metadata/languages.py | 351 + .../pip/_vendor/chardet/sbcharsetprober.py | 160 + .../pip/_vendor/chardet/sbcsgroupprober.py | 88 + .../pip/_vendor/chardet/sjisprober.py | 98 + .../pip/_vendor/chardet/universaldetector.py | 328 + .../pip/_vendor/chardet/utf1632prober.py | 223 + .../pip/_vendor/chardet/utf8prober.py | 80 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 266 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/distlib/__init__.py | 23 + .../pip/_vendor/distlib/compat.py | 1116 ++ .../pip/_vendor/distlib/database.py | 1350 ++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1300 ++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 152 + .../pip/_vendor/distlib/metadata.py | 1076 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 437 + .../site-packages/pip/_vendor/distlib/util.py | 1932 ++ .../pip/_vendor/distlib/version.py | 739 + .../pip/_vendor/distlib/wheel.py | 1082 ++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../pip/_vendor/distro/distro.py | 1374 ++ .../pip/_vendor/idna/__init__.py | 44 + .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 400 + .../pip/_vendor/idna/idnadata.py | 2151 +++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8600 +++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1010 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 + .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 499 + .../pip/_vendor/pep517/__init__.py | 6 + .../pip/_vendor/pep517/_compat.py | 8 + .../site-packages/pip/_vendor/pep517/build.py | 126 + .../site-packages/pip/_vendor/pep517/check.py | 207 + .../pip/_vendor/pep517/colorlog.py | 113 + .../pip/_vendor/pep517/dirtools.py | 19 + .../pip/_vendor/pep517/envbuild.py | 170 + .../pip/_vendor/pep517/in_process/__init__.py | 26 + .../_vendor/pep517/in_process/_in_process.py | 351 + .../site-packages/pip/_vendor/pep517/meta.py | 93 + .../pip/_vendor/pep517/wrappers.py | 362 + .../pip/_vendor/pkg_resources/__init__.py | 3296 ++++ .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/platformdirs/__init__.py | 340 + .../pip/_vendor/platformdirs/__main__.py | 46 + .../pip/_vendor/platformdirs/android.py | 120 + .../pip/_vendor/platformdirs/api.py | 156 + .../pip/_vendor/platformdirs/macos.py | 64 + .../pip/_vendor/platformdirs/unix.py | 181 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 182 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../pip/_vendor/pygments/cmdline.py | 668 + .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 940 + .../pip/_vendor/pygments/formatter.py | 94 + .../_vendor/pygments/formatters/__init__.py | 143 + .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 989 + .../pip/_vendor/pygments/formatters/img.py | 645 + .../pip/_vendor/pygments/formatters/irc.py | 179 + .../pip/_vendor/pygments/formatters/latex.py | 521 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 882 + .../pip/_vendor/pygments/lexers/__init__.py | 335 + .../pip/_vendor/pygments/lexers/_mapping.py | 541 + .../pip/_vendor/pygments/lexers/python.py | 1204 ++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 88 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 155 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 97 + .../pip/_vendor/pygments/token.py | 213 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 308 + .../pip/_vendor/pyparsing/__init__.py | 331 + .../pip/_vendor/pyparsing/actions.py | 207 + .../pip/_vendor/pyparsing/common.py | 424 + .../pip/_vendor/pyparsing/core.py | 5814 ++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 642 + .../pip/_vendor/pyparsing/exceptions.py | 267 + .../pip/_vendor/pyparsing/helpers.py | 1088 ++ .../pip/_vendor/pyparsing/results.py | 760 + .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 352 + .../pip/_vendor/pyparsing/util.py | 235 + .../pip/_vendor/requests/__init__.py | 182 + .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 48 + .../pip/_vendor/requests/adapters.py | 584 + .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 561 + .../pip/_vendor/requests/exceptions.py | 141 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1034 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 831 + .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1086 ++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 482 + .../pip/_vendor/resolvelib/structs.py | 165 + .../pip/_vendor/rich/__init__.py | 176 + .../pip/_vendor/rich/__main__.py | 282 + .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 ++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 78 + .../pip/_vendor/rich/_extension.py | 10 + .../pip/_vendor/rich/_inspect.py | 270 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 662 + .../pip/_vendor/rich/_windows.py | 72 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 237 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 517 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 615 + .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2572 +++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 225 + .../pip/_vendor/rich/default_styles.py | 188 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 54 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 445 + .../site-packages/pip/_vendor/rich/live.py | 373 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 280 + .../site-packages/pip/_vendor/rich/markup.py | 246 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 251 + .../site-packages/pip/_vendor/rich/pretty.py | 1010 ++ .../pip/_vendor/rich/progress.py | 1703 ++ .../pip/_vendor/rich/progress_bar.py | 224 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 152 + .../site-packages/pip/_vendor/rich/rule.py | 134 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 739 + .../site-packages/pip/_vendor/rich/spinner.py | 136 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 771 + .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 934 + .../site-packages/pip/_vendor/rich/table.py | 996 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1286 ++ .../site-packages/pip/_vendor/rich/theme.py | 112 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 679 + .../site-packages/pip/_vendor/rich/tree.py | 251 + .../site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 519 + .../pip/_vendor/tenacity/_asyncio.py | 92 + .../pip/_vendor/tenacity/_utils.py | 68 + .../pip/_vendor/tenacity/after.py | 46 + .../pip/_vendor/tenacity/before.py | 41 + .../pip/_vendor/tenacity/before_sleep.py | 58 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 240 + .../pip/_vendor/tenacity/stop.py | 96 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 232 + .../pip/_vendor/tomli/__init__.py | 11 + .../pip/_vendor/tomli/_parser.py | 691 + .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../pip/_vendor/typing_extensions.py | 2209 +++ .../pip/_vendor/urllib3/__init__.py | 102 + .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 567 + .../pip/_vendor/urllib3/connectionpool.py | 1110 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 519 + .../urllib3/contrib/securetransport.py | 921 + .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 51 + .../pip/_vendor/urllib3/packages/six.py | 1076 ++ .../pip/_vendor/urllib3/poolmanager.py | 537 + .../pip/_vendor/urllib3/request.py | 170 + .../pip/_vendor/urllib3/response.py | 866 + .../pip/_vendor/urllib3/util/__init__.py | 49 + .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 620 + .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 268 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../site-packages/pip/_vendor/vendor.txt | 23 + .../pip/_vendor/webencodings/__init__.py | 342 + .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + lib/python3.11/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3296 ++++ .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/appdirs.py | 607 + .../_vendor/importlib_resources/__init__.py | 36 + .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../pkg_resources/_vendor/jaraco/__init__.py | 0 .../pkg_resources/_vendor/jaraco/context.py | 213 + .../pkg_resources/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 + .../_vendor/more_itertools/__init__.py | 4 + .../_vendor/more_itertools/more.py | 4316 +++++ .../_vendor/more_itertools/recipes.py | 698 + .../_vendor/packaging/__about__.py | 26 + .../_vendor/packaging/__init__.py | 25 + .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 + .../pkg_resources/_vendor/packaging/tags.py | 487 + .../pkg_resources/_vendor/packaging/utils.py | 136 + .../_vendor/packaging/version.py | 504 + .../_vendor/pyparsing/__init__.py | 331 + .../_vendor/pyparsing/actions.py | 207 + .../pkg_resources/_vendor/pyparsing/common.py | 424 + .../pkg_resources/_vendor/pyparsing/core.py | 5814 ++++++ .../_vendor/pyparsing/diagram/__init__.py | 642 + .../_vendor/pyparsing/exceptions.py | 267 + .../_vendor/pyparsing/helpers.py | 1088 ++ .../_vendor/pyparsing/results.py | 760 + .../_vendor/pyparsing/testing.py | 331 + .../_vendor/pyparsing/unicode.py | 352 + .../pkg_resources/_vendor/pyparsing/util.py | 235 + .../pkg_resources/_vendor/zipp.py | 329 + .../pkg_resources/extern/__init__.py | 76 + .../AUTHORS.rst | 51 + .../pycryptodomex-3.18.0.dist-info/INSTALLER | 1 + .../LICENSE.rst | 61 + .../pycryptodomex-3.18.0.dist-info/METADATA | 88 + .../pycryptodomex-3.18.0.dist-info/RECORD | 513 + .../pycryptodomex-3.18.0.dist-info/REQUESTED | 0 .../pycryptodomex-3.18.0.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../site-packages/pysondb/__init__.py | 1 + .../site-packages/pysondb/__main__.py | 0 lib/python3.11/site-packages/pysondb/cli.py | 107 + lib/python3.11/site-packages/pysondb/db.py | 306 + .../site-packages/pysondb/db_types.py | 35 + .../site-packages/pysondb/errors.py | 24 + lib/python3.11/site-packages/pysondb/utils.py | 91 + .../pysondb_v2-2.0.0.dist-info/INSTALLER | 1 + .../pysondb_v2-2.0.0.dist-info/LICENSE | 21 + .../pysondb_v2-2.0.0.dist-info/METADATA | 362 + .../pysondb_v2-2.0.0.dist-info/RECORD | 23 + .../pysondb_v2-2.0.0.dist-info/REQUESTED | 0 .../pysondb_v2-2.0.0.dist-info/WHEEL | 6 + .../entry_points.txt | 3 + .../pysondb_v2-2.0.0.dist-info/top_level.txt | 1 + .../pytz-2023.3.dist-info/INSTALLER | 1 + .../pytz-2023.3.dist-info/LICENSE.txt | 19 + .../pytz-2023.3.dist-info/METADATA | 648 + .../pytz-2023.3.dist-info/RECORD | 621 + .../site-packages/pytz-2023.3.dist-info/WHEEL | 6 + .../pytz-2023.3.dist-info/top_level.txt | 1 + .../pytz-2023.3.dist-info/zip-safe | 1 + lib/python3.11/site-packages/pytz/__init__.py | 1555 ++ .../site-packages/pytz/exceptions.py | 59 + lib/python3.11/site-packages/pytz/lazy.py | 172 + .../site-packages/pytz/reference.py | 140 + lib/python3.11/site-packages/pytz/tzfile.py | 133 + lib/python3.11/site-packages/pytz/tzinfo.py | 577 + .../pytz/zoneinfo/Africa/Abidjan | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Accra | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Addis_Ababa | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Algiers | Bin 0 -> 735 bytes .../site-packages/pytz/zoneinfo/Africa/Asmara | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Africa/Asmera | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Africa/Bamako | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Bangui | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Banjul | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Bissau | Bin 0 -> 194 bytes .../pytz/zoneinfo/Africa/Blantyre | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Brazzaville | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Bujumbura | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Cairo | Bin 0 -> 2399 bytes .../pytz/zoneinfo/Africa/Casablanca | Bin 0 -> 2429 bytes .../site-packages/pytz/zoneinfo/Africa/Ceuta | Bin 0 -> 2052 bytes .../pytz/zoneinfo/Africa/Conakry | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Dakar | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Dar_es_Salaam | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Djibouti | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Africa/Douala | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/El_Aaiun | Bin 0 -> 2295 bytes .../pytz/zoneinfo/Africa/Freetown | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Gaborone | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Harare | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Johannesburg | Bin 0 -> 246 bytes .../site-packages/pytz/zoneinfo/Africa/Juba | Bin 0 -> 679 bytes .../pytz/zoneinfo/Africa/Kampala | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Khartoum | Bin 0 -> 679 bytes .../site-packages/pytz/zoneinfo/Africa/Kigali | Bin 0 -> 149 bytes .../pytz/zoneinfo/Africa/Kinshasa | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Lagos | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Libreville | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Lome | Bin 0 -> 148 bytes .../site-packages/pytz/zoneinfo/Africa/Luanda | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Lubumbashi | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Lusaka | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Malabo | Bin 0 -> 235 bytes .../site-packages/pytz/zoneinfo/Africa/Maputo | Bin 0 -> 149 bytes .../site-packages/pytz/zoneinfo/Africa/Maseru | Bin 0 -> 246 bytes .../pytz/zoneinfo/Africa/Mbabane | Bin 0 -> 246 bytes .../pytz/zoneinfo/Africa/Mogadishu | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Monrovia | Bin 0 -> 208 bytes .../pytz/zoneinfo/Africa/Nairobi | Bin 0 -> 265 bytes .../pytz/zoneinfo/Africa/Ndjamena | Bin 0 -> 199 bytes .../site-packages/pytz/zoneinfo/Africa/Niamey | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Nouakchott | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Ouagadougou | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Porto-Novo | Bin 0 -> 235 bytes .../pytz/zoneinfo/Africa/Sao_Tome | Bin 0 -> 254 bytes .../pytz/zoneinfo/Africa/Timbuktu | Bin 0 -> 148 bytes .../pytz/zoneinfo/Africa/Tripoli | Bin 0 -> 625 bytes .../site-packages/pytz/zoneinfo/Africa/Tunis | Bin 0 -> 689 bytes .../pytz/zoneinfo/Africa/Windhoek | Bin 0 -> 955 bytes .../site-packages/pytz/zoneinfo/America/Adak | Bin 0 -> 2356 bytes .../pytz/zoneinfo/America/Anchorage | Bin 0 -> 2371 bytes .../pytz/zoneinfo/America/Anguilla | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Antigua | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Araguaina | Bin 0 -> 870 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Catamarca | Bin 0 -> 1062 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Cordoba | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Jujuy | Bin 0 -> 1034 bytes .../pytz/zoneinfo/America/Argentina/La_Rioja | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Argentina/Mendoza | Bin 0 -> 1062 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Argentina/Salta | Bin 0 -> 1034 bytes .../pytz/zoneinfo/America/Argentina/San_Juan | Bin 0 -> 1076 bytes .../pytz/zoneinfo/America/Argentina/San_Luis | Bin 0 -> 1088 bytes .../pytz/zoneinfo/America/Argentina/Tucuman | Bin 0 -> 1090 bytes .../pytz/zoneinfo/America/Argentina/Ushuaia | Bin 0 -> 1062 bytes .../site-packages/pytz/zoneinfo/America/Aruba | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Asuncion | Bin 0 -> 2030 bytes .../pytz/zoneinfo/America/Atikokan | Bin 0 -> 182 bytes .../site-packages/pytz/zoneinfo/America/Atka | Bin 0 -> 2356 bytes .../site-packages/pytz/zoneinfo/America/Bahia | Bin 0 -> 1010 bytes .../pytz/zoneinfo/America/Bahia_Banderas | Bin 0 -> 1152 bytes .../pytz/zoneinfo/America/Barbados | Bin 0 -> 436 bytes .../site-packages/pytz/zoneinfo/America/Belem | Bin 0 -> 562 bytes .../pytz/zoneinfo/America/Belize | Bin 0 -> 1614 bytes .../pytz/zoneinfo/America/Blanc-Sablon | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Boa_Vista | Bin 0 -> 618 bytes .../pytz/zoneinfo/America/Bogota | Bin 0 -> 232 bytes .../site-packages/pytz/zoneinfo/America/Boise | Bin 0 -> 2410 bytes .../pytz/zoneinfo/America/Buenos_Aires | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Cambridge_Bay | Bin 0 -> 2254 bytes .../pytz/zoneinfo/America/Campo_Grande | Bin 0 -> 1430 bytes .../pytz/zoneinfo/America/Cancun | Bin 0 -> 834 bytes .../pytz/zoneinfo/America/Caracas | Bin 0 -> 250 bytes .../pytz/zoneinfo/America/Catamarca | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Cayenne | Bin 0 -> 184 bytes .../pytz/zoneinfo/America/Cayman | Bin 0 -> 182 bytes .../pytz/zoneinfo/America/Chicago | Bin 0 -> 3592 bytes .../pytz/zoneinfo/America/Chihuahua | Bin 0 -> 1102 bytes .../pytz/zoneinfo/America/Ciudad_Juarez | Bin 0 -> 1538 bytes .../pytz/zoneinfo/America/Coral_Harbour | Bin 0 -> 182 bytes .../pytz/zoneinfo/America/Cordoba | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Costa_Rica | Bin 0 -> 316 bytes .../pytz/zoneinfo/America/Creston | Bin 0 -> 360 bytes .../pytz/zoneinfo/America/Cuiaba | Bin 0 -> 1402 bytes .../pytz/zoneinfo/America/Curacao | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Danmarkshavn | Bin 0 -> 698 bytes .../pytz/zoneinfo/America/Dawson | Bin 0 -> 1614 bytes .../pytz/zoneinfo/America/Dawson_Creek | Bin 0 -> 1050 bytes .../pytz/zoneinfo/America/Denver | Bin 0 -> 2460 bytes .../pytz/zoneinfo/America/Detroit | Bin 0 -> 2230 bytes .../pytz/zoneinfo/America/Dominica | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Edmonton | Bin 0 -> 2332 bytes .../pytz/zoneinfo/America/Eirunepe | Bin 0 -> 642 bytes .../pytz/zoneinfo/America/El_Salvador | Bin 0 -> 224 bytes .../pytz/zoneinfo/America/Ensenada | Bin 0 -> 2374 bytes .../pytz/zoneinfo/America/Fort_Nelson | Bin 0 -> 2240 bytes .../pytz/zoneinfo/America/Fort_Wayne | Bin 0 -> 1682 bytes .../pytz/zoneinfo/America/Fortaleza | Bin 0 -> 702 bytes .../pytz/zoneinfo/America/Glace_Bay | Bin 0 -> 2192 bytes .../pytz/zoneinfo/America/Godthab | Bin 0 -> 1903 bytes .../pytz/zoneinfo/America/Goose_Bay | Bin 0 -> 3210 bytes .../pytz/zoneinfo/America/Grand_Turk | Bin 0 -> 1834 bytes .../pytz/zoneinfo/America/Grenada | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Guadeloupe | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Guatemala | Bin 0 -> 280 bytes .../pytz/zoneinfo/America/Guayaquil | Bin 0 -> 232 bytes .../pytz/zoneinfo/America/Guyana | Bin 0 -> 248 bytes .../pytz/zoneinfo/America/Halifax | Bin 0 -> 3424 bytes .../pytz/zoneinfo/America/Havana | Bin 0 -> 2416 bytes .../pytz/zoneinfo/America/Hermosillo | Bin 0 -> 456 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 0 -> 1682 bytes .../pytz/zoneinfo/America/Indiana/Knox | Bin 0 -> 2444 bytes .../pytz/zoneinfo/America/Indiana/Marengo | Bin 0 -> 1738 bytes .../pytz/zoneinfo/America/Indiana/Petersburg | Bin 0 -> 1920 bytes .../pytz/zoneinfo/America/Indiana/Tell_City | Bin 0 -> 1700 bytes .../pytz/zoneinfo/America/Indiana/Vevay | Bin 0 -> 1430 bytes .../pytz/zoneinfo/America/Indiana/Vincennes | Bin 0 -> 1710 bytes .../pytz/zoneinfo/America/Indiana/Winamac | Bin 0 -> 1794 bytes .../pytz/zoneinfo/America/Indianapolis | Bin 0 -> 1682 bytes .../pytz/zoneinfo/America/Inuvik | Bin 0 -> 2074 bytes .../pytz/zoneinfo/America/Iqaluit | Bin 0 -> 2202 bytes .../pytz/zoneinfo/America/Jamaica | Bin 0 -> 482 bytes .../site-packages/pytz/zoneinfo/America/Jujuy | Bin 0 -> 1034 bytes .../pytz/zoneinfo/America/Juneau | Bin 0 -> 2353 bytes .../pytz/zoneinfo/America/Kentucky/Louisville | Bin 0 -> 2788 bytes .../pytz/zoneinfo/America/Kentucky/Monticello | Bin 0 -> 2368 bytes .../pytz/zoneinfo/America/Knox_IN | Bin 0 -> 2444 bytes .../pytz/zoneinfo/America/Kralendijk | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/La_Paz | Bin 0 -> 218 bytes .../site-packages/pytz/zoneinfo/America/Lima | Bin 0 -> 392 bytes .../pytz/zoneinfo/America/Los_Angeles | Bin 0 -> 2852 bytes .../pytz/zoneinfo/America/Louisville | Bin 0 -> 2788 bytes .../pytz/zoneinfo/America/Lower_Princes | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Maceio | Bin 0 -> 730 bytes .../pytz/zoneinfo/America/Managua | Bin 0 -> 430 bytes .../pytz/zoneinfo/America/Manaus | Bin 0 -> 590 bytes .../pytz/zoneinfo/America/Marigot | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Martinique | Bin 0 -> 232 bytes .../pytz/zoneinfo/America/Matamoros | Bin 0 -> 1418 bytes .../pytz/zoneinfo/America/Mazatlan | Bin 0 -> 1128 bytes .../pytz/zoneinfo/America/Mendoza | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Menominee | Bin 0 -> 2274 bytes .../pytz/zoneinfo/America/Merida | Bin 0 -> 1004 bytes .../pytz/zoneinfo/America/Metlakatla | Bin 0 -> 1423 bytes .../pytz/zoneinfo/America/Mexico_City | Bin 0 -> 1222 bytes .../pytz/zoneinfo/America/Miquelon | Bin 0 -> 1652 bytes .../pytz/zoneinfo/America/Moncton | Bin 0 -> 3154 bytes .../pytz/zoneinfo/America/Monterrey | Bin 0 -> 980 bytes .../pytz/zoneinfo/America/Montevideo | Bin 0 -> 1496 bytes .../pytz/zoneinfo/America/Montreal | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Montserrat | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Nassau | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/New_York | Bin 0 -> 3552 bytes .../pytz/zoneinfo/America/Nipigon | Bin 0 -> 3494 bytes .../site-packages/pytz/zoneinfo/America/Nome | Bin 0 -> 2367 bytes .../pytz/zoneinfo/America/Noronha | Bin 0 -> 702 bytes .../pytz/zoneinfo/America/North_Dakota/Beulah | Bin 0 -> 2396 bytes .../pytz/zoneinfo/America/North_Dakota/Center | Bin 0 -> 2396 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 0 -> 2396 bytes .../site-packages/pytz/zoneinfo/America/Nuuk | Bin 0 -> 1903 bytes .../pytz/zoneinfo/America/Ojinaga | Bin 0 -> 1524 bytes .../pytz/zoneinfo/America/Panama | Bin 0 -> 182 bytes .../pytz/zoneinfo/America/Pangnirtung | Bin 0 -> 2202 bytes .../pytz/zoneinfo/America/Paramaribo | Bin 0 -> 248 bytes .../pytz/zoneinfo/America/Phoenix | Bin 0 -> 360 bytes .../pytz/zoneinfo/America/Port-au-Prince | Bin 0 -> 1434 bytes .../pytz/zoneinfo/America/Port_of_Spain | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Porto_Acre | Bin 0 -> 614 bytes .../pytz/zoneinfo/America/Porto_Velho | Bin 0 -> 562 bytes .../pytz/zoneinfo/America/Puerto_Rico | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Punta_Arenas | Bin 0 -> 1902 bytes .../pytz/zoneinfo/America/Rainy_River | Bin 0 -> 2868 bytes .../pytz/zoneinfo/America/Rankin_Inlet | Bin 0 -> 2066 bytes .../pytz/zoneinfo/America/Recife | Bin 0 -> 702 bytes .../pytz/zoneinfo/America/Regina | Bin 0 -> 980 bytes .../pytz/zoneinfo/America/Resolute | Bin 0 -> 2066 bytes .../pytz/zoneinfo/America/Rio_Branco | Bin 0 -> 614 bytes .../pytz/zoneinfo/America/Rosario | Bin 0 -> 1062 bytes .../pytz/zoneinfo/America/Santa_Isabel | Bin 0 -> 2374 bytes .../pytz/zoneinfo/America/Santarem | Bin 0 -> 588 bytes .../pytz/zoneinfo/America/Santiago | Bin 0 -> 2515 bytes .../pytz/zoneinfo/America/Santo_Domingo | Bin 0 -> 458 bytes .../pytz/zoneinfo/America/Sao_Paulo | Bin 0 -> 1430 bytes .../pytz/zoneinfo/America/Scoresbysund | Bin 0 -> 1902 bytes .../pytz/zoneinfo/America/Shiprock | Bin 0 -> 2460 bytes .../site-packages/pytz/zoneinfo/America/Sitka | Bin 0 -> 2329 bytes .../pytz/zoneinfo/America/St_Barthelemy | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Johns | Bin 0 -> 3655 bytes .../pytz/zoneinfo/America/St_Kitts | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Lucia | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Thomas | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/St_Vincent | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Swift_Current | Bin 0 -> 560 bytes .../pytz/zoneinfo/America/Tegucigalpa | Bin 0 -> 252 bytes .../site-packages/pytz/zoneinfo/America/Thule | Bin 0 -> 1502 bytes .../pytz/zoneinfo/America/Thunder_Bay | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Tijuana | Bin 0 -> 2374 bytes .../pytz/zoneinfo/America/Toronto | Bin 0 -> 3494 bytes .../pytz/zoneinfo/America/Tortola | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Vancouver | Bin 0 -> 2892 bytes .../pytz/zoneinfo/America/Virgin | Bin 0 -> 246 bytes .../pytz/zoneinfo/America/Whitehorse | Bin 0 -> 1614 bytes .../pytz/zoneinfo/America/Winnipeg | Bin 0 -> 2868 bytes .../pytz/zoneinfo/America/Yakutat | Bin 0 -> 2305 bytes .../pytz/zoneinfo/America/Yellowknife | Bin 0 -> 2332 bytes .../pytz/zoneinfo/Antarctica/Casey | Bin 0 -> 370 bytes .../pytz/zoneinfo/Antarctica/Davis | Bin 0 -> 283 bytes .../pytz/zoneinfo/Antarctica/DumontDUrville | Bin 0 -> 172 bytes .../pytz/zoneinfo/Antarctica/Macquarie | Bin 0 -> 2260 bytes .../pytz/zoneinfo/Antarctica/Mawson | Bin 0 -> 185 bytes .../pytz/zoneinfo/Antarctica/McMurdo | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Antarctica/Palmer | Bin 0 -> 1404 bytes .../pytz/zoneinfo/Antarctica/Rothera | Bin 0 -> 150 bytes .../pytz/zoneinfo/Antarctica/South_Pole | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Antarctica/Syowa | Bin 0 -> 151 bytes .../pytz/zoneinfo/Antarctica/Troll | Bin 0 -> 1148 bytes .../pytz/zoneinfo/Antarctica/Vostok | Bin 0 -> 151 bytes .../pytz/zoneinfo/Arctic/Longyearbyen | Bin 0 -> 2298 bytes .../site-packages/pytz/zoneinfo/Asia/Aden | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Almaty | Bin 0 -> 983 bytes .../site-packages/pytz/zoneinfo/Asia/Amman | Bin 0 -> 1433 bytes .../site-packages/pytz/zoneinfo/Asia/Anadyr | Bin 0 -> 1174 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtau | Bin 0 -> 969 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtobe | Bin 0 -> 997 bytes .../site-packages/pytz/zoneinfo/Asia/Ashgabat | Bin 0 -> 605 bytes .../pytz/zoneinfo/Asia/Ashkhabad | Bin 0 -> 605 bytes .../site-packages/pytz/zoneinfo/Asia/Atyrau | Bin 0 -> 977 bytes .../site-packages/pytz/zoneinfo/Asia/Baghdad | Bin 0 -> 969 bytes .../site-packages/pytz/zoneinfo/Asia/Bahrain | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Asia/Baku | Bin 0 -> 1213 bytes .../site-packages/pytz/zoneinfo/Asia/Bangkok | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Asia/Barnaul | Bin 0 -> 1207 bytes .../site-packages/pytz/zoneinfo/Asia/Beirut | Bin 0 -> 2154 bytes .../site-packages/pytz/zoneinfo/Asia/Bishkek | Bin 0 -> 969 bytes .../site-packages/pytz/zoneinfo/Asia/Brunei | Bin 0 -> 469 bytes .../site-packages/pytz/zoneinfo/Asia/Calcutta | Bin 0 -> 285 bytes .../site-packages/pytz/zoneinfo/Asia/Chita | Bin 0 -> 1207 bytes .../pytz/zoneinfo/Asia/Choibalsan | Bin 0 -> 935 bytes .../pytz/zoneinfo/Asia/Chongqing | Bin 0 -> 561 bytes .../pytz/zoneinfo/Asia/Chungking | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/Asia/Colombo | Bin 0 -> 358 bytes .../site-packages/pytz/zoneinfo/Asia/Dacca | Bin 0 -> 323 bytes .../site-packages/pytz/zoneinfo/Asia/Damascus | Bin 0 -> 1873 bytes .../site-packages/pytz/zoneinfo/Asia/Dhaka | Bin 0 -> 323 bytes .../site-packages/pytz/zoneinfo/Asia/Dili | Bin 0 -> 213 bytes .../site-packages/pytz/zoneinfo/Asia/Dubai | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Dushanbe | Bin 0 -> 577 bytes .../pytz/zoneinfo/Asia/Famagusta | Bin 0 -> 2028 bytes .../site-packages/pytz/zoneinfo/Asia/Gaza | Bin 0 -> 3808 bytes .../site-packages/pytz/zoneinfo/Asia/Harbin | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/Asia/Hebron | Bin 0 -> 3836 bytes .../pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin 0 -> 337 bytes .../pytz/zoneinfo/Asia/Hong_Kong | Bin 0 -> 1233 bytes .../site-packages/pytz/zoneinfo/Asia/Hovd | Bin 0 -> 877 bytes .../site-packages/pytz/zoneinfo/Asia/Irkutsk | Bin 0 -> 1229 bytes .../site-packages/pytz/zoneinfo/Asia/Istanbul | Bin 0 -> 1933 bytes .../site-packages/pytz/zoneinfo/Asia/Jakarta | Bin 0 -> 383 bytes .../site-packages/pytz/zoneinfo/Asia/Jayapura | Bin 0 -> 221 bytes .../pytz/zoneinfo/Asia/Jerusalem | Bin 0 -> 2388 bytes .../site-packages/pytz/zoneinfo/Asia/Kabul | Bin 0 -> 194 bytes .../pytz/zoneinfo/Asia/Kamchatka | Bin 0 -> 1152 bytes .../site-packages/pytz/zoneinfo/Asia/Karachi | Bin 0 -> 379 bytes .../site-packages/pytz/zoneinfo/Asia/Kashgar | Bin 0 -> 151 bytes .../pytz/zoneinfo/Asia/Kathmandu | Bin 0 -> 198 bytes .../site-packages/pytz/zoneinfo/Asia/Katmandu | Bin 0 -> 198 bytes .../site-packages/pytz/zoneinfo/Asia/Khandyga | Bin 0 -> 1257 bytes .../site-packages/pytz/zoneinfo/Asia/Kolkata | Bin 0 -> 285 bytes .../pytz/zoneinfo/Asia/Krasnoyarsk | Bin 0 -> 1193 bytes .../pytz/zoneinfo/Asia/Kuala_Lumpur | Bin 0 -> 401 bytes .../site-packages/pytz/zoneinfo/Asia/Kuching | Bin 0 -> 469 bytes .../site-packages/pytz/zoneinfo/Asia/Kuwait | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Macao | Bin 0 -> 1227 bytes .../site-packages/pytz/zoneinfo/Asia/Macau | Bin 0 -> 1227 bytes .../site-packages/pytz/zoneinfo/Asia/Magadan | Bin 0 -> 1208 bytes .../site-packages/pytz/zoneinfo/Asia/Makassar | Bin 0 -> 254 bytes .../site-packages/pytz/zoneinfo/Asia/Manila | Bin 0 -> 328 bytes .../site-packages/pytz/zoneinfo/Asia/Muscat | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Nicosia | Bin 0 -> 2002 bytes .../pytz/zoneinfo/Asia/Novokuznetsk | Bin 0 -> 1151 bytes .../pytz/zoneinfo/Asia/Novosibirsk | Bin 0 -> 1207 bytes .../site-packages/pytz/zoneinfo/Asia/Omsk | Bin 0 -> 1193 bytes .../site-packages/pytz/zoneinfo/Asia/Oral | Bin 0 -> 991 bytes .../pytz/zoneinfo/Asia/Phnom_Penh | Bin 0 -> 185 bytes .../pytz/zoneinfo/Asia/Pontianak | Bin 0 -> 353 bytes .../pytz/zoneinfo/Asia/Pyongyang | Bin 0 -> 237 bytes .../site-packages/pytz/zoneinfo/Asia/Qatar | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Asia/Qostanay | Bin 0 -> 997 bytes .../pytz/zoneinfo/Asia/Qyzylorda | Bin 0 -> 1011 bytes .../site-packages/pytz/zoneinfo/Asia/Rangoon | Bin 0 -> 254 bytes .../site-packages/pytz/zoneinfo/Asia/Riyadh | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Saigon | Bin 0 -> 337 bytes .../site-packages/pytz/zoneinfo/Asia/Sakhalin | Bin 0 -> 1188 bytes .../pytz/zoneinfo/Asia/Samarkand | Bin 0 -> 563 bytes .../site-packages/pytz/zoneinfo/Asia/Seoul | Bin 0 -> 617 bytes .../site-packages/pytz/zoneinfo/Asia/Shanghai | Bin 0 -> 561 bytes .../pytz/zoneinfo/Asia/Singapore | Bin 0 -> 401 bytes .../pytz/zoneinfo/Asia/Srednekolymsk | Bin 0 -> 1194 bytes .../site-packages/pytz/zoneinfo/Asia/Taipei | Bin 0 -> 761 bytes .../site-packages/pytz/zoneinfo/Asia/Tashkent | Bin 0 -> 577 bytes .../site-packages/pytz/zoneinfo/Asia/Tbilisi | Bin 0 -> 1021 bytes .../site-packages/pytz/zoneinfo/Asia/Tehran | Bin 0 -> 1248 bytes .../site-packages/pytz/zoneinfo/Asia/Tel_Aviv | Bin 0 -> 2388 bytes .../site-packages/pytz/zoneinfo/Asia/Thimbu | Bin 0 -> 189 bytes .../site-packages/pytz/zoneinfo/Asia/Thimphu | Bin 0 -> 189 bytes .../site-packages/pytz/zoneinfo/Asia/Tokyo | Bin 0 -> 309 bytes .../site-packages/pytz/zoneinfo/Asia/Tomsk | Bin 0 -> 1207 bytes .../pytz/zoneinfo/Asia/Ujung_Pandang | Bin 0 -> 254 bytes .../pytz/zoneinfo/Asia/Ulaanbaatar | Bin 0 -> 877 bytes .../pytz/zoneinfo/Asia/Ulan_Bator | Bin 0 -> 877 bytes .../site-packages/pytz/zoneinfo/Asia/Urumqi | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Asia/Ust-Nera | Bin 0 -> 1238 bytes .../pytz/zoneinfo/Asia/Vientiane | Bin 0 -> 185 bytes .../pytz/zoneinfo/Asia/Vladivostok | Bin 0 -> 1194 bytes .../site-packages/pytz/zoneinfo/Asia/Yakutsk | Bin 0 -> 1193 bytes .../site-packages/pytz/zoneinfo/Asia/Yangon | Bin 0 -> 254 bytes .../pytz/zoneinfo/Asia/Yekaterinburg | Bin 0 -> 1229 bytes .../site-packages/pytz/zoneinfo/Asia/Yerevan | Bin 0 -> 1137 bytes .../pytz/zoneinfo/Atlantic/Azores | Bin 0 -> 3498 bytes .../pytz/zoneinfo/Atlantic/Bermuda | Bin 0 -> 2396 bytes .../pytz/zoneinfo/Atlantic/Canary | Bin 0 -> 1897 bytes .../pytz/zoneinfo/Atlantic/Cape_Verde | Bin 0 -> 256 bytes .../pytz/zoneinfo/Atlantic/Faeroe | Bin 0 -> 1815 bytes .../pytz/zoneinfo/Atlantic/Faroe | Bin 0 -> 1815 bytes .../pytz/zoneinfo/Atlantic/Jan_Mayen | Bin 0 -> 2298 bytes .../pytz/zoneinfo/Atlantic/Madeira | Bin 0 -> 3503 bytes .../pytz/zoneinfo/Atlantic/Reykjavik | Bin 0 -> 148 bytes .../pytz/zoneinfo/Atlantic/South_Georgia | Bin 0 -> 150 bytes .../pytz/zoneinfo/Atlantic/St_Helena | Bin 0 -> 148 bytes .../pytz/zoneinfo/Atlantic/Stanley | Bin 0 -> 1200 bytes .../site-packages/pytz/zoneinfo/Australia/ACT | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/Adelaide | Bin 0 -> 2208 bytes .../pytz/zoneinfo/Australia/Brisbane | Bin 0 -> 419 bytes .../pytz/zoneinfo/Australia/Broken_Hill | Bin 0 -> 2229 bytes .../pytz/zoneinfo/Australia/Canberra | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/Currie | Bin 0 -> 2358 bytes .../pytz/zoneinfo/Australia/Darwin | Bin 0 -> 325 bytes .../pytz/zoneinfo/Australia/Eucla | Bin 0 -> 456 bytes .../pytz/zoneinfo/Australia/Hobart | Bin 0 -> 2358 bytes .../site-packages/pytz/zoneinfo/Australia/LHI | Bin 0 -> 1846 bytes .../pytz/zoneinfo/Australia/Lindeman | Bin 0 -> 475 bytes .../pytz/zoneinfo/Australia/Lord_Howe | Bin 0 -> 1846 bytes .../pytz/zoneinfo/Australia/Melbourne | Bin 0 -> 2190 bytes .../site-packages/pytz/zoneinfo/Australia/NSW | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/North | Bin 0 -> 325 bytes .../pytz/zoneinfo/Australia/Perth | Bin 0 -> 446 bytes .../pytz/zoneinfo/Australia/Queensland | Bin 0 -> 419 bytes .../pytz/zoneinfo/Australia/South | Bin 0 -> 2208 bytes .../pytz/zoneinfo/Australia/Sydney | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/Tasmania | Bin 0 -> 2358 bytes .../pytz/zoneinfo/Australia/Victoria | Bin 0 -> 2190 bytes .../pytz/zoneinfo/Australia/West | Bin 0 -> 446 bytes .../pytz/zoneinfo/Australia/Yancowinna | Bin 0 -> 2229 bytes .../site-packages/pytz/zoneinfo/Brazil/Acre | Bin 0 -> 614 bytes .../pytz/zoneinfo/Brazil/DeNoronha | Bin 0 -> 702 bytes .../site-packages/pytz/zoneinfo/Brazil/East | Bin 0 -> 1430 bytes .../site-packages/pytz/zoneinfo/Brazil/West | Bin 0 -> 590 bytes .../site-packages/pytz/zoneinfo/CET | Bin 0 -> 2094 bytes .../site-packages/pytz/zoneinfo/CST6CDT | Bin 0 -> 2310 bytes .../pytz/zoneinfo/Canada/Atlantic | Bin 0 -> 3424 bytes .../pytz/zoneinfo/Canada/Central | Bin 0 -> 2868 bytes .../pytz/zoneinfo/Canada/Eastern | Bin 0 -> 3494 bytes .../pytz/zoneinfo/Canada/Mountain | Bin 0 -> 2332 bytes .../pytz/zoneinfo/Canada/Newfoundland | Bin 0 -> 3655 bytes .../pytz/zoneinfo/Canada/Pacific | Bin 0 -> 2892 bytes .../pytz/zoneinfo/Canada/Saskatchewan | Bin 0 -> 980 bytes .../site-packages/pytz/zoneinfo/Canada/Yukon | Bin 0 -> 1614 bytes .../pytz/zoneinfo/Chile/Continental | Bin 0 -> 2515 bytes .../pytz/zoneinfo/Chile/EasterIsland | Bin 0 -> 2219 bytes .../site-packages/pytz/zoneinfo/Cuba | Bin 0 -> 2416 bytes .../site-packages/pytz/zoneinfo/EET | Bin 0 -> 1908 bytes .../site-packages/pytz/zoneinfo/EST | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/EST5EDT | Bin 0 -> 2310 bytes .../site-packages/pytz/zoneinfo/Egypt | Bin 0 -> 2399 bytes .../site-packages/pytz/zoneinfo/Eire | Bin 0 -> 3492 bytes .../site-packages/pytz/zoneinfo/Etc/GMT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+1 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+10 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+11 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+12 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+2 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+3 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+4 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+5 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+6 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+7 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+8 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+9 | Bin 0 -> 116 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-1 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-10 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-11 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-12 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-13 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-14 | Bin 0 -> 118 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-2 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-3 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-4 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-5 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-6 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-7 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-8 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-9 | Bin 0 -> 117 bytes .../site-packages/pytz/zoneinfo/Etc/GMT0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Greenwich | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/UCT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/UTC | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Universal | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Etc/Zulu | Bin 0 -> 114 bytes .../pytz/zoneinfo/Europe/Amsterdam | Bin 0 -> 2933 bytes .../pytz/zoneinfo/Europe/Andorra | Bin 0 -> 1742 bytes .../pytz/zoneinfo/Europe/Astrakhan | Bin 0 -> 1151 bytes .../site-packages/pytz/zoneinfo/Europe/Athens | Bin 0 -> 2262 bytes .../pytz/zoneinfo/Europe/Belfast | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Belgrade | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Berlin | Bin 0 -> 2298 bytes .../pytz/zoneinfo/Europe/Bratislava | Bin 0 -> 2301 bytes .../pytz/zoneinfo/Europe/Brussels | Bin 0 -> 2933 bytes .../pytz/zoneinfo/Europe/Bucharest | Bin 0 -> 2184 bytes .../pytz/zoneinfo/Europe/Budapest | Bin 0 -> 2368 bytes .../pytz/zoneinfo/Europe/Busingen | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Chisinau | Bin 0 -> 2390 bytes .../pytz/zoneinfo/Europe/Copenhagen | Bin 0 -> 2298 bytes .../site-packages/pytz/zoneinfo/Europe/Dublin | Bin 0 -> 3492 bytes .../pytz/zoneinfo/Europe/Gibraltar | Bin 0 -> 3068 bytes .../pytz/zoneinfo/Europe/Guernsey | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Helsinki | Bin 0 -> 1900 bytes .../pytz/zoneinfo/Europe/Isle_of_Man | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Istanbul | Bin 0 -> 1933 bytes .../site-packages/pytz/zoneinfo/Europe/Jersey | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Kaliningrad | Bin 0 -> 1493 bytes .../site-packages/pytz/zoneinfo/Europe/Kiev | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Kirov | Bin 0 -> 1185 bytes .../site-packages/pytz/zoneinfo/Europe/Kyiv | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Lisbon | Bin 0 -> 3497 bytes .../pytz/zoneinfo/Europe/Ljubljana | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/London | Bin 0 -> 3664 bytes .../pytz/zoneinfo/Europe/Luxembourg | Bin 0 -> 2933 bytes .../site-packages/pytz/zoneinfo/Europe/Madrid | Bin 0 -> 2614 bytes .../site-packages/pytz/zoneinfo/Europe/Malta | Bin 0 -> 2620 bytes .../pytz/zoneinfo/Europe/Mariehamn | Bin 0 -> 1900 bytes .../site-packages/pytz/zoneinfo/Europe/Minsk | Bin 0 -> 1307 bytes .../site-packages/pytz/zoneinfo/Europe/Monaco | Bin 0 -> 2962 bytes .../site-packages/pytz/zoneinfo/Europe/Moscow | Bin 0 -> 1535 bytes .../pytz/zoneinfo/Europe/Nicosia | Bin 0 -> 2002 bytes .../site-packages/pytz/zoneinfo/Europe/Oslo | Bin 0 -> 2298 bytes .../site-packages/pytz/zoneinfo/Europe/Paris | Bin 0 -> 2962 bytes .../pytz/zoneinfo/Europe/Podgorica | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Prague | Bin 0 -> 2301 bytes .../site-packages/pytz/zoneinfo/Europe/Riga | Bin 0 -> 2198 bytes .../site-packages/pytz/zoneinfo/Europe/Rome | Bin 0 -> 2641 bytes .../site-packages/pytz/zoneinfo/Europe/Samara | Bin 0 -> 1201 bytes .../pytz/zoneinfo/Europe/San_Marino | Bin 0 -> 2641 bytes .../pytz/zoneinfo/Europe/Sarajevo | Bin 0 -> 1920 bytes .../pytz/zoneinfo/Europe/Saratov | Bin 0 -> 1169 bytes .../pytz/zoneinfo/Europe/Simferopol | Bin 0 -> 1469 bytes .../site-packages/pytz/zoneinfo/Europe/Skopje | Bin 0 -> 1920 bytes .../site-packages/pytz/zoneinfo/Europe/Sofia | Bin 0 -> 2077 bytes .../pytz/zoneinfo/Europe/Stockholm | Bin 0 -> 2298 bytes .../pytz/zoneinfo/Europe/Tallinn | Bin 0 -> 2148 bytes .../site-packages/pytz/zoneinfo/Europe/Tirane | Bin 0 -> 2084 bytes .../pytz/zoneinfo/Europe/Tiraspol | Bin 0 -> 2390 bytes .../pytz/zoneinfo/Europe/Ulyanovsk | Bin 0 -> 1253 bytes .../pytz/zoneinfo/Europe/Uzhgorod | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Vaduz | Bin 0 -> 1909 bytes .../pytz/zoneinfo/Europe/Vatican | Bin 0 -> 2641 bytes .../site-packages/pytz/zoneinfo/Europe/Vienna | Bin 0 -> 2200 bytes .../pytz/zoneinfo/Europe/Vilnius | Bin 0 -> 2162 bytes .../pytz/zoneinfo/Europe/Volgograd | Bin 0 -> 1193 bytes .../site-packages/pytz/zoneinfo/Europe/Warsaw | Bin 0 -> 2654 bytes .../site-packages/pytz/zoneinfo/Europe/Zagreb | Bin 0 -> 1920 bytes .../pytz/zoneinfo/Europe/Zaporozhye | Bin 0 -> 2120 bytes .../site-packages/pytz/zoneinfo/Europe/Zurich | Bin 0 -> 1909 bytes .../site-packages/pytz/zoneinfo/Factory | Bin 0 -> 116 bytes lib/python3.11/site-packages/pytz/zoneinfo/GB | Bin 0 -> 3664 bytes .../site-packages/pytz/zoneinfo/GB-Eire | Bin 0 -> 3664 bytes .../site-packages/pytz/zoneinfo/GMT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT+0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT-0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/GMT0 | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Greenwich | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/HST | Bin 0 -> 115 bytes .../site-packages/pytz/zoneinfo/Hongkong | Bin 0 -> 1233 bytes .../site-packages/pytz/zoneinfo/Iceland | Bin 0 -> 148 bytes .../pytz/zoneinfo/Indian/Antananarivo | Bin 0 -> 265 bytes .../site-packages/pytz/zoneinfo/Indian/Chagos | Bin 0 -> 185 bytes .../pytz/zoneinfo/Indian/Christmas | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Indian/Cocos | Bin 0 -> 254 bytes .../site-packages/pytz/zoneinfo/Indian/Comoro | Bin 0 -> 265 bytes .../pytz/zoneinfo/Indian/Kerguelen | Bin 0 -> 185 bytes .../site-packages/pytz/zoneinfo/Indian/Mahe | Bin 0 -> 151 bytes .../pytz/zoneinfo/Indian/Maldives | Bin 0 -> 185 bytes .../pytz/zoneinfo/Indian/Mauritius | Bin 0 -> 227 bytes .../pytz/zoneinfo/Indian/Mayotte | Bin 0 -> 265 bytes .../pytz/zoneinfo/Indian/Reunion | Bin 0 -> 151 bytes .../site-packages/pytz/zoneinfo/Iran | Bin 0 -> 1248 bytes .../site-packages/pytz/zoneinfo/Israel | Bin 0 -> 2388 bytes .../site-packages/pytz/zoneinfo/Jamaica | Bin 0 -> 482 bytes .../site-packages/pytz/zoneinfo/Japan | Bin 0 -> 309 bytes .../site-packages/pytz/zoneinfo/Kwajalein | Bin 0 -> 302 bytes .../site-packages/pytz/zoneinfo/Libya | Bin 0 -> 625 bytes .../site-packages/pytz/zoneinfo/MET | Bin 0 -> 2094 bytes .../site-packages/pytz/zoneinfo/MST | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/MST7MDT | Bin 0 -> 2310 bytes .../pytz/zoneinfo/Mexico/BajaNorte | Bin 0 -> 2374 bytes .../pytz/zoneinfo/Mexico/BajaSur | Bin 0 -> 1128 bytes .../pytz/zoneinfo/Mexico/General | Bin 0 -> 1222 bytes lib/python3.11/site-packages/pytz/zoneinfo/NZ | Bin 0 -> 2437 bytes .../site-packages/pytz/zoneinfo/NZ-CHAT | Bin 0 -> 2054 bytes .../site-packages/pytz/zoneinfo/Navajo | Bin 0 -> 2460 bytes .../site-packages/pytz/zoneinfo/PRC | Bin 0 -> 561 bytes .../site-packages/pytz/zoneinfo/PST8PDT | Bin 0 -> 2310 bytes .../site-packages/pytz/zoneinfo/Pacific/Apia | Bin 0 -> 598 bytes .../pytz/zoneinfo/Pacific/Auckland | Bin 0 -> 2437 bytes .../pytz/zoneinfo/Pacific/Bougainville | Bin 0 -> 254 bytes .../pytz/zoneinfo/Pacific/Chatham | Bin 0 -> 2054 bytes .../site-packages/pytz/zoneinfo/Pacific/Chuuk | Bin 0 -> 172 bytes .../pytz/zoneinfo/Pacific/Easter | Bin 0 -> 2219 bytes .../site-packages/pytz/zoneinfo/Pacific/Efate | Bin 0 -> 524 bytes .../pytz/zoneinfo/Pacific/Enderbury | Bin 0 -> 220 bytes .../pytz/zoneinfo/Pacific/Fakaofo | Bin 0 -> 186 bytes .../site-packages/pytz/zoneinfo/Pacific/Fiji | Bin 0 -> 564 bytes .../pytz/zoneinfo/Pacific/Funafuti | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Galapagos | Bin 0 -> 224 bytes .../pytz/zoneinfo/Pacific/Gambier | Bin 0 -> 150 bytes .../pytz/zoneinfo/Pacific/Guadalcanal | Bin 0 -> 152 bytes .../site-packages/pytz/zoneinfo/Pacific/Guam | Bin 0 -> 494 bytes .../pytz/zoneinfo/Pacific/Honolulu | Bin 0 -> 329 bytes .../pytz/zoneinfo/Pacific/Johnston | Bin 0 -> 329 bytes .../pytz/zoneinfo/Pacific/Kanton | Bin 0 -> 220 bytes .../pytz/zoneinfo/Pacific/Kiritimati | Bin 0 -> 224 bytes .../pytz/zoneinfo/Pacific/Kosrae | Bin 0 -> 337 bytes .../pytz/zoneinfo/Pacific/Kwajalein | Bin 0 -> 302 bytes .../pytz/zoneinfo/Pacific/Majuro | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Marquesas | Bin 0 -> 159 bytes .../pytz/zoneinfo/Pacific/Midway | Bin 0 -> 175 bytes .../site-packages/pytz/zoneinfo/Pacific/Nauru | Bin 0 -> 238 bytes .../site-packages/pytz/zoneinfo/Pacific/Niue | Bin 0 -> 189 bytes .../pytz/zoneinfo/Pacific/Norfolk | Bin 0 -> 866 bytes .../pytz/zoneinfo/Pacific/Noumea | Bin 0 -> 290 bytes .../pytz/zoneinfo/Pacific/Pago_Pago | Bin 0 -> 175 bytes .../site-packages/pytz/zoneinfo/Pacific/Palau | Bin 0 -> 166 bytes .../pytz/zoneinfo/Pacific/Pitcairn | Bin 0 -> 188 bytes .../pytz/zoneinfo/Pacific/Pohnpei | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Ponape | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Port_Moresby | Bin 0 -> 172 bytes .../pytz/zoneinfo/Pacific/Rarotonga | Bin 0 -> 589 bytes .../pytz/zoneinfo/Pacific/Saipan | Bin 0 -> 494 bytes .../site-packages/pytz/zoneinfo/Pacific/Samoa | Bin 0 -> 175 bytes .../pytz/zoneinfo/Pacific/Tahiti | Bin 0 -> 151 bytes .../pytz/zoneinfo/Pacific/Tarawa | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Tongatapu | Bin 0 -> 358 bytes .../site-packages/pytz/zoneinfo/Pacific/Truk | Bin 0 -> 172 bytes .../site-packages/pytz/zoneinfo/Pacific/Wake | Bin 0 -> 152 bytes .../pytz/zoneinfo/Pacific/Wallis | Bin 0 -> 152 bytes .../site-packages/pytz/zoneinfo/Pacific/Yap | Bin 0 -> 172 bytes .../site-packages/pytz/zoneinfo/Poland | Bin 0 -> 2654 bytes .../site-packages/pytz/zoneinfo/Portugal | Bin 0 -> 3497 bytes .../site-packages/pytz/zoneinfo/ROC | Bin 0 -> 761 bytes .../site-packages/pytz/zoneinfo/ROK | Bin 0 -> 617 bytes .../site-packages/pytz/zoneinfo/Singapore | Bin 0 -> 401 bytes .../site-packages/pytz/zoneinfo/Turkey | Bin 0 -> 1933 bytes .../site-packages/pytz/zoneinfo/UCT | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/US/Alaska | Bin 0 -> 2371 bytes .../site-packages/pytz/zoneinfo/US/Aleutian | Bin 0 -> 2356 bytes .../site-packages/pytz/zoneinfo/US/Arizona | Bin 0 -> 360 bytes .../site-packages/pytz/zoneinfo/US/Central | Bin 0 -> 3592 bytes .../pytz/zoneinfo/US/East-Indiana | Bin 0 -> 1682 bytes .../site-packages/pytz/zoneinfo/US/Eastern | Bin 0 -> 3552 bytes .../site-packages/pytz/zoneinfo/US/Hawaii | Bin 0 -> 329 bytes .../pytz/zoneinfo/US/Indiana-Starke | Bin 0 -> 2444 bytes .../site-packages/pytz/zoneinfo/US/Michigan | Bin 0 -> 2230 bytes .../site-packages/pytz/zoneinfo/US/Mountain | Bin 0 -> 2460 bytes .../site-packages/pytz/zoneinfo/US/Pacific | Bin 0 -> 2852 bytes .../site-packages/pytz/zoneinfo/US/Samoa | Bin 0 -> 175 bytes .../site-packages/pytz/zoneinfo/UTC | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/Universal | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/W-SU | Bin 0 -> 1535 bytes .../site-packages/pytz/zoneinfo/WET | Bin 0 -> 1905 bytes .../site-packages/pytz/zoneinfo/Zulu | Bin 0 -> 114 bytes .../site-packages/pytz/zoneinfo/iso3166.tab | 274 + .../site-packages/pytz/zoneinfo/leapseconds | 82 + .../site-packages/pytz/zoneinfo/tzdata.zi | 4285 +++++ .../site-packages/pytz/zoneinfo/zone.tab | 448 + .../site-packages/pytz/zoneinfo/zone1970.tab | 374 + .../redis-4.5.5.dist-info/INSTALLER | 1 + .../redis-4.5.5.dist-info/LICENSE | 21 + .../redis-4.5.5.dist-info/METADATA | 189 + .../redis-4.5.5.dist-info/RECORD | 133 + .../redis-4.5.5.dist-info/REQUESTED | 0 .../site-packages/redis-4.5.5.dist-info/WHEEL | 5 + .../redis-4.5.5.dist-info/top_level.txt | 1 + .../site-packages/redis/__init__.py | 91 + .../site-packages/redis/asyncio/__init__.py | 64 + .../site-packages/redis/asyncio/client.py | 1420 ++ .../site-packages/redis/asyncio/cluster.py | 1593 ++ .../site-packages/redis/asyncio/connection.py | 1671 ++ .../site-packages/redis/asyncio/lock.py | 313 + .../site-packages/redis/asyncio/parser.py | 94 + .../site-packages/redis/asyncio/retry.py | 67 + .../site-packages/redis/asyncio/sentinel.py | 372 + .../site-packages/redis/asyncio/utils.py | 28 + lib/python3.11/site-packages/redis/backoff.py | 114 + lib/python3.11/site-packages/redis/client.py | 2142 +++ lib/python3.11/site-packages/redis/cluster.py | 2355 +++ .../site-packages/redis/commands/__init__.py | 20 + .../redis/commands/bf/__init__.py | 210 + .../redis/commands/bf/commands.py | 545 + .../site-packages/redis/commands/bf/info.py | 87 + .../site-packages/redis/commands/cluster.py | 914 + .../site-packages/redis/commands/core.py | 6074 +++++++ .../redis/commands/graph/__init__.py | 255 + .../redis/commands/graph/commands.py | 313 + .../redis/commands/graph/edge.py | 91 + .../redis/commands/graph/exceptions.py | 3 + .../redis/commands/graph/execution_plan.py | 211 + .../redis/commands/graph/node.py | 88 + .../redis/commands/graph/path.py | 78 + .../redis/commands/graph/query_result.py | 573 + .../site-packages/redis/commands/helpers.py | 158 + .../redis/commands/json/__init__.py | 133 + .../redis/commands/json/_util.py | 3 + .../redis/commands/json/commands.py | 390 + .../redis/commands/json/decoders.py | 60 + .../site-packages/redis/commands/json/path.py | 16 + .../site-packages/redis/commands/parser.py | 166 + .../redis/commands/redismodules.py | 103 + .../redis/commands/search/__init__.py | 171 + .../redis/commands/search/_util.py | 7 + .../redis/commands/search/aggregation.py | 368 + .../redis/commands/search/commands.py | 1096 ++ .../redis/commands/search/document.py | 17 + .../redis/commands/search/field.py | 169 + .../redis/commands/search/indexDefinition.py | 79 + .../redis/commands/search/query.py | 342 + .../redis/commands/search/querystring.py | 317 + .../redis/commands/search/reducers.py | 178 + .../redis/commands/search/result.py | 73 + .../redis/commands/search/suggestion.py | 51 + .../site-packages/redis/commands/sentinel.py | 99 + .../redis/commands/timeseries/__init__.py | 98 + .../redis/commands/timeseries/commands.py | 896 + .../redis/commands/timeseries/info.py | 82 + .../redis/commands/timeseries/utils.py | 44 + lib/python3.11/site-packages/redis/compat.py | 9 + .../site-packages/redis/connection.py | 1704 ++ lib/python3.11/site-packages/redis/crc.py | 23 + .../site-packages/redis/credentials.py | 26 + .../site-packages/redis/exceptions.py | 205 + lib/python3.11/site-packages/redis/lock.py | 308 + lib/python3.11/site-packages/redis/ocsp.py | 308 + lib/python3.11/site-packages/redis/retry.py | 54 + .../site-packages/redis/sentinel.py | 344 + lib/python3.11/site-packages/redis/typing.py | 54 + lib/python3.11/site-packages/redis/utils.py | 112 + .../requests-2.31.0.dist-info/INSTALLER | 1 + .../requests-2.31.0.dist-info/LICENSE | 175 + .../requests-2.31.0.dist-info/METADATA | 122 + .../requests-2.31.0.dist-info/RECORD | 43 + .../requests-2.31.0.dist-info/REQUESTED | 0 .../requests-2.31.0.dist-info/WHEEL | 5 + .../requests-2.31.0.dist-info/top_level.txt | 1 + .../site-packages/requests/__init__.py | 180 + .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 50 + .../site-packages/requests/adapters.py | 538 + lib/python3.11/site-packages/requests/api.py | 157 + lib/python3.11/site-packages/requests/auth.py | 315 + .../site-packages/requests/certs.py | 17 + .../site-packages/requests/compat.py | 79 + .../site-packages/requests/cookies.py | 561 + .../site-packages/requests/exceptions.py | 141 + lib/python3.11/site-packages/requests/help.py | 134 + .../site-packages/requests/hooks.py | 33 + .../site-packages/requests/models.py | 1034 ++ .../site-packages/requests/packages.py | 28 + .../site-packages/requests/sessions.py | 833 + .../site-packages/requests/status_codes.py | 128 + .../site-packages/requests/structures.py | 99 + .../site-packages/requests/utils.py | 1094 ++ .../requests_file-1.5.1.dist-info/INSTALLER | 1 + .../requests_file-1.5.1.dist-info/LICENSE | 13 + .../requests_file-1.5.1.dist-info/METADATA | 21 + .../requests_file-1.5.1.dist-info/RECORD | 9 + .../requests_file-1.5.1.dist-info/REQUESTED | 0 .../requests_file-1.5.1.dist-info/WHEEL | 6 + .../top_level.txt | 1 + lib/python3.11/site-packages/requests_file.py | 117 + .../schedule-1.2.0.dist-info/AUTHORS.rst | 44 + .../schedule-1.2.0.dist-info/INSTALLER | 1 + .../schedule-1.2.0.dist-info/LICENSE.txt | 21 + .../schedule-1.2.0.dist-info/METADATA | 97 + .../schedule-1.2.0.dist-info/RECORD | 11 + .../schedule-1.2.0.dist-info/REQUESTED | 0 .../schedule-1.2.0.dist-info/WHEEL | 6 + .../schedule-1.2.0.dist-info/top_level.txt | 1 + .../site-packages/schedule/__init__.py | 881 + .../site-packages/schedule/py.typed | 0 .../selenium-3.14.1.dist-info/DESCRIPTION.rst | 147 + .../selenium-3.14.1.dist-info/INSTALLER | 1 + .../selenium-3.14.1.dist-info/METADATA | 172 + .../selenium-3.14.1.dist-info/RECORD | 184 + .../selenium-3.14.1.dist-info/REQUESTED | 0 .../selenium-3.14.1.dist-info/WHEEL | 6 + .../selenium-3.14.1.dist-info/metadata.json | 1 + .../selenium-3.14.1.dist-info/top_level.txt | 1 + .../site-packages/selenium/__init__.py | 19 + .../site-packages/selenium/common/__init__.py | 18 + .../selenium/common/exceptions.py | 327 + .../selenium/webdriver/__init__.py | 39 + .../selenium/webdriver/android/__init__.py | 16 + .../selenium/webdriver/android/webdriver.py | 42 + .../selenium/webdriver/blackberry/__init__.py | 16 + .../webdriver/blackberry/webdriver.py | 116 + .../selenium/webdriver/chrome/__init__.py | 16 + .../selenium/webdriver/chrome/options.py | 211 + .../webdriver/chrome/remote_connection.py | 28 + .../selenium/webdriver/chrome/service.py | 45 + .../selenium/webdriver/chrome/webdriver.py | 161 + .../selenium/webdriver/common/__init__.py | 16 + .../webdriver/common/action_chains.py | 363 + .../webdriver/common/actions/__init__.py | 16 + .../common/actions/action_builder.py | 85 + .../webdriver/common/actions/input_device.py | 43 + .../webdriver/common/actions/interaction.py | 50 + .../webdriver/common/actions/key_actions.py | 50 + .../webdriver/common/actions/key_input.py | 51 + .../webdriver/common/actions/mouse_button.py | 5 + .../common/actions/pointer_actions.py | 100 + .../webdriver/common/actions/pointer_input.py | 63 + .../selenium/webdriver/common/alert.py | 105 + .../selenium/webdriver/common/by.py | 35 + .../webdriver/common/desired_capabilities.py | 128 + .../webdriver/common/html5/__init__.py | 16 + .../common/html5/application_cache.py | 48 + .../selenium/webdriver/common/keys.py | 96 + .../selenium/webdriver/common/proxy.py | 334 + .../selenium/webdriver/common/service.py | 178 + .../webdriver/common/touch_actions.py | 192 + .../selenium/webdriver/common/utils.py | 152 + .../selenium/webdriver/edge/__init__.py | 16 + .../selenium/webdriver/edge/options.py | 54 + .../selenium/webdriver/edge/service.py | 57 + .../selenium/webdriver/edge/webdriver.py | 71 + .../selenium/webdriver/firefox/__init__.py | 16 + .../firefox/amd64/x_ignore_nofocus.so | Bin 0 -> 41552 bytes .../webdriver/firefox/extension_connection.py | 84 + .../webdriver/firefox/firefox_binary.py | 217 + .../webdriver/firefox/firefox_profile.py | 384 + .../selenium/webdriver/firefox/options.py | 189 + .../webdriver/firefox/remote_connection.py | 34 + .../selenium/webdriver/firefox/service.py | 54 + .../selenium/webdriver/firefox/webdriver.py | 276 + .../selenium/webdriver/firefox/webdriver.xpi | Bin 0 -> 716051 bytes .../webdriver/firefox/webdriver_prefs.json | 69 + .../selenium/webdriver/firefox/webelement.py | 49 + .../webdriver/firefox/x86/x_ignore_nofocus.so | Bin 0 -> 30887 bytes .../selenium/webdriver/ie/__init__.py | 16 + .../selenium/webdriver/ie/options.py | 351 + .../selenium/webdriver/ie/service.py | 50 + .../selenium/webdriver/ie/webdriver.py | 105 + .../selenium/webdriver/opera/__init__.py | 16 + .../selenium/webdriver/opera/options.py | 115 + .../selenium/webdriver/opera/webdriver.py | 83 + .../selenium/webdriver/phantomjs/__init__.py | 16 + .../selenium/webdriver/phantomjs/service.py | 68 + .../selenium/webdriver/phantomjs/webdriver.py | 80 + .../selenium/webdriver/remote/__init__.py | 16 + .../selenium/webdriver/remote/command.py | 174 + .../selenium/webdriver/remote/errorhandler.py | 245 + .../webdriver/remote/file_detector.py | 58 + .../selenium/webdriver/remote/getAttribute.js | 8 + .../selenium/webdriver/remote/isDisplayed.js | 101 + .../selenium/webdriver/remote/mobile.py | 85 + .../webdriver/remote/remote_connection.py | 443 + .../selenium/webdriver/remote/switch_to.py | 134 + .../selenium/webdriver/remote/utils.py | 90 + .../selenium/webdriver/remote/webdriver.py | 1262 ++ .../selenium/webdriver/remote/webelement.py | 708 + .../selenium/webdriver/safari/__init__.py | 16 + .../selenium/webdriver/safari/permissions.py | 28 + .../webdriver/safari/remote_connection.py | 27 + .../selenium/webdriver/safari/service.py | 60 + .../selenium/webdriver/safari/webdriver.py | 112 + .../selenium/webdriver/support/__init__.py | 16 + .../support/abstract_event_listener.py | 79 + .../selenium/webdriver/support/color.py | 310 + .../support/event_firing_webdriver.py | 322 + .../selenium/webdriver/support/events.py | 19 + .../webdriver/support/expected_conditions.py | 422 + .../selenium/webdriver/support/select.py | 241 + .../selenium/webdriver/support/ui.py | 19 + .../selenium/webdriver/support/wait.py | 96 + .../selenium/webdriver/webkitgtk/__init__.py | 16 + .../selenium/webdriver/webkitgtk/options.py | 107 + .../selenium/webdriver/webkitgtk/service.py | 42 + .../selenium/webdriver/webkitgtk/webdriver.py | 74 + .../PKG-INFO | 81 + .../SOURCES.txt | 15 + .../dependency_links.txt | 1 + .../installed-files.txt | 10 + .../not-zip-safe | 1 + .../requires.txt | 4 + .../top_level.txt | 1 + .../seleniumrequests/__init__.py | 35 + .../site-packages/seleniumrequests/request.py | 242 + .../setuptools-65.5.1.dist-info/INSTALLER | 1 + .../setuptools-65.5.1.dist-info/LICENSE | 19 + .../setuptools-65.5.1.dist-info/METADATA | 133 + .../setuptools-65.5.1.dist-info/RECORD | 458 + .../setuptools-65.5.1.dist-info/REQUESTED | 0 .../setuptools-65.5.1.dist-info/WHEEL | 5 + .../entry_points.txt | 57 + .../setuptools-65.5.1.dist-info/top_level.txt | 4 + .../site-packages/setuptools/__init__.py | 247 + .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 24 + .../setuptools/_distutils/_collections.py | 56 + .../setuptools/_distutils/_functools.py | 20 + .../setuptools/_distutils/_macos_compat.py | 12 + .../setuptools/_distutils/_msvccompiler.py | 572 + .../setuptools/_distutils/archive_util.py | 280 + .../setuptools/_distutils/bcppcompiler.py | 408 + .../setuptools/_distutils/ccompiler.py | 1220 ++ .../setuptools/_distutils/cmd.py | 436 + .../setuptools/_distutils/command/__init__.py | 25 + .../_distutils/command/_framework_compat.py | 55 + .../setuptools/_distutils/command/bdist.py | 157 + .../_distutils/command/bdist_dumb.py | 144 + .../_distutils/command/bdist_rpm.py | 615 + .../setuptools/_distutils/command/build.py | 153 + .../_distutils/command/build_clib.py | 208 + .../_distutils/command/build_ext.py | 787 + .../setuptools/_distutils/command/build_py.py | 407 + .../_distutils/command/build_scripts.py | 173 + .../setuptools/_distutils/command/check.py | 151 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 377 + .../setuptools/_distutils/command/install.py | 814 + .../_distutils/command/install_data.py | 84 + .../_distutils/command/install_egg_info.py | 91 + .../_distutils/command/install_headers.py | 45 + .../_distutils/command/install_lib.py | 238 + .../_distutils/command/install_scripts.py | 61 + .../_distutils/command/py37compat.py | 31 + .../setuptools/_distutils/command/register.py | 319 + .../setuptools/_distutils/command/sdist.py | 531 + .../setuptools/_distutils/command/upload.py | 205 + .../setuptools/_distutils/config.py | 139 + .../setuptools/_distutils/core.py | 291 + .../setuptools/_distutils/cygwinccompiler.py | 364 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 96 + .../setuptools/_distutils/dir_util.py | 243 + .../setuptools/_distutils/dist.py | 1286 ++ .../setuptools/_distutils/errors.py | 127 + .../setuptools/_distutils/extension.py | 248 + .../setuptools/_distutils/fancy_getopt.py | 470 + .../setuptools/_distutils/file_util.py | 249 + .../setuptools/_distutils/filelist.py | 371 + .../setuptools/_distutils/log.py | 80 + .../setuptools/_distutils/msvc9compiler.py | 832 + .../setuptools/_distutils/msvccompiler.py | 695 + .../setuptools/_distutils/py38compat.py | 8 + .../setuptools/_distutils/py39compat.py | 22 + .../setuptools/_distutils/spawn.py | 109 + .../setuptools/_distutils/sysconfig.py | 558 + .../setuptools/_distutils/text_file.py | 287 + .../setuptools/_distutils/unixccompiler.py | 401 + .../setuptools/_distutils/util.py | 513 + .../setuptools/_distutils/version.py | 358 + .../setuptools/_distutils/versionpredicate.py | 175 + .../site-packages/setuptools/_entry_points.py | 86 + .../site-packages/setuptools/_imp.py | 82 + .../site-packages/setuptools/_importlib.py | 47 + .../site-packages/setuptools/_itertools.py | 23 + .../site-packages/setuptools/_path.py | 29 + .../site-packages/setuptools/_reqs.py | 19 + .../setuptools/_vendor/__init__.py | 0 .../_vendor/importlib_metadata/__init__.py | 1047 ++ .../_vendor/importlib_metadata/_adapters.py | 68 + .../importlib_metadata/_collections.py | 30 + .../_vendor/importlib_metadata/_compat.py | 71 + .../_vendor/importlib_metadata/_functools.py | 104 + .../_vendor/importlib_metadata/_itertools.py | 73 + .../_vendor/importlib_metadata/_meta.py | 48 + .../_vendor/importlib_metadata/_text.py | 99 + .../_vendor/importlib_resources/__init__.py | 36 + .../_vendor/importlib_resources/_adapters.py | 170 + .../_vendor/importlib_resources/_common.py | 104 + .../_vendor/importlib_resources/_compat.py | 98 + .../_vendor/importlib_resources/_itertools.py | 35 + .../_vendor/importlib_resources/_legacy.py | 121 + .../_vendor/importlib_resources/abc.py | 137 + .../_vendor/importlib_resources/readers.py | 122 + .../_vendor/importlib_resources/simple.py | 116 + .../setuptools/_vendor/jaraco/__init__.py | 0 .../setuptools/_vendor/jaraco/context.py | 213 + .../setuptools/_vendor/jaraco/functools.py | 525 + .../_vendor/jaraco/text/__init__.py | 599 + .../_vendor/more_itertools/__init__.py | 4 + .../setuptools/_vendor/more_itertools/more.py | 3824 ++++ .../_vendor/more_itertools/recipes.py | 620 + .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 26 + .../setuptools/_vendor/packaging/__init__.py | 25 + .../_vendor/packaging/_manylinux.py | 301 + .../_vendor/packaging/_musllinux.py | 136 + .../_vendor/packaging/_structures.py | 61 + .../setuptools/_vendor/packaging/markers.py | 304 + .../_vendor/packaging/requirements.py | 146 + .../_vendor/packaging/specifiers.py | 802 + .../setuptools/_vendor/packaging/tags.py | 487 + .../setuptools/_vendor/packaging/utils.py | 136 + .../setuptools/_vendor/packaging/version.py | 504 + .../setuptools/_vendor/pyparsing/__init__.py | 331 + .../setuptools/_vendor/pyparsing/actions.py | 207 + .../setuptools/_vendor/pyparsing/common.py | 424 + .../setuptools/_vendor/pyparsing/core.py | 5814 ++++++ .../_vendor/pyparsing/diagram/__init__.py | 642 + .../_vendor/pyparsing/exceptions.py | 267 + .../setuptools/_vendor/pyparsing/helpers.py | 1088 ++ .../setuptools/_vendor/pyparsing/results.py | 760 + .../setuptools/_vendor/pyparsing/testing.py | 331 + .../setuptools/_vendor/pyparsing/unicode.py | 352 + .../setuptools/_vendor/pyparsing/util.py | 235 + .../setuptools/_vendor/tomli/__init__.py | 11 + .../setuptools/_vendor/tomli/_parser.py | 691 + .../setuptools/_vendor/tomli/_re.py | 107 + .../setuptools/_vendor/tomli/_types.py | 10 + .../setuptools/_vendor/typing_extensions.py | 2296 +++ .../site-packages/setuptools/_vendor/zipp.py | 329 + .../site-packages/setuptools/archive_util.py | 213 + .../site-packages/setuptools/build_meta.py | 511 + .../setuptools/command/__init__.py | 12 + .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 457 + .../setuptools/command/bdist_rpm.py | 40 + .../site-packages/setuptools/command/build.py | 146 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 383 + .../setuptools/command/build_py.py | 368 + .../setuptools/command/develop.py | 193 + .../setuptools/command/dist_info.py | 142 + .../setuptools/command/easy_install.py | 2312 +++ .../setuptools/command/editable_wheel.py | 844 + .../setuptools/command/egg_info.py | 763 + .../setuptools/command/install.py | 139 + .../setuptools/command/install_egg_info.py | 63 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 70 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 210 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 251 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 213 + .../setuptools/config/__init__.py | 35 + .../setuptools/config/_apply_pyprojecttoml.py | 377 + .../config/_validate_pyproject/__init__.py | 34 + .../_validate_pyproject/error_reporting.py | 318 + .../_validate_pyproject/extra_validations.py | 36 + .../fastjsonschema_exceptions.py | 51 + .../fastjsonschema_validations.py | 1035 ++ .../config/_validate_pyproject/formats.py | 259 + .../site-packages/setuptools/config/expand.py | 462 + .../setuptools/config/pyprojecttoml.py | 493 + .../setuptools/config/setupcfg.py | 762 + .../site-packages/setuptools/dep_util.py | 25 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/discovery.py | 600 + .../site-packages/setuptools/dist.py | 1222 ++ .../site-packages/setuptools/errors.py | 58 + .../site-packages/setuptools/extension.py | 148 + .../setuptools/extern/__init__.py | 76 + .../site-packages/setuptools/glob.py | 167 + .../site-packages/setuptools/installer.py | 104 + .../site-packages/setuptools/launch.py | 36 + .../site-packages/setuptools/logging.py | 36 + .../site-packages/setuptools/monkey.py | 165 + .../site-packages/setuptools/msvc.py | 1703 ++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1166 ++ .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 530 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/unicode_utils.py | 42 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 222 + .../setuptools/windows_support.py | 29 + .../six-1.16.0.dist-info/INSTALLER | 1 + .../six-1.16.0.dist-info/LICENSE | 18 + .../six-1.16.0.dist-info/METADATA | 49 + .../site-packages/six-1.16.0.dist-info/RECORD | 9 + .../six-1.16.0.dist-info/REQUESTED | 0 .../site-packages/six-1.16.0.dist-info/WHEEL | 6 + .../six-1.16.0.dist-info/top_level.txt | 1 + lib/python3.11/site-packages/six.py | 998 ++ .../soupsieve-2.4.1.dist-info/INSTALLER | 1 + .../soupsieve-2.4.1.dist-info/METADATA | 116 + .../soupsieve-2.4.1.dist-info/RECORD | 21 + .../soupsieve-2.4.1.dist-info/REQUESTED | 0 .../soupsieve-2.4.1.dist-info/WHEEL | 4 + .../licenses/LICENSE.md | 21 + .../site-packages/soupsieve/__init__.py | 169 + .../site-packages/soupsieve/__meta__.py | 197 + .../site-packages/soupsieve/css_match.py | 1590 ++ .../site-packages/soupsieve/css_parser.py | 1296 ++ .../site-packages/soupsieve/css_types.py | 408 + .../site-packages/soupsieve/pretty.py | 138 + .../site-packages/soupsieve/py.typed | 0 .../site-packages/soupsieve/util.py | 117 + .../tldextract-3.4.4.dist-info/INSTALLER | 1 + .../tldextract-3.4.4.dist-info/LICENSE | 29 + .../tldextract-3.4.4.dist-info/METADATA | 52 + .../tldextract-3.4.4.dist-info/RECORD | 27 + .../tldextract-3.4.4.dist-info/REQUESTED | 0 .../tldextract-3.4.4.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../tldextract-3.4.4.dist-info/top_level.txt | 1 + .../tldextract/.tld_set_snapshot | 13756 ++++++++++++++ .../site-packages/tldextract/__init__.py | 12 + .../site-packages/tldextract/__main__.py | 7 + .../site-packages/tldextract/_version.py | 4 + .../site-packages/tldextract/cache.py | 250 + .../site-packages/tldextract/cli.py | 91 + .../site-packages/tldextract/py.typed | 0 .../site-packages/tldextract/remote.py | 61 + .../site-packages/tldextract/suffix_list.py | 101 + .../site-packages/tldextract/tldextract.py | 453 + .../INSTALLER | 1 + .../typing_extensions-4.6.3.dist-info/LICENSE | 279 + .../METADATA | 64 + .../typing_extensions-4.6.3.dist-info/RECORD | 8 + .../REQUESTED | 0 .../typing_extensions-4.6.3.dist-info/WHEEL | 4 + .../site-packages/typing_extensions.py | 2869 +++ .../tzlocal-5.0.1.dist-info/INSTALLER | 1 + .../tzlocal-5.0.1.dist-info/LICENSE.txt | 19 + .../tzlocal-5.0.1.dist-info/METADATA | 613 + .../tzlocal-5.0.1.dist-info/RECORD | 17 + .../tzlocal-5.0.1.dist-info/WHEEL | 5 + .../tzlocal-5.0.1.dist-info/top_level.txt | 1 + .../tzlocal-5.0.1.dist-info/zip-safe | 1 + .../site-packages/tzlocal/__init__.py | 20 + lib/python3.11/site-packages/tzlocal/unix.py | 230 + lib/python3.11/site-packages/tzlocal/utils.py | 112 + lib/python3.11/site-packages/tzlocal/win32.py | 147 + .../site-packages/tzlocal/windows_tz.py | 718 + .../urllib3-1.26.2.dist-info/INSTALLER | 1 + .../urllib3-1.26.2.dist-info/LICENSE.txt | 21 + .../urllib3-1.26.2.dist-info/METADATA | 1349 ++ .../urllib3-1.26.2.dist-info/RECORD | 85 + .../urllib3-1.26.2.dist-info/REQUESTED | 0 .../urllib3-1.26.2.dist-info/WHEEL | 6 + .../urllib3-1.26.2.dist-info/top_level.txt | 1 + .../site-packages/urllib3/__init__.py | 85 + .../site-packages/urllib3/_collections.py | 337 + .../site-packages/urllib3/_version.py | 2 + .../site-packages/urllib3/connection.py | 535 + .../site-packages/urllib3/connectionpool.py | 1067 ++ .../site-packages/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 396 + .../urllib3/contrib/appengine.py | 314 + .../site-packages/urllib3/contrib/ntlmpool.py | 121 + .../urllib3/contrib/pyopenssl.py | 509 + .../urllib3/contrib/securetransport.py | 920 + .../site-packages/urllib3/contrib/socks.py | 216 + .../site-packages/urllib3/exceptions.py | 313 + .../site-packages/urllib3/fields.py | 274 + .../site-packages/urllib3/filepost.py | 98 + .../urllib3/packages/__init__.py | 5 + .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 51 + .../site-packages/urllib3/packages/six.py | 1021 ++ .../packages/ssl_match_hostname/__init__.py | 22 + .../ssl_match_hostname/_implementation.py | 160 + .../site-packages/urllib3/poolmanager.py | 536 + .../site-packages/urllib3/request.py | 170 + .../site-packages/urllib3/response.py | 821 + .../site-packages/urllib3/util/__init__.py | 49 + .../site-packages/urllib3/util/connection.py | 150 + .../site-packages/urllib3/util/proxy.py | 56 + .../site-packages/urllib3/util/queue.py | 22 + .../site-packages/urllib3/util/request.py | 143 + .../site-packages/urllib3/util/response.py | 107 + .../site-packages/urllib3/util/retry.py | 601 + .../site-packages/urllib3/util/ssl_.py | 474 + .../urllib3/util/ssltransport.py | 221 + .../site-packages/urllib3/util/timeout.py | 268 + .../site-packages/urllib3/util/url.py | 430 + .../site-packages/urllib3/util/wait.py | 153 + .../websockets-11.0.3.dist-info/INSTALLER | 1 + .../websockets-11.0.3.dist-info/LICENSE | 24 + .../websockets-11.0.3.dist-info/METADATA | 176 + .../websockets-11.0.3.dist-info/RECORD | 88 + .../websockets-11.0.3.dist-info/REQUESTED | 0 .../websockets-11.0.3.dist-info/WHEEL | 8 + .../websockets-11.0.3.dist-info/top_level.txt | 1 + .../site-packages/websockets/__init__.py | 114 + .../site-packages/websockets/__main__.py | 159 + .../site-packages/websockets/auth.py | 4 + .../site-packages/websockets/client.py | 358 + .../site-packages/websockets/connection.py | 13 + .../websockets/datastructures.py | 200 + .../site-packages/websockets/exceptions.py | 403 + .../websockets/extensions/__init__.py | 4 + .../websockets/extensions/base.py | 133 + .../extensions/permessage_deflate.py | 660 + .../site-packages/websockets/frames.py | 449 + .../site-packages/websockets/headers.py | 587 + .../site-packages/websockets/http.py | 30 + .../site-packages/websockets/http11.py | 364 + .../site-packages/websockets/imports.py | 99 + .../websockets/legacy/__init__.py | 0 .../websockets/legacy/async_timeout.py | 265 + .../site-packages/websockets/legacy/auth.py | 184 + .../site-packages/websockets/legacy/client.py | 713 + .../websockets/legacy/compatibility.py | 33 + .../websockets/legacy/framing.py | 176 + .../websockets/legacy/handshake.py | 165 + .../site-packages/websockets/legacy/http.py | 201 + .../websockets/legacy/protocol.py | 1642 ++ .../site-packages/websockets/legacy/server.py | 1196 ++ .../site-packages/websockets/protocol.py | 707 + .../site-packages/websockets/py.typed | 0 .../site-packages/websockets/server.py | 575 + .../site-packages/websockets/speedups.c | 223 + .../speedups.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 35480 bytes .../site-packages/websockets/streams.py | 151 + .../site-packages/websockets/sync/__init__.py | 0 .../site-packages/websockets/sync/client.py | 328 + .../websockets/sync/compatibility.py | 21 + .../websockets/sync/connection.py | 764 + .../site-packages/websockets/sync/messages.py | 281 + .../site-packages/websockets/sync/server.py | 529 + .../site-packages/websockets/sync/utils.py | 46 + .../site-packages/websockets/typing.py | 60 + .../site-packages/websockets/uri.py | 108 + .../site-packages/websockets/utils.py | 51 + .../site-packages/websockets/version.py | 78 + .../site-packages/werkzeug/__init__.py | 6 + .../site-packages/werkzeug/_internal.py | 553 + .../site-packages/werkzeug/_reloader.py | 446 + .../site-packages/werkzeug/datastructures.py | 3040 ++++ .../site-packages/werkzeug/datastructures.pyi | 921 + .../site-packages/werkzeug/debug/__init__.py | 533 + .../site-packages/werkzeug/debug/console.py | 222 + .../site-packages/werkzeug/debug/repr.py | 285 + .../werkzeug/debug/shared/ICON_LICENSE.md | 6 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 359 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/style.css | 150 + .../site-packages/werkzeug/debug/tbtools.py | 435 + .../site-packages/werkzeug/exceptions.py | 884 + .../site-packages/werkzeug/formparser.py | 465 + lib/python3.11/site-packages/werkzeug/http.py | 1327 ++ .../site-packages/werkzeug/local.py | 648 + .../werkzeug/middleware/__init__.py | 22 + .../werkzeug/middleware/dispatcher.py | 78 + .../werkzeug/middleware/http_proxy.py | 230 + .../site-packages/werkzeug/middleware/lint.py | 420 + .../werkzeug/middleware/profiler.py | 139 + .../werkzeug/middleware/proxy_fix.py | 187 + .../werkzeug/middleware/shared_data.py | 280 + .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 133 + .../werkzeug/routing/converters.py | 257 + .../werkzeug/routing/exceptions.py | 146 + .../site-packages/werkzeug/routing/map.py | 944 + .../site-packages/werkzeug/routing/matcher.py | 192 + .../site-packages/werkzeug/routing/rules.py | 904 + .../site-packages/werkzeug/sansio/__init__.py | 0 .../site-packages/werkzeug/sansio/http.py | 136 + .../werkzeug/sansio/multipart.py | 287 + .../site-packages/werkzeug/sansio/request.py | 547 + .../site-packages/werkzeug/sansio/response.py | 704 + .../site-packages/werkzeug/sansio/utils.py | 165 + .../site-packages/werkzeug/security.py | 140 + .../site-packages/werkzeug/serving.py | 1069 ++ lib/python3.11/site-packages/werkzeug/test.py | 1338 ++ .../site-packages/werkzeug/testapp.py | 241 + lib/python3.11/site-packages/werkzeug/urls.py | 1067 ++ .../site-packages/werkzeug/user_agent.py | 47 + .../site-packages/werkzeug/utils.py | 706 + .../werkzeug/wrappers/__init__.py | 3 + .../werkzeug/wrappers/request.py | 634 + .../werkzeug/wrappers/response.py | 885 + lib/python3.11/site-packages/werkzeug/wsgi.py | 1058 ++ .../wget-3.2-py3.11.egg-info/PKG-INFO | 125 + .../wget-3.2-py3.11.egg-info/SOURCES.txt | 7 + .../dependency_links.txt | 1 + .../installed-files.txt | 6 + .../wget-3.2-py3.11.egg-info/top_level.txt | 1 + lib/python3.11/site-packages/wget.py | 628 + .../yt_dlp-2023.3.4.dist-info/AUTHORS | 0 .../yt_dlp-2023.3.4.dist-info/INSTALLER | 1 + .../yt_dlp-2023.3.4.dist-info/LICENSE | 24 + .../yt_dlp-2023.3.4.dist-info/METADATA | 2274 +++ .../yt_dlp-2023.3.4.dist-info/RECORD | 2193 +++ .../yt_dlp-2023.3.4.dist-info/REQUESTED | 0 .../yt_dlp-2023.3.4.dist-info/WHEEL | 6 + .../entry_points.txt | 5 + .../yt_dlp-2023.3.4.dist-info/top_level.txt | 1 + .../site-packages/yt_dlp/YoutubeDL.py | 4076 +++++ .../site-packages/yt_dlp/__init__.py | 991 + .../site-packages/yt_dlp/__main__.py | 17 + .../yt_dlp/__pyinstaller/__init__.py | 5 + .../yt_dlp/__pyinstaller/hook-yt_dlp.py | 31 + lib/python3.11/site-packages/yt_dlp/aes.py | 567 + lib/python3.11/site-packages/yt_dlp/cache.py | 91 + .../site-packages/yt_dlp/compat/__init__.py | 72 + .../yt_dlp/compat/_deprecated.py | 16 + .../site-packages/yt_dlp/compat/_legacy.py | 107 + .../yt_dlp/compat/compat_utils.py | 83 + .../site-packages/yt_dlp/compat/functools.py | 26 + .../site-packages/yt_dlp/compat/imghdr.py | 16 + .../site-packages/yt_dlp/compat/shutil.py | 30 + .../site-packages/yt_dlp/cookies.py | 1087 ++ .../yt_dlp/dependencies/Cryptodome.py | 36 + .../yt_dlp/dependencies/__init__.py | 83 + .../yt_dlp/downloader/__init__.py | 130 + .../site-packages/yt_dlp/downloader/common.py | 475 + .../site-packages/yt_dlp/downloader/dash.py | 87 + .../yt_dlp/downloader/external.py | 628 + .../site-packages/yt_dlp/downloader/f4m.py | 427 + .../site-packages/yt_dlp/downloader/fc2.py | 46 + .../yt_dlp/downloader/fragment.py | 534 + .../site-packages/yt_dlp/downloader/hls.py | 365 + .../site-packages/yt_dlp/downloader/http.py | 390 + .../site-packages/yt_dlp/downloader/ism.py | 283 + .../site-packages/yt_dlp/downloader/mhtml.py | 189 + .../yt_dlp/downloader/niconico.py | 52 + .../site-packages/yt_dlp/downloader/rtmp.py | 213 + .../site-packages/yt_dlp/downloader/rtsp.py | 42 + .../yt_dlp/downloader/websocket.py | 53 + .../yt_dlp/downloader/youtube_live_chat.py | 230 + .../yt_dlp/extractor/__init__.py | 42 + .../yt_dlp/extractor/_extractors.py | 2429 +++ .../site-packages/yt_dlp/extractor/abc.py | 313 + .../site-packages/yt_dlp/extractor/abcnews.py | 153 + .../site-packages/yt_dlp/extractor/abcotvs.py | 130 + .../site-packages/yt_dlp/extractor/abematv.py | 522 + .../yt_dlp/extractor/academicearth.py | 39 + .../site-packages/yt_dlp/extractor/acast.py | 121 + .../site-packages/yt_dlp/extractor/acfun.py | 199 + .../site-packages/yt_dlp/extractor/adn.py | 259 + .../yt_dlp/extractor/adobeconnect.py | 34 + .../yt_dlp/extractor/adobepass.py | 1778 ++ .../site-packages/yt_dlp/extractor/adobetv.py | 286 + .../yt_dlp/extractor/adultswim.py | 197 + .../yt_dlp/extractor/aenetworks.py | 338 + .../site-packages/yt_dlp/extractor/aeonco.py | 40 + .../yt_dlp/extractor/afreecatv.py | 533 + .../site-packages/yt_dlp/extractor/agora.py | 251 + .../yt_dlp/extractor/airmozilla.py | 63 + .../site-packages/yt_dlp/extractor/airtv.py | 96 + .../site-packages/yt_dlp/extractor/aitube.py | 60 + .../yt_dlp/extractor/aliexpress.py | 50 + .../yt_dlp/extractor/aljazeera.py | 83 + .../yt_dlp/extractor/allocine.py | 125 + .../yt_dlp/extractor/alphaporno.py | 75 + .../yt_dlp/extractor/alsace20tv.py | 83 + .../site-packages/yt_dlp/extractor/alura.py | 167 + .../site-packages/yt_dlp/extractor/amara.py | 100 + .../site-packages/yt_dlp/extractor/amazon.py | 170 + .../yt_dlp/extractor/amazonminitv.py | 291 + .../yt_dlp/extractor/amcnetworks.py | 146 + .../yt_dlp/extractor/americastestkitchen.py | 215 + .../site-packages/yt_dlp/extractor/amp.py | 98 + .../yt_dlp/extractor/anchorfm.py | 98 + .../site-packages/yt_dlp/extractor/angel.py | 56 + .../yt_dlp/extractor/ant1newsgr.py | 128 + .../site-packages/yt_dlp/extractor/anvato.py | 412 + .../site-packages/yt_dlp/extractor/aol.py | 132 + .../site-packages/yt_dlp/extractor/apa.py | 82 + .../site-packages/yt_dlp/extractor/aparat.py | 88 + .../yt_dlp/extractor/appleconnect.py | 50 + .../yt_dlp/extractor/applepodcasts.py | 85 + .../yt_dlp/extractor/appletrailers.py | 278 + .../yt_dlp/extractor/archiveorg.py | 1183 ++ .../yt_dlp/extractor/arcpublishing.py | 164 + .../site-packages/yt_dlp/extractor/ard.py | 645 + .../site-packages/yt_dlp/extractor/arkena.py | 150 + .../site-packages/yt_dlp/extractor/arnes.py | 98 + .../site-packages/yt_dlp/extractor/arte.py | 324 + .../yt_dlp/extractor/asiancrush.py | 196 + .../yt_dlp/extractor/atresplayer.py | 104 + .../yt_dlp/extractor/atscaleconf.py | 34 + .../yt_dlp/extractor/atttechchannel.py | 53 + .../site-packages/yt_dlp/extractor/atvat.py | 108 + .../yt_dlp/extractor/audimedia.py | 89 + .../yt_dlp/extractor/audioboom.py | 57 + .../yt_dlp/extractor/audiodraft.py | 93 + .../yt_dlp/extractor/audiomack.py | 147 + .../site-packages/yt_dlp/extractor/audius.py | 271 + .../site-packages/yt_dlp/extractor/awaan.py | 184 + .../site-packages/yt_dlp/extractor/aws.py | 75 + .../yt_dlp/extractor/azmedien.py | 66 + .../site-packages/yt_dlp/extractor/baidu.py | 51 + .../site-packages/yt_dlp/extractor/banbye.py | 148 + .../yt_dlp/extractor/bandaichannel.py | 33 + .../yt_dlp/extractor/bandcamp.py | 485 + .../yt_dlp/extractor/bannedvideo.py | 155 + .../site-packages/yt_dlp/extractor/bbc.py | 1643 ++ .../yt_dlp/extractor/beatbump.py | 101 + .../yt_dlp/extractor/beatport.py | 97 + .../site-packages/yt_dlp/extractor/beeg.py | 89 + .../yt_dlp/extractor/behindkink.py | 41 + .../yt_dlp/extractor/bellmedia.py | 91 + .../yt_dlp/extractor/berufetv.py | 70 + .../site-packages/yt_dlp/extractor/bet.py | 80 + .../site-packages/yt_dlp/extractor/bfi.py | 34 + .../site-packages/yt_dlp/extractor/bfmtv.py | 117 + .../site-packages/yt_dlp/extractor/bibeltv.py | 27 + .../site-packages/yt_dlp/extractor/bigflix.py | 73 + .../site-packages/yt_dlp/extractor/bigo.py | 56 + .../site-packages/yt_dlp/extractor/bild.py | 37 + .../yt_dlp/extractor/bilibili.py | 1233 ++ .../yt_dlp/extractor/biobiochiletv.py | 83 + .../site-packages/yt_dlp/extractor/biqle.py | 110 + .../yt_dlp/extractor/bitchute.py | 233 + .../site-packages/yt_dlp/extractor/bitwave.py | 58 + .../yt_dlp/extractor/blackboardcollaborate.py | 63 + .../yt_dlp/extractor/bleacherreport.py | 109 + .../site-packages/yt_dlp/extractor/blerp.py | 167 + .../site-packages/yt_dlp/extractor/blogger.py | 45 + .../yt_dlp/extractor/bloomberg.py | 77 + .../site-packages/yt_dlp/extractor/bokecc.py | 53 + .../yt_dlp/extractor/bongacams.py | 70 + .../site-packages/yt_dlp/extractor/booyah.py | 86 + .../yt_dlp/extractor/bostonglobe.py | 69 + .../site-packages/yt_dlp/extractor/box.py | 92 + .../site-packages/yt_dlp/extractor/boxcast.py | 102 + .../site-packages/yt_dlp/extractor/bpb.py | 56 + .../site-packages/yt_dlp/extractor/br.py | 308 + .../site-packages/yt_dlp/extractor/bravotv.py | 117 + .../yt_dlp/extractor/breakcom.py | 86 + .../yt_dlp/extractor/breitbart.py | 34 + .../yt_dlp/extractor/brightcove.py | 950 + .../yt_dlp/extractor/bundesliga.py | 34 + .../yt_dlp/extractor/businessinsider.py | 45 + .../yt_dlp/extractor/buzzfeed.py | 95 + .../site-packages/yt_dlp/extractor/byutv.py | 118 + .../site-packages/yt_dlp/extractor/c56.py | 59 + .../site-packages/yt_dlp/extractor/cableav.py | 32 + .../site-packages/yt_dlp/extractor/callin.py | 155 + .../yt_dlp/extractor/caltrans.py | 37 + .../site-packages/yt_dlp/extractor/cam4.py | 31 + .../site-packages/yt_dlp/extractor/camdemy.py | 158 + .../yt_dlp/extractor/cammodels.py | 77 + .../site-packages/yt_dlp/extractor/camsoda.py | 57 + .../yt_dlp/extractor/camtasia.py | 71 + .../yt_dlp/extractor/camwithher.py | 87 + .../yt_dlp/extractor/canalalpha.py | 94 + .../site-packages/yt_dlp/extractor/canalc2.py | 68 + .../yt_dlp/extractor/canalplus.py | 110 + .../site-packages/yt_dlp/extractor/canvas.py | 383 + .../yt_dlp/extractor/carambatv.py | 105 + .../yt_dlp/extractor/cartoonnetwork.py | 59 + .../site-packages/yt_dlp/extractor/cbc.py | 518 + .../site-packages/yt_dlp/extractor/cbs.py | 164 + .../yt_dlp/extractor/cbsinteractive.py | 98 + .../yt_dlp/extractor/cbslocal.py | 116 + .../site-packages/yt_dlp/extractor/cbsnews.py | 143 + .../yt_dlp/extractor/cbssports.py | 108 + .../site-packages/yt_dlp/extractor/ccc.py | 108 + .../site-packages/yt_dlp/extractor/ccma.py | 141 + .../site-packages/yt_dlp/extractor/cctv.py | 187 + .../site-packages/yt_dlp/extractor/cda.py | 338 + .../yt_dlp/extractor/cellebrite.py | 63 + .../yt_dlp/extractor/ceskatelevize.py | 289 + .../site-packages/yt_dlp/extractor/cgtn.py | 61 + .../yt_dlp/extractor/channel9.py | 252 + .../yt_dlp/extractor/charlierose.py | 50 + .../yt_dlp/extractor/chaturbate.py | 106 + .../yt_dlp/extractor/chilloutzone.py | 93 + .../yt_dlp/extractor/chingari.py | 207 + .../site-packages/yt_dlp/extractor/chirbit.py | 88 + .../yt_dlp/extractor/cinchcast.py | 56 + .../site-packages/yt_dlp/extractor/cinemax.py | 24 + .../yt_dlp/extractor/cinetecamilano.py | 61 + .../yt_dlp/extractor/ciscolive.py | 145 + .../yt_dlp/extractor/ciscowebex.py | 106 + .../site-packages/yt_dlp/extractor/cjsw.py | 67 + .../yt_dlp/extractor/cliphunter.py | 76 + .../site-packages/yt_dlp/extractor/clippit.py | 70 + .../site-packages/yt_dlp/extractor/cliprs.py | 30 + .../yt_dlp/extractor/clipsyndicate.py | 52 + .../yt_dlp/extractor/closertotruth.py | 88 + .../yt_dlp/extractor/cloudflarestream.py | 60 + .../site-packages/yt_dlp/extractor/cloudy.py | 57 + .../site-packages/yt_dlp/extractor/clubic.py | 52 + .../site-packages/yt_dlp/extractor/clyp.py | 99 + .../site-packages/yt_dlp/extractor/cmt.py | 54 + .../site-packages/yt_dlp/extractor/cnbc.py | 66 + .../site-packages/yt_dlp/extractor/cnn.py | 198 + .../yt_dlp/extractor/comedycentral.py | 52 + .../site-packages/yt_dlp/extractor/common.py | 3850 ++++ .../yt_dlp/extractor/commonmistakes.py | 42 + .../yt_dlp/extractor/commonprotocols.py | 70 + .../yt_dlp/extractor/condenast.py | 250 + .../site-packages/yt_dlp/extractor/contv.py | 113 + .../site-packages/yt_dlp/extractor/corus.py | 153 + .../site-packages/yt_dlp/extractor/coub.py | 136 + .../site-packages/yt_dlp/extractor/cozytv.py | 37 + .../site-packages/yt_dlp/extractor/cpac.py | 136 + .../site-packages/yt_dlp/extractor/cracked.py | 88 + .../site-packages/yt_dlp/extractor/crackle.py | 243 + .../site-packages/yt_dlp/extractor/craftsy.py | 68 + .../yt_dlp/extractor/crooksandliars.py | 59 + .../yt_dlp/extractor/crowdbunker.py | 109 + .../yt_dlp/extractor/crunchyroll.py | 319 + .../site-packages/yt_dlp/extractor/cspan.py | 286 + .../site-packages/yt_dlp/extractor/ctsnews.py | 84 + .../site-packages/yt_dlp/extractor/ctv.py | 49 + .../site-packages/yt_dlp/extractor/ctvnews.py | 70 + .../yt_dlp/extractor/cultureunplugged.py | 67 + .../yt_dlp/extractor/curiositystream.py | 203 + .../site-packages/yt_dlp/extractor/cwtv.py | 95 + .../site-packages/yt_dlp/extractor/cybrary.py | 144 + .../site-packages/yt_dlp/extractor/daftsex.py | 141 + .../yt_dlp/extractor/dailymail.py | 73 + .../yt_dlp/extractor/dailymotion.py | 412 + .../yt_dlp/extractor/dailywire.py | 113 + .../site-packages/yt_dlp/extractor/damtomo.py | 109 + .../site-packages/yt_dlp/extractor/daum.py | 258 + .../site-packages/yt_dlp/extractor/daystar.py | 47 + .../site-packages/yt_dlp/extractor/dbtv.py | 47 + .../site-packages/yt_dlp/extractor/dctp.py | 102 + .../site-packages/yt_dlp/extractor/deezer.py | 142 + .../site-packages/yt_dlp/extractor/defense.py | 37 + .../yt_dlp/extractor/democracynow.py | 91 + .../site-packages/yt_dlp/extractor/detik.py | 159 + .../site-packages/yt_dlp/extractor/deuxm.py | 76 + .../site-packages/yt_dlp/extractor/dfb.py | 52 + .../site-packages/yt_dlp/extractor/dhm.py | 57 + .../site-packages/yt_dlp/extractor/digg.py | 54 + .../yt_dlp/extractor/digitalconcerthall.py | 137 + .../yt_dlp/extractor/digiteka.py | 98 + .../yt_dlp/extractor/discovery.py | 115 + .../yt_dlp/extractor/discoverygo.py | 172 + .../site-packages/yt_dlp/extractor/disney.py | 160 + .../site-packages/yt_dlp/extractor/dispeak.py | 127 + .../site-packages/yt_dlp/extractor/dlive.py | 92 + .../site-packages/yt_dlp/extractor/dotsub.py | 81 + .../site-packages/yt_dlp/extractor/douyutv.py | 211 + .../site-packages/yt_dlp/extractor/dplay.py | 1003 ++ .../yt_dlp/extractor/drbonanza.py | 54 + .../site-packages/yt_dlp/extractor/dreisat.py | 41 + .../site-packages/yt_dlp/extractor/drooble.py | 113 + .../site-packages/yt_dlp/extractor/dropbox.py | 72 + .../site-packages/yt_dlp/extractor/dropout.py | 218 + .../site-packages/yt_dlp/extractor/drtuber.py | 104 + .../site-packages/yt_dlp/extractor/drtv.py | 470 + .../site-packages/yt_dlp/extractor/dtube.py | 79 + .../site-packages/yt_dlp/extractor/duboku.py | 241 + .../site-packages/yt_dlp/extractor/dumpert.py | 76 + .../site-packages/yt_dlp/extractor/dvtv.py | 177 + .../site-packages/yt_dlp/extractor/dw.py | 106 + .../yt_dlp/extractor/eagleplatform.py | 215 + .../yt_dlp/extractor/ebaumsworld.py | 31 + .../site-packages/yt_dlp/extractor/ebay.py | 36 + .../site-packages/yt_dlp/extractor/echomsk.py | 43 + .../site-packages/yt_dlp/extractor/egghead.py | 134 + .../site-packages/yt_dlp/extractor/ehow.py | 36 + .../yt_dlp/extractor/eighttracks.py | 161 + .../yt_dlp/extractor/einthusan.py | 105 + .../site-packages/yt_dlp/extractor/eitb.py | 83 + .../yt_dlp/extractor/ellentube.py | 130 + .../site-packages/yt_dlp/extractor/elonet.py | 64 + .../site-packages/yt_dlp/extractor/elpais.py | 92 + .../site-packages/yt_dlp/extractor/embedly.py | 109 + .../yt_dlp/extractor/engadget.py | 15 + .../site-packages/yt_dlp/extractor/epicon.py | 115 + .../site-packages/yt_dlp/extractor/epoch.py | 55 + .../site-packages/yt_dlp/extractor/eporner.py | 126 + .../yt_dlp/extractor/eroprofile.py | 122 + .../site-packages/yt_dlp/extractor/ertgr.py | 302 + .../yt_dlp/extractor/escapist.py | 108 + .../site-packages/yt_dlp/extractor/espn.py | 421 + .../site-packages/yt_dlp/extractor/esri.py | 70 + .../site-packages/yt_dlp/extractor/europa.py | 173 + .../yt_dlp/extractor/europeantour.py | 34 + .../yt_dlp/extractor/eurosport.py | 97 + .../yt_dlp/extractor/euscreen.py | 60 + .../site-packages/yt_dlp/extractor/expotv.py | 74 + .../yt_dlp/extractor/expressen.py | 90 + .../yt_dlp/extractor/extractors.py | 28 + .../yt_dlp/extractor/extremetube.py | 48 + .../site-packages/yt_dlp/extractor/eyedotv.py | 61 + .../yt_dlp/extractor/facebook.py | 799 + .../site-packages/yt_dlp/extractor/fancode.py | 179 + .../site-packages/yt_dlp/extractor/faz.py | 89 + .../site-packages/yt_dlp/extractor/fc2.py | 288 + .../site-packages/yt_dlp/extractor/fczenit.py | 51 + .../site-packages/yt_dlp/extractor/fifa.py | 83 + .../yt_dlp/extractor/filmmodu.py | 69 + .../site-packages/yt_dlp/extractor/filmon.py | 173 + .../site-packages/yt_dlp/extractor/filmweb.py | 38 + .../site-packages/yt_dlp/extractor/firsttv.py | 152 + .../site-packages/yt_dlp/extractor/fivetv.py | 85 + .../site-packages/yt_dlp/extractor/flickr.py | 114 + .../yt_dlp/extractor/folketinget.py | 73 + .../yt_dlp/extractor/footyroom.py | 53 + .../yt_dlp/extractor/formula1.py | 24 + .../yt_dlp/extractor/fourtube.py | 306 + .../yt_dlp/extractor/fourzerostudio.py | 106 + .../site-packages/yt_dlp/extractor/fox.py | 173 + .../site-packages/yt_dlp/extractor/fox9.py | 38 + .../site-packages/yt_dlp/extractor/foxgay.py | 58 + .../site-packages/yt_dlp/extractor/foxnews.py | 150 + .../yt_dlp/extractor/foxsports.py | 51 + .../site-packages/yt_dlp/extractor/fptplay.py | 117 + .../yt_dlp/extractor/franceinter.py | 56 + .../yt_dlp/extractor/francetv.py | 385 + .../yt_dlp/extractor/freesound.py | 77 + .../yt_dlp/extractor/freespeech.py | 29 + .../site-packages/yt_dlp/extractor/freetv.py | 139 + .../yt_dlp/extractor/frontendmasters.py | 252 + .../site-packages/yt_dlp/extractor/fujitv.py | 71 + .../yt_dlp/extractor/funimation.py | 349 + .../site-packages/yt_dlp/extractor/funk.py | 44 + .../site-packages/yt_dlp/extractor/fusion.py | 81 + .../site-packages/yt_dlp/extractor/fuyintv.py | 30 + .../site-packages/yt_dlp/extractor/gab.py | 141 + .../site-packages/yt_dlp/extractor/gaia.py | 122 + .../yt_dlp/extractor/gameinformer.py | 46 + .../yt_dlp/extractor/gamejolt.py | 540 + .../yt_dlp/extractor/gamespot.py | 75 + .../yt_dlp/extractor/gamestar.py | 60 + .../yt_dlp/extractor/gaskrank.py | 97 + .../site-packages/yt_dlp/extractor/gazeta.py | 43 + .../yt_dlp/extractor/gdcvault.py | 218 + .../yt_dlp/extractor/gedidigital.py | 198 + .../site-packages/yt_dlp/extractor/generic.py | 2829 +++ .../yt_dlp/extractor/genericembeds.py | 114 + .../site-packages/yt_dlp/extractor/genius.py | 127 + .../site-packages/yt_dlp/extractor/gettr.py | 206 + .../site-packages/yt_dlp/extractor/gfycat.py | 145 + .../yt_dlp/extractor/giantbomb.py | 85 + .../site-packages/yt_dlp/extractor/giga.py | 93 + .../site-packages/yt_dlp/extractor/gigya.py | 20 + .../site-packages/yt_dlp/extractor/glide.py | 38 + .../site-packages/yt_dlp/extractor/globo.py | 246 + .../site-packages/yt_dlp/extractor/glomex.py | 216 + .../site-packages/yt_dlp/extractor/go.py | 333 + .../site-packages/yt_dlp/extractor/godtube.py | 54 + .../site-packages/yt_dlp/extractor/gofile.py | 106 + .../site-packages/yt_dlp/extractor/golem.py | 68 + .../yt_dlp/extractor/goodgame.py | 57 + .../yt_dlp/extractor/googledrive.py | 338 + .../yt_dlp/extractor/googlepodcasts.py | 84 + .../yt_dlp/extractor/googlesearch.py | 38 + .../site-packages/yt_dlp/extractor/goplay.py | 394 + .../site-packages/yt_dlp/extractor/gopro.py | 105 + .../site-packages/yt_dlp/extractor/goshgay.py | 48 + .../yt_dlp/extractor/gotostage.py | 70 + .../yt_dlp/extractor/gputechconf.py | 32 + .../site-packages/yt_dlp/extractor/gronkh.py | 110 + .../site-packages/yt_dlp/extractor/groupon.py | 65 + .../yt_dlp/extractor/harpodeon.py | 70 + .../site-packages/yt_dlp/extractor/hbo.py | 171 + .../yt_dlp/extractor/hearthisat.py | 96 + .../site-packages/yt_dlp/extractor/heise.py | 207 + .../yt_dlp/extractor/hellporno.py | 72 + .../yt_dlp/extractor/helsinki.py | 38 + .../yt_dlp/extractor/hentaistigma.py | 37 + .../site-packages/yt_dlp/extractor/hgtv.py | 37 + .../site-packages/yt_dlp/extractor/hidive.py | 118 + .../yt_dlp/extractor/historicfilms.py | 45 + .../site-packages/yt_dlp/extractor/hitbox.py | 209 + .../yt_dlp/extractor/hitrecord.py | 66 + .../site-packages/yt_dlp/extractor/hketv.py | 187 + .../site-packages/yt_dlp/extractor/holodex.py | 100 + .../yt_dlp/extractor/hotnewhiphop.py | 64 + .../site-packages/yt_dlp/extractor/hotstar.py | 386 + .../site-packages/yt_dlp/extractor/howcast.py | 41 + .../yt_dlp/extractor/howstuffworks.py | 86 + .../yt_dlp/extractor/hrfensehen.py | 90 + .../site-packages/yt_dlp/extractor/hrti.py | 200 + .../site-packages/yt_dlp/extractor/hse.py | 93 + .../site-packages/yt_dlp/extractor/huajiao.py | 53 + .../yt_dlp/extractor/huffpost.py | 90 + .../site-packages/yt_dlp/extractor/hungama.py | 147 + .../site-packages/yt_dlp/extractor/huya.py | 134 + .../site-packages/yt_dlp/extractor/hypem.py | 47 + .../yt_dlp/extractor/hypergryph.py | 32 + .../site-packages/yt_dlp/extractor/hytale.py | 58 + .../site-packages/yt_dlp/extractor/icareus.py | 179 + .../yt_dlp/extractor/ichinanalive.py | 160 + .../site-packages/yt_dlp/extractor/ign.py | 402 + .../site-packages/yt_dlp/extractor/iheart.py | 94 + .../yt_dlp/extractor/iltalehti.py | 51 + .../site-packages/yt_dlp/extractor/imdb.py | 144 + .../yt_dlp/extractor/imggaming.py | 126 + .../site-packages/yt_dlp/extractor/imgur.py | 150 + .../site-packages/yt_dlp/extractor/ina.py | 84 + .../site-packages/yt_dlp/extractor/inc.py | 57 + .../yt_dlp/extractor/indavideo.py | 116 + .../site-packages/yt_dlp/extractor/infoq.py | 136 + .../yt_dlp/extractor/instagram.py | 730 + .../yt_dlp/extractor/internazionale.py | 75 + .../yt_dlp/extractor/internetvideoarchive.py | 58 + .../site-packages/yt_dlp/extractor/iprima.py | 273 + .../site-packages/yt_dlp/extractor/iqiyi.py | 755 + .../yt_dlp/extractor/islamchannel.py | 81 + .../yt_dlp/extractor/israelnationalnews.py | 50 + .../site-packages/yt_dlp/extractor/itprotv.py | 139 + .../site-packages/yt_dlp/extractor/itv.py | 266 + .../site-packages/yt_dlp/extractor/ivi.py | 253 + .../site-packages/yt_dlp/extractor/ivideon.py | 77 + .../site-packages/yt_dlp/extractor/iwara.py | 239 + .../site-packages/yt_dlp/extractor/ixigua.py | 83 + .../yt_dlp/extractor/izlesene.py | 113 + .../site-packages/yt_dlp/extractor/jable.py | 103 + .../site-packages/yt_dlp/extractor/jamendo.py | 210 + .../yt_dlp/extractor/japandiet.py | 274 + .../yt_dlp/extractor/jeuxvideo.py | 50 + .../site-packages/yt_dlp/extractor/jixie.py | 47 + .../site-packages/yt_dlp/extractor/joj.py | 108 + .../site-packages/yt_dlp/extractor/jove.py | 76 + .../yt_dlp/extractor/jwplatform.py | 75 + .../site-packages/yt_dlp/extractor/kakao.py | 152 + .../site-packages/yt_dlp/extractor/kaltura.py | 545 + .../site-packages/yt_dlp/extractor/kanal2.py | 66 + .../yt_dlp/extractor/kankanews.py | 48 + .../yt_dlp/extractor/karaoketv.py | 61 + .../yt_dlp/extractor/karrierevideos.py | 96 + .../yt_dlp/extractor/keezmovies.py | 125 + .../yt_dlp/extractor/kelbyone.py | 80 + .../site-packages/yt_dlp/extractor/ketnet.py | 70 + .../yt_dlp/extractor/khanacademy.py | 110 + .../site-packages/yt_dlp/extractor/kick.py | 127 + .../site-packages/yt_dlp/extractor/kicker.py | 55 + .../yt_dlp/extractor/kickstarter.py | 68 + .../site-packages/yt_dlp/extractor/kinja.py | 206 + .../yt_dlp/extractor/kinopoisk.py | 63 + .../yt_dlp/extractor/kommunetv.py | 31 + .../site-packages/yt_dlp/extractor/kompas.py | 26 + .../yt_dlp/extractor/konserthusetplay.py | 119 + .../site-packages/yt_dlp/extractor/koo.py | 113 + .../yt_dlp/extractor/krasview.py | 57 + .../site-packages/yt_dlp/extractor/kth.py | 28 + .../site-packages/yt_dlp/extractor/ku6.py | 30 + .../site-packages/yt_dlp/extractor/kusi.py | 83 + .../site-packages/yt_dlp/extractor/kuwo.py | 346 + .../site-packages/yt_dlp/extractor/la7.py | 239 + .../yt_dlp/extractor/laola1tv.py | 261 + .../site-packages/yt_dlp/extractor/lastfm.py | 126 + .../yt_dlp/extractor/lazy_extractors.py | 14877 ++++++++++++++++ .../site-packages/yt_dlp/extractor/lbry.py | 345 + .../site-packages/yt_dlp/extractor/lci.py | 28 + .../site-packages/yt_dlp/extractor/lcp.py | 87 + .../yt_dlp/extractor/lecture2go.py | 66 + .../yt_dlp/extractor/lecturio.py | 232 + .../site-packages/yt_dlp/extractor/leeco.py | 364 + .../yt_dlp/extractor/lefigaro.py | 135 + .../site-packages/yt_dlp/extractor/lego.py | 141 + .../site-packages/yt_dlp/extractor/lemonde.py | 56 + .../site-packages/yt_dlp/extractor/lenta.py | 50 + .../yt_dlp/extractor/libraryofcongress.py | 148 + .../site-packages/yt_dlp/extractor/libsyn.py | 89 + .../yt_dlp/extractor/lifenews.py | 234 + .../site-packages/yt_dlp/extractor/likee.py | 192 + .../yt_dlp/extractor/limelight.py | 358 + .../site-packages/yt_dlp/extractor/line.py | 143 + .../yt_dlp/extractor/linkedin.py | 255 + .../yt_dlp/extractor/linuxacademy.py | 241 + .../yt_dlp/extractor/liputan6.py | 64 + .../yt_dlp/extractor/listennotes.py | 86 + .../site-packages/yt_dlp/extractor/litv.py | 132 + .../yt_dlp/extractor/livejournal.py | 39 + .../yt_dlp/extractor/livestream.py | 363 + .../yt_dlp/extractor/livestreamfails.py | 37 + .../site-packages/yt_dlp/extractor/lnkgo.py | 163 + .../yt_dlp/extractor/localnews8.py | 42 + .../yt_dlp/extractor/lovehomeporn.py | 33 + .../site-packages/yt_dlp/extractor/lrt.py | 108 + .../site-packages/yt_dlp/extractor/lumni.py | 24 + .../site-packages/yt_dlp/extractor/lynda.py | 330 + .../site-packages/yt_dlp/extractor/m6.py | 22 + .../yt_dlp/extractor/magentamusik360.py | 58 + .../site-packages/yt_dlp/extractor/mailru.py | 340 + .../yt_dlp/extractor/mainstreaming.py | 210 + .../site-packages/yt_dlp/extractor/malltv.py | 107 + .../yt_dlp/extractor/mangomolo.py | 73 + .../site-packages/yt_dlp/extractor/manoto.py | 133 + .../yt_dlp/extractor/manyvids.py | 161 + .../site-packages/yt_dlp/extractor/maoritv.py | 28 + .../site-packages/yt_dlp/extractor/markiza.py | 122 + .../yt_dlp/extractor/massengeschmacktv.py | 73 + .../site-packages/yt_dlp/extractor/masters.py | 38 + .../site-packages/yt_dlp/extractor/matchtv.py | 51 + .../site-packages/yt_dlp/extractor/mdr.py | 184 + .../site-packages/yt_dlp/extractor/medaltv.py | 173 + .../yt_dlp/extractor/mediaite.py | 90 + .../yt_dlp/extractor/mediaklikk.py | 100 + .../yt_dlp/extractor/medialaan.py | 111 + .../yt_dlp/extractor/mediaset.py | 315 + .../yt_dlp/extractor/mediasite.py | 411 + .../yt_dlp/extractor/mediastream.py | 178 + .../yt_dlp/extractor/mediaworksnz.py | 103 + .../site-packages/yt_dlp/extractor/medici.py | 67 + .../yt_dlp/extractor/megaphone.py | 46 + .../yt_dlp/extractor/megatvcom.py | 164 + .../site-packages/yt_dlp/extractor/meipai.py | 99 + .../yt_dlp/extractor/melonvod.py | 68 + .../site-packages/yt_dlp/extractor/meta.py | 70 + .../yt_dlp/extractor/metacafe.py | 281 + .../yt_dlp/extractor/metacritic.py | 62 + .../site-packages/yt_dlp/extractor/mgoon.py | 81 + .../site-packages/yt_dlp/extractor/mgtv.py | 150 + .../site-packages/yt_dlp/extractor/miaopai.py | 36 + .../yt_dlp/extractor/microsoftembed.py | 65 + .../yt_dlp/extractor/microsoftstream.py | 121 + .../extractor/microsoftvirtualacademy.py | 189 + .../site-packages/yt_dlp/extractor/mildom.py | 291 + .../site-packages/yt_dlp/extractor/minds.py | 193 + .../yt_dlp/extractor/ministrygrid.py | 55 + .../site-packages/yt_dlp/extractor/minoto.py | 45 + .../site-packages/yt_dlp/extractor/miomio.py | 138 + .../yt_dlp/extractor/mirrativ.py | 118 + .../yt_dlp/extractor/mirrorcouk.py | 98 + .../site-packages/yt_dlp/extractor/mit.py | 130 + .../site-packages/yt_dlp/extractor/mitele.py | 82 + .../site-packages/yt_dlp/extractor/mixch.py | 81 + .../yt_dlp/extractor/mixcloud.py | 364 + .../site-packages/yt_dlp/extractor/mlb.py | 381 + .../yt_dlp/extractor/mlssoccer.py | 114 + .../site-packages/yt_dlp/extractor/mnet.py | 85 + .../site-packages/yt_dlp/extractor/mocha.py | 64 + .../yt_dlp/extractor/moevideo.py | 74 + .../site-packages/yt_dlp/extractor/mofosex.py | 70 + .../yt_dlp/extractor/mojvideo.py | 52 + .../yt_dlp/extractor/morningstar.py | 45 + .../yt_dlp/extractor/motherless.py | 249 + .../yt_dlp/extractor/motorsport.py | 51 + .../yt_dlp/extractor/movieclips.py | 46 + .../yt_dlp/extractor/moviepilot.py | 97 + .../site-packages/yt_dlp/extractor/moview.py | 43 + .../yt_dlp/extractor/moviezine.py | 38 + .../yt_dlp/extractor/movingimage.py | 50 + .../site-packages/yt_dlp/extractor/msn.py | 167 + .../site-packages/yt_dlp/extractor/mtv.py | 653 + .../yt_dlp/extractor/muenchentv.py | 71 + .../yt_dlp/extractor/murrtube.py | 162 + .../yt_dlp/extractor/musescore.py | 64 + .../yt_dlp/extractor/musicdex.py | 172 + .../site-packages/yt_dlp/extractor/mwave.py | 87 + .../yt_dlp/extractor/mxplayer.py | 241 + .../yt_dlp/extractor/mychannels.py | 35 + .../site-packages/yt_dlp/extractor/myspace.py | 195 + .../site-packages/yt_dlp/extractor/myspass.py | 92 + .../site-packages/yt_dlp/extractor/myvi.py | 100 + .../yt_dlp/extractor/myvideoge.py | 81 + .../yt_dlp/extractor/myvidster.py | 27 + .../site-packages/yt_dlp/extractor/n1.py | 137 + .../site-packages/yt_dlp/extractor/nate.py | 120 + .../yt_dlp/extractor/nationalgeographic.py | 80 + .../site-packages/yt_dlp/extractor/naver.py | 397 + .../site-packages/yt_dlp/extractor/nba.py | 419 + .../site-packages/yt_dlp/extractor/nbc.py | 800 + .../site-packages/yt_dlp/extractor/ndr.py | 471 + .../site-packages/yt_dlp/extractor/ndtv.py | 106 + .../site-packages/yt_dlp/extractor/nebula.py | 274 + .../yt_dlp/extractor/nerdcubed.py | 33 + .../yt_dlp/extractor/neteasemusic.py | 548 + .../yt_dlp/extractor/netverse.py | 281 + .../yt_dlp/extractor/netzkino.py | 84 + .../yt_dlp/extractor/newgrounds.py | 286 + .../yt_dlp/extractor/newspicks.py | 53 + .../yt_dlp/extractor/newstube.py | 75 + .../site-packages/yt_dlp/extractor/newsy.py | 47 + .../yt_dlp/extractor/nextmedia.py | 235 + .../site-packages/yt_dlp/extractor/nexx.py | 525 + .../site-packages/yt_dlp/extractor/nfb.py | 58 + .../yt_dlp/extractor/nfhsnetwork.py | 141 + .../site-packages/yt_dlp/extractor/nfl.py | 301 + .../site-packages/yt_dlp/extractor/nhk.py | 336 + .../site-packages/yt_dlp/extractor/nhl.py | 123 + .../site-packages/yt_dlp/extractor/nick.py | 244 + .../yt_dlp/extractor/niconico.py | 874 + .../yt_dlp/extractor/ninecninemedia.py | 130 + .../site-packages/yt_dlp/extractor/ninegag.py | 148 + .../site-packages/yt_dlp/extractor/ninenow.py | 122 + .../yt_dlp/extractor/nintendo.py | 57 + .../site-packages/yt_dlp/extractor/nitter.py | 340 + .../yt_dlp/extractor/njpwworld.py | 82 + .../yt_dlp/extractor/nobelprize.py | 58 + .../site-packages/yt_dlp/extractor/noice.py | 116 + .../yt_dlp/extractor/nonktube.py | 36 + .../yt_dlp/extractor/noodlemagazine.py | 62 + .../site-packages/yt_dlp/extractor/noovo.py | 101 + .../yt_dlp/extractor/normalboots.py | 51 + .../site-packages/yt_dlp/extractor/nosnl.py | 115 + .../yt_dlp/extractor/nosvideo.py | 72 + .../site-packages/yt_dlp/extractor/nova.py | 322 + .../yt_dlp/extractor/novaplay.py | 69 + .../site-packages/yt_dlp/extractor/nowness.py | 144 + .../site-packages/yt_dlp/extractor/noz.py | 82 + .../site-packages/yt_dlp/extractor/npo.py | 612 + .../site-packages/yt_dlp/extractor/npr.py | 132 + .../site-packages/yt_dlp/extractor/nrk.py | 874 + .../site-packages/yt_dlp/extractor/nrl.py | 26 + .../site-packages/yt_dlp/extractor/ntvcojp.py | 55 + .../site-packages/yt_dlp/extractor/ntvde.py | 73 + .../site-packages/yt_dlp/extractor/ntvru.py | 140 + .../site-packages/yt_dlp/extractor/nuevo.py | 36 + .../site-packages/yt_dlp/extractor/nuvid.py | 99 + .../site-packages/yt_dlp/extractor/nytimes.py | 262 + .../yt_dlp/extractor/nzherald.py | 123 + .../yt_dlp/extractor/nzonscreen.py | 93 + .../site-packages/yt_dlp/extractor/nzz.py | 40 + .../site-packages/yt_dlp/extractor/odatv.py | 47 + .../yt_dlp/extractor/odkmedia.py | 105 + .../yt_dlp/extractor/odnoklassniki.py | 436 + .../site-packages/yt_dlp/extractor/oftv.py | 54 + .../yt_dlp/extractor/oktoberfesttv.py | 44 + .../yt_dlp/extractor/olympics.py | 65 + .../site-packages/yt_dlp/extractor/on24.py | 87 + .../site-packages/yt_dlp/extractor/once.py | 40 + .../yt_dlp/extractor/ondemandkorea.py | 87 + .../yt_dlp/extractor/onefootball.py | 47 + .../yt_dlp/extractor/onenewsnz.py | 111 + .../yt_dlp/extractor/oneplace.py | 43 + .../site-packages/yt_dlp/extractor/onet.py | 259 + .../yt_dlp/extractor/onionstudios.py | 42 + .../site-packages/yt_dlp/extractor/ooyala.py | 230 + .../yt_dlp/extractor/opencast.py | 172 + .../yt_dlp/extractor/openload.py | 243 + .../site-packages/yt_dlp/extractor/openrec.py | 147 + .../site-packages/yt_dlp/extractor/ora.py | 71 + .../site-packages/yt_dlp/extractor/orf.py | 526 + .../yt_dlp/extractor/outsidetv.py | 25 + .../yt_dlp/extractor/packtpub.py | 158 + .../yt_dlp/extractor/palcomp3.py | 143 + .../yt_dlp/extractor/pandoratv.py | 128 + .../site-packages/yt_dlp/extractor/panopto.py | 600 + .../yt_dlp/extractor/paramountplus.py | 201 + .../site-packages/yt_dlp/extractor/parler.py | 111 + .../yt_dlp/extractor/parlview.py | 64 + .../site-packages/yt_dlp/extractor/patreon.py | 454 + .../site-packages/yt_dlp/extractor/pbs.py | 698 + .../yt_dlp/extractor/pearvideo.py | 68 + .../yt_dlp/extractor/peekvids.py | 191 + .../yt_dlp/extractor/peertube.py | 1399 ++ .../site-packages/yt_dlp/extractor/peertv.py | 52 + .../site-packages/yt_dlp/extractor/peloton.py | 215 + .../site-packages/yt_dlp/extractor/people.py | 29 + .../yt_dlp/extractor/performgroup.py | 77 + .../yt_dlp/extractor/periscope.py | 183 + .../yt_dlp/extractor/philharmoniedeparis.py | 97 + .../site-packages/yt_dlp/extractor/phoenix.py | 130 + .../yt_dlp/extractor/photobucket.py | 43 + .../site-packages/yt_dlp/extractor/piapro.py | 105 + .../site-packages/yt_dlp/extractor/picarto.py | 122 + .../site-packages/yt_dlp/extractor/piksel.py | 172 + .../yt_dlp/extractor/pinkbike.py | 93 + .../yt_dlp/extractor/pinterest.py | 248 + .../yt_dlp/extractor/pixivsketch.py | 118 + .../yt_dlp/extractor/pladform.py | 136 + .../yt_dlp/extractor/planetmarathi.py | 72 + .../site-packages/yt_dlp/extractor/platzi.py | 213 + .../site-packages/yt_dlp/extractor/playfm.py | 70 + .../yt_dlp/extractor/playplustv.py | 104 + .../site-packages/yt_dlp/extractor/plays.py | 49 + .../yt_dlp/extractor/playstuff.py | 63 + .../yt_dlp/extractor/playsuisse.py | 147 + .../yt_dlp/extractor/playtvak.py | 185 + .../site-packages/yt_dlp/extractor/playvid.py | 90 + .../yt_dlp/extractor/playwire.py | 72 + .../yt_dlp/extractor/pluralsight.py | 491 + .../site-packages/yt_dlp/extractor/plutotv.py | 194 + .../yt_dlp/extractor/podbayfm.py | 75 + .../yt_dlp/extractor/podchaser.py | 97 + .../yt_dlp/extractor/podomatic.py | 73 + .../site-packages/yt_dlp/extractor/pokemon.py | 136 + .../site-packages/yt_dlp/extractor/pokergo.py | 106 + .../yt_dlp/extractor/polsatgo.py | 86 + .../yt_dlp/extractor/polskieradio.py | 544 + .../yt_dlp/extractor/popcorntimes.py | 91 + .../yt_dlp/extractor/popcorntv.py | 72 + .../site-packages/yt_dlp/extractor/porn91.py | 95 + .../site-packages/yt_dlp/extractor/porncom.py | 99 + .../site-packages/yt_dlp/extractor/pornez.py | 42 + .../yt_dlp/extractor/pornflip.py | 77 + .../site-packages/yt_dlp/extractor/pornhd.py | 116 + .../site-packages/yt_dlp/extractor/pornhub.py | 816 + .../yt_dlp/extractor/pornotube.py | 83 + .../yt_dlp/extractor/pornovoisines.py | 102 + .../site-packages/yt_dlp/extractor/pornoxo.py | 54 + .../yt_dlp/extractor/pr0gramm.py | 97 + .../yt_dlp/extractor/prankcast.py | 66 + .../yt_dlp/extractor/premiershiprugby.py | 39 + .../site-packages/yt_dlp/extractor/presstv.py | 69 + .../yt_dlp/extractor/projectveritas.py | 51 + .../yt_dlp/extractor/prosiebensat1.py | 496 + .../site-packages/yt_dlp/extractor/prx.py | 428 + .../site-packages/yt_dlp/extractor/puhutv.py | 235 + .../site-packages/yt_dlp/extractor/puls4.py | 51 + .../site-packages/yt_dlp/extractor/pyvideo.py | 70 + .../yt_dlp/extractor/qingting.py | 47 + .../site-packages/yt_dlp/extractor/qqmusic.py | 365 + .../site-packages/yt_dlp/extractor/r7.py | 108 + .../site-packages/yt_dlp/extractor/radiko.py | 241 + .../yt_dlp/extractor/radiobremen.py | 59 + .../yt_dlp/extractor/radiocanada.py | 165 + .../site-packages/yt_dlp/extractor/radiode.py | 49 + .../yt_dlp/extractor/radiofrance.py | 104 + .../yt_dlp/extractor/radiojavan.py | 80 + .../yt_dlp/extractor/radiokapital.py | 97 + .../yt_dlp/extractor/radiozet.py | 50 + .../site-packages/yt_dlp/extractor/radlive.py | 184 + .../site-packages/yt_dlp/extractor/rai.py | 820 + .../yt_dlp/extractor/raywenderlich.py | 177 + .../site-packages/yt_dlp/extractor/rbgtum.py | 93 + .../yt_dlp/extractor/rbmaradio.py | 68 + .../site-packages/yt_dlp/extractor/rcs.py | 372 + .../site-packages/yt_dlp/extractor/rcti.py | 373 + .../site-packages/yt_dlp/extractor/rds.py | 67 + .../site-packages/yt_dlp/extractor/redbee.py | 379 + .../yt_dlp/extractor/redbulltv.py | 224 + .../site-packages/yt_dlp/extractor/reddit.py | 283 + .../site-packages/yt_dlp/extractor/redgifs.py | 260 + .../site-packages/yt_dlp/extractor/redtube.py | 140 + .../site-packages/yt_dlp/extractor/regiotv.py | 59 + .../site-packages/yt_dlp/extractor/rentv.py | 102 + .../site-packages/yt_dlp/extractor/restudy.py | 40 + .../site-packages/yt_dlp/extractor/reuters.py | 65 + .../yt_dlp/extractor/reverbnation.py | 51 + .../site-packages/yt_dlp/extractor/rice.py | 112 + .../yt_dlp/extractor/rmcdecouverte.py | 71 + .../yt_dlp/extractor/rockstargames.py | 64 + .../site-packages/yt_dlp/extractor/rokfin.py | 409 + .../yt_dlp/extractor/roosterteeth.py | 211 + .../yt_dlp/extractor/rottentomatoes.py | 30 + .../site-packages/yt_dlp/extractor/rozhlas.py | 179 + .../site-packages/yt_dlp/extractor/rte.py | 162 + .../site-packages/yt_dlp/extractor/rtl2.py | 193 + .../site-packages/yt_dlp/extractor/rtlnl.py | 294 + .../site-packages/yt_dlp/extractor/rtnews.py | 196 + .../site-packages/yt_dlp/extractor/rtp.py | 97 + .../site-packages/yt_dlp/extractor/rtrfm.py | 65 + .../site-packages/yt_dlp/extractor/rts.py | 231 + .../site-packages/yt_dlp/extractor/rtve.py | 344 + .../site-packages/yt_dlp/extractor/rtvnh.py | 58 + .../site-packages/yt_dlp/extractor/rtvs.py | 85 + .../site-packages/yt_dlp/extractor/rtvslo.py | 150 + .../site-packages/yt_dlp/extractor/ruhd.py | 42 + .../yt_dlp/extractor/rule34video.py | 61 + .../site-packages/yt_dlp/extractor/rumble.py | 332 + .../site-packages/yt_dlp/extractor/rutube.py | 365 + .../site-packages/yt_dlp/extractor/rutv.py | 203 + .../site-packages/yt_dlp/extractor/ruutu.py | 262 + .../site-packages/yt_dlp/extractor/ruv.py | 186 + .../site-packages/yt_dlp/extractor/safari.py | 259 + .../yt_dlp/extractor/saitosan.py | 74 + .../yt_dlp/extractor/samplefocus.py | 97 + .../site-packages/yt_dlp/extractor/sapo.py | 114 + .../yt_dlp/extractor/savefrom.py | 30 + .../site-packages/yt_dlp/extractor/sbs.py | 103 + .../site-packages/yt_dlp/extractor/screen9.py | 62 + .../yt_dlp/extractor/screencast.py | 117 + .../yt_dlp/extractor/screencastify.py | 52 + .../yt_dlp/extractor/screencastomatic.py | 72 + .../yt_dlp/extractor/scrippsnetworks.py | 148 + .../yt_dlp/extractor/scrolller.py | 102 + .../site-packages/yt_dlp/extractor/scte.py | 135 + .../site-packages/yt_dlp/extractor/seeker.py | 55 + .../yt_dlp/extractor/senategov.py | 200 + .../yt_dlp/extractor/sendtonews.py | 104 + .../site-packages/yt_dlp/extractor/servus.py | 135 + .../yt_dlp/extractor/sevenplus.py | 134 + .../site-packages/yt_dlp/extractor/sexu.py | 60 + .../yt_dlp/extractor/seznamzpravy.py | 157 + .../site-packages/yt_dlp/extractor/shahid.py | 217 + .../site-packages/yt_dlp/extractor/shared.py | 138 + .../yt_dlp/extractor/sharevideos.py | 6 + .../yt_dlp/extractor/shemaroome.py | 99 + .../yt_dlp/extractor/showroomlive.py | 80 + .../site-packages/yt_dlp/extractor/sibnet.py | 17 + .../yt_dlp/extractor/simplecast.py | 151 + .../site-packages/yt_dlp/extractor/sina.py | 109 + .../site-packages/yt_dlp/extractor/sixplay.py | 122 + .../site-packages/yt_dlp/extractor/skeb.py | 140 + .../site-packages/yt_dlp/extractor/sky.py | 156 + .../site-packages/yt_dlp/extractor/skyit.py | 227 + .../yt_dlp/extractor/skylinewebcams.py | 39 + .../yt_dlp/extractor/skynewsarabia.py | 114 + .../yt_dlp/extractor/skynewsau.py | 43 + .../yt_dlp/extractor/slideshare.py | 53 + .../yt_dlp/extractor/slideslive.py | 567 + .../yt_dlp/extractor/slutload.py | 63 + .../site-packages/yt_dlp/extractor/smotrim.py | 65 + .../site-packages/yt_dlp/extractor/snotr.py | 68 + .../site-packages/yt_dlp/extractor/sohu.py | 198 + .../site-packages/yt_dlp/extractor/sonyliv.py | 216 + .../yt_dlp/extractor/soundcloud.py | 951 + .../yt_dlp/extractor/soundgasm.py | 74 + .../yt_dlp/extractor/southpark.py | 188 + .../yt_dlp/extractor/sovietscloset.py | 208 + .../yt_dlp/extractor/spankbang.py | 195 + .../yt_dlp/extractor/spankwire.py | 174 + .../site-packages/yt_dlp/extractor/spiegel.py | 51 + .../site-packages/yt_dlp/extractor/spike.py | 46 + .../site-packages/yt_dlp/extractor/sport5.py | 86 + .../yt_dlp/extractor/sportbox.py | 88 + .../yt_dlp/extractor/sportdeutschland.py | 142 + .../site-packages/yt_dlp/extractor/spotify.py | 167 + .../yt_dlp/extractor/spreaker.py | 173 + .../yt_dlp/extractor/springboardplatform.py | 113 + .../site-packages/yt_dlp/extractor/sprout.py | 61 + .../site-packages/yt_dlp/extractor/srgssr.py | 247 + .../yt_dlp/extractor/srmediathek.py | 56 + .../yt_dlp/extractor/stanfordoc.py | 89 + .../yt_dlp/extractor/startrek.py | 75 + .../site-packages/yt_dlp/extractor/startv.py | 100 + .../site-packages/yt_dlp/extractor/steam.py | 174 + .../yt_dlp/extractor/stitcher.py | 142 + .../yt_dlp/extractor/storyfire.py | 135 + .../yt_dlp/extractor/streamable.py | 103 + .../yt_dlp/extractor/streamanity.py | 47 + .../yt_dlp/extractor/streamcloud.py | 75 + .../yt_dlp/extractor/streamcz.py | 122 + .../yt_dlp/extractor/streamff.py | 30 + .../yt_dlp/extractor/streetvoice.py | 97 + .../yt_dlp/extractor/stretchinternet.py | 35 + .../yt_dlp/extractor/stripchat.py | 67 + .../site-packages/yt_dlp/extractor/stv.py | 89 + .../yt_dlp/extractor/substack.py | 100 + .../yt_dlp/extractor/sunporno.py | 75 + .../yt_dlp/extractor/sverigesradio.py | 111 + .../site-packages/yt_dlp/extractor/svt.py | 413 + .../yt_dlp/extractor/swearnet.py | 73 + .../yt_dlp/extractor/swrmediathek.py | 111 + .../site-packages/yt_dlp/extractor/syfy.py | 56 + .../site-packages/yt_dlp/extractor/syvdk.py | 33 + .../site-packages/yt_dlp/extractor/sztvhu.py | 38 + .../yt_dlp/extractor/tagesschau.py | 149 + .../site-packages/yt_dlp/extractor/tass.py | 58 + .../site-packages/yt_dlp/extractor/tbs.py | 89 + .../yt_dlp/extractor/tdslifeway.py | 31 + .../yt_dlp/extractor/teachable.py | 295 + .../yt_dlp/extractor/teachertube.py | 124 + .../yt_dlp/extractor/teachingchannel.py | 31 + .../yt_dlp/extractor/teamcoco.py | 201 + .../yt_dlp/extractor/teamtreehouse.py | 134 + .../yt_dlp/extractor/techtalks.py | 80 + .../site-packages/yt_dlp/extractor/ted.py | 236 + .../site-packages/yt_dlp/extractor/tele13.py | 84 + .../site-packages/yt_dlp/extractor/tele5.py | 88 + .../yt_dlp/extractor/telebruxelles.py | 72 + .../yt_dlp/extractor/telecaribe.py | 77 + .../yt_dlp/extractor/telecinco.py | 147 + .../yt_dlp/extractor/telegraaf.py | 86 + .../yt_dlp/extractor/telegram.py | 136 + .../site-packages/yt_dlp/extractor/telemb.py | 74 + .../yt_dlp/extractor/telemundo.py | 53 + .../yt_dlp/extractor/telequebec.py | 237 + .../yt_dlp/extractor/teletask.py | 51 + .../yt_dlp/extractor/telewebion.py | 52 + .../site-packages/yt_dlp/extractor/tempo.py | 114 + .../site-packages/yt_dlp/extractor/tencent.py | 490 + .../yt_dlp/extractor/tennistv.py | 155 + .../site-packages/yt_dlp/extractor/tenplay.py | 118 + .../site-packages/yt_dlp/extractor/testurl.py | 46 + .../site-packages/yt_dlp/extractor/tf1.py | 82 + .../site-packages/yt_dlp/extractor/tfo.py | 52 + .../yt_dlp/extractor/theholetv.py | 35 + .../yt_dlp/extractor/theintercept.py | 46 + .../yt_dlp/extractor/theplatform.py | 401 + .../site-packages/yt_dlp/extractor/thestar.py | 33 + .../site-packages/yt_dlp/extractor/thesun.py | 36 + .../site-packages/yt_dlp/extractor/theta.py | 90 + .../yt_dlp/extractor/theweatherchannel.py | 97 + .../yt_dlp/extractor/thisamericanlife.py | 38 + .../site-packages/yt_dlp/extractor/thisav.py | 66 + .../yt_dlp/extractor/thisoldhouse.py | 55 + .../site-packages/yt_dlp/extractor/thisvid.py | 226 + .../yt_dlp/extractor/threeqsdn.py | 156 + .../yt_dlp/extractor/threespeak.py | 93 + .../site-packages/yt_dlp/extractor/tiktok.py | 1022 ++ .../site-packages/yt_dlp/extractor/tinypic.py | 54 + .../site-packages/yt_dlp/extractor/tmz.py | 191 + .../site-packages/yt_dlp/extractor/tnaflix.py | 337 + .../site-packages/yt_dlp/extractor/toggle.py | 228 + .../site-packages/yt_dlp/extractor/toggo.py | 82 + .../yt_dlp/extractor/tokentube.py | 153 + .../site-packages/yt_dlp/extractor/tonline.py | 51 + .../yt_dlp/extractor/toongoggles.py | 76 + .../site-packages/yt_dlp/extractor/toutv.py | 87 + .../site-packages/yt_dlp/extractor/toypics.py | 87 + .../yt_dlp/extractor/traileraddict.py | 61 + .../site-packages/yt_dlp/extractor/triller.py | 294 + .../yt_dlp/extractor/trilulilu.py | 100 + .../site-packages/yt_dlp/extractor/trovo.py | 342 + .../yt_dlp/extractor/trtcocuk.py | 48 + .../site-packages/yt_dlp/extractor/trueid.py | 136 + .../site-packages/yt_dlp/extractor/trunews.py | 32 + .../site-packages/yt_dlp/extractor/truth.py | 69 + .../site-packages/yt_dlp/extractor/trutv.py | 70 + .../site-packages/yt_dlp/extractor/tube8.py | 79 + .../yt_dlp/extractor/tubetugraz.py | 252 + .../site-packages/yt_dlp/extractor/tubitv.py | 168 + .../site-packages/yt_dlp/extractor/tumblr.py | 387 + .../site-packages/yt_dlp/extractor/tunein.py | 234 + .../site-packages/yt_dlp/extractor/tunepk.py | 87 + .../site-packages/yt_dlp/extractor/turbo.py | 64 + .../site-packages/yt_dlp/extractor/turner.py | 256 + .../site-packages/yt_dlp/extractor/tv2.py | 322 + .../site-packages/yt_dlp/extractor/tv24ua.py | 78 + .../site-packages/yt_dlp/extractor/tv2dk.py | 172 + .../site-packages/yt_dlp/extractor/tv2hu.py | 107 + .../site-packages/yt_dlp/extractor/tv4.py | 136 + .../yt_dlp/extractor/tv5mondeplus.py | 119 + .../site-packages/yt_dlp/extractor/tv5unis.py | 116 + .../site-packages/yt_dlp/extractor/tva.py | 85 + .../yt_dlp/extractor/tvanouvelles.py | 62 + .../site-packages/yt_dlp/extractor/tvc.py | 97 + .../site-packages/yt_dlp/extractor/tver.py | 105 + .../site-packages/yt_dlp/extractor/tvigle.py | 133 + .../yt_dlp/extractor/tviplayer.py | 78 + .../site-packages/yt_dlp/extractor/tvland.py | 37 + .../site-packages/yt_dlp/extractor/tvn24.py | 99 + .../site-packages/yt_dlp/extractor/tvnet.py | 138 + .../site-packages/yt_dlp/extractor/tvnoe.py | 45 + .../site-packages/yt_dlp/extractor/tvnow.py | 639 + .../yt_dlp/extractor/tvopengr.py | 116 + .../site-packages/yt_dlp/extractor/tvp.py | 583 + .../site-packages/yt_dlp/extractor/tvplay.py | 519 + .../yt_dlp/extractor/tvplayer.py | 82 + .../yt_dlp/extractor/tweakers.py | 59 + .../yt_dlp/extractor/twentyfourvideo.py | 128 + .../yt_dlp/extractor/twentymin.py | 80 + .../yt_dlp/extractor/twentythreevideo.py | 76 + .../yt_dlp/extractor/twitcasting.py | 295 + .../site-packages/yt_dlp/extractor/twitch.py | 1207 ++ .../site-packages/yt_dlp/extractor/twitter.py | 1364 ++ .../site-packages/yt_dlp/extractor/txxx.py | 418 + .../site-packages/yt_dlp/extractor/udemy.py | 475 + .../site-packages/yt_dlp/extractor/udn.py | 98 + .../site-packages/yt_dlp/extractor/ufctv.py | 13 + .../yt_dlp/extractor/ukcolumn.py | 70 + .../yt_dlp/extractor/uktvplay.py | 36 + .../site-packages/yt_dlp/extractor/umg.py | 97 + .../site-packages/yt_dlp/extractor/unistra.py | 64 + .../site-packages/yt_dlp/extractor/unity.py | 30 + .../yt_dlp/extractor/unscripted.py | 53 + .../yt_dlp/extractor/unsupported.py | 146 + .../site-packages/yt_dlp/extractor/uol.py | 138 + .../site-packages/yt_dlp/extractor/uplynk.py | 88 + .../site-packages/yt_dlp/extractor/urort.py | 59 + .../site-packages/yt_dlp/extractor/urplay.py | 163 + .../yt_dlp/extractor/usanetwork.py | 21 + .../yt_dlp/extractor/usatoday.py | 60 + .../site-packages/yt_dlp/extractor/ustream.py | 275 + .../site-packages/yt_dlp/extractor/ustudio.py | 119 + .../site-packages/yt_dlp/extractor/utreon.py | 81 + .../yt_dlp/extractor/varzesh3.py | 72 + .../site-packages/yt_dlp/extractor/vbox7.py | 93 + .../site-packages/yt_dlp/extractor/veehd.py | 116 + .../site-packages/yt_dlp/extractor/veo.py | 76 + .../site-packages/yt_dlp/extractor/veoh.py | 188 + .../site-packages/yt_dlp/extractor/vesti.py | 118 + .../site-packages/yt_dlp/extractor/vevo.py | 355 + .../site-packages/yt_dlp/extractor/vgtv.py | 311 + .../site-packages/yt_dlp/extractor/vh1.py | 33 + .../site-packages/yt_dlp/extractor/vice.py | 321 + .../site-packages/yt_dlp/extractor/vidbit.py | 82 + .../site-packages/yt_dlp/extractor/viddler.py | 135 + .../site-packages/yt_dlp/extractor/videa.py | 185 + .../yt_dlp/extractor/videocampus_sachsen.py | 253 + .../yt_dlp/extractor/videodetective.py | 27 + .../yt_dlp/extractor/videofyme.py | 50 + .../yt_dlp/extractor/videoken.py | 336 + .../yt_dlp/extractor/videomore.py | 307 + .../yt_dlp/extractor/videopress.py | 89 + .../site-packages/yt_dlp/extractor/vidio.py | 309 + .../site-packages/yt_dlp/extractor/vidlii.py | 153 + .../yt_dlp/extractor/viewlift.py | 336 + .../site-packages/yt_dlp/extractor/viidea.py | 199 + .../site-packages/yt_dlp/extractor/viki.py | 346 + .../site-packages/yt_dlp/extractor/vimeo.py | 1452 ++ .../site-packages/yt_dlp/extractor/vimm.py | 66 + .../site-packages/yt_dlp/extractor/vimple.py | 58 + .../site-packages/yt_dlp/extractor/vine.py | 151 + .../site-packages/yt_dlp/extractor/viqeo.py | 86 + .../site-packages/yt_dlp/extractor/viu.py | 542 + .../site-packages/yt_dlp/extractor/vk.py | 703 + .../site-packages/yt_dlp/extractor/vocaroo.py | 65 + .../yt_dlp/extractor/vodlocker.py | 77 + .../site-packages/yt_dlp/extractor/vodpl.py | 29 + .../yt_dlp/extractor/vodplatform.py | 37 + .../yt_dlp/extractor/voicerepublic.py | 59 + .../site-packages/yt_dlp/extractor/voicy.py | 144 + .../site-packages/yt_dlp/extractor/volejtv.py | 40 + .../site-packages/yt_dlp/extractor/voot.py | 149 + .../yt_dlp/extractor/voxmedia.py | 221 + .../site-packages/yt_dlp/extractor/vrak.py | 77 + .../site-packages/yt_dlp/extractor/vrt.py | 82 + .../site-packages/yt_dlp/extractor/vrv.py | 268 + .../site-packages/yt_dlp/extractor/vshare.py | 57 + .../site-packages/yt_dlp/extractor/vtm.py | 59 + .../site-packages/yt_dlp/extractor/vuclip.py | 68 + .../site-packages/yt_dlp/extractor/vupload.py | 52 + .../site-packages/yt_dlp/extractor/vvvvid.py | 295 + .../yt_dlp/extractor/vyborymos.py | 52 + .../site-packages/yt_dlp/extractor/vzaar.py | 100 + .../site-packages/yt_dlp/extractor/wakanim.py | 75 + .../site-packages/yt_dlp/extractor/walla.py | 82 + .../site-packages/yt_dlp/extractor/wasdtv.py | 159 + .../yt_dlp/extractor/washingtonpost.py | 123 + .../site-packages/yt_dlp/extractor/wat.py | 107 + .../yt_dlp/extractor/watchbox.py | 153 + .../yt_dlp/extractor/watchindianporn.py | 65 + .../site-packages/yt_dlp/extractor/wdr.py | 372 + .../yt_dlp/extractor/webcamerapl.py | 44 + .../yt_dlp/extractor/webcaster.py | 92 + .../yt_dlp/extractor/webofstories.py | 155 + .../site-packages/yt_dlp/extractor/weibo.py | 134 + .../site-packages/yt_dlp/extractor/weiqitv.py | 49 + .../yt_dlp/extractor/whowatch.py | 96 + .../yt_dlp/extractor/wikimedia.py | 55 + .../site-packages/yt_dlp/extractor/willow.py | 56 + .../site-packages/yt_dlp/extractor/wimtv.py | 150 + .../site-packages/yt_dlp/extractor/wistia.py | 394 + .../yt_dlp/extractor/wordpress.py | 154 + .../yt_dlp/extractor/worldstarhiphop.py | 38 + .../site-packages/yt_dlp/extractor/wppilot.py | 173 + .../yt_dlp/extractor/wrestleuniverse.py | 233 + .../site-packages/yt_dlp/extractor/wsj.py | 120 + .../site-packages/yt_dlp/extractor/wwe.py | 138 + .../site-packages/yt_dlp/extractor/xanimu.py | 51 + .../site-packages/yt_dlp/extractor/xbef.py | 42 + .../yt_dlp/extractor/xboxclips.py | 62 + .../yt_dlp/extractor/xfileshare.py | 198 + .../yt_dlp/extractor/xhamster.py | 458 + .../yt_dlp/extractor/ximalaya.py | 167 + .../yt_dlp/extractor/xinpianchang.py | 90 + .../site-packages/yt_dlp/extractor/xminus.py | 76 + .../site-packages/yt_dlp/extractor/xnxx.py | 83 + .../site-packages/yt_dlp/extractor/xstream.py | 115 + .../site-packages/yt_dlp/extractor/xtube.py | 214 + .../site-packages/yt_dlp/extractor/xuite.py | 149 + .../site-packages/yt_dlp/extractor/xvideos.py | 180 + .../yt_dlp/extractor/xxxymovies.py | 77 + .../site-packages/yt_dlp/extractor/yahoo.py | 547 + .../yt_dlp/extractor/yandexdisk.py | 142 + .../yt_dlp/extractor/yandexmusic.py | 454 + .../yt_dlp/extractor/yandexvideo.py | 385 + .../yt_dlp/extractor/yapfiles.py | 89 + .../site-packages/yt_dlp/extractor/yappy.py | 99 + .../yt_dlp/extractor/yesjapan.py | 59 + .../yt_dlp/extractor/yinyuetai.py | 52 + .../yt_dlp/extractor/yle_areena.py | 138 + .../site-packages/yt_dlp/extractor/ynet.py | 48 + .../site-packages/yt_dlp/extractor/youjizz.py | 90 + .../site-packages/yt_dlp/extractor/youku.py | 315 + .../site-packages/yt_dlp/extractor/younow.py | 200 + .../site-packages/yt_dlp/extractor/youporn.py | 197 + .../yt_dlp/extractor/yourporn.py | 65 + .../yt_dlp/extractor/yourupload.py | 43 + .../site-packages/yt_dlp/extractor/youtube.py | 7047 ++++++++ .../site-packages/yt_dlp/extractor/zapiks.py | 106 + .../site-packages/yt_dlp/extractor/zattoo.py | 864 + .../site-packages/yt_dlp/extractor/zdf.py | 439 + .../site-packages/yt_dlp/extractor/zee5.py | 258 + .../site-packages/yt_dlp/extractor/zeenews.py | 57 + .../site-packages/yt_dlp/extractor/zhihu.py | 65 + .../site-packages/yt_dlp/extractor/zingmp3.py | 385 + .../site-packages/yt_dlp/extractor/zoom.py | 97 + .../site-packages/yt_dlp/extractor/zype.py | 135 + .../site-packages/yt_dlp/jsinterp.py | 844 + .../site-packages/yt_dlp/minicurses.py | 182 + .../site-packages/yt_dlp/options.py | 1883 ++ .../site-packages/yt_dlp/plugins.py | 173 + .../yt_dlp/postprocessor/__init__.py | 47 + .../yt_dlp/postprocessor/common.py | 216 + .../yt_dlp/postprocessor/embedthumbnail.py | 227 + .../yt_dlp/postprocessor/exec.py | 43 + .../yt_dlp/postprocessor/ffmpeg.py | 1180 ++ .../yt_dlp/postprocessor/metadataparser.py | 125 + .../yt_dlp/postprocessor/modify_chapters.py | 335 + .../postprocessor/movefilesafterdownload.py | 53 + .../yt_dlp/postprocessor/sponskrub.py | 98 + .../yt_dlp/postprocessor/sponsorblock.py | 104 + .../yt_dlp/postprocessor/xattrpp.py | 63 + lib/python3.11/site-packages/yt_dlp/socks.py | 267 + lib/python3.11/site-packages/yt_dlp/update.py | 423 + lib/python3.11/site-packages/yt_dlp/utils.py | 6506 +++++++ .../site-packages/yt_dlp/version.py | 11 + lib/python3.11/site-packages/yt_dlp/webvtt.py | 397 + .../zipp-3.15.0.dist-info/INSTALLER | 1 + .../zipp-3.15.0.dist-info/LICENSE | 19 + .../zipp-3.15.0.dist-info/METADATA | 106 + .../zipp-3.15.0.dist-info/RECORD | 11 + .../zipp-3.15.0.dist-info/REQUESTED | 0 .../site-packages/zipp-3.15.0.dist-info/WHEEL | 5 + .../zipp-3.15.0.dist-info/top_level.txt | 1 + lib/python3.11/site-packages/zipp/__init__.py | 402 + .../site-packages/zipp/py310compat.py | 12 + lib64 | 1 + navidrome/navidrome.db | Bin 10891264 -> 10895360 bytes pyvenv.cfg | 5 + share/bash-completion/completions/yt-dlp | 29 + share/doc/yt_dlp/README.txt | 2797 +++ share/fish/vendor_completions.d/yt-dlp.fish | 304 + share/man/man1/mid3cp.1 | 66 + share/man/man1/mid3iconv.1 | 68 + share/man/man1/mid3v2.1 | 151 + share/man/man1/moggsplit.1 | 64 + share/man/man1/mutagen-inspect.1 | 47 + share/man/man1/mutagen-pony.1 | 46 + share/man/man1/yt-dlp.1 | 3709 ++++ share/zsh/site-functions/_yt-dlp | 30 + 3653 files changed, 786095 insertions(+), 17 deletions(-) create mode 100644 bin/Activate.ps1 create mode 100644 bin/activate create mode 100644 bin/activate.csh create mode 100644 bin/activate.fish create mode 100755 bin/flask create mode 100755 bin/mid3cp create mode 100755 bin/mid3iconv create mode 100755 bin/mid3v2 create mode 100755 bin/moggsplit create mode 100755 bin/mutagen-inspect create mode 100755 bin/mutagen-pony create mode 100755 bin/normalizer create mode 100755 bin/pip create mode 100755 bin/pip3 create mode 100755 bin/pip3.11 create mode 100755 bin/pysondb create mode 120000 bin/python create mode 120000 bin/python3 create mode 120000 bin/python3.11 create mode 100755 bin/tldextract create mode 100755 bin/yt-dlp create mode 100644 lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt create mode 100644 lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt create mode 100644 lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/Brotli-1.0.9.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/Brotli-1.0.9.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/Brotli-1.0.9.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/Brotli-1.0.9.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/Brotli-1.0.9.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/Brotli-1.0.9.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/Brotli-1.0.9.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/AES.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/AES.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/CAST.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/CAST.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/DES.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/DES.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/DES3.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/DES3.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.pyi create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_ARC4.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_Salsa20.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/__init__.pyi create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_chacha20.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.pyi create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_pkcs1_decode.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aes.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aesni.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_arc2.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_blowfish.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cast.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cbc.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cfb.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ctr.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des3.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ecb.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_eksblowfish.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ocb.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ofb.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/CMAC.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/CMAC.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/HMAC.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/HMAC.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/MD2.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/MD2.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/MD4.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/MD4.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/MD5.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/MD5.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA1.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA1.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA224.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA224.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA256.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA256.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA384.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA384.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA512.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHA512.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.pyi create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2b.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2s.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_MD2.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_MD4.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_MD5.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_RIPEMD160.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_SHA1.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_SHA224.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_SHA256.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_SHA384.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_SHA512.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/__init__.pyi create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_ghash_clmul.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_ghash_portable.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_keccak.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/Hash/_poly1305.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/keccak.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Hash/keccak.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/IO/PEM.py create mode 100644 lib/python3.11/site-packages/Cryptodome/IO/PEM.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/IO/PKCS8.py create mode 100644 lib/python3.11/site-packages/Cryptodome/IO/PKCS8.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/IO/_PBES.py create mode 100644 lib/python3.11/site-packages/Cryptodome/IO/_PBES.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/IO/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/Numbers.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/Numbers.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/Primality.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/Primality.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Math/__init__.py create mode 100755 lib/python3.11/site-packages/Cryptodome/Math/_modexp.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/Protocol/KDF.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Protocol/KDF.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Protocol/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Protocol/__init__.pyi create mode 100755 lib/python3.11/site-packages/Cryptodome/Protocol/_scrypt.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.py create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.py create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.py create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.py create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.pyi create mode 100755 lib/python3.11/site-packages/Cryptodome/PublicKey/_ec_ws.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/PublicKey/_ed25519.abi3.so create mode 100755 lib/python3.11/site-packages/Cryptodome/PublicKey/_ed448.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.py create mode 100644 lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.pyi create mode 100755 lib/python3.11/site-packages/Cryptodome/PublicKey/_x25519.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/Random/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Random/__init__.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Random/random.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Random/random.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/common.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/common.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/IO/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PBES.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Math/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Primality.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_modexp.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_RSA.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Random/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Random/test_random.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_dss.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pss.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Util/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Counter.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Padding.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_asn1.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_number.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_strxor.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/__main__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/loader.py create mode 100644 lib/python3.11/site-packages/Cryptodome/SelfTest/st_common.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/DSS.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/DSS.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/eddsa.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/eddsa.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/pss.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Signature/pss.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/Counter.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/Counter.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/Padding.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/Padding.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/RFC1751.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/RFC1751.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.pyi create mode 100755 lib/python3.11/site-packages/Cryptodome/Util/_cpuid_c.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/_file_system.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/_file_system.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/_raw_api.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/_raw_api.pyi create mode 100755 lib/python3.11/site-packages/Cryptodome/Util/_strxor.abi3.so create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/asn1.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/asn1.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/number.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/number.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/py3compat.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/py3compat.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/strxor.py create mode 100644 lib/python3.11/site-packages/Cryptodome/Util/strxor.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/__init__.py create mode 100644 lib/python3.11/site-packages/Cryptodome/__init__.pyi create mode 100644 lib/python3.11/site-packages/Cryptodome/py.typed create mode 100644 lib/python3.11/site-packages/Flask-2.2.5.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/Flask-2.2.5.dist-info/LICENSE.rst create mode 100644 lib/python3.11/site-packages/Flask-2.2.5.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/Flask-2.2.5.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/Flask-2.2.5.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/Flask-2.2.5.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/Flask-2.2.5.dist-info/entry_points.txt create mode 100644 lib/python3.11/site-packages/Flask-2.2.5.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst create mode 100644 lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt create mode 100644 lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst create mode 100644 lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst create mode 100644 lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt create mode 100755 lib/python3.11/site-packages/_brotli.cpython-311-x86_64-linux-gnu.so create mode 100644 lib/python3.11/site-packages/_distutils_hack/__init__.py create mode 100644 lib/python3.11/site-packages/_distutils_hack/override.py create mode 100644 lib/python3.11/site-packages/apscheduler/__init__.py create mode 100644 lib/python3.11/site-packages/apscheduler/events.py create mode 100644 lib/python3.11/site-packages/apscheduler/executors/__init__.py create mode 100644 lib/python3.11/site-packages/apscheduler/executors/asyncio.py create mode 100644 lib/python3.11/site-packages/apscheduler/executors/base.py create mode 100644 lib/python3.11/site-packages/apscheduler/executors/base_py3.py create mode 100644 lib/python3.11/site-packages/apscheduler/executors/debug.py create mode 100644 lib/python3.11/site-packages/apscheduler/executors/gevent.py create mode 100644 lib/python3.11/site-packages/apscheduler/executors/pool.py create mode 100644 lib/python3.11/site-packages/apscheduler/executors/tornado.py create mode 100644 lib/python3.11/site-packages/apscheduler/executors/twisted.py create mode 100644 lib/python3.11/site-packages/apscheduler/job.py create mode 100644 lib/python3.11/site-packages/apscheduler/jobstores/__init__.py create mode 100644 lib/python3.11/site-packages/apscheduler/jobstores/base.py create mode 100644 lib/python3.11/site-packages/apscheduler/jobstores/memory.py create mode 100644 lib/python3.11/site-packages/apscheduler/jobstores/mongodb.py create mode 100644 lib/python3.11/site-packages/apscheduler/jobstores/redis.py create mode 100644 lib/python3.11/site-packages/apscheduler/jobstores/rethinkdb.py create mode 100644 lib/python3.11/site-packages/apscheduler/jobstores/sqlalchemy.py create mode 100644 lib/python3.11/site-packages/apscheduler/jobstores/zookeeper.py create mode 100644 lib/python3.11/site-packages/apscheduler/schedulers/__init__.py create mode 100644 lib/python3.11/site-packages/apscheduler/schedulers/asyncio.py create mode 100644 lib/python3.11/site-packages/apscheduler/schedulers/background.py create mode 100644 lib/python3.11/site-packages/apscheduler/schedulers/base.py create mode 100644 lib/python3.11/site-packages/apscheduler/schedulers/blocking.py create mode 100644 lib/python3.11/site-packages/apscheduler/schedulers/gevent.py create mode 100644 lib/python3.11/site-packages/apscheduler/schedulers/qt.py create mode 100644 lib/python3.11/site-packages/apscheduler/schedulers/tornado.py create mode 100644 lib/python3.11/site-packages/apscheduler/schedulers/twisted.py create mode 100644 lib/python3.11/site-packages/apscheduler/triggers/__init__.py create mode 100644 lib/python3.11/site-packages/apscheduler/triggers/base.py create mode 100644 lib/python3.11/site-packages/apscheduler/triggers/combining.py create mode 100644 lib/python3.11/site-packages/apscheduler/triggers/cron/__init__.py create mode 100644 lib/python3.11/site-packages/apscheduler/triggers/cron/expressions.py create mode 100644 lib/python3.11/site-packages/apscheduler/triggers/cron/fields.py create mode 100644 lib/python3.11/site-packages/apscheduler/triggers/date.py create mode 100644 lib/python3.11/site-packages/apscheduler/triggers/interval.py create mode 100644 lib/python3.11/site-packages/apscheduler/util.py create mode 100644 lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/zip-safe create mode 100644 lib/python3.11/site-packages/async_timeout/__init__.py create mode 100644 lib/python3.11/site-packages/async_timeout/py.typed create mode 100644 lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/AUTHORS create mode 100644 lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/LICENSE create mode 100644 lib/python3.11/site-packages/brotli.py create mode 100644 lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/PKG-INFO create mode 100644 lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/SOURCES.txt create mode 100644 lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/dependency_links.txt create mode 100644 lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/installed-files.txt create mode 100644 lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/requires.txt create mode 100644 lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/top_level.txt create mode 100644 lib/python3.11/site-packages/bs4/__init__.py create mode 100644 lib/python3.11/site-packages/bs4/builder/__init__.py create mode 100644 lib/python3.11/site-packages/bs4/builder/_html5lib.py create mode 100644 lib/python3.11/site-packages/bs4/builder/_htmlparser.py create mode 100644 lib/python3.11/site-packages/bs4/builder/_lxml.py create mode 100644 lib/python3.11/site-packages/bs4/css.py create mode 100644 lib/python3.11/site-packages/bs4/dammit.py create mode 100644 lib/python3.11/site-packages/bs4/diagnose.py create mode 100644 lib/python3.11/site-packages/bs4/element.py create mode 100644 lib/python3.11/site-packages/bs4/formatter.py create mode 100644 lib/python3.11/site-packages/bs4/tests/__init__.py create mode 100644 lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase create mode 100644 lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase create mode 100644 lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase create mode 100644 lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase create mode 100644 lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase create mode 100644 lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase create mode 100644 lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase create mode 100644 lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase create mode 100644 lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase create mode 100644 lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase create mode 100644 lib/python3.11/site-packages/bs4/tests/fuzz/crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase create mode 100644 lib/python3.11/site-packages/bs4/tests/test_builder.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_builder_registry.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_css.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_dammit.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_docs.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_element.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_formatter.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_fuzz.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_html5lib.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_htmlparser.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_lxml.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_navigablestring.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_pageelement.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_soup.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_tag.py create mode 100644 lib/python3.11/site-packages/bs4/tests/test_tree.py create mode 100644 lib/python3.11/site-packages/certifi-2023.5.7.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/certifi-2023.5.7.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/certifi-2023.5.7.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/certifi-2023.5.7.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/certifi-2023.5.7.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/certifi-2023.5.7.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/certifi-2023.5.7.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/certifi/__init__.py create mode 100644 lib/python3.11/site-packages/certifi/__main__.py create mode 100644 lib/python3.11/site-packages/certifi/cacert.pem create mode 100644 lib/python3.11/site-packages/certifi/core.py create mode 100644 lib/python3.11/site-packages/certifi/py.typed create mode 100644 lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/entry_points.txt create mode 100644 lib/python3.11/site-packages/charset_normalizer-3.1.0.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/charset_normalizer/__init__.py create mode 100644 lib/python3.11/site-packages/charset_normalizer/api.py create mode 100644 lib/python3.11/site-packages/charset_normalizer/assets/__init__.py create mode 100644 lib/python3.11/site-packages/charset_normalizer/cd.py create mode 100644 lib/python3.11/site-packages/charset_normalizer/cli/__init__.py create mode 100644 lib/python3.11/site-packages/charset_normalizer/cli/normalizer.py create mode 100644 lib/python3.11/site-packages/charset_normalizer/constant.py create mode 100644 lib/python3.11/site-packages/charset_normalizer/legacy.py create mode 100755 lib/python3.11/site-packages/charset_normalizer/md.cpython-311-x86_64-linux-gnu.so create mode 100644 lib/python3.11/site-packages/charset_normalizer/md.py create mode 100755 lib/python3.11/site-packages/charset_normalizer/md__mypyc.cpython-311-x86_64-linux-gnu.so create mode 100644 lib/python3.11/site-packages/charset_normalizer/models.py create mode 100644 lib/python3.11/site-packages/charset_normalizer/py.typed create mode 100644 lib/python3.11/site-packages/charset_normalizer/utils.py create mode 100644 lib/python3.11/site-packages/charset_normalizer/version.py create mode 100644 lib/python3.11/site-packages/click-8.1.3.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/click-8.1.3.dist-info/LICENSE.rst create mode 100644 lib/python3.11/site-packages/click-8.1.3.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/click-8.1.3.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/click-8.1.3.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/click-8.1.3.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/click-8.1.3.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/click/__init__.py create mode 100644 lib/python3.11/site-packages/click/_compat.py create mode 100644 lib/python3.11/site-packages/click/_termui_impl.py create mode 100644 lib/python3.11/site-packages/click/_textwrap.py create mode 100644 lib/python3.11/site-packages/click/_winconsole.py create mode 100644 lib/python3.11/site-packages/click/core.py create mode 100644 lib/python3.11/site-packages/click/decorators.py create mode 100644 lib/python3.11/site-packages/click/exceptions.py create mode 100644 lib/python3.11/site-packages/click/formatting.py create mode 100644 lib/python3.11/site-packages/click/globals.py create mode 100644 lib/python3.11/site-packages/click/parser.py create mode 100644 lib/python3.11/site-packages/click/py.typed create mode 100644 lib/python3.11/site-packages/click/shell_completion.py create mode 100644 lib/python3.11/site-packages/click/termui.py create mode 100644 lib/python3.11/site-packages/click/testing.py create mode 100644 lib/python3.11/site-packages/click/types.py create mode 100644 lib/python3.11/site-packages/click/utils.py create mode 100644 lib/python3.11/site-packages/distutils-precedence.pth create mode 100644 lib/python3.11/site-packages/filelock-3.12.2.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/filelock-3.12.2.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/filelock-3.12.2.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/filelock-3.12.2.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/filelock-3.12.2.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/filelock-3.12.2.dist-info/licenses/LICENSE create mode 100644 lib/python3.11/site-packages/filelock/__init__.py create mode 100644 lib/python3.11/site-packages/filelock/_api.py create mode 100644 lib/python3.11/site-packages/filelock/_error.py create mode 100644 lib/python3.11/site-packages/filelock/_soft.py create mode 100644 lib/python3.11/site-packages/filelock/_unix.py create mode 100644 lib/python3.11/site-packages/filelock/_util.py create mode 100644 lib/python3.11/site-packages/filelock/_windows.py create mode 100644 lib/python3.11/site-packages/filelock/py.typed create mode 100644 lib/python3.11/site-packages/filelock/version.py create mode 100644 lib/python3.11/site-packages/flask/__init__.py create mode 100644 lib/python3.11/site-packages/flask/__main__.py create mode 100644 lib/python3.11/site-packages/flask/app.py create mode 100644 lib/python3.11/site-packages/flask/blueprints.py create mode 100644 lib/python3.11/site-packages/flask/cli.py create mode 100644 lib/python3.11/site-packages/flask/config.py create mode 100644 lib/python3.11/site-packages/flask/ctx.py create mode 100644 lib/python3.11/site-packages/flask/debughelpers.py create mode 100644 lib/python3.11/site-packages/flask/globals.py create mode 100644 lib/python3.11/site-packages/flask/helpers.py create mode 100644 lib/python3.11/site-packages/flask/json/__init__.py create mode 100644 lib/python3.11/site-packages/flask/json/provider.py create mode 100644 lib/python3.11/site-packages/flask/json/tag.py create mode 100644 lib/python3.11/site-packages/flask/logging.py create mode 100644 lib/python3.11/site-packages/flask/py.typed create mode 100644 lib/python3.11/site-packages/flask/scaffold.py create mode 100644 lib/python3.11/site-packages/flask/sessions.py create mode 100644 lib/python3.11/site-packages/flask/signals.py create mode 100644 lib/python3.11/site-packages/flask/templating.py create mode 100644 lib/python3.11/site-packages/flask/testing.py create mode 100644 lib/python3.11/site-packages/flask/typing.py create mode 100644 lib/python3.11/site-packages/flask/views.py create mode 100644 lib/python3.11/site-packages/flask/wrappers.py create mode 100644 lib/python3.11/site-packages/idna-3.4.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/idna-3.4.dist-info/LICENSE.md create mode 100644 lib/python3.11/site-packages/idna-3.4.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/idna-3.4.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/idna-3.4.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/idna-3.4.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/idna/__init__.py create mode 100644 lib/python3.11/site-packages/idna/codec.py create mode 100644 lib/python3.11/site-packages/idna/compat.py create mode 100644 lib/python3.11/site-packages/idna/core.py create mode 100644 lib/python3.11/site-packages/idna/idnadata.py create mode 100644 lib/python3.11/site-packages/idna/intranges.py create mode 100644 lib/python3.11/site-packages/idna/package_data.py create mode 100644 lib/python3.11/site-packages/idna/py.typed create mode 100644 lib/python3.11/site-packages/idna/uts46data.py create mode 100644 lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/importlib_metadata-6.6.0.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/importlib_metadata/__init__.py create mode 100644 lib/python3.11/site-packages/importlib_metadata/_adapters.py create mode 100644 lib/python3.11/site-packages/importlib_metadata/_collections.py create mode 100644 lib/python3.11/site-packages/importlib_metadata/_compat.py create mode 100644 lib/python3.11/site-packages/importlib_metadata/_functools.py create mode 100644 lib/python3.11/site-packages/importlib_metadata/_itertools.py create mode 100644 lib/python3.11/site-packages/importlib_metadata/_meta.py create mode 100644 lib/python3.11/site-packages/importlib_metadata/_py39compat.py create mode 100644 lib/python3.11/site-packages/importlib_metadata/_text.py create mode 100644 lib/python3.11/site-packages/importlib_metadata/py.typed create mode 100644 lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/LICENSE.rst create mode 100644 lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/itsdangerous-2.1.2.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/itsdangerous/__init__.py create mode 100644 lib/python3.11/site-packages/itsdangerous/_json.py create mode 100644 lib/python3.11/site-packages/itsdangerous/encoding.py create mode 100644 lib/python3.11/site-packages/itsdangerous/exc.py create mode 100644 lib/python3.11/site-packages/itsdangerous/py.typed create mode 100644 lib/python3.11/site-packages/itsdangerous/serializer.py create mode 100644 lib/python3.11/site-packages/itsdangerous/signer.py create mode 100644 lib/python3.11/site-packages/itsdangerous/timed.py create mode 100644 lib/python3.11/site-packages/itsdangerous/url_safe.py create mode 100644 lib/python3.11/site-packages/jinja2/__init__.py create mode 100644 lib/python3.11/site-packages/jinja2/_identifier.py create mode 100644 lib/python3.11/site-packages/jinja2/async_utils.py create mode 100644 lib/python3.11/site-packages/jinja2/bccache.py create mode 100644 lib/python3.11/site-packages/jinja2/compiler.py create mode 100644 lib/python3.11/site-packages/jinja2/constants.py create mode 100644 lib/python3.11/site-packages/jinja2/debug.py create mode 100644 lib/python3.11/site-packages/jinja2/defaults.py create mode 100644 lib/python3.11/site-packages/jinja2/environment.py create mode 100644 lib/python3.11/site-packages/jinja2/exceptions.py create mode 100644 lib/python3.11/site-packages/jinja2/ext.py create mode 100644 lib/python3.11/site-packages/jinja2/filters.py create mode 100644 lib/python3.11/site-packages/jinja2/idtracking.py create mode 100644 lib/python3.11/site-packages/jinja2/lexer.py create mode 100644 lib/python3.11/site-packages/jinja2/loaders.py create mode 100644 lib/python3.11/site-packages/jinja2/meta.py create mode 100644 lib/python3.11/site-packages/jinja2/nativetypes.py create mode 100644 lib/python3.11/site-packages/jinja2/nodes.py create mode 100644 lib/python3.11/site-packages/jinja2/optimizer.py create mode 100644 lib/python3.11/site-packages/jinja2/parser.py create mode 100644 lib/python3.11/site-packages/jinja2/py.typed create mode 100644 lib/python3.11/site-packages/jinja2/runtime.py create mode 100644 lib/python3.11/site-packages/jinja2/sandbox.py create mode 100644 lib/python3.11/site-packages/jinja2/tests.py create mode 100644 lib/python3.11/site-packages/jinja2/utils.py create mode 100644 lib/python3.11/site-packages/jinja2/visitor.py create mode 100644 lib/python3.11/site-packages/markupsafe/__init__.py create mode 100644 lib/python3.11/site-packages/markupsafe/_native.py create mode 100644 lib/python3.11/site-packages/markupsafe/_speedups.c create mode 100755 lib/python3.11/site-packages/markupsafe/_speedups.cpython-311-x86_64-linux-gnu.so create mode 100644 lib/python3.11/site-packages/markupsafe/_speedups.pyi create mode 100644 lib/python3.11/site-packages/markupsafe/py.typed create mode 100644 lib/python3.11/site-packages/mutagen-1.46.0.dist-info/COPYING create mode 100644 lib/python3.11/site-packages/mutagen-1.46.0.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/mutagen-1.46.0.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/mutagen-1.46.0.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/mutagen-1.46.0.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/mutagen-1.46.0.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/mutagen-1.46.0.dist-info/entry_points.txt create mode 100644 lib/python3.11/site-packages/mutagen-1.46.0.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/mutagen/__init__.py create mode 100644 lib/python3.11/site-packages/mutagen/_constants.py create mode 100644 lib/python3.11/site-packages/mutagen/_file.py create mode 100644 lib/python3.11/site-packages/mutagen/_iff.py create mode 100644 lib/python3.11/site-packages/mutagen/_riff.py create mode 100644 lib/python3.11/site-packages/mutagen/_tags.py create mode 100644 lib/python3.11/site-packages/mutagen/_tools/__init__.py create mode 100644 lib/python3.11/site-packages/mutagen/_tools/_util.py create mode 100644 lib/python3.11/site-packages/mutagen/_tools/mid3cp.py create mode 100644 lib/python3.11/site-packages/mutagen/_tools/mid3iconv.py create mode 100644 lib/python3.11/site-packages/mutagen/_tools/mid3v2.py create mode 100644 lib/python3.11/site-packages/mutagen/_tools/moggsplit.py create mode 100644 lib/python3.11/site-packages/mutagen/_tools/mutagen_inspect.py create mode 100644 lib/python3.11/site-packages/mutagen/_tools/mutagen_pony.py create mode 100644 lib/python3.11/site-packages/mutagen/_util.py create mode 100644 lib/python3.11/site-packages/mutagen/_vorbis.py create mode 100644 lib/python3.11/site-packages/mutagen/aac.py create mode 100644 lib/python3.11/site-packages/mutagen/ac3.py create mode 100644 lib/python3.11/site-packages/mutagen/aiff.py create mode 100644 lib/python3.11/site-packages/mutagen/apev2.py create mode 100644 lib/python3.11/site-packages/mutagen/asf/__init__.py create mode 100644 lib/python3.11/site-packages/mutagen/asf/_attrs.py create mode 100644 lib/python3.11/site-packages/mutagen/asf/_objects.py create mode 100644 lib/python3.11/site-packages/mutagen/asf/_util.py create mode 100644 lib/python3.11/site-packages/mutagen/dsdiff.py create mode 100644 lib/python3.11/site-packages/mutagen/dsf.py create mode 100644 lib/python3.11/site-packages/mutagen/easyid3.py create mode 100644 lib/python3.11/site-packages/mutagen/easymp4.py create mode 100644 lib/python3.11/site-packages/mutagen/flac.py create mode 100644 lib/python3.11/site-packages/mutagen/id3/__init__.py create mode 100644 lib/python3.11/site-packages/mutagen/id3/_file.py create mode 100644 lib/python3.11/site-packages/mutagen/id3/_frames.py create mode 100644 lib/python3.11/site-packages/mutagen/id3/_id3v1.py create mode 100644 lib/python3.11/site-packages/mutagen/id3/_specs.py create mode 100644 lib/python3.11/site-packages/mutagen/id3/_tags.py create mode 100644 lib/python3.11/site-packages/mutagen/id3/_util.py create mode 100644 lib/python3.11/site-packages/mutagen/m4a.py create mode 100644 lib/python3.11/site-packages/mutagen/monkeysaudio.py create mode 100644 lib/python3.11/site-packages/mutagen/mp3/__init__.py create mode 100644 lib/python3.11/site-packages/mutagen/mp3/_util.py create mode 100644 lib/python3.11/site-packages/mutagen/mp4/__init__.py create mode 100644 lib/python3.11/site-packages/mutagen/mp4/_as_entry.py create mode 100644 lib/python3.11/site-packages/mutagen/mp4/_atom.py create mode 100644 lib/python3.11/site-packages/mutagen/mp4/_util.py create mode 100644 lib/python3.11/site-packages/mutagen/musepack.py create mode 100644 lib/python3.11/site-packages/mutagen/ogg.py create mode 100644 lib/python3.11/site-packages/mutagen/oggflac.py create mode 100644 lib/python3.11/site-packages/mutagen/oggopus.py create mode 100644 lib/python3.11/site-packages/mutagen/oggspeex.py create mode 100644 lib/python3.11/site-packages/mutagen/oggtheora.py create mode 100644 lib/python3.11/site-packages/mutagen/oggvorbis.py create mode 100644 lib/python3.11/site-packages/mutagen/optimfrog.py create mode 100644 lib/python3.11/site-packages/mutagen/py.typed create mode 100644 lib/python3.11/site-packages/mutagen/smf.py create mode 100644 lib/python3.11/site-packages/mutagen/tak.py create mode 100644 lib/python3.11/site-packages/mutagen/trueaudio.py create mode 100644 lib/python3.11/site-packages/mutagen/wave.py create mode 100644 lib/python3.11/site-packages/mutagen/wavpack.py create mode 100644 lib/python3.11/site-packages/pip-22.3.1.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/pip-22.3.1.dist-info/LICENSE.txt create mode 100644 lib/python3.11/site-packages/pip-22.3.1.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/pip-22.3.1.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/pip-22.3.1.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/pip-22.3.1.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/pip-22.3.1.dist-info/entry_points.txt create mode 100644 lib/python3.11/site-packages/pip-22.3.1.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/pip/__init__.py create mode 100644 lib/python3.11/site-packages/pip/__main__.py create mode 100644 lib/python3.11/site-packages/pip/__pip-runner__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/build_env.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cache.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/base_command.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/command_context.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/main.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/main_parser.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/parser.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/req_command.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/spinners.py create mode 100644 lib/python3.11/site-packages/pip/_internal/cli/status_codes.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/cache.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/check.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/completion.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/configuration.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/debug.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/download.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/freeze.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/hash.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/help.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/index.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/inspect.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/install.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/list.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/search.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/show.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/uninstall.py create mode 100644 lib/python3.11/site-packages/pip/_internal/commands/wheel.py create mode 100644 lib/python3.11/site-packages/pip/_internal/configuration.py create mode 100644 lib/python3.11/site-packages/pip/_internal/distributions/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/distributions/base.py create mode 100644 lib/python3.11/site-packages/pip/_internal/distributions/installed.py create mode 100644 lib/python3.11/site-packages/pip/_internal/distributions/sdist.py create mode 100644 lib/python3.11/site-packages/pip/_internal/distributions/wheel.py create mode 100644 lib/python3.11/site-packages/pip/_internal/exceptions.py create mode 100644 lib/python3.11/site-packages/pip/_internal/index/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/index/collector.py create mode 100644 lib/python3.11/site-packages/pip/_internal/index/package_finder.py create mode 100644 lib/python3.11/site-packages/pip/_internal/index/sources.py create mode 100644 lib/python3.11/site-packages/pip/_internal/locations/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/locations/_distutils.py create mode 100644 lib/python3.11/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 lib/python3.11/site-packages/pip/_internal/locations/base.py create mode 100644 lib/python3.11/site-packages/pip/_internal/main.py create mode 100644 lib/python3.11/site-packages/pip/_internal/metadata/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/metadata/_json.py create mode 100644 lib/python3.11/site-packages/pip/_internal/metadata/base.py create mode 100644 lib/python3.11/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 lib/python3.11/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 lib/python3.11/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 lib/python3.11/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/candidate.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/direct_url.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/format_control.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/index.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/installation_report.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/link.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/scheme.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/search_scope.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/target_python.py create mode 100644 lib/python3.11/site-packages/pip/_internal/models/wheel.py create mode 100644 lib/python3.11/site-packages/pip/_internal/network/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/network/auth.py create mode 100644 lib/python3.11/site-packages/pip/_internal/network/cache.py create mode 100644 lib/python3.11/site-packages/pip/_internal/network/download.py create mode 100644 lib/python3.11/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 lib/python3.11/site-packages/pip/_internal/network/session.py create mode 100644 lib/python3.11/site-packages/pip/_internal/network/utils.py create mode 100644 lib/python3.11/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/check.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/freeze.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 lib/python3.11/site-packages/pip/_internal/operations/prepare.py create mode 100644 lib/python3.11/site-packages/pip/_internal/pyproject.py create mode 100644 lib/python3.11/site-packages/pip/_internal/req/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/req/constructors.py create mode 100644 lib/python3.11/site-packages/pip/_internal/req/req_file.py create mode 100644 lib/python3.11/site-packages/pip/_internal/req/req_install.py create mode 100644 lib/python3.11/site-packages/pip/_internal/req/req_set.py create mode 100644 lib/python3.11/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/base.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 lib/python3.11/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 lib/python3.11/site-packages/pip/_internal/self_outdated_check.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/_log.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/appdirs.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/compat.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/datetime.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/deprecation.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/egg_link.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/encoding.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/filesystem.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/filetypes.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/glibc.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/hashes.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/logging.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/misc.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/models.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/packaging.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/subprocess.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/unpacking.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/urls.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 lib/python3.11/site-packages/pip/_internal/utils/wheel.py create mode 100644 lib/python3.11/site-packages/pip/_internal/vcs/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 lib/python3.11/site-packages/pip/_internal/vcs/git.py create mode 100644 lib/python3.11/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 lib/python3.11/site-packages/pip/_internal/vcs/subversion.py create mode 100644 lib/python3.11/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 lib/python3.11/site-packages/pip/_internal/wheel_builder.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/certifi/core.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/enums.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/chardet/version.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/colorama/win32.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/compat.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/database.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/index.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/locators.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/markers.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/resources.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/util.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/version.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distro/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distro/__main__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/distro/distro.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/idna/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/idna/codec.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/idna/compat.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/idna/core.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/idna/intranges.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/idna/package_data.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/packaging/markers.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/packaging/tags.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/packaging/utils.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/packaging/version.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pep517/_compat.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pep517/build.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pep517/check.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pep517/in_process/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pep517/in_process/_in_process.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pep517/meta.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/console.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/filter.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/style.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/token.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pygments/util.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/__version__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/adapters.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/api.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/auth.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/certs.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/compat.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/cookies.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/help.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/hooks.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/models.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/packages.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/sessions.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/structures.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/requests/utils.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/__main__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_extension.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_loop.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_pick.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_stack.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_timer.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_windows.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/abc.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/align.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/ansi.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/bar.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/box.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/cells.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/color.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/columns.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/console.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/constrain.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/containers.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/control.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/emoji.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/errors.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/filesize.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/json.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/layout.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/live.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/live_render.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/logging.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/markup.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/measure.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/padding.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/pager.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/palette.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/panel.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/pretty.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/progress.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/prompt.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/protocol.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/region.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/repr.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/rule.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/scope.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/screen.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/segment.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/spinner.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/status.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/style.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/styled.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/syntax.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/table.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/text.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/theme.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/themes.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/traceback.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/rich/tree.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/six.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tenacity/after.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tenacity/before.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tomli/_re.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/tomli/_types.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/typing_extensions.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/request.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/response.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/vendor.txt create mode 100644 lib/python3.11/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 lib/python3.11/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 lib/python3.11/site-packages/pip/py.typed create mode 100644 lib/python3.11/site-packages/pkg_resources/__init__.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_common.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/abc.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/readers.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/importlib_resources/simple.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/__init__.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/context.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/functools.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/__init__.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/more.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/more_itertools/recipes.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_manylinux.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_musllinux.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/__init__.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/actions.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/common.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/core.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/helpers.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/results.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/testing.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/unicode.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/pyparsing/util.py create mode 100644 lib/python3.11/site-packages/pkg_resources/_vendor/zipp.py create mode 100644 lib/python3.11/site-packages/pkg_resources/extern/__init__.py create mode 100644 lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/AUTHORS.rst create mode 100644 lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/LICENSE.rst create mode 100644 lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/pycryptodomex-3.18.0.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/pysondb/__init__.py create mode 100644 lib/python3.11/site-packages/pysondb/__main__.py create mode 100644 lib/python3.11/site-packages/pysondb/cli.py create mode 100644 lib/python3.11/site-packages/pysondb/db.py create mode 100644 lib/python3.11/site-packages/pysondb/db_types.py create mode 100644 lib/python3.11/site-packages/pysondb/errors.py create mode 100644 lib/python3.11/site-packages/pysondb/utils.py create mode 100644 lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/entry_points.txt create mode 100644 lib/python3.11/site-packages/pysondb_v2-2.0.0.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/pytz-2023.3.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/pytz-2023.3.dist-info/LICENSE.txt create mode 100644 lib/python3.11/site-packages/pytz-2023.3.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/pytz-2023.3.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/pytz-2023.3.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/pytz-2023.3.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/pytz-2023.3.dist-info/zip-safe create mode 100644 lib/python3.11/site-packages/pytz/__init__.py create mode 100644 lib/python3.11/site-packages/pytz/exceptions.py create mode 100644 lib/python3.11/site-packages/pytz/lazy.py create mode 100644 lib/python3.11/site-packages/pytz/reference.py create mode 100644 lib/python3.11/site-packages/pytz/tzfile.py create mode 100644 lib/python3.11/site-packages/pytz/tzinfo.py create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Abidjan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Accra create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Addis_Ababa create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Algiers create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Asmara create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Asmera create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Bamako create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Bangui create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Banjul create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Bissau create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Blantyre create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Brazzaville create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Bujumbura create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Cairo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Casablanca create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Ceuta create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Conakry create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Dakar create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Djibouti create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Douala create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/El_Aaiun create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Freetown create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Gaborone create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Harare create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Johannesburg create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Juba create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Kampala create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Khartoum create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Kigali create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Kinshasa create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Lagos create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Libreville create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Lome create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Luanda create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Lubumbashi create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Lusaka create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Malabo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Maputo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Maseru create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Mbabane create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Mogadishu create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Monrovia create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Nairobi create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Ndjamena create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Niamey create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Nouakchott create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Ouagadougou create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Porto-Novo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Sao_Tome create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Timbuktu create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Tripoli create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Tunis create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Africa/Windhoek create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Adak create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Anchorage create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Anguilla create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Antigua create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Araguaina create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Buenos_Aires create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Catamarca create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/ComodRivadavia create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Cordoba create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Jujuy create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/La_Rioja create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Mendoza create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Rio_Gallegos create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Salta create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/San_Juan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/San_Luis create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Tucuman create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Argentina/Ushuaia create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Aruba create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Asuncion create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Atikokan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Atka create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Bahia create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Bahia_Banderas create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Barbados create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Belem create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Belize create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Blanc-Sablon create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Boa_Vista create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Bogota create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Boise create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Buenos_Aires create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Cambridge_Bay create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Campo_Grande create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Cancun create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Caracas create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Catamarca create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Cayenne create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Cayman create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Chicago create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Chihuahua create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Ciudad_Juarez create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Coral_Harbour create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Cordoba create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Costa_Rica create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Creston create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Cuiaba create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Curacao create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Danmarkshavn create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Dawson create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Dawson_Creek create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Denver create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Detroit create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Dominica create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Edmonton create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Eirunepe create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/El_Salvador create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Ensenada create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Fort_Nelson create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Fort_Wayne create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Fortaleza create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Glace_Bay create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Godthab create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Goose_Bay create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Grand_Turk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Grenada create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Guadeloupe create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Guatemala create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Guayaquil create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Guyana create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Halifax create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Havana create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Hermosillo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Indianapolis create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Knox create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Marengo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Petersburg create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Tell_City create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Vevay create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Vincennes create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Indiana/Winamac create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Indianapolis create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Inuvik create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Iqaluit create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Jamaica create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Jujuy create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Juneau create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Kentucky/Louisville create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Kentucky/Monticello create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Knox_IN create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Kralendijk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/La_Paz create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Lima create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Los_Angeles create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Louisville create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Lower_Princes create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Maceio create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Managua create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Manaus create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Marigot create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Martinique create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Matamoros create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Mazatlan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Mendoza create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Menominee create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Merida create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Metlakatla create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Mexico_City create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Miquelon create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Moncton create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Monterrey create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Montevideo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Montreal create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Montserrat create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Nassau create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/New_York create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Nipigon create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Nome create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Noronha create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/North_Dakota/Beulah create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/North_Dakota/Center create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/North_Dakota/New_Salem create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Nuuk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Ojinaga create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Panama create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Pangnirtung create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Paramaribo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Phoenix create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Port-au-Prince create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Port_of_Spain create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Porto_Acre create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Porto_Velho create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Puerto_Rico create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Punta_Arenas create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Rainy_River create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Rankin_Inlet create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Recife create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Regina create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Resolute create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Rio_Branco create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Rosario create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Santa_Isabel create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Santarem create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Santiago create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Santo_Domingo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Sao_Paulo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Scoresbysund create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Shiprock create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Sitka create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/St_Barthelemy create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/St_Johns create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/St_Kitts create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/St_Lucia create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/St_Thomas create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/St_Vincent create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Swift_Current create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Tegucigalpa create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Thule create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Thunder_Bay create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Tijuana create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Toronto create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Tortola create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Vancouver create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Virgin create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Whitehorse create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Winnipeg create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Yakutat create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/America/Yellowknife create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Casey create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Davis create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/DumontDUrville create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Macquarie create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Mawson create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/McMurdo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Palmer create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Rothera create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/South_Pole create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Syowa create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Troll create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Antarctica/Vostok create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Arctic/Longyearbyen create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Aden create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Almaty create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Amman create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Anadyr create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Aqtau create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Aqtobe create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ashgabat create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ashkhabad create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Atyrau create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Baghdad create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Bahrain create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Baku create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Bangkok create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Barnaul create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Beirut create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Bishkek create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Brunei create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Calcutta create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Chita create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Choibalsan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Chongqing create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Chungking create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Colombo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Dacca create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Damascus create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Dhaka create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Dili create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Dubai create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Dushanbe create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Famagusta create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Gaza create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Harbin create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Hebron create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Hong_Kong create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Hovd create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Irkutsk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Istanbul create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Jakarta create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Jayapura create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Jerusalem create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kabul create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kamchatka create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Karachi create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kashgar create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kathmandu create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Katmandu create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Khandyga create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kolkata create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kuala_Lumpur create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kuching create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Kuwait create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Macao create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Macau create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Magadan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Makassar create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Manila create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Muscat create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Nicosia create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Novokuznetsk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Novosibirsk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Omsk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Oral create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Phnom_Penh create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Pontianak create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Pyongyang create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Qatar create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Qostanay create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Qyzylorda create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Rangoon create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Riyadh create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Saigon create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Sakhalin create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Samarkand create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Seoul create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Shanghai create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Singapore create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Srednekolymsk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Taipei create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tashkent create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tbilisi create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tehran create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tel_Aviv create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Thimbu create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Thimphu create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tokyo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Tomsk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ujung_Pandang create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ulaanbaatar create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ulan_Bator create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Urumqi create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Ust-Nera create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Vientiane create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Vladivostok create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Yakutsk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Yangon create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Yekaterinburg create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Asia/Yerevan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Azores create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Bermuda create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Canary create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Cape_Verde create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Faeroe create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Faroe create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Jan_Mayen create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Madeira create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Reykjavik create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/South_Georgia create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/St_Helena create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Atlantic/Stanley create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/ACT create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Adelaide create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Brisbane create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Broken_Hill create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Canberra create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Currie create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Darwin create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Eucla create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Hobart create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/LHI create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Lindeman create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Lord_Howe create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Melbourne create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/NSW create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/North create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Perth create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Queensland create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/South create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Sydney create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Tasmania create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Victoria create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/West create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Australia/Yancowinna create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Brazil/Acre create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Brazil/DeNoronha create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Brazil/East create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Brazil/West create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/CET create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/CST6CDT create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Canada/Atlantic create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Canada/Central create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Canada/Eastern create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Canada/Mountain create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Canada/Newfoundland create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Canada/Pacific create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Canada/Saskatchewan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Canada/Yukon create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Chile/Continental create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Chile/EasterIsland create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Cuba create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/EET create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/EST create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/EST5EDT create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Egypt create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Eire create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+0 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+1 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+10 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+11 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+12 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+2 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+3 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+4 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+5 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+6 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+7 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+8 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT+9 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-0 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-1 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-10 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-11 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-12 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-13 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-14 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-2 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-3 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-4 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-5 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-6 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-7 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-8 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT-9 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/GMT0 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/Greenwich create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/UCT create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/UTC create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/Universal create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Etc/Zulu create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Amsterdam create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Andorra create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Astrakhan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Athens create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Belfast create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Belgrade create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Berlin create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Bratislava create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Brussels create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Bucharest create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Budapest create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Busingen create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Chisinau create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Copenhagen create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Dublin create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Gibraltar create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Guernsey create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Helsinki create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Isle_of_Man create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Istanbul create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Jersey create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Kaliningrad create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Kiev create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Kirov create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Kyiv create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Lisbon create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Ljubljana create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/London create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Luxembourg create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Madrid create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Malta create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Mariehamn create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Minsk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Monaco create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Moscow create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Nicosia create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Oslo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Paris create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Podgorica create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Prague create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Riga create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Rome create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Samara create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/San_Marino create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Sarajevo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Saratov create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Simferopol create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Skopje create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Sofia create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Stockholm create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Tallinn create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Tirane create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Tiraspol create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Ulyanovsk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Uzhgorod create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Vaduz create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Vatican create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Vienna create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Vilnius create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Volgograd create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Warsaw create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Zagreb create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Zaporozhye create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Europe/Zurich create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Factory create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/GB create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/GB-Eire create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/GMT create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/GMT+0 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/GMT-0 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/GMT0 create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Greenwich create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/HST create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Hongkong create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Iceland create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Indian/Antananarivo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Indian/Chagos create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Indian/Christmas create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Indian/Cocos create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Indian/Comoro create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Indian/Kerguelen create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Indian/Mahe create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Indian/Maldives create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Indian/Mauritius create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Indian/Mayotte create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Indian/Reunion create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Iran create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Israel create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Jamaica create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Japan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Kwajalein create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Libya create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/MET create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/MST create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/MST7MDT create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Mexico/BajaNorte create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Mexico/BajaSur create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Mexico/General create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/NZ create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/NZ-CHAT create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Navajo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/PRC create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/PST8PDT create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Apia create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Auckland create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Bougainville create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Chatham create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Chuuk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Easter create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Efate create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Enderbury create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Fakaofo create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Fiji create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Funafuti create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Galapagos create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Gambier create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Guadalcanal create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Guam create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Honolulu create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Johnston create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Kanton create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Kiritimati create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Kosrae create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Kwajalein create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Majuro create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Marquesas create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Midway create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Nauru create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Niue create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Norfolk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Noumea create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Pago_Pago create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Palau create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Pitcairn create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Pohnpei create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Ponape create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Port_Moresby create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Rarotonga create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Saipan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Samoa create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Tahiti create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Tarawa create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Tongatapu create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Truk create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Wake create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Wallis create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Pacific/Yap create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Poland create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Portugal create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/ROC create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/ROK create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Singapore create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Turkey create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/UCT create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/Alaska create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/Aleutian create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/Arizona create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/Central create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/East-Indiana create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/Eastern create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/Hawaii create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/Indiana-Starke create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/Michigan create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/Mountain create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/Pacific create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/US/Samoa create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/UTC create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Universal create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/W-SU create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/WET create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/Zulu create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/iso3166.tab create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/leapseconds create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/tzdata.zi create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/zone.tab create mode 100644 lib/python3.11/site-packages/pytz/zoneinfo/zone1970.tab create mode 100644 lib/python3.11/site-packages/redis-4.5.5.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/redis-4.5.5.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/redis-4.5.5.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/redis-4.5.5.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/redis-4.5.5.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/redis-4.5.5.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/redis-4.5.5.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/redis/__init__.py create mode 100644 lib/python3.11/site-packages/redis/asyncio/__init__.py create mode 100644 lib/python3.11/site-packages/redis/asyncio/client.py create mode 100644 lib/python3.11/site-packages/redis/asyncio/cluster.py create mode 100644 lib/python3.11/site-packages/redis/asyncio/connection.py create mode 100644 lib/python3.11/site-packages/redis/asyncio/lock.py create mode 100644 lib/python3.11/site-packages/redis/asyncio/parser.py create mode 100644 lib/python3.11/site-packages/redis/asyncio/retry.py create mode 100644 lib/python3.11/site-packages/redis/asyncio/sentinel.py create mode 100644 lib/python3.11/site-packages/redis/asyncio/utils.py create mode 100644 lib/python3.11/site-packages/redis/backoff.py create mode 100644 lib/python3.11/site-packages/redis/client.py create mode 100644 lib/python3.11/site-packages/redis/cluster.py create mode 100644 lib/python3.11/site-packages/redis/commands/__init__.py create mode 100644 lib/python3.11/site-packages/redis/commands/bf/__init__.py create mode 100644 lib/python3.11/site-packages/redis/commands/bf/commands.py create mode 100644 lib/python3.11/site-packages/redis/commands/bf/info.py create mode 100644 lib/python3.11/site-packages/redis/commands/cluster.py create mode 100644 lib/python3.11/site-packages/redis/commands/core.py create mode 100644 lib/python3.11/site-packages/redis/commands/graph/__init__.py create mode 100644 lib/python3.11/site-packages/redis/commands/graph/commands.py create mode 100644 lib/python3.11/site-packages/redis/commands/graph/edge.py create mode 100644 lib/python3.11/site-packages/redis/commands/graph/exceptions.py create mode 100644 lib/python3.11/site-packages/redis/commands/graph/execution_plan.py create mode 100644 lib/python3.11/site-packages/redis/commands/graph/node.py create mode 100644 lib/python3.11/site-packages/redis/commands/graph/path.py create mode 100644 lib/python3.11/site-packages/redis/commands/graph/query_result.py create mode 100644 lib/python3.11/site-packages/redis/commands/helpers.py create mode 100644 lib/python3.11/site-packages/redis/commands/json/__init__.py create mode 100644 lib/python3.11/site-packages/redis/commands/json/_util.py create mode 100644 lib/python3.11/site-packages/redis/commands/json/commands.py create mode 100644 lib/python3.11/site-packages/redis/commands/json/decoders.py create mode 100644 lib/python3.11/site-packages/redis/commands/json/path.py create mode 100644 lib/python3.11/site-packages/redis/commands/parser.py create mode 100644 lib/python3.11/site-packages/redis/commands/redismodules.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/__init__.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/_util.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/aggregation.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/commands.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/document.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/field.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/indexDefinition.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/query.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/querystring.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/reducers.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/result.py create mode 100644 lib/python3.11/site-packages/redis/commands/search/suggestion.py create mode 100644 lib/python3.11/site-packages/redis/commands/sentinel.py create mode 100644 lib/python3.11/site-packages/redis/commands/timeseries/__init__.py create mode 100644 lib/python3.11/site-packages/redis/commands/timeseries/commands.py create mode 100644 lib/python3.11/site-packages/redis/commands/timeseries/info.py create mode 100644 lib/python3.11/site-packages/redis/commands/timeseries/utils.py create mode 100644 lib/python3.11/site-packages/redis/compat.py create mode 100644 lib/python3.11/site-packages/redis/connection.py create mode 100644 lib/python3.11/site-packages/redis/crc.py create mode 100644 lib/python3.11/site-packages/redis/credentials.py create mode 100644 lib/python3.11/site-packages/redis/exceptions.py create mode 100644 lib/python3.11/site-packages/redis/lock.py create mode 100644 lib/python3.11/site-packages/redis/ocsp.py create mode 100644 lib/python3.11/site-packages/redis/retry.py create mode 100644 lib/python3.11/site-packages/redis/sentinel.py create mode 100644 lib/python3.11/site-packages/redis/typing.py create mode 100644 lib/python3.11/site-packages/redis/utils.py create mode 100644 lib/python3.11/site-packages/requests-2.31.0.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/requests-2.31.0.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/requests-2.31.0.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/requests-2.31.0.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/requests-2.31.0.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/requests-2.31.0.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/requests-2.31.0.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/requests/__init__.py create mode 100644 lib/python3.11/site-packages/requests/__version__.py create mode 100644 lib/python3.11/site-packages/requests/_internal_utils.py create mode 100644 lib/python3.11/site-packages/requests/adapters.py create mode 100644 lib/python3.11/site-packages/requests/api.py create mode 100644 lib/python3.11/site-packages/requests/auth.py create mode 100644 lib/python3.11/site-packages/requests/certs.py create mode 100644 lib/python3.11/site-packages/requests/compat.py create mode 100644 lib/python3.11/site-packages/requests/cookies.py create mode 100644 lib/python3.11/site-packages/requests/exceptions.py create mode 100644 lib/python3.11/site-packages/requests/help.py create mode 100644 lib/python3.11/site-packages/requests/hooks.py create mode 100644 lib/python3.11/site-packages/requests/models.py create mode 100644 lib/python3.11/site-packages/requests/packages.py create mode 100644 lib/python3.11/site-packages/requests/sessions.py create mode 100644 lib/python3.11/site-packages/requests/status_codes.py create mode 100644 lib/python3.11/site-packages/requests/structures.py create mode 100644 lib/python3.11/site-packages/requests/utils.py create mode 100644 lib/python3.11/site-packages/requests_file-1.5.1.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/requests_file-1.5.1.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/requests_file-1.5.1.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/requests_file-1.5.1.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/requests_file-1.5.1.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/requests_file-1.5.1.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/requests_file-1.5.1.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/requests_file.py create mode 100644 lib/python3.11/site-packages/schedule-1.2.0.dist-info/AUTHORS.rst create mode 100644 lib/python3.11/site-packages/schedule-1.2.0.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/schedule-1.2.0.dist-info/LICENSE.txt create mode 100644 lib/python3.11/site-packages/schedule-1.2.0.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/schedule-1.2.0.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/schedule-1.2.0.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/schedule-1.2.0.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/schedule-1.2.0.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/schedule/__init__.py create mode 100644 lib/python3.11/site-packages/schedule/py.typed create mode 100644 lib/python3.11/site-packages/selenium-3.14.1.dist-info/DESCRIPTION.rst create mode 100644 lib/python3.11/site-packages/selenium-3.14.1.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/selenium-3.14.1.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/selenium-3.14.1.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/selenium-3.14.1.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/selenium-3.14.1.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/selenium-3.14.1.dist-info/metadata.json create mode 100644 lib/python3.11/site-packages/selenium-3.14.1.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/selenium/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/common/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/common/exceptions.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/android/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/android/webdriver.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/blackberry/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/blackberry/webdriver.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/chrome/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/chrome/options.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/chrome/remote_connection.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/chrome/service.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/chrome/webdriver.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/action_chains.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/actions/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/actions/action_builder.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/actions/input_device.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/actions/interaction.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/actions/key_actions.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/actions/key_input.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/actions/mouse_button.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/actions/pointer_actions.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/actions/pointer_input.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/alert.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/by.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/desired_capabilities.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/html5/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/html5/application_cache.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/keys.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/proxy.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/service.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/touch_actions.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/common/utils.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/edge/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/edge/options.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/edge/service.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/edge/webdriver.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/firefox/__init__.py create mode 100755 lib/python3.11/site-packages/selenium/webdriver/firefox/amd64/x_ignore_nofocus.so create mode 100644 lib/python3.11/site-packages/selenium/webdriver/firefox/extension_connection.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/firefox/firefox_binary.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/firefox/firefox_profile.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/firefox/options.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/firefox/remote_connection.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/firefox/service.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/firefox/webdriver.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/firefox/webdriver.xpi create mode 100644 lib/python3.11/site-packages/selenium/webdriver/firefox/webdriver_prefs.json create mode 100644 lib/python3.11/site-packages/selenium/webdriver/firefox/webelement.py create mode 100755 lib/python3.11/site-packages/selenium/webdriver/firefox/x86/x_ignore_nofocus.so create mode 100644 lib/python3.11/site-packages/selenium/webdriver/ie/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/ie/options.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/ie/service.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/ie/webdriver.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/opera/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/opera/options.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/opera/webdriver.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/phantomjs/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/phantomjs/service.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/phantomjs/webdriver.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/command.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/file_detector.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/getAttribute.js create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/isDisplayed.js create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/mobile.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/remote_connection.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/switch_to.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/utils.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/remote/webelement.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/safari/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/safari/permissions.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/safari/remote_connection.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/safari/service.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/safari/webdriver.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/support/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/support/abstract_event_listener.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/support/color.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/support/event_firing_webdriver.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/support/events.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/support/expected_conditions.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/support/select.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/support/ui.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/support/wait.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/webkitgtk/__init__.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/webkitgtk/options.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/webkitgtk/service.py create mode 100644 lib/python3.11/site-packages/selenium/webdriver/webkitgtk/webdriver.py create mode 100644 lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/PKG-INFO create mode 100644 lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/SOURCES.txt create mode 100644 lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/dependency_links.txt create mode 100644 lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/installed-files.txt create mode 100644 lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/not-zip-safe create mode 100644 lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/requires.txt create mode 100644 lib/python3.11/site-packages/selenium_requests-1.3-py3.11.egg-info/top_level.txt create mode 100644 lib/python3.11/site-packages/seleniumrequests/__init__.py create mode 100644 lib/python3.11/site-packages/seleniumrequests/request.py create mode 100644 lib/python3.11/site-packages/setuptools-65.5.1.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/setuptools-65.5.1.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/setuptools-65.5.1.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/setuptools-65.5.1.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/setuptools-65.5.1.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/setuptools-65.5.1.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/setuptools-65.5.1.dist-info/entry_points.txt create mode 100644 lib/python3.11/site-packages/setuptools-65.5.1.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/setuptools/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_deprecation_warning.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/_collections.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/_functools.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/_macos_compat.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/archive_util.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/cmd.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/_framework_compat.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/build.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/check.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/clean.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/config.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/install.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/register.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/command/upload.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/config.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/core.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/debug.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/dep_util.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/dir_util.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/dist.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/errors.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/extension.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/file_util.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/filelist.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/log.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/py38compat.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/py39compat.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/spawn.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/text_file.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/util.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/version.py create mode 100644 lib/python3.11/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 lib/python3.11/site-packages/setuptools/_entry_points.py create mode 100644 lib/python3.11/site-packages/setuptools/_imp.py create mode 100644 lib/python3.11/site-packages/setuptools/_importlib.py create mode 100644 lib/python3.11/site-packages/setuptools/_itertools.py create mode 100644 lib/python3.11/site-packages/setuptools/_path.py create mode 100644 lib/python3.11/site-packages/setuptools/_reqs.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_collections.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_compat.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_functools.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_meta.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_metadata/_text.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_adapters.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_common.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_compat.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_itertools.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/_legacy.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/abc.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/readers.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/importlib_resources/simple.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/jaraco/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/jaraco/context.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/jaraco/functools.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/packaging/_manylinux.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/packaging/_musllinux.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/pyparsing/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/pyparsing/actions.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/pyparsing/common.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/pyparsing/core.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/pyparsing/exceptions.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/pyparsing/helpers.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/pyparsing/results.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/pyparsing/testing.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/pyparsing/unicode.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/pyparsing/util.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/tomli/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/tomli/_parser.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/tomli/_re.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/tomli/_types.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/typing_extensions.py create mode 100644 lib/python3.11/site-packages/setuptools/_vendor/zipp.py create mode 100644 lib/python3.11/site-packages/setuptools/archive_util.py create mode 100644 lib/python3.11/site-packages/setuptools/build_meta.py create mode 100644 lib/python3.11/site-packages/setuptools/command/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/command/alias.py create mode 100644 lib/python3.11/site-packages/setuptools/command/bdist_egg.py create mode 100644 lib/python3.11/site-packages/setuptools/command/bdist_rpm.py create mode 100644 lib/python3.11/site-packages/setuptools/command/build.py create mode 100644 lib/python3.11/site-packages/setuptools/command/build_clib.py create mode 100644 lib/python3.11/site-packages/setuptools/command/build_ext.py create mode 100644 lib/python3.11/site-packages/setuptools/command/build_py.py create mode 100644 lib/python3.11/site-packages/setuptools/command/develop.py create mode 100644 lib/python3.11/site-packages/setuptools/command/dist_info.py create mode 100644 lib/python3.11/site-packages/setuptools/command/easy_install.py create mode 100644 lib/python3.11/site-packages/setuptools/command/editable_wheel.py create mode 100644 lib/python3.11/site-packages/setuptools/command/egg_info.py create mode 100644 lib/python3.11/site-packages/setuptools/command/install.py create mode 100644 lib/python3.11/site-packages/setuptools/command/install_egg_info.py create mode 100644 lib/python3.11/site-packages/setuptools/command/install_lib.py create mode 100644 lib/python3.11/site-packages/setuptools/command/install_scripts.py create mode 100644 lib/python3.11/site-packages/setuptools/command/launcher manifest.xml create mode 100644 lib/python3.11/site-packages/setuptools/command/py36compat.py create mode 100644 lib/python3.11/site-packages/setuptools/command/register.py create mode 100644 lib/python3.11/site-packages/setuptools/command/rotate.py create mode 100644 lib/python3.11/site-packages/setuptools/command/saveopts.py create mode 100644 lib/python3.11/site-packages/setuptools/command/sdist.py create mode 100644 lib/python3.11/site-packages/setuptools/command/setopt.py create mode 100644 lib/python3.11/site-packages/setuptools/command/test.py create mode 100644 lib/python3.11/site-packages/setuptools/command/upload.py create mode 100644 lib/python3.11/site-packages/setuptools/command/upload_docs.py create mode 100644 lib/python3.11/site-packages/setuptools/config/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/config/_apply_pyprojecttoml.py create mode 100644 lib/python3.11/site-packages/setuptools/config/_validate_pyproject/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/config/_validate_pyproject/error_reporting.py create mode 100644 lib/python3.11/site-packages/setuptools/config/_validate_pyproject/extra_validations.py create mode 100644 lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py create mode 100644 lib/python3.11/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py create mode 100644 lib/python3.11/site-packages/setuptools/config/_validate_pyproject/formats.py create mode 100644 lib/python3.11/site-packages/setuptools/config/expand.py create mode 100644 lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py create mode 100644 lib/python3.11/site-packages/setuptools/config/setupcfg.py create mode 100644 lib/python3.11/site-packages/setuptools/dep_util.py create mode 100644 lib/python3.11/site-packages/setuptools/depends.py create mode 100644 lib/python3.11/site-packages/setuptools/discovery.py create mode 100644 lib/python3.11/site-packages/setuptools/dist.py create mode 100644 lib/python3.11/site-packages/setuptools/errors.py create mode 100644 lib/python3.11/site-packages/setuptools/extension.py create mode 100644 lib/python3.11/site-packages/setuptools/extern/__init__.py create mode 100644 lib/python3.11/site-packages/setuptools/glob.py create mode 100644 lib/python3.11/site-packages/setuptools/installer.py create mode 100644 lib/python3.11/site-packages/setuptools/launch.py create mode 100644 lib/python3.11/site-packages/setuptools/logging.py create mode 100644 lib/python3.11/site-packages/setuptools/monkey.py create mode 100644 lib/python3.11/site-packages/setuptools/msvc.py create mode 100644 lib/python3.11/site-packages/setuptools/namespaces.py create mode 100644 lib/python3.11/site-packages/setuptools/package_index.py create mode 100644 lib/python3.11/site-packages/setuptools/py34compat.py create mode 100644 lib/python3.11/site-packages/setuptools/sandbox.py create mode 100644 lib/python3.11/site-packages/setuptools/script (dev).tmpl create mode 100644 lib/python3.11/site-packages/setuptools/script.tmpl create mode 100644 lib/python3.11/site-packages/setuptools/unicode_utils.py create mode 100644 lib/python3.11/site-packages/setuptools/version.py create mode 100644 lib/python3.11/site-packages/setuptools/wheel.py create mode 100644 lib/python3.11/site-packages/setuptools/windows_support.py create mode 100644 lib/python3.11/site-packages/six-1.16.0.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/six-1.16.0.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/six-1.16.0.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/six-1.16.0.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/six-1.16.0.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/six-1.16.0.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/six-1.16.0.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/six.py create mode 100644 lib/python3.11/site-packages/soupsieve-2.4.1.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/soupsieve-2.4.1.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/soupsieve-2.4.1.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/soupsieve-2.4.1.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/soupsieve-2.4.1.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/soupsieve-2.4.1.dist-info/licenses/LICENSE.md create mode 100644 lib/python3.11/site-packages/soupsieve/__init__.py create mode 100644 lib/python3.11/site-packages/soupsieve/__meta__.py create mode 100644 lib/python3.11/site-packages/soupsieve/css_match.py create mode 100644 lib/python3.11/site-packages/soupsieve/css_parser.py create mode 100644 lib/python3.11/site-packages/soupsieve/css_types.py create mode 100644 lib/python3.11/site-packages/soupsieve/pretty.py create mode 100644 lib/python3.11/site-packages/soupsieve/py.typed create mode 100644 lib/python3.11/site-packages/soupsieve/util.py create mode 100644 lib/python3.11/site-packages/tldextract-3.4.4.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/tldextract-3.4.4.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/tldextract-3.4.4.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/tldextract-3.4.4.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/tldextract-3.4.4.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/tldextract-3.4.4.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/tldextract-3.4.4.dist-info/entry_points.txt create mode 100644 lib/python3.11/site-packages/tldextract-3.4.4.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/tldextract/.tld_set_snapshot create mode 100644 lib/python3.11/site-packages/tldextract/__init__.py create mode 100644 lib/python3.11/site-packages/tldextract/__main__.py create mode 100644 lib/python3.11/site-packages/tldextract/_version.py create mode 100644 lib/python3.11/site-packages/tldextract/cache.py create mode 100644 lib/python3.11/site-packages/tldextract/cli.py create mode 100644 lib/python3.11/site-packages/tldextract/py.typed create mode 100644 lib/python3.11/site-packages/tldextract/remote.py create mode 100644 lib/python3.11/site-packages/tldextract/suffix_list.py create mode 100644 lib/python3.11/site-packages/tldextract/tldextract.py create mode 100644 lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/typing_extensions-4.6.3.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/typing_extensions.py create mode 100644 lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/LICENSE.txt create mode 100644 lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/tzlocal-5.0.1.dist-info/zip-safe create mode 100644 lib/python3.11/site-packages/tzlocal/__init__.py create mode 100644 lib/python3.11/site-packages/tzlocal/unix.py create mode 100644 lib/python3.11/site-packages/tzlocal/utils.py create mode 100644 lib/python3.11/site-packages/tzlocal/win32.py create mode 100644 lib/python3.11/site-packages/tzlocal/windows_tz.py create mode 100644 lib/python3.11/site-packages/urllib3-1.26.2.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/urllib3-1.26.2.dist-info/LICENSE.txt create mode 100644 lib/python3.11/site-packages/urllib3-1.26.2.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/urllib3-1.26.2.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/urllib3-1.26.2.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/urllib3-1.26.2.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/urllib3-1.26.2.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/urllib3/__init__.py create mode 100644 lib/python3.11/site-packages/urllib3/_collections.py create mode 100644 lib/python3.11/site-packages/urllib3/_version.py create mode 100644 lib/python3.11/site-packages/urllib3/connection.py create mode 100644 lib/python3.11/site-packages/urllib3/connectionpool.py create mode 100644 lib/python3.11/site-packages/urllib3/contrib/__init__.py create mode 100644 lib/python3.11/site-packages/urllib3/contrib/_appengine_environ.py create mode 100644 lib/python3.11/site-packages/urllib3/contrib/_securetransport/__init__.py create mode 100644 lib/python3.11/site-packages/urllib3/contrib/_securetransport/bindings.py create mode 100644 lib/python3.11/site-packages/urllib3/contrib/_securetransport/low_level.py create mode 100644 lib/python3.11/site-packages/urllib3/contrib/appengine.py create mode 100644 lib/python3.11/site-packages/urllib3/contrib/ntlmpool.py create mode 100644 lib/python3.11/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 lib/python3.11/site-packages/urllib3/contrib/securetransport.py create mode 100644 lib/python3.11/site-packages/urllib3/contrib/socks.py create mode 100644 lib/python3.11/site-packages/urllib3/exceptions.py create mode 100644 lib/python3.11/site-packages/urllib3/fields.py create mode 100644 lib/python3.11/site-packages/urllib3/filepost.py create mode 100644 lib/python3.11/site-packages/urllib3/packages/__init__.py create mode 100644 lib/python3.11/site-packages/urllib3/packages/backports/__init__.py create mode 100644 lib/python3.11/site-packages/urllib3/packages/backports/makefile.py create mode 100644 lib/python3.11/site-packages/urllib3/packages/six.py create mode 100644 lib/python3.11/site-packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 lib/python3.11/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 lib/python3.11/site-packages/urllib3/poolmanager.py create mode 100644 lib/python3.11/site-packages/urllib3/request.py create mode 100644 lib/python3.11/site-packages/urllib3/response.py create mode 100644 lib/python3.11/site-packages/urllib3/util/__init__.py create mode 100644 lib/python3.11/site-packages/urllib3/util/connection.py create mode 100644 lib/python3.11/site-packages/urllib3/util/proxy.py create mode 100644 lib/python3.11/site-packages/urllib3/util/queue.py create mode 100644 lib/python3.11/site-packages/urllib3/util/request.py create mode 100644 lib/python3.11/site-packages/urllib3/util/response.py create mode 100644 lib/python3.11/site-packages/urllib3/util/retry.py create mode 100644 lib/python3.11/site-packages/urllib3/util/ssl_.py create mode 100644 lib/python3.11/site-packages/urllib3/util/ssltransport.py create mode 100644 lib/python3.11/site-packages/urllib3/util/timeout.py create mode 100644 lib/python3.11/site-packages/urllib3/util/url.py create mode 100644 lib/python3.11/site-packages/urllib3/util/wait.py create mode 100644 lib/python3.11/site-packages/websockets-11.0.3.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/websockets-11.0.3.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/websockets-11.0.3.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/websockets-11.0.3.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/websockets-11.0.3.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/websockets-11.0.3.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/websockets-11.0.3.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/websockets/__init__.py create mode 100644 lib/python3.11/site-packages/websockets/__main__.py create mode 100644 lib/python3.11/site-packages/websockets/auth.py create mode 100644 lib/python3.11/site-packages/websockets/client.py create mode 100644 lib/python3.11/site-packages/websockets/connection.py create mode 100644 lib/python3.11/site-packages/websockets/datastructures.py create mode 100644 lib/python3.11/site-packages/websockets/exceptions.py create mode 100644 lib/python3.11/site-packages/websockets/extensions/__init__.py create mode 100644 lib/python3.11/site-packages/websockets/extensions/base.py create mode 100644 lib/python3.11/site-packages/websockets/extensions/permessage_deflate.py create mode 100644 lib/python3.11/site-packages/websockets/frames.py create mode 100644 lib/python3.11/site-packages/websockets/headers.py create mode 100644 lib/python3.11/site-packages/websockets/http.py create mode 100644 lib/python3.11/site-packages/websockets/http11.py create mode 100644 lib/python3.11/site-packages/websockets/imports.py create mode 100644 lib/python3.11/site-packages/websockets/legacy/__init__.py create mode 100644 lib/python3.11/site-packages/websockets/legacy/async_timeout.py create mode 100644 lib/python3.11/site-packages/websockets/legacy/auth.py create mode 100644 lib/python3.11/site-packages/websockets/legacy/client.py create mode 100644 lib/python3.11/site-packages/websockets/legacy/compatibility.py create mode 100644 lib/python3.11/site-packages/websockets/legacy/framing.py create mode 100644 lib/python3.11/site-packages/websockets/legacy/handshake.py create mode 100644 lib/python3.11/site-packages/websockets/legacy/http.py create mode 100644 lib/python3.11/site-packages/websockets/legacy/protocol.py create mode 100644 lib/python3.11/site-packages/websockets/legacy/server.py create mode 100644 lib/python3.11/site-packages/websockets/protocol.py create mode 100644 lib/python3.11/site-packages/websockets/py.typed create mode 100644 lib/python3.11/site-packages/websockets/server.py create mode 100644 lib/python3.11/site-packages/websockets/speedups.c create mode 100755 lib/python3.11/site-packages/websockets/speedups.cpython-311-x86_64-linux-gnu.so create mode 100644 lib/python3.11/site-packages/websockets/streams.py create mode 100644 lib/python3.11/site-packages/websockets/sync/__init__.py create mode 100644 lib/python3.11/site-packages/websockets/sync/client.py create mode 100644 lib/python3.11/site-packages/websockets/sync/compatibility.py create mode 100644 lib/python3.11/site-packages/websockets/sync/connection.py create mode 100644 lib/python3.11/site-packages/websockets/sync/messages.py create mode 100644 lib/python3.11/site-packages/websockets/sync/server.py create mode 100644 lib/python3.11/site-packages/websockets/sync/utils.py create mode 100644 lib/python3.11/site-packages/websockets/typing.py create mode 100644 lib/python3.11/site-packages/websockets/uri.py create mode 100644 lib/python3.11/site-packages/websockets/utils.py create mode 100644 lib/python3.11/site-packages/websockets/version.py create mode 100644 lib/python3.11/site-packages/werkzeug/__init__.py create mode 100644 lib/python3.11/site-packages/werkzeug/_internal.py create mode 100644 lib/python3.11/site-packages/werkzeug/_reloader.py create mode 100644 lib/python3.11/site-packages/werkzeug/datastructures.py create mode 100644 lib/python3.11/site-packages/werkzeug/datastructures.pyi create mode 100644 lib/python3.11/site-packages/werkzeug/debug/__init__.py create mode 100644 lib/python3.11/site-packages/werkzeug/debug/console.py create mode 100644 lib/python3.11/site-packages/werkzeug/debug/repr.py create mode 100644 lib/python3.11/site-packages/werkzeug/debug/shared/ICON_LICENSE.md create mode 100644 lib/python3.11/site-packages/werkzeug/debug/shared/console.png create mode 100644 lib/python3.11/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 lib/python3.11/site-packages/werkzeug/debug/shared/less.png create mode 100644 lib/python3.11/site-packages/werkzeug/debug/shared/more.png create mode 100644 lib/python3.11/site-packages/werkzeug/debug/shared/style.css create mode 100644 lib/python3.11/site-packages/werkzeug/debug/tbtools.py create mode 100644 lib/python3.11/site-packages/werkzeug/exceptions.py create mode 100644 lib/python3.11/site-packages/werkzeug/formparser.py create mode 100644 lib/python3.11/site-packages/werkzeug/http.py create mode 100644 lib/python3.11/site-packages/werkzeug/local.py create mode 100644 lib/python3.11/site-packages/werkzeug/middleware/__init__.py create mode 100644 lib/python3.11/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 lib/python3.11/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 lib/python3.11/site-packages/werkzeug/middleware/lint.py create mode 100644 lib/python3.11/site-packages/werkzeug/middleware/profiler.py create mode 100644 lib/python3.11/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 lib/python3.11/site-packages/werkzeug/middleware/shared_data.py create mode 100644 lib/python3.11/site-packages/werkzeug/py.typed create mode 100644 lib/python3.11/site-packages/werkzeug/routing/__init__.py create mode 100644 lib/python3.11/site-packages/werkzeug/routing/converters.py create mode 100644 lib/python3.11/site-packages/werkzeug/routing/exceptions.py create mode 100644 lib/python3.11/site-packages/werkzeug/routing/map.py create mode 100644 lib/python3.11/site-packages/werkzeug/routing/matcher.py create mode 100644 lib/python3.11/site-packages/werkzeug/routing/rules.py create mode 100644 lib/python3.11/site-packages/werkzeug/sansio/__init__.py create mode 100644 lib/python3.11/site-packages/werkzeug/sansio/http.py create mode 100644 lib/python3.11/site-packages/werkzeug/sansio/multipart.py create mode 100644 lib/python3.11/site-packages/werkzeug/sansio/request.py create mode 100644 lib/python3.11/site-packages/werkzeug/sansio/response.py create mode 100644 lib/python3.11/site-packages/werkzeug/sansio/utils.py create mode 100644 lib/python3.11/site-packages/werkzeug/security.py create mode 100644 lib/python3.11/site-packages/werkzeug/serving.py create mode 100644 lib/python3.11/site-packages/werkzeug/test.py create mode 100644 lib/python3.11/site-packages/werkzeug/testapp.py create mode 100644 lib/python3.11/site-packages/werkzeug/urls.py create mode 100644 lib/python3.11/site-packages/werkzeug/user_agent.py create mode 100644 lib/python3.11/site-packages/werkzeug/utils.py create mode 100644 lib/python3.11/site-packages/werkzeug/wrappers/__init__.py create mode 100644 lib/python3.11/site-packages/werkzeug/wrappers/request.py create mode 100644 lib/python3.11/site-packages/werkzeug/wrappers/response.py create mode 100644 lib/python3.11/site-packages/werkzeug/wsgi.py create mode 100644 lib/python3.11/site-packages/wget-3.2-py3.11.egg-info/PKG-INFO create mode 100644 lib/python3.11/site-packages/wget-3.2-py3.11.egg-info/SOURCES.txt create mode 100644 lib/python3.11/site-packages/wget-3.2-py3.11.egg-info/dependency_links.txt create mode 100644 lib/python3.11/site-packages/wget-3.2-py3.11.egg-info/installed-files.txt create mode 100644 lib/python3.11/site-packages/wget-3.2-py3.11.egg-info/top_level.txt create mode 100644 lib/python3.11/site-packages/wget.py create mode 100644 lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/AUTHORS create mode 100644 lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/entry_points.txt create mode 100644 lib/python3.11/site-packages/yt_dlp-2023.3.4.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/yt_dlp/YoutubeDL.py create mode 100644 lib/python3.11/site-packages/yt_dlp/__init__.py create mode 100644 lib/python3.11/site-packages/yt_dlp/__main__.py create mode 100644 lib/python3.11/site-packages/yt_dlp/__pyinstaller/__init__.py create mode 100644 lib/python3.11/site-packages/yt_dlp/__pyinstaller/hook-yt_dlp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/aes.py create mode 100644 lib/python3.11/site-packages/yt_dlp/cache.py create mode 100644 lib/python3.11/site-packages/yt_dlp/compat/__init__.py create mode 100644 lib/python3.11/site-packages/yt_dlp/compat/_deprecated.py create mode 100644 lib/python3.11/site-packages/yt_dlp/compat/_legacy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/compat/compat_utils.py create mode 100644 lib/python3.11/site-packages/yt_dlp/compat/functools.py create mode 100644 lib/python3.11/site-packages/yt_dlp/compat/imghdr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/compat/shutil.py create mode 100644 lib/python3.11/site-packages/yt_dlp/cookies.py create mode 100644 lib/python3.11/site-packages/yt_dlp/dependencies/Cryptodome.py create mode 100644 lib/python3.11/site-packages/yt_dlp/dependencies/__init__.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/__init__.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/common.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/dash.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/external.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/f4m.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/fc2.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/fragment.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/hls.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/http.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/ism.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/mhtml.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/niconico.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/rtmp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/rtsp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/websocket.py create mode 100644 lib/python3.11/site-packages/yt_dlp/downloader/youtube_live_chat.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/__init__.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/_extractors.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/abc.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/abcnews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/abcotvs.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/abematv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/academicearth.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/acast.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/acfun.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/adn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/adobeconnect.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/adobepass.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/adobetv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/adultswim.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/aenetworks.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/aeonco.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/afreecatv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/agora.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/airmozilla.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/airtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/aitube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/aliexpress.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/aljazeera.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/allocine.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/alphaporno.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/alsace20tv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/alura.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/amara.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/amazon.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/amazonminitv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/amcnetworks.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/americastestkitchen.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/amp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/anchorfm.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/angel.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ant1newsgr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/anvato.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/aol.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/apa.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/aparat.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/appleconnect.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/applepodcasts.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/appletrailers.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/archiveorg.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/arcpublishing.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ard.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/arkena.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/arnes.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/arte.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/asiancrush.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/atresplayer.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/atscaleconf.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/atttechchannel.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/atvat.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/audimedia.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/audioboom.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/audiodraft.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/audiomack.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/audius.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/awaan.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/aws.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/azmedien.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/baidu.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/banbye.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bandaichannel.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bandcamp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bannedvideo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bbc.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/beatbump.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/beatport.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/beeg.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/behindkink.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bellmedia.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/berufetv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bfi.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bfmtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bibeltv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bigflix.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bigo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bild.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bilibili.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/biobiochiletv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/biqle.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bitchute.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bitwave.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/blackboardcollaborate.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bleacherreport.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/blerp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/blogger.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bloomberg.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bokecc.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bongacams.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/booyah.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bostonglobe.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/box.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/boxcast.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bpb.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/br.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bravotv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/breakcom.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/breitbart.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/brightcove.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/bundesliga.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/businessinsider.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/buzzfeed.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/byutv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/c56.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cableav.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/callin.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/caltrans.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cam4.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/camdemy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cammodels.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/camsoda.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/camtasia.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/camwithher.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/canalalpha.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/canalc2.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/canalplus.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/canvas.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/carambatv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cartoonnetwork.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cbc.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cbs.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cbsinteractive.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cbslocal.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cbsnews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cbssports.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ccc.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ccma.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cctv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cda.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cellebrite.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ceskatelevize.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cgtn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/channel9.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/charlierose.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/chaturbate.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/chilloutzone.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/chingari.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/chirbit.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cinchcast.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cinemax.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cinetecamilano.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ciscolive.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ciscowebex.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cjsw.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cliphunter.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/clippit.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cliprs.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/clipsyndicate.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/closertotruth.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cloudflarestream.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cloudy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/clubic.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/clyp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cmt.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cnbc.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cnn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/comedycentral.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/common.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/commonmistakes.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/commonprotocols.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/condenast.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/contv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/corus.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/coub.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cozytv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cpac.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cracked.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/crackle.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/craftsy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/crooksandliars.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/crowdbunker.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/crunchyroll.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cspan.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ctsnews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ctv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ctvnews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cultureunplugged.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/curiositystream.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cwtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/cybrary.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/daftsex.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dailymail.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dailymotion.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dailywire.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/damtomo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/daum.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/daystar.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dbtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dctp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/deezer.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/defense.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/democracynow.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/detik.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/deuxm.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dfb.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dhm.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/digg.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/digitalconcerthall.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/digiteka.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/discovery.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/discoverygo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/disney.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dispeak.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dlive.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dotsub.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/douyutv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dplay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/drbonanza.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dreisat.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/drooble.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dropbox.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dropout.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/drtuber.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/drtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dtube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/duboku.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dumpert.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dvtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/dw.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/eagleplatform.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ebaumsworld.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ebay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/echomsk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/egghead.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ehow.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/eighttracks.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/einthusan.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/eitb.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ellentube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/elonet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/elpais.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/embedly.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/engadget.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/epicon.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/epoch.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/eporner.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/eroprofile.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ertgr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/escapist.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/espn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/esri.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/europa.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/europeantour.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/eurosport.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/euscreen.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/expotv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/expressen.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/extractors.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/extremetube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/eyedotv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/facebook.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fancode.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/faz.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fc2.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fczenit.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fifa.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/filmmodu.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/filmon.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/filmweb.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/firsttv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fivetv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/flickr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/folketinget.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/footyroom.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/formula1.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fourtube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fourzerostudio.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fox.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fox9.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/foxgay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/foxnews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/foxsports.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fptplay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/franceinter.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/francetv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/freesound.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/freespeech.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/freetv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/frontendmasters.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fujitv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/funimation.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/funk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fusion.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/fuyintv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gab.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gaia.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gameinformer.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gamejolt.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gamespot.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gamestar.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gaskrank.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gazeta.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gdcvault.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gedidigital.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/generic.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/genericembeds.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/genius.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gettr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gfycat.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/giantbomb.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/giga.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gigya.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/glide.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/globo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/glomex.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/go.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/godtube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gofile.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/golem.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/goodgame.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/googledrive.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/googlepodcasts.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/googlesearch.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/goplay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gopro.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/goshgay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gotostage.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gputechconf.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/gronkh.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/groupon.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/harpodeon.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hbo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hearthisat.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/heise.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hellporno.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/helsinki.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hentaistigma.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hgtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hidive.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/historicfilms.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hitbox.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hitrecord.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hketv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/holodex.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hotnewhiphop.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hotstar.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/howcast.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/howstuffworks.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hrfensehen.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hrti.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hse.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/huajiao.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/huffpost.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hungama.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/huya.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hypem.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hypergryph.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/hytale.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/icareus.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ichinanalive.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ign.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/iheart.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/iltalehti.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/imdb.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/imggaming.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/imgur.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ina.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/inc.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/indavideo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/infoq.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/instagram.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/internazionale.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/internetvideoarchive.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/iprima.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/iqiyi.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/islamchannel.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/israelnationalnews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/itprotv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/itv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ivi.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ivideon.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/iwara.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ixigua.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/izlesene.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/jable.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/jamendo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/japandiet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/jeuxvideo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/jixie.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/joj.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/jove.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/jwplatform.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kakao.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kaltura.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kanal2.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kankanews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/karaoketv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/karrierevideos.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/keezmovies.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kelbyone.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ketnet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/khanacademy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kick.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kicker.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kickstarter.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kinja.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kinopoisk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kommunetv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kompas.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/konserthusetplay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/koo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/krasview.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kth.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ku6.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kusi.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/kuwo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/la7.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/laola1tv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lastfm.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lazy_extractors.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lbry.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lci.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lcp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lecture2go.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lecturio.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/leeco.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lefigaro.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lego.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lemonde.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lenta.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/libraryofcongress.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/libsyn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lifenews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/likee.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/limelight.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/line.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/linkedin.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/linuxacademy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/liputan6.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/listennotes.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/litv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/livejournal.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/livestream.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/livestreamfails.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lnkgo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/localnews8.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lovehomeporn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lrt.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lumni.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/lynda.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/m6.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/magentamusik360.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mailru.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mainstreaming.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/malltv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mangomolo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/manoto.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/manyvids.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/maoritv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/markiza.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/massengeschmacktv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/masters.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/matchtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mdr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/medaltv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mediaite.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mediaklikk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/medialaan.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mediaset.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mediasite.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mediastream.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mediaworksnz.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/medici.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/megaphone.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/megatvcom.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/meipai.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/melonvod.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/meta.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/metacafe.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/metacritic.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mgoon.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mgtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/miaopai.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/microsoftembed.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/microsoftstream.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/microsoftvirtualacademy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mildom.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/minds.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ministrygrid.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/minoto.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/miomio.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mirrativ.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mirrorcouk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mit.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mitele.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mixch.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mixcloud.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mlb.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mlssoccer.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mnet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mocha.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/moevideo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mofosex.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mojvideo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/morningstar.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/motherless.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/motorsport.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/movieclips.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/moviepilot.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/moview.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/moviezine.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/movingimage.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/msn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/muenchentv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/murrtube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/musescore.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/musicdex.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mwave.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mxplayer.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/mychannels.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/myspace.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/myspass.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/myvi.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/myvideoge.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/myvidster.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/n1.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nate.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nationalgeographic.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/naver.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nba.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nbc.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ndr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ndtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nebula.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nerdcubed.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/neteasemusic.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/netverse.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/netzkino.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/newgrounds.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/newspicks.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/newstube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/newsy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nextmedia.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nexx.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nfb.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nfhsnetwork.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nfl.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nhk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nhl.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nick.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/niconico.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ninecninemedia.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ninegag.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ninenow.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nintendo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nitter.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/njpwworld.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nobelprize.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/noice.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nonktube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/noodlemagazine.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/noovo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/normalboots.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nosnl.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nosvideo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nova.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/novaplay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nowness.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/noz.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/npo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/npr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nrk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nrl.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ntvcojp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ntvde.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ntvru.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nuevo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nuvid.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nytimes.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nzherald.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nzonscreen.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/nzz.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/odatv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/odkmedia.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/odnoklassniki.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/oftv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/oktoberfesttv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/olympics.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/on24.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/once.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ondemandkorea.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/onefootball.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/onenewsnz.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/oneplace.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/onet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/onionstudios.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ooyala.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/opencast.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/openload.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/openrec.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ora.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/orf.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/outsidetv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/packtpub.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/palcomp3.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pandoratv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/panopto.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/paramountplus.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/parler.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/parlview.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/patreon.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pbs.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pearvideo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/peekvids.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/peertube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/peertv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/peloton.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/people.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/performgroup.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/periscope.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/philharmoniedeparis.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/phoenix.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/photobucket.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/piapro.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/picarto.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/piksel.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pinkbike.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pinterest.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pixivsketch.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pladform.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/planetmarathi.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/platzi.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/playfm.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/playplustv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/plays.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/playstuff.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/playsuisse.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/playtvak.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/playvid.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/playwire.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pluralsight.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/plutotv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/podbayfm.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/podchaser.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/podomatic.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pokemon.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pokergo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/polsatgo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/polskieradio.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/popcorntimes.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/popcorntv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/porn91.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/porncom.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pornez.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pornflip.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pornhd.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pornhub.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pornotube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pornovoisines.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pornoxo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pr0gramm.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/prankcast.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/premiershiprugby.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/presstv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/projectveritas.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/prosiebensat1.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/prx.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/puhutv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/puls4.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/pyvideo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/qingting.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/qqmusic.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/r7.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/radiko.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/radiobremen.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/radiocanada.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/radiode.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/radiofrance.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/radiojavan.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/radiokapital.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/radiozet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/radlive.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rai.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/raywenderlich.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rbgtum.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rbmaradio.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rcs.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rcti.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rds.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/redbee.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/redbulltv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/reddit.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/redgifs.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/redtube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/regiotv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rentv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/restudy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/reuters.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/reverbnation.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rice.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rmcdecouverte.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rockstargames.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rokfin.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/roosterteeth.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rottentomatoes.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rozhlas.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rte.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rtl2.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rtlnl.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rtnews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rtp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rtrfm.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rts.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rtve.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rtvnh.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rtvs.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rtvslo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ruhd.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rule34video.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rumble.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rutube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/rutv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ruutu.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ruv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/safari.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/saitosan.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/samplefocus.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sapo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/savefrom.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sbs.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/screen9.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/screencast.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/screencastify.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/screencastomatic.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/scrippsnetworks.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/scrolller.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/scte.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/seeker.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/senategov.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sendtonews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/servus.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sevenplus.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sexu.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/seznamzpravy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/shahid.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/shared.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sharevideos.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/shemaroome.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/showroomlive.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sibnet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/simplecast.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sina.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sixplay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/skeb.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sky.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/skyit.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/skylinewebcams.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/skynewsarabia.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/skynewsau.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/slideshare.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/slideslive.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/slutload.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/smotrim.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/snotr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sohu.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sonyliv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/soundcloud.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/soundgasm.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/southpark.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sovietscloset.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/spankbang.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/spankwire.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/spiegel.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/spike.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sport5.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sportbox.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sportdeutschland.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/spotify.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/spreaker.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/springboardplatform.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sprout.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/srgssr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/srmediathek.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/stanfordoc.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/startrek.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/startv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/steam.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/stitcher.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/storyfire.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/streamable.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/streamanity.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/streamcloud.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/streamcz.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/streamff.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/streetvoice.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/stretchinternet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/stripchat.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/stv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/substack.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sunporno.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sverigesradio.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/svt.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/swearnet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/swrmediathek.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/syfy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/syvdk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/sztvhu.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tagesschau.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tass.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tbs.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tdslifeway.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/teachable.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/teachertube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/teachingchannel.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/teamcoco.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/teamtreehouse.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/techtalks.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ted.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tele13.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tele5.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/telebruxelles.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/telecaribe.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/telecinco.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/telegraaf.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/telegram.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/telemb.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/telemundo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/telequebec.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/teletask.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/telewebion.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tempo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tencent.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tennistv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tenplay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/testurl.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tf1.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tfo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/theholetv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/theintercept.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/theplatform.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/thestar.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/thesun.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/theta.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/theweatherchannel.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/thisamericanlife.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/thisav.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/thisoldhouse.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/thisvid.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/threeqsdn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/threespeak.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tiktok.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tinypic.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tmz.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tnaflix.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/toggle.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/toggo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tokentube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tonline.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/toongoggles.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/toutv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/toypics.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/traileraddict.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/triller.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/trilulilu.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/trovo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/trtcocuk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/trueid.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/trunews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/truth.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/trutv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tube8.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tubetugraz.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tubitv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tumblr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tunein.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tunepk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/turbo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/turner.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tv2.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tv24ua.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tv2dk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tv2hu.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tv4.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tv5mondeplus.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tv5unis.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tva.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvanouvelles.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvc.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tver.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvigle.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tviplayer.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvland.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvn24.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvnet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvnoe.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvnow.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvopengr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvplay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tvplayer.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/tweakers.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/twentyfourvideo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/twentymin.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/twentythreevideo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/twitcasting.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/twitch.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/twitter.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/txxx.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/udemy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/udn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ufctv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ukcolumn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/uktvplay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/umg.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/unistra.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/unity.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/unscripted.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/unsupported.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/uol.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/uplynk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/urort.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/urplay.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/usanetwork.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/usatoday.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ustream.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ustudio.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/utreon.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/varzesh3.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vbox7.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/veehd.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/veo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/veoh.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vesti.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vevo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vgtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vh1.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vice.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vidbit.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/viddler.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/videa.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/videocampus_sachsen.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/videodetective.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/videofyme.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/videoken.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/videomore.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/videopress.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vidio.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vidlii.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/viewlift.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/viidea.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/viki.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vimeo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vimm.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vimple.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vine.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/viqeo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/viu.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vocaroo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vodlocker.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vodpl.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vodplatform.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/voicerepublic.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/voicy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/volejtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/voot.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/voxmedia.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vrak.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vrt.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vrv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vshare.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vtm.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vuclip.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vupload.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vvvvid.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vyborymos.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/vzaar.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wakanim.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/walla.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wasdtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/washingtonpost.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wat.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/watchbox.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/watchindianporn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wdr.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/webcamerapl.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/webcaster.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/webofstories.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/weibo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/weiqitv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/whowatch.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wikimedia.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/willow.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wimtv.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wistia.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wordpress.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/worldstarhiphop.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wppilot.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wrestleuniverse.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wsj.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/wwe.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xanimu.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xbef.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xboxclips.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xfileshare.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xhamster.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ximalaya.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xinpianchang.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xminus.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xnxx.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xstream.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xtube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xuite.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xvideos.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/xxxymovies.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/yahoo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/yandexdisk.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/yandexmusic.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/yandexvideo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/yapfiles.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/yappy.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/yesjapan.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/yinyuetai.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/yle_areena.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/ynet.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/youjizz.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/youku.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/younow.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/youporn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/yourporn.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/yourupload.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/youtube.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/zapiks.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/zattoo.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/zdf.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/zee5.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/zeenews.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/zhihu.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/zingmp3.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/zoom.py create mode 100644 lib/python3.11/site-packages/yt_dlp/extractor/zype.py create mode 100644 lib/python3.11/site-packages/yt_dlp/jsinterp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/minicurses.py create mode 100644 lib/python3.11/site-packages/yt_dlp/options.py create mode 100644 lib/python3.11/site-packages/yt_dlp/plugins.py create mode 100644 lib/python3.11/site-packages/yt_dlp/postprocessor/__init__.py create mode 100644 lib/python3.11/site-packages/yt_dlp/postprocessor/common.py create mode 100644 lib/python3.11/site-packages/yt_dlp/postprocessor/embedthumbnail.py create mode 100644 lib/python3.11/site-packages/yt_dlp/postprocessor/exec.py create mode 100644 lib/python3.11/site-packages/yt_dlp/postprocessor/ffmpeg.py create mode 100644 lib/python3.11/site-packages/yt_dlp/postprocessor/metadataparser.py create mode 100644 lib/python3.11/site-packages/yt_dlp/postprocessor/modify_chapters.py create mode 100644 lib/python3.11/site-packages/yt_dlp/postprocessor/movefilesafterdownload.py create mode 100644 lib/python3.11/site-packages/yt_dlp/postprocessor/sponskrub.py create mode 100644 lib/python3.11/site-packages/yt_dlp/postprocessor/sponsorblock.py create mode 100644 lib/python3.11/site-packages/yt_dlp/postprocessor/xattrpp.py create mode 100644 lib/python3.11/site-packages/yt_dlp/socks.py create mode 100644 lib/python3.11/site-packages/yt_dlp/update.py create mode 100644 lib/python3.11/site-packages/yt_dlp/utils.py create mode 100644 lib/python3.11/site-packages/yt_dlp/version.py create mode 100644 lib/python3.11/site-packages/yt_dlp/webvtt.py create mode 100644 lib/python3.11/site-packages/zipp-3.15.0.dist-info/INSTALLER create mode 100644 lib/python3.11/site-packages/zipp-3.15.0.dist-info/LICENSE create mode 100644 lib/python3.11/site-packages/zipp-3.15.0.dist-info/METADATA create mode 100644 lib/python3.11/site-packages/zipp-3.15.0.dist-info/RECORD create mode 100644 lib/python3.11/site-packages/zipp-3.15.0.dist-info/REQUESTED create mode 100644 lib/python3.11/site-packages/zipp-3.15.0.dist-info/WHEEL create mode 100644 lib/python3.11/site-packages/zipp-3.15.0.dist-info/top_level.txt create mode 100644 lib/python3.11/site-packages/zipp/__init__.py create mode 100644 lib/python3.11/site-packages/zipp/py310compat.py create mode 120000 lib64 create mode 100644 pyvenv.cfg create mode 100644 share/bash-completion/completions/yt-dlp create mode 100644 share/doc/yt_dlp/README.txt create mode 100644 share/fish/vendor_completions.d/yt-dlp.fish create mode 100644 share/man/man1/mid3cp.1 create mode 100644 share/man/man1/mid3iconv.1 create mode 100644 share/man/man1/mid3v2.1 create mode 100644 share/man/man1/moggsplit.1 create mode 100644 share/man/man1/mutagen-inspect.1 create mode 100644 share/man/man1/mutagen-pony.1 create mode 100644 share/man/man1/yt-dlp.1 create mode 100644 share/zsh/site-functions/_yt-dlp diff --git a/Dockerfile b/Dockerfile index c0b31a0..5edf5fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.6.15-slim-bullseye +FROM debian:bullseye-slim RUN apt update && apt upgrade -y RUN apt install firefox-esr -y RUN apt install curl python3-pip -y @@ -29,4 +29,4 @@ ENV FLASK_APP=app ## Switch to user #USER ${uid}:${gid} -CMD ["python3","-u","app.py"] \ No newline at end of file +CMD ["python3","-u","app.py"] diff --git a/bin/Activate.ps1 b/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/bin/activate b/bin/activate new file mode 100644 index 0000000..6017128 --- /dev/null +++ b/bin/activate @@ -0,0 +1,69 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/home/stonesoft/Apps/getDiscography" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1="(getDiscography) ${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT="(getDiscography) " + export VIRTUAL_ENV_PROMPT +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null +fi diff --git a/bin/activate.csh b/bin/activate.csh new file mode 100644 index 0000000..65c086e --- /dev/null +++ b/bin/activate.csh @@ -0,0 +1,26 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/home/stonesoft/Apps/getDiscography" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = "(getDiscography) $prompt" + setenv VIRTUAL_ENV_PROMPT "(getDiscography) " +endif + +alias pydoc python -m pydoc + +rehash diff --git a/bin/activate.fish b/bin/activate.fish new file mode 100644 index 0000000..dd28b73 --- /dev/null +++ b/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/); you cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/home/stonesoft/Apps/getDiscography" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) "(getDiscography) " (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT "(getDiscography) " +end diff --git a/bin/flask b/bin/flask new file mode 100755 index 0000000..e293292 --- /dev/null +++ b/bin/flask @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from flask.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/mid3cp b/bin/mid3cp new file mode 100755 index 0000000..d247522 --- /dev/null +++ b/bin/mid3cp @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.mid3cp import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/bin/mid3iconv b/bin/mid3iconv new file mode 100755 index 0000000..c4b6233 --- /dev/null +++ b/bin/mid3iconv @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.mid3iconv import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/bin/mid3v2 b/bin/mid3v2 new file mode 100755 index 0000000..01626af --- /dev/null +++ b/bin/mid3v2 @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.mid3v2 import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/bin/moggsplit b/bin/moggsplit new file mode 100755 index 0000000..bf0b7ef --- /dev/null +++ b/bin/moggsplit @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.moggsplit import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/bin/mutagen-inspect b/bin/mutagen-inspect new file mode 100755 index 0000000..24a9d2a --- /dev/null +++ b/bin/mutagen-inspect @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.mutagen_inspect import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/bin/mutagen-pony b/bin/mutagen-pony new file mode 100755 index 0000000..ea44fc7 --- /dev/null +++ b/bin/mutagen-pony @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mutagen._tools.mutagen_pony import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/bin/normalizer b/bin/normalizer new file mode 100755 index 0000000..2a36d63 --- /dev/null +++ b/bin/normalizer @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from charset_normalizer.cli.normalizer import cli_detect +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli_detect()) diff --git a/bin/pip b/bin/pip new file mode 100755 index 0000000..c83195d --- /dev/null +++ b/bin/pip @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/pip3 b/bin/pip3 new file mode 100755 index 0000000..c83195d --- /dev/null +++ b/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/pip3.11 b/bin/pip3.11 new file mode 100755 index 0000000..c83195d --- /dev/null +++ b/bin/pip3.11 @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/pysondb b/bin/pysondb new file mode 100755 index 0000000..763bf6f --- /dev/null +++ b/bin/pysondb @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pysondb.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/python b/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/bin/python3 b/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/bin/python3.11 b/bin/python3.11 new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/bin/python3.11 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/bin/tldextract b/bin/tldextract new file mode 100755 index 0000000..df550e2 --- /dev/null +++ b/bin/tldextract @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from tldextract.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/bin/yt-dlp b/bin/yt-dlp new file mode 100755 index 0000000..f9b036a --- /dev/null +++ b/bin/yt-dlp @@ -0,0 +1,8 @@ +#!/home/stonesoft/Apps/getDiscography/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from yt_dlp import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/docker-compose.yml b/docker-compose.yml index e6e6dd2..c70fc6b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,18 +13,3 @@ services: redis: image: redis - navidrome: - image: deluan/navidrome:latest -# user: 1000:1000 # should be owner of volumes - ports: - - "4533:4533" - restart: unless-stopped - environment: - # Optional: put your config options customization here. Examples: - ND_SCANSCHEDULE: 1h - ND_LOGLEVEL: info - ND_SESSIONTIMEOUT: 24h -# ND_BASEURL: "" - volumes: - - "./navidrome:/data:Z" - - "/home/stonesoft/Music:/music:ro" diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/INSTALLER b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..07806f8 --- /dev/null +++ b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/LICENSE.txt @@ -0,0 +1,19 @@ +This is the MIT license: http://www.opensource.org/licenses/mit-license.php + +Copyright (c) Alex Grönholm + +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/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/METADATA b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/METADATA new file mode 100644 index 0000000..64f91d3 --- /dev/null +++ b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/METADATA @@ -0,0 +1,138 @@ +Metadata-Version: 2.1 +Name: APScheduler +Version: 3.10.1 +Summary: In-process task scheduler with Cron-like capabilities +Home-page: https://github.com/agronholm/apscheduler +Author: Alex Grönholm +Author-email: apscheduler@nextday.fi +License: MIT +Keywords: scheduling cron +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 +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: >=3.6 +License-File: LICENSE.txt +Requires-Dist: setuptools (>=0.7) +Requires-Dist: six (>=1.4.0) +Requires-Dist: pytz +Requires-Dist: tzlocal (!=3.*,>=2.0) +Provides-Extra: doc +Requires-Dist: sphinx ; extra == 'doc' +Requires-Dist: sphinx-rtd-theme ; extra == 'doc' +Provides-Extra: gevent +Requires-Dist: gevent ; extra == 'gevent' +Provides-Extra: mongodb +Requires-Dist: pymongo (>=3.0) ; extra == 'mongodb' +Provides-Extra: redis +Requires-Dist: redis (>=3.0) ; extra == 'redis' +Provides-Extra: rethinkdb +Requires-Dist: rethinkdb (>=2.4.0) ; extra == 'rethinkdb' +Provides-Extra: sqlalchemy +Requires-Dist: sqlalchemy (>=1.4) ; extra == 'sqlalchemy' +Provides-Extra: testing +Requires-Dist: pytest ; extra == 'testing' +Requires-Dist: pytest-asyncio ; extra == 'testing' +Requires-Dist: pytest-cov ; extra == 'testing' +Requires-Dist: pytest-tornado5 ; extra == 'testing' +Provides-Extra: tornado +Requires-Dist: tornado (>=4.3) ; extra == 'tornado' +Provides-Extra: twisted +Requires-Dist: twisted ; extra == 'twisted' +Provides-Extra: zookeeper +Requires-Dist: kazoo ; extra == 'zookeeper' + +.. image:: https://github.com/agronholm/apscheduler/workflows/Python%20codeqa/test/badge.svg?branch=3.x + :target: https://github.com/agronholm/apscheduler/actions?query=workflow%3A%22Python+codeqa%2Ftest%22+branch%3A3.x + :alt: Build Status +.. image:: https://coveralls.io/repos/github/agronholm/apscheduler/badge.svg?branch=3.x + :target: https://coveralls.io/github/agronholm/apscheduler?branch=3.x + :alt: Code Coverage +.. image:: https://readthedocs.org/projects/apscheduler/badge/?version=3.x + :target: https://apscheduler.readthedocs.io/en/master/?badge=3.x + :alt: Documentation + +Advanced Python Scheduler (APScheduler) is a Python library that lets you schedule your Python code +to be executed later, either just once or periodically. You can add new jobs or remove old ones on +the fly as you please. If you store your jobs in a database, they will also survive scheduler +restarts and maintain their state. When the scheduler is restarted, it will then run all the jobs +it should have run while it was offline [#f1]_. + +Among other things, APScheduler can be used as a cross-platform, application specific replacement +to platform specific schedulers, such as the cron daemon or the Windows task scheduler. Please +note, however, that APScheduler is **not** a daemon or service itself, nor does it come with any +command line tools. It is primarily meant to be run inside existing applications. That said, +APScheduler does provide some building blocks for you to build a scheduler service or to run a +dedicated scheduler process. + +APScheduler has three built-in scheduling systems you can use: + +* Cron-style scheduling (with optional start/end times) +* Interval-based execution (runs jobs on even intervals, with optional start/end times) +* One-off delayed execution (runs jobs once, on a set date/time) + +You can mix and match scheduling systems and the backends where the jobs are stored any way you +like. Supported backends for storing jobs include: + +* Memory +* `SQLAlchemy `_ (any RDBMS supported by SQLAlchemy works) +* `MongoDB `_ +* `Redis `_ +* `RethinkDB `_ +* `ZooKeeper `_ + +APScheduler also integrates with several common Python frameworks, like: + +* `asyncio `_ (:pep:`3156`) +* `gevent `_ +* `Tornado `_ +* `Twisted `_ +* `Qt `_ (using either + `PyQt `_ , + `PySide6 `_ , + `PySide2 `_ or + `PySide `_) + +There are third party solutions for integrating APScheduler with other frameworks: + +* `Django `_ +* `Flask `_ + + +.. [#f1] The cutoff period for this is also configurable. + + +Documentation +------------- + +Documentation can be found `here `_. + + +Source +------ + +The source can be browsed at `Github `_. + + +Reporting bugs +-------------- + +A `bug tracker `_ is provided by Github. + + +Getting help +------------ + +If you have problems or other questions, you can either: + +* Ask in the `apscheduler `_ room on Gitter +* Ask on the `APScheduler GitHub discussion forum `_, or +* Ask on `StackOverflow `_ and tag your + question with the ``apscheduler`` tag diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/RECORD b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/RECORD new file mode 100644 index 0000000..73b273b --- /dev/null +++ b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/RECORD @@ -0,0 +1,84 @@ +APScheduler-3.10.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +APScheduler-3.10.1.dist-info/LICENSE.txt,sha256=YWP3mH37ONa8MgzitwsvArhivEESZRbVUu8c1DJH51g,1130 +APScheduler-3.10.1.dist-info/METADATA,sha256=nShBYOJMsJ9iwrKP_x4rAVN87_NmBOwpdPPn85sY9G4,5676 +APScheduler-3.10.1.dist-info/RECORD,, +APScheduler-3.10.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +APScheduler-3.10.1.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92 +APScheduler-3.10.1.dist-info/entry_points.txt,sha256=KMxTUp2QykDNL6w-WBU5xrk8ebroCPEBN0eZtyL3x2w,1147 +APScheduler-3.10.1.dist-info/top_level.txt,sha256=O3oMCWxG-AHkecUoO6Ze7-yYjWrttL95uHO8-RFdYvE,12 +apscheduler/__init__.py,sha256=qFEK2ysRBcLiYmm3deyJJ1avUOugaM_nCGHMD42WMBw,380 +apscheduler/__pycache__/__init__.cpython-311.pyc,, +apscheduler/__pycache__/events.cpython-311.pyc,, +apscheduler/__pycache__/job.cpython-311.pyc,, +apscheduler/__pycache__/util.cpython-311.pyc,, +apscheduler/events.py,sha256=KRMTDQUS6d2uVnrQvPoz3ZPV5V9XKsCAZLsgx913FFo,3593 +apscheduler/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apscheduler/executors/__pycache__/__init__.cpython-311.pyc,, +apscheduler/executors/__pycache__/asyncio.cpython-311.pyc,, +apscheduler/executors/__pycache__/base.cpython-311.pyc,, +apscheduler/executors/__pycache__/base_py3.cpython-311.pyc,, +apscheduler/executors/__pycache__/debug.cpython-311.pyc,, +apscheduler/executors/__pycache__/gevent.cpython-311.pyc,, +apscheduler/executors/__pycache__/pool.cpython-311.pyc,, +apscheduler/executors/__pycache__/tornado.cpython-311.pyc,, +apscheduler/executors/__pycache__/twisted.cpython-311.pyc,, +apscheduler/executors/asyncio.py,sha256=9m4wvRHSSYplllxAQyxWkPVcFdyFG5aZbHt5nfWKIAc,1859 +apscheduler/executors/base.py,sha256=hogiMc_t-huw6BMod0HEeY2FhRNmAAUyNNuBHvIX31M,5336 +apscheduler/executors/base_py3.py,sha256=8WOpTeX1NA-spdbEQ1oJMh5T2O_t2UdsaSnAh-iEWe0,1831 +apscheduler/executors/debug.py,sha256=15_ogSBzl8RRCfBYDnkIV2uMH8cLk1KImYmBa_NVGpc,573 +apscheduler/executors/gevent.py,sha256=aulrNmoefyBgrOkH9awRhFiXIDnSCnZ4U0o0_JXIXgc,777 +apscheduler/executors/pool.py,sha256=h4cYgKMRhjpNHmkhlogHLbmT4O_q6HePXVLmiJIHC3c,2484 +apscheduler/executors/tornado.py,sha256=DU75VaQ9R6nBuy8lbPUvDKUgsuJcZqwAvURC5vg3r6w,1780 +apscheduler/executors/twisted.py,sha256=bRoU0C4BoVcS6_BjKD5wfUs0IJpGkmLsRAcMH2rJJss,778 +apscheduler/job.py,sha256=JCRERBpfWLuomPiNNHX-jrluEwfHkdscEmz4i0Y8rao,11216 +apscheduler/jobstores/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apscheduler/jobstores/__pycache__/__init__.cpython-311.pyc,, +apscheduler/jobstores/__pycache__/base.cpython-311.pyc,, +apscheduler/jobstores/__pycache__/memory.cpython-311.pyc,, +apscheduler/jobstores/__pycache__/mongodb.cpython-311.pyc,, +apscheduler/jobstores/__pycache__/redis.cpython-311.pyc,, +apscheduler/jobstores/__pycache__/rethinkdb.cpython-311.pyc,, +apscheduler/jobstores/__pycache__/sqlalchemy.cpython-311.pyc,, +apscheduler/jobstores/__pycache__/zookeeper.cpython-311.pyc,, +apscheduler/jobstores/base.py,sha256=DXzSW9XscueHZHMvy1qFiG-vYqUl_MMv0n0uBSZWXGo,4523 +apscheduler/jobstores/memory.py,sha256=ZxWiKsqfsCHFvac-6X9BztuhnuSxlOYi1dhT6g-pjQo,3655 +apscheduler/jobstores/mongodb.py,sha256=r9t2neNuzfPuf_omDm0KdkLGPZXLksiH-U3j13MIBlM,5347 +apscheduler/jobstores/redis.py,sha256=kjQDIzPXz-Yq976U9HK3aMkcCI_QRLKgTADQWKewtik,5483 +apscheduler/jobstores/rethinkdb.py,sha256=k1rSLYJqejuhQxJY3pXwHAQYcpZ1QFJsoQ8n0oEu5MM,5863 +apscheduler/jobstores/sqlalchemy.py,sha256=LIA9iSGMvuPTVqGHdztgQs4YFmYN1xqXvpJauYNK470,6529 +apscheduler/jobstores/zookeeper.py,sha256=avGLXaJGjHD0F7uG6rLJ2gg_TXNqXDEM4PqOu56f-Xg,6363 +apscheduler/schedulers/__init__.py,sha256=jM63xA_K7GSToBenhsz-SCcqfhk1pdEVb6ajwoO5Kqg,406 +apscheduler/schedulers/__pycache__/__init__.cpython-311.pyc,, +apscheduler/schedulers/__pycache__/asyncio.cpython-311.pyc,, +apscheduler/schedulers/__pycache__/background.cpython-311.pyc,, +apscheduler/schedulers/__pycache__/base.cpython-311.pyc,, +apscheduler/schedulers/__pycache__/blocking.cpython-311.pyc,, +apscheduler/schedulers/__pycache__/gevent.cpython-311.pyc,, +apscheduler/schedulers/__pycache__/qt.cpython-311.pyc,, +apscheduler/schedulers/__pycache__/tornado.cpython-311.pyc,, +apscheduler/schedulers/__pycache__/twisted.cpython-311.pyc,, +apscheduler/schedulers/asyncio.py,sha256=iJO6QUo1oW16giOU_nW8WMu2b9NTWT4Tg2gY586G08w,1994 +apscheduler/schedulers/background.py,sha256=751p-f5Di6pY4x6UXlZggpxQ5k2ObJ_Q5wSeWmKHS8o,1566 +apscheduler/schedulers/base.py,sha256=M8WWEKjG-VfyL_UF1Wgbjk01yxa45t_GXfKyvtY0RMs,43228 +apscheduler/schedulers/blocking.py,sha256=8nubfJ4PoUnAkEY6WRQG4COzG4SxGyW9PjuVPhDAbsk,985 +apscheduler/schedulers/gevent.py,sha256=csPBvV75FGcboXXsdex6fCD7J54QgBddYNdWj62ZO9g,1031 +apscheduler/schedulers/qt.py,sha256=aooX3slyDwLglojae5t2tz6NlqfceZYCeXAIS0LQVCk,1613 +apscheduler/schedulers/tornado.py,sha256=D9Vaq3Ee9EFiXa1jDy9tedI048gR_YT_LAFUWqO_uEw,1926 +apscheduler/schedulers/twisted.py,sha256=D5EBjjMRtMBxy0_aAURcULAI8Ky2IvCTr9tK9sO1rYk,1844 +apscheduler/triggers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apscheduler/triggers/__pycache__/__init__.cpython-311.pyc,, +apscheduler/triggers/__pycache__/base.cpython-311.pyc,, +apscheduler/triggers/__pycache__/combining.cpython-311.pyc,, +apscheduler/triggers/__pycache__/date.cpython-311.pyc,, +apscheduler/triggers/__pycache__/interval.cpython-311.pyc,, +apscheduler/triggers/base.py,sha256=BvBJdOnIeVClXPXeInzYK25cN64jAc4a9IiEQucSiVk,1355 +apscheduler/triggers/combining.py,sha256=klaSoBp1kyrPX5D3gBpNTlsGKjks5QeKPW5JN_MVs30,3449 +apscheduler/triggers/cron/__init__.py,sha256=D39BQ63qWyk6XZcSuWth46ELQ3VIFpYjUHh7Kj65Z9M,9251 +apscheduler/triggers/cron/__pycache__/__init__.cpython-311.pyc,, +apscheduler/triggers/cron/__pycache__/expressions.cpython-311.pyc,, +apscheduler/triggers/cron/__pycache__/fields.cpython-311.pyc,, +apscheduler/triggers/cron/expressions.py,sha256=hu1kq0mKvivIw7U0D0Nnrbuk3q01dCuhZ7SHRPw6qhI,9184 +apscheduler/triggers/cron/fields.py,sha256=NWPClh1NgSOpTlJ3sm1TXM_ViC2qJGKWkd_vg0xsw7o,3510 +apscheduler/triggers/date.py,sha256=RrfB1PNO9G9e91p1BOf-y_TseVHQQR-KJPhNdPpAHcU,1705 +apscheduler/triggers/interval.py,sha256=ABjcZFaGYAAgdAaUQIuLr9_dLszIifu88qaXrJmdxQ4,4377 +apscheduler/util.py,sha256=zaDgtfj1TzSZp7TGyC_57Gq96hrcrhzP41pwZ0xbBxA,13846 diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/REQUESTED b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/WHEEL b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/WHEEL new file mode 100644 index 0000000..57e3d84 --- /dev/null +++ b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.38.4) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt new file mode 100644 index 0000000..0adfe3e --- /dev/null +++ b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/entry_points.txt @@ -0,0 +1,23 @@ +[apscheduler.executors] +asyncio = apscheduler.executors.asyncio:AsyncIOExecutor [asyncio] +debug = apscheduler.executors.debug:DebugExecutor +gevent = apscheduler.executors.gevent:GeventExecutor [gevent] +processpool = apscheduler.executors.pool:ProcessPoolExecutor +threadpool = apscheduler.executors.pool:ThreadPoolExecutor +tornado = apscheduler.executors.tornado:TornadoExecutor [tornado] +twisted = apscheduler.executors.twisted:TwistedExecutor [twisted] + +[apscheduler.jobstores] +memory = apscheduler.jobstores.memory:MemoryJobStore +mongodb = apscheduler.jobstores.mongodb:MongoDBJobStore [mongodb] +redis = apscheduler.jobstores.redis:RedisJobStore [redis] +rethinkdb = apscheduler.jobstores.rethinkdb:RethinkDBJobStore [rethinkdb] +sqlalchemy = apscheduler.jobstores.sqlalchemy:SQLAlchemyJobStore [sqlalchemy] +zookeeper = apscheduler.jobstores.zookeeper:ZooKeeperJobStore [zookeeper] + +[apscheduler.triggers] +and = apscheduler.triggers.combining:AndTrigger +cron = apscheduler.triggers.cron:CronTrigger +date = apscheduler.triggers.date:DateTrigger +interval = apscheduler.triggers.interval:IntervalTrigger +or = apscheduler.triggers.combining:OrTrigger diff --git a/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/top_level.txt b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/top_level.txt new file mode 100644 index 0000000..d31d10d --- /dev/null +++ b/lib/python3.11/site-packages/APScheduler-3.10.1.dist-info/top_level.txt @@ -0,0 +1 @@ +apscheduler diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/INSTALLER b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/LICENSE b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/LICENSE new file mode 100644 index 0000000..33b7cdd --- /dev/null +++ b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. + +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/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/METADATA b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/METADATA new file mode 100644 index 0000000..8d75117 --- /dev/null +++ b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/METADATA @@ -0,0 +1,35 @@ +Metadata-Version: 2.1 +Name: Brotli +Version: 1.0.9 +Summary: Python bindings for the Brotli compression library +Home-page: https://github.com/google/brotli +Author: The Brotli Authors +License: MIT +Platform: Posix +Platform: MacOS X +Platform: Windows +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Operating System :: POSIX :: Linux +Classifier: Programming Language :: C +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.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Unix Shell +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Archiving +Classifier: Topic :: System :: Archiving :: Compression +Classifier: Topic :: Text Processing :: Fonts +Classifier: Topic :: Utilities +License-File: LICENSE + diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/RECORD b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/RECORD new file mode 100644 index 0000000..679a5db --- /dev/null +++ b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/RECORD @@ -0,0 +1,10 @@ +Brotli-1.0.9.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Brotli-1.0.9.dist-info/LICENSE,sha256=PRgACONpIqTo2uwRw0x68mT-1ZYtB5JK6pKMOOhmPJQ,1084 +Brotli-1.0.9.dist-info/METADATA,sha256=fR3OZQ1fl4V68oGnYTtIGxN9qHvHxT-hOGK6B2i5rjw,1357 +Brotli-1.0.9.dist-info/RECORD,, +Brotli-1.0.9.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Brotli-1.0.9.dist-info/WHEEL,sha256=MXkSmZj-ucMvJEZe-5F9uGaWQfgqj_gRjwLyMfC10Vs,152 +Brotli-1.0.9.dist-info/top_level.txt,sha256=gsS54HrhO3ZveFxeMrKo_7qH4Sm4TbQ7jGLVBEqJ4NI,15 +__pycache__/brotli.cpython-311.pyc,, +_brotli.cpython-311-x86_64-linux-gnu.so,sha256=1277SVw5QQtx05nvFG7ZP61OYsFcvxH2BzyghZThRMs,6625080 +brotli.py,sha256=iwoQnPvrANtaJYTJ6mSjOQUENH7Z8RgAEbn-HxMR-kU,1857 diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/REQUESTED b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/WHEEL b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/WHEEL new file mode 100644 index 0000000..1d3967a --- /dev/null +++ b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: false +Tag: cp311-cp311-manylinux_2_17_x86_64 +Tag: cp311-cp311-manylinux2014_x86_64 + diff --git a/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/top_level.txt b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/top_level.txt new file mode 100644 index 0000000..a111e9c --- /dev/null +++ b/lib/python3.11/site-packages/Brotli-1.0.9.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_brotli +brotli diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/AES.py b/lib/python3.11/site-packages/Cryptodome/Cipher/AES.py new file mode 100644 index 0000000..402a3d7 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/AES.py @@ -0,0 +1,234 @@ +# -*- coding: utf-8 -*- +# +# Cipher/AES.py : AES +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +from Cryptodome.Util import _cpu_features +from Cryptodome.Random import get_random_bytes + +MODE_ECB = 1 #: Electronic Code Book (:ref:`ecb_mode`) +MODE_CBC = 2 #: Cipher-Block Chaining (:ref:`cbc_mode`) +MODE_CFB = 3 #: Cipher Feedback (:ref:`cfb_mode`) +MODE_OFB = 5 #: Output Feedback (:ref:`ofb_mode`) +MODE_CTR = 6 #: Counter mode (:ref:`ctr_mode`) +MODE_OPENPGP = 7 #: OpenPGP mode (:ref:`openpgp_mode`) +MODE_CCM = 8 #: Counter with CBC-MAC (:ref:`ccm_mode`) +MODE_EAX = 9 #: :ref:`eax_mode` +MODE_SIV = 10 #: Synthetic Initialization Vector (:ref:`siv_mode`) +MODE_GCM = 11 #: Galois Counter Mode (:ref:`gcm_mode`) +MODE_OCB = 12 #: Offset Code Book (:ref:`ocb_mode`) + + +_cproto = """ + int AES_start_operation(const uint8_t key[], + size_t key_len, + void **pResult); + int AES_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int AES_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int AES_stop_operation(void *state); + """ + + +# Load portable AES +_raw_aes_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_aes", + _cproto) + +# Try to load AES with AES NI instructions +try: + _raw_aesni_lib = None + if _cpu_features.have_aes_ni(): + _raw_aesni_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_aesni", + _cproto.replace("AES", + "AESNI")) +# _raw_aesni may not have been compiled in +except OSError: + pass + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a handle to a low-level + base cipher. It will absorb named parameters in the process.""" + + use_aesni = dict_parameters.pop("use_aesni", True) + + try: + key = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + if len(key) not in key_size: + raise ValueError("Incorrect AES key length (%d bytes)" % len(key)) + + if use_aesni and _raw_aesni_lib: + start_operation = _raw_aesni_lib.AESNI_start_operation + stop_operation = _raw_aesni_lib.AESNI_stop_operation + else: + start_operation = _raw_aes_lib.AES_start_operation + stop_operation = _raw_aes_lib.AES_stop_operation + + cipher = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + cipher.address_of()) + if result: + raise ValueError("Error %X while instantiating the AES cipher" + % result) + return SmartPointer(cipher.get(), stop_operation) + + +def _derive_Poly1305_key_pair(key, nonce): + """Derive a tuple (r, s, nonce) for a Poly1305 MAC. + + If nonce is ``None``, a new 16-byte nonce is generated. + """ + + if len(key) != 32: + raise ValueError("Poly1305 with AES requires a 32-byte key") + + if nonce is None: + nonce = get_random_bytes(16) + elif len(nonce) != 16: + raise ValueError("Poly1305 with AES requires a 16-byte nonce") + + s = new(key[:16], MODE_ECB).encrypt(nonce) + return key[16:], s, nonce + + +def new(key, mode, *args, **kwargs): + """Create a new AES cipher. + + Args: + key(bytes/bytearray/memoryview): + The secret key to use in the symmetric cipher. + + It must be 16 (*AES-128)*, 24 (*AES-192*) or 32 (*AES-256*) bytes long. + + For ``MODE_SIV`` only, it doubles to 32, 48, or 64 bytes. + mode (a ``MODE_*`` constant): + The chaining mode to use for encryption or decryption. + If in doubt, use ``MODE_EAX``. + + Keyword Args: + iv (bytes/bytearray/memoryview): + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 16 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 16 bytes long for encryption + and 18 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + nonce (bytes/bytearray/memoryview): + (Only applicable for ``MODE_CCM``, ``MODE_EAX``, ``MODE_GCM``, + ``MODE_SIV``, ``MODE_OCB``, and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key (except possibly for ``MODE_SIV``, see below). + + For ``MODE_EAX``, ``MODE_GCM`` and ``MODE_SIV`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CCM``, its length must be in the range **[7..13]**. + Bear in mind that with CCM there is a trade-off between nonce + length and maximum message size. Recommendation: **11** bytes. + + For ``MODE_OCB``, its length must be in the range **[1..15]** + (recommended: **15**). + + For ``MODE_CTR``, its length must be in the range **[0..15]** + (recommended: **8**). + + For ``MODE_SIV``, the nonce is optional, if it is not specified, + then no nonce is being used, which renders the encryption + deterministic. + + If not provided, for modes other than ``MODE_SIV``, a random + byte string of the recommended length is used (you must then + read its value with the :attr:`nonce` attribute). + + segment_size (integer): + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + mac_len (integer): + (Only ``MODE_EAX``, ``MODE_GCM``, ``MODE_OCB``, ``MODE_CCM``) + Length of the authentication tag, in bytes. + + It must be even and in the range **[4..16]**. + The recommended value (and the default, if not specified) is **16**. + + msg_len (integer): + (Only ``MODE_CCM``). Length of the message to (de)cipher. + If not specified, ``encrypt`` must be called with the entire message. + Similarly, ``decrypt`` can only be called once. + + assoc_len (integer): + (Only ``MODE_CCM``). Length of the associated data. + If not specified, all associated data is buffered internally, + which may represent a problem for very large messages. + + initial_value (integer or bytes/bytearray/memoryview): + (Only ``MODE_CTR``). + The initial value for the counter. If not present, the cipher will + start counting from 0. The value is incremented by one for each block. + The counter number is encoded in big endian mode. + + counter (object): + (Only ``MODE_CTR``). + Instance of ``Cryptodome.Util.Counter``, which allows full customization + of the counter block. This parameter is incompatible to both ``nonce`` + and ``initial_value``. + + use_aesni: (boolean): + Use Intel AES-NI hardware extensions (default: use if available). + + Returns: + an AES object, of the applicable mode. + """ + + kwargs["add_aes_modes"] = True + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + + +# Size of a data block (in bytes) +block_size = 16 +# Size of a key (in bytes) +key_size = (16, 24, 32) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/AES.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/AES.pyi new file mode 100644 index 0000000..a694b0f --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/AES.pyi @@ -0,0 +1,154 @@ +from typing import ByteString, Dict, Optional, Tuple, Union, overload +from typing_extensions import Literal + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_ccm import CcmMode +from Cryptodome.Cipher._mode_eax import EaxMode +from Cryptodome.Cipher._mode_gcm import GcmMode +from Cryptodome.Cipher._mode_siv import SivMode +from Cryptodome.Cipher._mode_ocb import OcbMode + +MODE_ECB: Literal[1] +MODE_CBC: Literal[2] +MODE_CFB: Literal[3] +MODE_OFB: Literal[5] +MODE_CTR: Literal[6] +MODE_OPENPGP: Literal[7] +MODE_CCM: Literal[8] +MODE_EAX: Literal[9] +MODE_SIV: Literal[10] +MODE_GCM: Literal[11] +MODE_OCB: Literal[12] + +# MODE_ECB +@overload +def new(key: ByteString, + mode: Literal[1], + use_aesni : bool = ...) -> \ + EcbMode: ... + +# MODE_CBC +@overload +def new(key: ByteString, + mode: Literal[2], + iv : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + CbcMode: ... + +@overload +def new(key: ByteString, + mode: Literal[2], + IV : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + CbcMode: ... + +# MODE_CFB +@overload +def new(key: ByteString, + mode: Literal[3], + iv : Optional[ByteString] = ..., + segment_size : int = ..., + use_aesni : bool = ...) -> \ + CfbMode: ... + +@overload +def new(key: ByteString, + mode: Literal[3], + IV : Optional[ByteString] = ..., + segment_size : int = ..., + use_aesni : bool = ...) -> \ + CfbMode: ... + +# MODE_OFB +@overload +def new(key: ByteString, + mode: Literal[5], + iv : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + OfbMode: ... + +@overload +def new(key: ByteString, + mode: Literal[5], + IV : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + OfbMode: ... + +# MODE_CTR +@overload +def new(key: ByteString, + mode: Literal[6], + nonce : Optional[ByteString] = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ..., + use_aesni : bool = ...) -> \ + CtrMode: ... + +# MODE_OPENPGP +@overload +def new(key: ByteString, + mode: Literal[7], + iv : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + OpenPgpMode: ... + +@overload +def new(key: ByteString, + mode: Literal[7], + IV : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + OpenPgpMode: ... + +# MODE_CCM +@overload +def new(key: ByteString, + mode: Literal[8], + nonce : Optional[ByteString] = ..., + mac_len : int = ..., + assoc_len : int = ..., + use_aesni : bool = ...) -> \ + CcmMode: ... + +# MODE_EAX +@overload +def new(key: ByteString, + mode: Literal[9], + nonce : Optional[ByteString] = ..., + mac_len : int = ..., + use_aesni : bool = ...) -> \ + EaxMode: ... + +# MODE_GCM +@overload +def new(key: ByteString, + mode: Literal[10], + nonce : Optional[ByteString] = ..., + use_aesni : bool = ...) -> \ + SivMode: ... + +# MODE_SIV +@overload +def new(key: ByteString, + mode: Literal[11], + nonce : Optional[ByteString] = ..., + mac_len : int = ..., + use_aesni : bool = ...) -> \ + GcmMode: ... + +# MODE_OCB +@overload +def new(key: ByteString, + mode: Literal[12], + nonce : Optional[ByteString] = ..., + mac_len : int = ..., + use_aesni : bool = ...) -> \ + OcbMode: ... + + +block_size: int +key_size: Tuple[int, int, int] diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.py b/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.py new file mode 100644 index 0000000..4dc1bb8 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +# +# Cipher/ARC2.py : ARC2.py +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== +""" +Module's constants for the modes of operation supported with ARC2: + +:var MODE_ECB: :ref:`Electronic Code Book (ECB) ` +: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_EAX: :ref:`EAX Mode ` +""" + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util.py3compat import byte_string +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +_raw_arc2_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_arc2", + """ + int ARC2_start_operation(const uint8_t key[], + size_t key_len, + size_t effective_key_len, + void **pResult); + int ARC2_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int ARC2_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int ARC2_stop_operation(void *state); + """ + ) + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a handle to a low-level + base cipher. It will absorb named parameters in the process.""" + + try: + key = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + effective_keylen = dict_parameters.pop("effective_keylen", 1024) + + if len(key) not in key_size: + raise ValueError("Incorrect ARC2 key length (%d bytes)" % len(key)) + + if not (40 <= effective_keylen <= 1024): + raise ValueError("'effective_key_len' must be at least 40 and no larger than 1024 " + "(not %d)" % effective_keylen) + + start_operation = _raw_arc2_lib.ARC2_start_operation + stop_operation = _raw_arc2_lib.ARC2_stop_operation + + cipher = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + c_size_t(effective_keylen), + cipher.address_of()) + if result: + raise ValueError("Error %X while instantiating the ARC2 cipher" + % result) + + return SmartPointer(cipher.get(), stop_operation) + + +def new(key, mode, *args, **kwargs): + """Create a new RC2 cipher. + + :param key: + The secret key to use in the symmetric cipher. + Its length can vary from 5 to 128 bytes; the actual search space + (and the cipher strength) can be reduced with the ``effective_keylen`` parameter. + :type key: bytes, bytearray, memoryview + + :param mode: + The chaining mode to use for encryption or decryption. + :type mode: One of the supported ``MODE_*`` constants + + :Keyword Arguments: + * **iv** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 8 bytes long for encryption + and 10 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + * **nonce** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key. + + For ``MODE_EAX`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CTR``, its length must be in the range **[0..7]**. + + If not provided for ``MODE_EAX``, a random byte string is generated (you + can read it back via the ``nonce`` attribute). + + * **effective_keylen** (*integer*) -- + Optional. Maximum strength in bits of the actual key used by the ARC2 algorithm. + If the supplied ``key`` parameter is longer (in bits) of the value specified + here, it will be weakened to match it. + If not specified, no limitation is applied. + + * **segment_size** (*integer*) -- + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + * **mac_len** : (*integer*) -- + (Only ``MODE_EAX``) + Length of the authentication tag, in bytes. + It must be no longer than 8 (default). + + * **initial_value** : (*integer*) -- + (Only ``MODE_CTR``). The initial value for the counter within + the counter block. By default it is **0**. + + :Return: an ARC2 object, of the applicable mode. + """ + + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + +MODE_ECB = 1 +MODE_CBC = 2 +MODE_CFB = 3 +MODE_OFB = 5 +MODE_CTR = 6 +MODE_OPENPGP = 7 +MODE_EAX = 9 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = range(5, 128 + 1) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.pyi new file mode 100644 index 0000000..178c3c0 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/ARC2.pyi @@ -0,0 +1,33 @@ +from typing import Union, Dict, Iterable, Optional, ByteString + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +ARC2Mode = int + +MODE_ECB: ARC2Mode +MODE_CBC: ARC2Mode +MODE_CFB: ARC2Mode +MODE_OFB: ARC2Mode +MODE_CTR: ARC2Mode +MODE_OPENPGP: ARC2Mode +MODE_EAX: ARC2Mode + +def new(key: ByteString, + mode: ARC2Mode, + iv : Optional[ByteString] = ..., + IV : Optional[ByteString] = ..., + nonce : Optional[ByteString] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: Iterable[int] diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.py b/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.py new file mode 100644 index 0000000..543a323 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +# +# Cipher/ARC4.py : ARC4 +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr) + + +_raw_arc4_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._ARC4", """ + int ARC4_stream_encrypt(void *rc4State, const uint8_t in[], + uint8_t out[], size_t len); + int ARC4_stream_init(uint8_t *key, size_t keylen, + void **pRc4State); + int ARC4_stream_destroy(void *rc4State); + """) + + +class ARC4Cipher: + """ARC4 cipher object. Do not create it directly. Use + :func:`Cryptodome.Cipher.ARC4.new` instead. + """ + + def __init__(self, key, *args, **kwargs): + """Initialize an ARC4 cipher object + + See also `new()` at the module level.""" + + if len(args) > 0: + ndrop = args[0] + args = args[1:] + else: + ndrop = kwargs.pop('drop', 0) + + if len(key) not in key_size: + raise ValueError("Incorrect ARC4 key length (%d bytes)" % + len(key)) + + self._state = VoidPointer() + result = _raw_arc4_lib.ARC4_stream_init(c_uint8_ptr(key), + c_size_t(len(key)), + self._state.address_of()) + if result != 0: + raise ValueError("Error %d while creating the ARC4 cipher" + % result) + self._state = SmartPointer(self._state.get(), + _raw_arc4_lib.ARC4_stream_destroy) + + if ndrop > 0: + # This is OK even if the cipher is used for decryption, + # since encrypt and decrypt are actually the same thing + # with ARC4. + self.encrypt(b'\x00' * ndrop) + + self.block_size = 1 + self.key_size = len(key) + + def encrypt(self, plaintext): + """Encrypt a piece of data. + + :param plaintext: The data to encrypt, of any size. + :type plaintext: bytes, bytearray, memoryview + :returns: the encrypted byte string, of equal length as the + plaintext. + """ + + ciphertext = create_string_buffer(len(plaintext)) + result = _raw_arc4_lib.ARC4_stream_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + ciphertext, + c_size_t(len(plaintext))) + if result: + raise ValueError("Error %d while encrypting with RC4" % result) + return get_raw_buffer(ciphertext) + + def decrypt(self, ciphertext): + """Decrypt a piece of data. + + :param ciphertext: The data to decrypt, of any size. + :type ciphertext: bytes, bytearray, memoryview + :returns: the decrypted byte string, of equal length as the + ciphertext. + """ + + try: + return self.encrypt(ciphertext) + except ValueError as e: + raise ValueError(str(e).replace("enc", "dec")) + + +def new(key, *args, **kwargs): + """Create a new ARC4 cipher. + + :param key: + The secret key to use in the symmetric cipher. + Its length must be in the range ``[1..256]``. + The recommended length is 16 bytes. + :type key: bytes, bytearray, memoryview + + :Keyword Arguments: + * *drop* (``integer``) -- + The amount of bytes to discard from the initial part of the keystream. + In fact, such part has been found to be distinguishable from random + data (while it shouldn't) and also correlated to key. + + The recommended value is 3072_ bytes. The default value is 0. + + :Return: an `ARC4Cipher` object + + .. _3072: http://eprint.iacr.org/2002/067.pdf + """ + return ARC4Cipher(key, *args, **kwargs) + + +# Size of a data block (in bytes) +block_size = 1 +# Size of a key (in bytes) +key_size = range(1, 256+1) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.pyi new file mode 100644 index 0000000..96bf6e2 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/ARC4.pyi @@ -0,0 +1,14 @@ +from typing import Any, Union, Iterable, ByteString + +class ARC4Cipher: + block_size: int + key_size: int + + def __init__(self, key: ByteString, *args: Any, **kwargs: Any) -> None: ... + def encrypt(self, plaintext: ByteString) -> bytes: ... + def decrypt(self, ciphertext: ByteString) -> bytes: ... + +def new(key: ByteString, drop : int = ...) -> ARC4Cipher: ... + +block_size: int +key_size: Iterable[int] diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.py b/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.py new file mode 100644 index 0000000..536cbc8 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +# +# Cipher/Blowfish.py : Blowfish +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== +""" +Module's constants for the modes of operation supported with Blowfish: + +:var MODE_ECB: :ref:`Electronic Code Book (ECB) ` +: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_EAX: :ref:`EAX Mode ` +""" + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, c_size_t, + c_uint8_ptr) + +_raw_blowfish_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_blowfish", + """ + int Blowfish_start_operation(const uint8_t key[], + size_t key_len, + void **pResult); + int Blowfish_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int Blowfish_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int Blowfish_stop_operation(void *state); + """ + ) + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a smart pointer to + a low-level base cipher. It will absorb named parameters in + the process.""" + + try: + key = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + if len(key) not in key_size: + raise ValueError("Incorrect Blowfish key length (%d bytes)" % len(key)) + + start_operation = _raw_blowfish_lib.Blowfish_start_operation + stop_operation = _raw_blowfish_lib.Blowfish_stop_operation + + void_p = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + void_p.address_of()) + if result: + raise ValueError("Error %X while instantiating the Blowfish cipher" + % result) + return SmartPointer(void_p.get(), stop_operation) + + +def new(key, mode, *args, **kwargs): + """Create a new Blowfish cipher + + :param key: + The secret key to use in the symmetric cipher. + Its length can vary from 5 to 56 bytes. + :type key: bytes, bytearray, memoryview + + :param mode: + The chaining mode to use for encryption or decryption. + :type mode: One of the supported ``MODE_*`` constants + + :Keyword Arguments: + * **iv** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 8 bytes long for encryption + and 10 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + * **nonce** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key. + + For ``MODE_EAX`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CTR``, its length must be in the range **[0..7]**. + + If not provided for ``MODE_EAX``, a random byte string is generated (you + can read it back via the ``nonce`` attribute). + + * **segment_size** (*integer*) -- + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + * **mac_len** : (*integer*) -- + (Only ``MODE_EAX``) + Length of the authentication tag, in bytes. + It must be no longer than 8 (default). + + * **initial_value** : (*integer*) -- + (Only ``MODE_CTR``). The initial value for the counter within + the counter block. By default it is **0**. + + :Return: a Blowfish object, of the applicable mode. + """ + + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + +MODE_ECB = 1 +MODE_CBC = 2 +MODE_CFB = 3 +MODE_OFB = 5 +MODE_CTR = 6 +MODE_OPENPGP = 7 +MODE_EAX = 9 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = range(4, 56 + 1) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.pyi new file mode 100644 index 0000000..961f07e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/Blowfish.pyi @@ -0,0 +1,33 @@ +from typing import Union, Dict, Iterable, ByteString, Optional + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +BlowfishMode = int + +MODE_ECB: BlowfishMode +MODE_CBC: BlowfishMode +MODE_CFB: BlowfishMode +MODE_OFB: BlowfishMode +MODE_CTR: BlowfishMode +MODE_OPENPGP: BlowfishMode +MODE_EAX: BlowfishMode + +def new(key: ByteString, + mode: BlowfishMode, + iv : Optional[ByteString] = ..., + IV : Optional[ByteString] = ..., + nonce : Optional[ByteString] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: Iterable[int] diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.py b/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.py new file mode 100644 index 0000000..84eb88e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +# +# Cipher/CAST.py : CAST +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== +""" +Module's constants for the modes of operation supported with CAST: + +:var MODE_ECB: :ref:`Electronic Code Book (ECB) ` +: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_EAX: :ref:`EAX Mode ` +""" + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util.py3compat import byte_string +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +_raw_cast_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_cast", + """ + int CAST_start_operation(const uint8_t key[], + size_t key_len, + void **pResult); + int CAST_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CAST_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CAST_stop_operation(void *state); + """) + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a handle to a low-level + base cipher. It will absorb named parameters in the process.""" + + try: + key = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + if len(key) not in key_size: + raise ValueError("Incorrect CAST key length (%d bytes)" % len(key)) + + start_operation = _raw_cast_lib.CAST_start_operation + stop_operation = _raw_cast_lib.CAST_stop_operation + + cipher = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + cipher.address_of()) + if result: + raise ValueError("Error %X while instantiating the CAST cipher" + % result) + + return SmartPointer(cipher.get(), stop_operation) + + +def new(key, mode, *args, **kwargs): + """Create a new CAST cipher + + :param key: + The secret key to use in the symmetric cipher. + Its length can vary from 5 to 16 bytes. + :type key: bytes, bytearray, memoryview + + :param mode: + The chaining mode to use for encryption or decryption. + :type mode: One of the supported ``MODE_*`` constants + + :Keyword Arguments: + * **iv** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 8 bytes long for encryption + and 10 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + * **nonce** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key. + + For ``MODE_EAX`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CTR``, its length must be in the range **[0..7]**. + + If not provided for ``MODE_EAX``, a random byte string is generated (you + can read it back via the ``nonce`` attribute). + + * **segment_size** (*integer*) -- + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + * **mac_len** : (*integer*) -- + (Only ``MODE_EAX``) + Length of the authentication tag, in bytes. + It must be no longer than 8 (default). + + * **initial_value** : (*integer*) -- + (Only ``MODE_CTR``). The initial value for the counter within + the counter block. By default it is **0**. + + :Return: a CAST object, of the applicable mode. + """ + + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + +MODE_ECB = 1 +MODE_CBC = 2 +MODE_CFB = 3 +MODE_OFB = 5 +MODE_CTR = 6 +MODE_OPENPGP = 7 +MODE_EAX = 9 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = range(5, 16 + 1) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.pyi new file mode 100644 index 0000000..5dcd20c --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/CAST.pyi @@ -0,0 +1,33 @@ +from typing import Union, Dict, Iterable, Optional, ByteString + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +CASTMode = int + +MODE_ECB: CASTMode +MODE_CBC: CASTMode +MODE_CFB: CASTMode +MODE_OFB: CASTMode +MODE_CTR: CASTMode +MODE_OPENPGP: CASTMode +MODE_EAX: CASTMode + +def new(key: ByteString, + mode: CASTMode, + iv : Optional[ByteString] = ..., + IV : Optional[ByteString] = ..., + nonce : Optional[ByteString] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size : Iterable[int] diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.py b/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.py new file mode 100644 index 0000000..648d692 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.py @@ -0,0 +1,287 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Random import get_random_bytes + +from Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, VoidPointer, + SmartPointer, c_size_t, + c_uint8_ptr, c_ulong, + is_writeable_buffer) + +_raw_chacha20_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._chacha20", + """ + int chacha20_init(void **pState, + const uint8_t *key, + size_t keySize, + const uint8_t *nonce, + size_t nonceSize); + + int chacha20_destroy(void *state); + + int chacha20_encrypt(void *state, + const uint8_t in[], + uint8_t out[], + size_t len); + + int chacha20_seek(void *state, + unsigned long block_high, + unsigned long block_low, + unsigned offset); + int hchacha20( const uint8_t key[32], + const uint8_t nonce16[16], + uint8_t subkey[32]); + """) + + +def _HChaCha20(key, nonce): + + assert(len(key) == 32) + assert(len(nonce) == 16) + + subkey = bytearray(32) + result = _raw_chacha20_lib.hchacha20( + c_uint8_ptr(key), + c_uint8_ptr(nonce), + c_uint8_ptr(subkey)) + if result: + raise ValueError("Error %d when deriving subkey with HChaCha20" % result) + + return subkey + + +class ChaCha20Cipher(object): + """ChaCha20 (or XChaCha20) cipher object. + Do not create it directly. Use :py:func:`new` instead. + + :var nonce: The nonce with length 8, 12 or 24 bytes + :vartype nonce: bytes + """ + + block_size = 1 + + def __init__(self, key, nonce): + """Initialize a ChaCha20/XChaCha20 cipher object + + See also `new()` at the module level.""" + + self.nonce = _copy_bytes(None, None, nonce) + + # XChaCha20 requires a key derivation with HChaCha20 + # See 2.3 in https://tools.ietf.org/html/draft-arciszewski-xchacha-03 + if len(nonce) == 24: + key = _HChaCha20(key, nonce[:16]) + nonce = b'\x00' * 4 + nonce[16:] + self._name = "XChaCha20" + else: + self._name = "ChaCha20" + nonce = self.nonce + + self._next = ("encrypt", "decrypt") + + self._state = VoidPointer() + result = _raw_chacha20_lib.chacha20_init( + self._state.address_of(), + c_uint8_ptr(key), + c_size_t(len(key)), + nonce, + c_size_t(len(nonce))) + if result: + raise ValueError("Error %d instantiating a %s cipher" % (result, + self._name)) + self._state = SmartPointer(self._state.get(), + _raw_chacha20_lib.chacha20_destroy) + + def encrypt(self, plaintext, output=None): + """Encrypt a piece of data. + + Args: + plaintext(bytes/bytearray/memoryview): The data to encrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the ciphertext + is written to. If ``None``, the ciphertext is returned. + Returns: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("Cipher object can only be used for decryption") + self._next = ("encrypt",) + return self._encrypt(plaintext, output) + + def _encrypt(self, plaintext, output): + """Encrypt without FSM checks""" + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = _raw_chacha20_lib.chacha20_encrypt( + self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + raise ValueError("Error %d while encrypting with %s" % (result, self._name)) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt a piece of data. + + Args: + ciphertext(bytes/bytearray/memoryview): The data to decrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the plaintext + is written to. If ``None``, the plaintext is returned. + Returns: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("Cipher object can only be used for encryption") + self._next = ("decrypt",) + + try: + return self._encrypt(ciphertext, output) + except ValueError as e: + raise ValueError(str(e).replace("enc", "dec")) + + def seek(self, position): + """Seek to a certain position in the key stream. + + Args: + position (integer): + The absolute position within the key stream, in bytes. + """ + + position, offset = divmod(position, 64) + block_low = position & 0xFFFFFFFF + block_high = position >> 32 + + result = _raw_chacha20_lib.chacha20_seek( + self._state.get(), + c_ulong(block_high), + c_ulong(block_low), + offset + ) + if result: + raise ValueError("Error %d while seeking with %s" % (result, self._name)) + + +def _derive_Poly1305_key_pair(key, nonce): + """Derive a tuple (r, s, nonce) for a Poly1305 MAC. + + If nonce is ``None``, a new 12-byte nonce is generated. + """ + + if len(key) != 32: + raise ValueError("Poly1305 with ChaCha20 requires a 32-byte key") + + if nonce is None: + padded_nonce = nonce = get_random_bytes(12) + elif len(nonce) == 8: + # See RFC7538, 2.6: [...] ChaCha20 as specified here requires a 96-bit + # nonce. So if the provided nonce is only 64-bit, then the first 32 + # bits of the nonce will be set to a constant number. + # This will usually be zero, but for protocols with multiple senders it may be + # different for each sender, but should be the same for all + # invocations of the function with the same key by a particular + # sender. + padded_nonce = b'\x00\x00\x00\x00' + nonce + elif len(nonce) == 12: + padded_nonce = nonce + else: + raise ValueError("Poly1305 with ChaCha20 requires an 8- or 12-byte nonce") + + rs = new(key=key, nonce=padded_nonce).encrypt(b'\x00' * 32) + return rs[:16], rs[16:], nonce + + +def new(**kwargs): + """Create a new ChaCha20 or XChaCha20 cipher + + Keyword Args: + key (bytes/bytearray/memoryview): The secret key to use. + It must be 32 bytes long. + nonce (bytes/bytearray/memoryview): A mandatory value that + must never be reused for any other encryption + done with this key. + + For ChaCha20, it must be 8 or 12 bytes long. + + For XChaCha20, it must be 24 bytes long. + + If not provided, 8 bytes will be randomly generated + (you can find them back in the ``nonce`` attribute). + + :Return: a :class:`Cryptodome.Cipher.ChaCha20.ChaCha20Cipher` object + """ + + try: + key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing parameter %s" % e) + + nonce = kwargs.pop("nonce", None) + if nonce is None: + nonce = get_random_bytes(8) + + if len(key) != 32: + raise ValueError("ChaCha20/XChaCha20 key must be 32 bytes long") + + if len(nonce) not in (8, 12, 24): + raise ValueError("Nonce must be 8/12 bytes(ChaCha20) or 24 bytes (XChaCha20)") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return ChaCha20Cipher(key, nonce) + +# Size of a data block (in bytes) +block_size = 1 + +# Size of a key (in bytes) +key_size = 32 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.pyi new file mode 100644 index 0000000..ba2f699 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20.pyi @@ -0,0 +1,23 @@ +from typing import Union, overload, ByteString, Optional + +def _HChaCha20(key: ByteString, nonce: ByteString) -> bytearray: ... + +class ChaCha20Cipher: + block_size: int + nonce: bytes + + def __init__(self, key: ByteString, nonce: ByteString) -> None: ... + @overload + def encrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def encrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def decrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + def seek(self, position: int) -> None: ... + +def new(key: ByteString, nonce: Optional[ByteString] = ...) -> ChaCha20Cipher: ... + +block_size: int +key_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py b/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py new file mode 100644 index 0000000..b2923ed --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py @@ -0,0 +1,336 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from binascii import unhexlify + +from Cryptodome.Cipher import ChaCha20 +from Cryptodome.Cipher.ChaCha20 import _HChaCha20 +from Cryptodome.Hash import Poly1305, BLAKE2s + +from Cryptodome.Random import get_random_bytes + +from Cryptodome.Util.number import long_to_bytes +from Cryptodome.Util.py3compat import _copy_bytes, bord +from Cryptodome.Util._raw_api import is_buffer + + +def _enum(**enums): + return type('Enum', (), enums) + + +_CipherStatus = _enum(PROCESSING_AUTH_DATA=1, + PROCESSING_CIPHERTEXT=2, + PROCESSING_DONE=3) + + +class ChaCha20Poly1305Cipher(object): + """ChaCha20-Poly1305 and XChaCha20-Poly1305 cipher object. + Do not create it directly. Use :py:func:`new` instead. + + :var nonce: The nonce with length 8, 12 or 24 bytes + :vartype nonce: byte string + """ + + def __init__(self, key, nonce): + """Initialize a ChaCha20-Poly1305 AEAD cipher object + + See also `new()` at the module level.""" + + self._next = ("update", "encrypt", "decrypt", "digest", + "verify") + + self._authenticator = Poly1305.new(key=key, nonce=nonce, cipher=ChaCha20) + + self._cipher = ChaCha20.new(key=key, nonce=nonce) + self._cipher.seek(64) # Block counter starts at 1 + + self._len_aad = 0 + self._len_ct = 0 + self._mac_tag = None + self._status = _CipherStatus.PROCESSING_AUTH_DATA + + def update(self, data): + """Protect the associated data. + + Associated data (also known as *additional authenticated data* - AAD) + is the piece of the message that must stay in the clear, while + still allowing the receiver to verify its integrity. + An example is packet headers. + + The associated data (possibly split into multiple segments) is + fed into :meth:`update` before any call to :meth:`decrypt` or :meth:`encrypt`. + If there is no associated data, :meth:`update` is not called. + + :param bytes/bytearray/memoryview assoc_data: + A piece of associated data. There are no restrictions on its size. + """ + + if "update" not in self._next: + raise TypeError("update() method cannot be called") + + self._len_aad += len(data) + self._authenticator.update(data) + + def _pad_aad(self): + + assert(self._status == _CipherStatus.PROCESSING_AUTH_DATA) + if self._len_aad & 0x0F: + self._authenticator.update(b'\x00' * (16 - (self._len_aad & 0x0F))) + self._status = _CipherStatus.PROCESSING_CIPHERTEXT + + def encrypt(self, plaintext, output=None): + """Encrypt a piece of data. + + Args: + plaintext(bytes/bytearray/memoryview): The data to encrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the ciphertext + is written to. If ``None``, the ciphertext is returned. + Returns: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() method cannot be called") + + if self._status == _CipherStatus.PROCESSING_AUTH_DATA: + self._pad_aad() + + self._next = ("encrypt", "digest") + + result = self._cipher.encrypt(plaintext, output=output) + self._len_ct += len(plaintext) + if output is None: + self._authenticator.update(result) + else: + self._authenticator.update(output) + return result + + def decrypt(self, ciphertext, output=None): + """Decrypt a piece of data. + + Args: + ciphertext(bytes/bytearray/memoryview): The data to decrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the plaintext + is written to. If ``None``, the plaintext is returned. + Returns: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() method cannot be called") + + if self._status == _CipherStatus.PROCESSING_AUTH_DATA: + self._pad_aad() + + self._next = ("decrypt", "verify") + + self._len_ct += len(ciphertext) + self._authenticator.update(ciphertext) + return self._cipher.decrypt(ciphertext, output=output) + + def _compute_mac(self): + """Finalize the cipher (if not done already) and return the MAC.""" + + if self._mac_tag: + assert(self._status == _CipherStatus.PROCESSING_DONE) + return self._mac_tag + + assert(self._status != _CipherStatus.PROCESSING_DONE) + + if self._status == _CipherStatus.PROCESSING_AUTH_DATA: + self._pad_aad() + + if self._len_ct & 0x0F: + self._authenticator.update(b'\x00' * (16 - (self._len_ct & 0x0F))) + + self._status = _CipherStatus.PROCESSING_DONE + + self._authenticator.update(long_to_bytes(self._len_aad, 8)[::-1]) + self._authenticator.update(long_to_bytes(self._len_ct, 8)[::-1]) + self._mac_tag = self._authenticator.digest() + return self._mac_tag + + def digest(self): + """Compute the *binary* authentication tag (MAC). + + :Return: the MAC tag, as 16 ``bytes``. + """ + + if "digest" not in self._next: + raise TypeError("digest() method cannot be called") + self._next = ("digest",) + + return self._compute_mac() + + def hexdigest(self): + """Compute the *printable* authentication tag (MAC). + + This method is like :meth:`digest`. + + :Return: the MAC tag, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* authentication tag (MAC). + + The receiver invokes this method at the very end, to + check if the associated data (if any) and the decrypted + messages are valid. + + :param bytes/bytearray/memoryview received_mac_tag: + This is the 16-byte *binary* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = ("verify",) + + secret = get_random_bytes(16) + + self._compute_mac() + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, + data=self._mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, + data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* authentication tag (MAC). + + This method is like :meth:`verify`. + + :param string hex_mac_tag: + This is the *printable* MAC. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext): + """Perform :meth:`encrypt` and :meth:`digest` in one step. + + :param plaintext: The data to encrypt, of any size. + :type plaintext: bytes/bytearray/memoryview + :return: a tuple with two ``bytes`` objects: + + - the ciphertext, of equal length as the plaintext + - the 16-byte MAC tag + """ + + return self.encrypt(plaintext), self.digest() + + def decrypt_and_verify(self, ciphertext, received_mac_tag): + """Perform :meth:`decrypt` and :meth:`verify` in one step. + + :param ciphertext: The piece of data to decrypt. + :type ciphertext: bytes/bytearray/memoryview + :param bytes received_mac_tag: + This is the 16-byte *binary* MAC, as received from the sender. + :return: the decrypted data (as ``bytes``) + :raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + plaintext = self.decrypt(ciphertext) + self.verify(received_mac_tag) + return plaintext + + +def new(**kwargs): + """Create a new ChaCha20-Poly1305 or XChaCha20-Poly1305 AEAD cipher. + + :keyword key: The secret key to use. It must be 32 bytes long. + :type key: byte string + + :keyword nonce: + A value that must never be reused for any other encryption + done with this key. + + For ChaCha20-Poly1305, it must be 8 or 12 bytes long. + + For XChaCha20-Poly1305, it must be 24 bytes long. + + If not provided, 12 ``bytes`` will be generated randomly + (you can find them back in the ``nonce`` attribute). + :type nonce: bytes, bytearray, memoryview + + :Return: a :class:`Cryptodome.Cipher.ChaCha20.ChaCha20Poly1305Cipher` object + """ + + try: + key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing parameter %s" % e) + + self._len_ct += len(plaintext) + + if len(key) != 32: + raise ValueError("Key must be 32 bytes long") + + nonce = kwargs.pop("nonce", None) + if nonce is None: + nonce = get_random_bytes(12) + + if len(nonce) in (8, 12): + chacha20_poly1305_nonce = nonce + elif len(nonce) == 24: + key = _HChaCha20(key, nonce[:16]) + chacha20_poly1305_nonce = b'\x00\x00\x00\x00' + nonce[16:] + else: + raise ValueError("Nonce must be 8, 12 or 24 bytes long") + + if not is_buffer(nonce): + raise TypeError("nonce must be bytes, bytearray or memoryview") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + cipher = ChaCha20Poly1305Cipher(key, chacha20_poly1305_nonce) + cipher.nonce = _copy_bytes(None, None, nonce) + return cipher + + +# Size of a key (in bytes) +key_size = 32 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi new file mode 100644 index 0000000..f4b2a42 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi @@ -0,0 +1,26 @@ +from typing import Union, Tuple, overload, ByteString, Optional + +class ChaCha20Poly1305Cipher: + nonce: bytes + + def __init__(self, key: ByteString, nonce: ByteString) -> None: ... + def update(self, data: ByteString) -> None: ... + @overload + def encrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def encrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def decrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: ByteString) -> None: ... + def hexverify(self, received_mac_tag: str) -> None: ... + def encrypt_and_digest(self, plaintext: ByteString) -> Tuple[bytes, bytes]: ... + def decrypt_and_verify(self, ciphertext: ByteString, received_mac_tag: ByteString) -> bytes: ... + +def new(key: ByteString, nonce: Optional[ByteString] = ...) -> ChaCha20Poly1305Cipher: ... + +block_size: int +key_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/DES.py b/lib/python3.11/site-packages/Cryptodome/Cipher/DES.py new file mode 100644 index 0000000..026b491 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/DES.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +# +# Cipher/DES.py : DES +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== +""" +Module's constants for the modes of operation supported with Single DES: + +:var MODE_ECB: :ref:`Electronic Code Book (ECB) ` +: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_EAX: :ref:`EAX Mode ` +""" + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util.py3compat import byte_string +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +_raw_des_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_des", + """ + int DES_start_operation(const uint8_t key[], + size_t key_len, + void **pResult); + int DES_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int DES_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int DES_stop_operation(void *state); + """) + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a handle to a low-level + base cipher. It will absorb named parameters in the process.""" + + try: + key = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + if len(key) != key_size: + raise ValueError("Incorrect DES key length (%d bytes)" % len(key)) + + start_operation = _raw_des_lib.DES_start_operation + stop_operation = _raw_des_lib.DES_stop_operation + + cipher = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + cipher.address_of()) + if result: + raise ValueError("Error %X while instantiating the DES cipher" + % result) + return SmartPointer(cipher.get(), stop_operation) + + +def new(key, mode, *args, **kwargs): + """Create a new DES cipher. + + :param key: + The secret key to use in the symmetric cipher. + It must be 8 byte long. The parity bits will be ignored. + :type key: bytes/bytearray/memoryview + + :param mode: + The chaining mode to use for encryption or decryption. + :type mode: One of the supported ``MODE_*`` constants + + :Keyword Arguments: + * **iv** (*byte string*) -- + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 8 bytes long for encryption + and 10 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + * **nonce** (*byte string*) -- + (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key. + + For ``MODE_EAX`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CTR``, its length must be in the range **[0..7]**. + + If not provided for ``MODE_EAX``, a random byte string is generated (you + can read it back via the ``nonce`` attribute). + + * **segment_size** (*integer*) -- + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + * **mac_len** : (*integer*) -- + (Only ``MODE_EAX``) + Length of the authentication tag, in bytes. + It must be no longer than 8 (default). + + * **initial_value** : (*integer*) -- + (Only ``MODE_CTR``). The initial value for the counter within + the counter block. By default it is **0**. + + :Return: a DES object, of the applicable mode. + """ + + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + +MODE_ECB = 1 +MODE_CBC = 2 +MODE_CFB = 3 +MODE_OFB = 5 +MODE_CTR = 6 +MODE_OPENPGP = 7 +MODE_EAX = 9 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = 8 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/DES.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/DES.pyi new file mode 100644 index 0000000..dc18713 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/DES.pyi @@ -0,0 +1,33 @@ +from typing import Union, Dict, Iterable, ByteString, Optional + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +DESMode = int + +MODE_ECB: DESMode +MODE_CBC: DESMode +MODE_CFB: DESMode +MODE_OFB: DESMode +MODE_CTR: DESMode +MODE_OPENPGP: DESMode +MODE_EAX: DESMode + +def new(key: ByteString, + mode: DESMode, + iv : Optional[ByteString] = ..., + IV : Optional[ByteString] = ..., + nonce : Optional[ByteString] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.py b/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.py new file mode 100644 index 0000000..3b2828e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.py @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- +# +# Cipher/DES3.py : DES3 +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== +""" +Module's constants for the modes of operation supported with Triple DES: + +:var MODE_ECB: :ref:`Electronic Code Book (ECB) ` +: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_EAX: :ref:`EAX Mode ` +""" + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util.py3compat import byte_string, bchr, bord, bstr +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t) + +_raw_des3_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_des3", + """ + int DES3_start_operation(const uint8_t key[], + size_t key_len, + void **pResult); + int DES3_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int DES3_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int DES3_stop_operation(void *state); + """) + + +def adjust_key_parity(key_in): + """Set the parity bits in a TDES key. + + :param key_in: the TDES key whose bits need to be adjusted + :type key_in: byte string + + :returns: a copy of ``key_in``, with the parity bits correctly set + :rtype: byte string + + :raises ValueError: if the TDES key is not 16 or 24 bytes long + :raises ValueError: if the TDES key degenerates into Single DES + """ + + def parity_byte(key_byte): + parity = 1 + for i in range(1, 8): + parity ^= (key_byte >> i) & 1 + return (key_byte & 0xFE) | parity + + if len(key_in) not in key_size: + raise ValueError("Not a valid TDES key") + + key_out = b"".join([ bchr(parity_byte(bord(x))) for x in key_in ]) + + if key_out[:8] == key_out[8:16] or key_out[-16:-8] == key_out[-8:]: + raise ValueError("Triple DES key degenerates to single DES") + + return key_out + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a handle to a low-level base cipher. + It will absorb named parameters in the process.""" + + try: + key_in = dict_parameters.pop("key") + except KeyError: + raise TypeError("Missing 'key' parameter") + + key = adjust_key_parity(bstr(key_in)) + + start_operation = _raw_des3_lib.DES3_start_operation + stop_operation = _raw_des3_lib.DES3_stop_operation + + cipher = VoidPointer() + result = start_operation(key, + c_size_t(len(key)), + cipher.address_of()) + if result: + raise ValueError("Error %X while instantiating the TDES cipher" + % result) + return SmartPointer(cipher.get(), stop_operation) + + +def new(key, mode, *args, **kwargs): + """Create a new Triple DES cipher. + + :param key: + The secret key to use in the symmetric cipher. + It must be 16 or 24 byte long. The parity bits will be ignored. + :type key: bytes/bytearray/memoryview + + :param mode: + The chaining mode to use for encryption or decryption. + :type mode: One of the supported ``MODE_*`` constants + + :Keyword Arguments: + * **iv** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + The initialization vector to use for encryption or decryption. + + For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 8 bytes long. + + For ``MODE_OPENPGP`` mode only, + it must be 8 bytes long for encryption + and 10 bytes for decryption (in the latter case, it is + actually the *encrypted* IV which was prefixed to the ciphertext). + + If not provided, a random byte string is generated (you must then + read its value with the :attr:`iv` attribute). + + * **nonce** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_EAX`` and ``MODE_CTR``). + + A value that must never be reused for any other encryption done + with this key. + + For ``MODE_EAX`` there are no + restrictions on its length (recommended: **16** bytes). + + For ``MODE_CTR``, its length must be in the range **[0..7]**. + + If not provided for ``MODE_EAX``, a random byte string is generated (you + can read it back via the ``nonce`` attribute). + + * **segment_size** (*integer*) -- + (Only ``MODE_CFB``).The number of **bits** the plaintext and ciphertext + are segmented in. It must be a multiple of 8. + If not specified, it will be assumed to be 8. + + * **mac_len** : (*integer*) -- + (Only ``MODE_EAX``) + Length of the authentication tag, in bytes. + It must be no longer than 8 (default). + + * **initial_value** : (*integer*) -- + (Only ``MODE_CTR``). The initial value for the counter within + the counter block. By default it is **0**. + + :Return: a Triple DES object, of the applicable mode. + """ + + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + +MODE_ECB = 1 +MODE_CBC = 2 +MODE_CFB = 3 +MODE_OFB = 5 +MODE_CTR = 6 +MODE_OPENPGP = 7 +MODE_EAX = 9 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = (16, 24) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.pyi new file mode 100644 index 0000000..d5eac4d --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/DES3.pyi @@ -0,0 +1,35 @@ +from typing import Union, Dict, Tuple, ByteString, Optional + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +def adjust_key_parity(key_in: bytes) -> bytes: ... + +DES3Mode = int + +MODE_ECB: DES3Mode +MODE_CBC: DES3Mode +MODE_CFB: DES3Mode +MODE_OFB: DES3Mode +MODE_CTR: DES3Mode +MODE_OPENPGP: DES3Mode +MODE_EAX: DES3Mode + +def new(key: ByteString, + mode: DES3Mode, + iv : Optional[ByteString] = ..., + IV : Optional[ByteString] = ..., + nonce : Optional[ByteString] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, ByteString] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: Tuple[int, int] diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py b/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py new file mode 100644 index 0000000..7525c5d --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py @@ -0,0 +1,239 @@ +# -*- coding: utf-8 -*- +# +# Cipher/PKCS1_OAEP.py : PKCS#1 OAEP +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Signature.pss import MGF1 +import Cryptodome.Hash.SHA1 + +from Cryptodome.Util.py3compat import bord, _copy_bytes +import Cryptodome.Util.number +from Cryptodome.Util.number import ceil_div, bytes_to_long, long_to_bytes +from Cryptodome.Util.strxor import strxor +from Cryptodome import Random + +class PKCS1OAEP_Cipher: + """Cipher object for PKCS#1 v1.5 OAEP. + Do not create directly: use :func:`new` instead.""" + + def __init__(self, key, hashAlgo, mgfunc, label, randfunc): + """Initialize this PKCS#1 OAEP cipher object. + + :Parameters: + key : an RSA key object + If a private half is given, both encryption and decryption are possible. + If a public half is given, only encryption is possible. + hashAlgo : hash object + The hash function to use. This can be a module under `Cryptodome.Hash` + or an existing hash object created from any of such modules. If not specified, + `Cryptodome.Hash.SHA1` is used. + mgfunc : callable + A mask generation function that accepts two parameters: a string to + use as seed, and the lenth of the mask to generate, in bytes. + If not specified, the standard MGF1 consistent with ``hashAlgo`` is used (a safe choice). + label : bytes/bytearray/memoryview + A label to apply to this particular encryption. If not specified, + an empty string is used. Specifying a label does not improve + security. + randfunc : callable + A function that returns random bytes. + + :attention: Modify the mask generation function only if you know what you are doing. + Sender and receiver must use the same one. + """ + self._key = key + + if hashAlgo: + self._hashObj = hashAlgo + else: + self._hashObj = Cryptodome.Hash.SHA1 + + if mgfunc: + self._mgf = mgfunc + else: + self._mgf = lambda x,y: MGF1(x,y,self._hashObj) + + self._label = _copy_bytes(None, None, label) + self._randfunc = randfunc + + def can_encrypt(self): + """Legacy function to check if you can call :meth:`encrypt`. + + .. deprecated:: 3.0""" + return self._key.can_encrypt() + + def can_decrypt(self): + """Legacy function to check if you can call :meth:`decrypt`. + + .. deprecated:: 3.0""" + return self._key.can_decrypt() + + def encrypt(self, message): + """Encrypt a message with PKCS#1 OAEP. + + :param message: + The message to encrypt, also known as plaintext. It can be of + variable length, but not longer than the RSA modulus (in bytes) + minus 2, minus twice the hash output size. + For instance, if you use RSA 2048 and SHA-256, the longest message + you can encrypt is 190 byte long. + :type message: bytes/bytearray/memoryview + + :returns: The ciphertext, as large as the RSA modulus. + :rtype: bytes + + :raises ValueError: + if the message is too long. + """ + + # See 7.1.1 in RFC3447 + modBits = Cryptodome.Util.number.size(self._key.n) + k = ceil_div(modBits, 8) # Convert from bits to bytes + hLen = self._hashObj.digest_size + mLen = len(message) + + # Step 1b + ps_len = k - mLen - 2 * hLen - 2 + if ps_len < 0: + raise ValueError("Plaintext is too long.") + # Step 2a + lHash = self._hashObj.new(self._label).digest() + # Step 2b + ps = b'\x00' * ps_len + # Step 2c + db = lHash + ps + b'\x01' + _copy_bytes(None, None, message) + # Step 2d + ros = self._randfunc(hLen) + # Step 2e + dbMask = self._mgf(ros, k-hLen-1) + # Step 2f + maskedDB = strxor(db, dbMask) + # Step 2g + seedMask = self._mgf(maskedDB, hLen) + # Step 2h + maskedSeed = strxor(ros, seedMask) + # Step 2i + em = b'\x00' + maskedSeed + maskedDB + # Step 3a (OS2IP) + em_int = bytes_to_long(em) + # Step 3b (RSAEP) + m_int = self._key._encrypt(em_int) + # Step 3c (I2OSP) + c = long_to_bytes(m_int, k) + return c + + def decrypt(self, ciphertext): + """Decrypt a message with PKCS#1 OAEP. + + :param ciphertext: The encrypted message. + :type ciphertext: bytes/bytearray/memoryview + + :returns: The original message (plaintext). + :rtype: bytes + + :raises ValueError: + if the ciphertext has the wrong length, or if decryption + fails the integrity check (in which case, the decryption + key is probably wrong). + :raises TypeError: + if the RSA key has no private half (i.e. you are trying + to decrypt using a public key). + """ + + # See 7.1.2 in RFC3447 + modBits = Cryptodome.Util.number.size(self._key.n) + k = ceil_div(modBits,8) # Convert from bits to bytes + hLen = self._hashObj.digest_size + + # Step 1b and 1c + if len(ciphertext) != k or k Any: ... + +class HashLikeModule(Protocol): + digest_size : int + @staticmethod + def new(data: Optional[bytes] = ...) -> Any: ... + +HashLike = Union[HashLikeClass, HashLikeModule] + +Buffer = Union[bytes, bytearray, memoryview] + +class PKCS1OAEP_Cipher: + def __init__(self, + key: RsaKey, + hashAlgo: HashLike, + mgfunc: Callable[[bytes, int], bytes], + label: Buffer, + randfunc: Callable[[int], bytes]) -> None: ... + def can_encrypt(self) -> bool: ... + def can_decrypt(self) -> bool: ... + def encrypt(self, message: Buffer) -> bytes: ... + def decrypt(self, ciphertext: Buffer) -> bytes: ... + +def new(key: RsaKey, + hashAlgo: Optional[HashLike] = ..., + mgfunc: Optional[Callable[[bytes, int], bytes]] = ..., + label: Optional[Buffer] = ..., + randfunc: Optional[Callable[[int], bytes]] = ...) -> PKCS1OAEP_Cipher: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py b/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py new file mode 100644 index 0000000..17ef9eb --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py @@ -0,0 +1,217 @@ +# -*- coding: utf-8 -*- +# +# Cipher/PKCS1-v1_5.py : PKCS#1 v1.5 +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +__all__ = ['new', 'PKCS115_Cipher'] + +from Cryptodome import Random +from Cryptodome.Util.number import bytes_to_long, long_to_bytes +from Cryptodome.Util.py3compat import bord, is_bytes, _copy_bytes + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, c_size_t, + c_uint8_ptr) + + +_raw_pkcs1_decode = load_pycryptodome_raw_lib("Cryptodome.Cipher._pkcs1_decode", + """ + int pkcs1_decode(const uint8_t *em, size_t len_em, + const uint8_t *sentinel, size_t len_sentinel, + size_t expected_pt_len, + uint8_t *output); + """) + + +def _pkcs1_decode(em, sentinel, expected_pt_len, output): + if len(em) != len(output): + raise ValueError("Incorrect output length") + + ret = _raw_pkcs1_decode.pkcs1_decode(c_uint8_ptr(em), + c_size_t(len(em)), + c_uint8_ptr(sentinel), + c_size_t(len(sentinel)), + c_size_t(expected_pt_len), + c_uint8_ptr(output)) + return ret + + +class PKCS115_Cipher: + """This cipher can perform PKCS#1 v1.5 RSA encryption or decryption. + Do not instantiate directly. Use :func:`Cryptodome.Cipher.PKCS1_v1_5.new` instead.""" + + def __init__(self, key, randfunc): + """Initialize this PKCS#1 v1.5 cipher object. + + :Parameters: + key : an RSA key object + If a private half is given, both encryption and decryption are possible. + If a public half is given, only encryption is possible. + randfunc : callable + Function that returns random bytes. + """ + + self._key = key + self._randfunc = randfunc + + def can_encrypt(self): + """Return True if this cipher object can be used for encryption.""" + return self._key.can_encrypt() + + def can_decrypt(self): + """Return True if this cipher object can be used for decryption.""" + return self._key.can_decrypt() + + def encrypt(self, message): + """Produce the PKCS#1 v1.5 encryption of a message. + + This function is named ``RSAES-PKCS1-V1_5-ENCRYPT``, and it is specified in + `section 7.2.1 of RFC8017 + `_. + + :param message: + The message to encrypt, also known as plaintext. It can be of + variable length, but not longer than the RSA modulus (in bytes) minus 11. + :type message: bytes/bytearray/memoryview + + :Returns: A byte string, the ciphertext in which the message is encrypted. + It is as long as the RSA modulus (in bytes). + + :Raises ValueError: + If the RSA key length is not sufficiently long to deal with the given + message. + """ + + # See 7.2.1 in RFC8017 + k = self._key.size_in_bytes() + mLen = len(message) + + # Step 1 + if mLen > k - 11: + raise ValueError("Plaintext is too long.") + # Step 2a + ps = [] + while len(ps) != k - mLen - 3: + new_byte = self._randfunc(1) + if bord(new_byte[0]) == 0x00: + continue + ps.append(new_byte) + ps = b"".join(ps) + assert(len(ps) == k - mLen - 3) + # Step 2b + em = b'\x00\x02' + ps + b'\x00' + _copy_bytes(None, None, message) + # Step 3a (OS2IP) + em_int = bytes_to_long(em) + # Step 3b (RSAEP) + m_int = self._key._encrypt(em_int) + # Step 3c (I2OSP) + c = long_to_bytes(m_int, k) + return c + + def decrypt(self, ciphertext, sentinel, expected_pt_len=0): + r"""Decrypt a PKCS#1 v1.5 ciphertext. + + This is the function ``RSAES-PKCS1-V1_5-DECRYPT`` specified in + `section 7.2.2 of RFC8017 + `_. + + Args: + ciphertext (bytes/bytearray/memoryview): + The ciphertext that contains the message to recover. + sentinel (any type): + The object to return whenever an error is detected. + expected_pt_len (integer): + The length the plaintext is known to have, or 0 if unknown. + + Returns (byte string): + It is either the original message or the ``sentinel`` (in case of an error). + + .. warning:: + PKCS#1 v1.5 decryption is intrinsically vulnerable to timing + attacks (see `Bleichenbacher's`__ attack). + **Use PKCS#1 OAEP instead**. + + This implementation attempts to mitigate the risk + with some constant-time constructs. + However, they are not sufficient by themselves: the type of protocol you + implement and the way you handle errors make a big difference. + + Specifically, you should make it very hard for the (malicious) + party that submitted the ciphertext to quickly understand if decryption + succeeded or not. + + To this end, it is recommended that your protocol only encrypts + plaintexts of fixed length (``expected_pt_len``), + that ``sentinel`` is a random byte string of the same length, + and that processing continues for as long + as possible even if ``sentinel`` is returned (i.e. in case of + incorrect decryption). + + .. __: https://dx.doi.org/10.1007/BFb0055716 + """ + + # See 7.2.2 in RFC8017 + k = self._key.size_in_bytes() + + # Step 1 + if len(ciphertext) != k: + raise ValueError("Ciphertext with incorrect length (not %d bytes)" % k) + + # Step 2a (O2SIP) + ct_int = bytes_to_long(ciphertext) + + # Step 2b (RSADP) + m_int = self._key._decrypt(ct_int) + + # Complete step 2c (I2OSP) + em = long_to_bytes(m_int, k) + + # Step 3 (not constant time when the sentinel is not a byte string) + output = bytes(bytearray(k)) + if not is_bytes(sentinel) or len(sentinel) > k: + size = _pkcs1_decode(em, b'', expected_pt_len, output) + if size < 0: + return sentinel + else: + return output[size:] + + # Step 3 (somewhat constant time) + size = _pkcs1_decode(em, sentinel, expected_pt_len, output) + return output[size:] + + +def new(key, randfunc=None): + """Create a cipher for performing PKCS#1 v1.5 encryption or decryption. + + :param key: + The key to use to encrypt or decrypt the message. This is a `Cryptodome.PublicKey.RSA` object. + Decryption is only possible if *key* is a private RSA key. + :type key: RSA key object + + :param randfunc: + Function that return random bytes. + The default is :func:`Cryptodome.Random.get_random_bytes`. + :type randfunc: callable + + :returns: A cipher object `PKCS115_Cipher`. + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + return PKCS115_Cipher(key, randfunc) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi new file mode 100644 index 0000000..b69f509 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi @@ -0,0 +1,20 @@ +from typing import Callable, Union, Any, Optional, TypeVar + +from Cryptodome.PublicKey.RSA import RsaKey + +Buffer = Union[bytes, bytearray, memoryview] +T = TypeVar('T') + +class PKCS115_Cipher: + def __init__(self, + key: RsaKey, + randfunc: Callable[[int], bytes]) -> None: ... + def can_encrypt(self) -> bool: ... + def can_decrypt(self) -> bool: ... + def encrypt(self, message: Buffer) -> bytes: ... + def decrypt(self, ciphertext: Buffer, + sentinel: T, + expected_pt_len: Optional[int] = ...) -> Union[bytes, T]: ... + +def new(key: RsaKey, + randfunc: Optional[Callable[[int], bytes]] = ...) -> PKCS115_Cipher: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.py b/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.py new file mode 100644 index 0000000..79e6701 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +# +# Cipher/Salsa20.py : Salsa20 stream cipher (http://cr.yp.to/snuffle.html) +# +# Contributed by Fabrizio Tarizzo . +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, VoidPointer, + SmartPointer, c_size_t, + c_uint8_ptr, is_writeable_buffer) + +from Cryptodome.Random import get_random_bytes + +_raw_salsa20_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._Salsa20", + """ + int Salsa20_stream_init(uint8_t *key, size_t keylen, + uint8_t *nonce, size_t nonce_len, + void **pSalsaState); + int Salsa20_stream_destroy(void *salsaState); + int Salsa20_stream_encrypt(void *salsaState, + const uint8_t in[], + uint8_t out[], size_t len); + """) + + +class Salsa20Cipher: + """Salsa20 cipher object. Do not create it directly. Use :py:func:`new` + instead. + + :var nonce: The nonce with length 8 + :vartype nonce: byte string + """ + + def __init__(self, key, nonce): + """Initialize a Salsa20 cipher object + + See also `new()` at the module level.""" + + if len(key) not in key_size: + raise ValueError("Incorrect key length for Salsa20 (%d bytes)" % len(key)) + + if len(nonce) != 8: + raise ValueError("Incorrect nonce length for Salsa20 (%d bytes)" % + len(nonce)) + + self.nonce = _copy_bytes(None, None, nonce) + + self._state = VoidPointer() + result = _raw_salsa20_lib.Salsa20_stream_init( + c_uint8_ptr(key), + c_size_t(len(key)), + c_uint8_ptr(nonce), + c_size_t(len(nonce)), + self._state.address_of()) + if result: + raise ValueError("Error %d instantiating a Salsa20 cipher") + self._state = SmartPointer(self._state.get(), + _raw_salsa20_lib.Salsa20_stream_destroy) + + self.block_size = 1 + self.key_size = len(key) + + def encrypt(self, plaintext, output=None): + """Encrypt a piece of data. + + Args: + plaintext(bytes/bytearray/memoryview): The data to encrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the ciphertext + is written to. If ``None``, the ciphertext is returned. + Returns: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = _raw_salsa20_lib.Salsa20_stream_encrypt( + self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + raise ValueError("Error %d while encrypting with Salsa20" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt a piece of data. + + Args: + ciphertext(bytes/bytearray/memoryview): The data to decrypt, of any size. + Keyword Args: + output(bytes/bytearray/memoryview): The location where the plaintext + is written to. If ``None``, the plaintext is returned. + Returns: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + try: + return self.encrypt(ciphertext, output=output) + except ValueError as e: + raise ValueError(str(e).replace("enc", "dec")) + + +def new(key, nonce=None): + """Create a new Salsa20 cipher + + :keyword key: The secret key to use. It must be 16 or 32 bytes long. + :type key: bytes/bytearray/memoryview + + :keyword nonce: + A value that must never be reused for any other encryption + done with this key. It must be 8 bytes long. + + If not provided, a random byte string will be generated (you can read + it back via the ``nonce`` attribute of the returned object). + :type nonce: bytes/bytearray/memoryview + + :Return: a :class:`Cryptodome.Cipher.Salsa20.Salsa20Cipher` object + """ + + if nonce is None: + nonce = get_random_bytes(8) + + return Salsa20Cipher(key, nonce) + +# Size of a data block (in bytes) +block_size = 1 + +# Size of a key (in bytes) +key_size = (16, 32) + diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.pyi new file mode 100644 index 0000000..cc56808 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/Salsa20.pyi @@ -0,0 +1,24 @@ +from typing import Union, Tuple, Optional, overload, ByteString, Optional + +class Salsa20Cipher: + nonce: bytes + block_size: int + key_size: int + + def __init__(self, + key: ByteString, + nonce: ByteString) -> None: ... + @overload + def encrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def encrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: ByteString) -> bytes: ... + @overload + def decrypt(self, plaintext: ByteString, output: Union[bytearray, memoryview]) -> None: ... + +def new(key: ByteString, nonce: Optional[ByteString] = ...) -> Salsa20Cipher: ... + +block_size: int +key_size: Tuple[int, int] + diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_ARC4.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_ARC4.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..451d359707bb1f98ab6c8a231f3eeaa98b7cc774 GIT binary patch literal 21016 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 CAhy;3 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.py b/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.py new file mode 100644 index 0000000..c1c3249 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.py @@ -0,0 +1,131 @@ +# =================================================================== +# +# Copyright (c) 2019, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import sys + +from Cryptodome.Cipher import _create_cipher +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, c_size_t, + c_uint8_ptr, c_uint) + +_raw_blowfish_lib = load_pycryptodome_raw_lib( + "Cryptodome.Cipher._raw_eksblowfish", + """ + int EKSBlowfish_start_operation(const uint8_t key[], + size_t key_len, + const uint8_t salt[16], + size_t salt_len, + unsigned cost, + unsigned invert, + void **pResult); + int EKSBlowfish_encrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int EKSBlowfish_decrypt(const void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int EKSBlowfish_stop_operation(void *state); + """ + ) + + +def _create_base_cipher(dict_parameters): + """This method instantiates and returns a smart pointer to + a low-level base cipher. It will absorb named parameters in + the process.""" + + try: + key = dict_parameters.pop("key") + salt = dict_parameters.pop("salt") + cost = dict_parameters.pop("cost") + except KeyError as e: + raise TypeError("Missing EKSBlowfish parameter: " + str(e)) + invert = dict_parameters.pop("invert", True) + + if len(key) not in key_size: + raise ValueError("Incorrect EKSBlowfish key length (%d bytes)" % len(key)) + + start_operation = _raw_blowfish_lib.EKSBlowfish_start_operation + stop_operation = _raw_blowfish_lib.EKSBlowfish_stop_operation + + void_p = VoidPointer() + result = start_operation(c_uint8_ptr(key), + c_size_t(len(key)), + c_uint8_ptr(salt), + c_size_t(len(salt)), + c_uint(cost), + c_uint(int(invert)), + void_p.address_of()) + if result: + raise ValueError("Error %X while instantiating the EKSBlowfish cipher" + % result) + return SmartPointer(void_p.get(), stop_operation) + + +def new(key, mode, salt, cost, invert): + """Create a new EKSBlowfish cipher + + Args: + + key (bytes, bytearray, memoryview): + The secret key to use in the symmetric cipher. + Its length can vary from 0 to 72 bytes. + + mode (one of the supported ``MODE_*`` constants): + The chaining mode to use for encryption or decryption. + + salt (bytes, bytearray, memoryview): + The salt that bcrypt uses to thwart rainbow table attacks + + cost (integer): + The complexity factor in bcrypt + + invert (bool): + If ``False``, in the inner loop use ``ExpandKey`` first over the salt + and then over the key, as defined in + the `original bcrypt specification `_. + If ``True``, reverse the order, as in the first implementation of + `bcrypt` in OpenBSD. + + :Return: an EKSBlowfish object + """ + + kwargs = { 'salt':salt, 'cost':cost, 'invert':invert } + return _create_cipher(sys.modules[__name__], key, mode, **kwargs) + + +MODE_ECB = 1 + +# Size of a data block (in bytes) +block_size = 8 +# Size of a key (in bytes) +key_size = range(0, 72 + 1) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi new file mode 100644 index 0000000..49c8448 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi @@ -0,0 +1,15 @@ +from typing import Union, Iterable + +from Cryptodome.Cipher._mode_ecb import EcbMode + +MODE_ECB: int + +Buffer = Union[bytes, bytearray, memoryview] + +def new(key: Buffer, + mode: int, + salt: Buffer, + cost: int) -> EcbMode: ... + +block_size: int +key_size: Iterable[int] diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_Salsa20.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_Salsa20.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..a303d911a4b77471b48fa845c0ded098329a5318 GIT binary patch literal 27016 zcmeHQdw5jkng7n5oXNx_GYJzQT-1>b78H_9f*3SlCQM)wKoUqWATSKc1X9B!CKC+Q z1u9@k)3~r@pLMq=*wtO@+AeFmh}~{WK#^K6D7AH6tEjXOc&XT`OIK?4_kQPl&rD8+ z*1bIY&*sZ>&ilT<@4bDObD49?)~bc`9GWJ$=wgl_sUyckDpZ9lq8N}0Q6@65o+Pf4 zx@n23VcZ47gqRBDmtx2&B{R<=vxm|O zhbe~?WjhkdE~n6}&zUono>cLey3A^sBjs79{Ml)N(qk&y1g!R#@n+(EK2yO?%S~7? zWxG1qsV-9*f0%H$FH!L>)h{lUKU39Q*}go4(6P+Fxj_^ydGqO3D&Z!UFE1uf_bD`d5` z?U)kgY7$P{7MCd%CP&*4A|R80mqL9vJC?kskQ})&rsK z@3}&K#xIJ52<v+GbLx{De@ z+h;q84fXyqo&~p;;Yz^SRY>XVdaRBcQ&Fj{;EkH)s`)c!oee3gk?<{yQ*cb8z`_>eMdgBFWgMAfK`Zi{T zdg}|$_w`H*_O2{A0sLXmgF!Ig>uoDI+`F*g2SI2Y2|{`@2=UoqZ*#%PU~jPCr*Qdb zUu|(;&y2o~GSu%4_Vtwa1q&X9!7HeI4NAKqKMZfDg8z_7m;HiwD|G8j))>Qc07Z@1G4)|Z}eP?d}v>SukGZcR}R7=|m?j3l>?LRfQ zKX1&y(e!}-r{MAij%N7(qpCkE5AhF>ZI%DSVE>G3VF~Sk|E0P8^@f1H|7Vr`c}}R8 z))(yUFCR1TG{XG8vcLSAfft~6p|bzZ*<#@74F84xJ7Ms2cF_MuuzzA%VBjb2z`*hJ zD*y9U{x|0JXO$vK1~No+cUA9CD8Ib}N3;F!1hi8~0&RVDe*eTYiau~G-G2&Ua|8ZQ zk;44`to(rgWwH;JE-csw57$usCj(}V+5Q*%^IV*EUM9Snt-MNNC*f%h+@Jxw1O4S= zk!y*to*3^g@Ti8GS`(PJ(s?Hv!pW>nIzjJlp9_sz{ zhqV9r5d}Z{1#K|qrTgeTw0=JZGwIy-D{Tjj?NDbHiFOjaBy%NXzfRXgHM8<27Qg_$Ag2@ zaEf~#G)SkqDC%~l&^9j-T2GEPAuHXr8+8S!n~3EAPNQo{(Va8TonPb0yu-Ck+%*2i zYf1|y5nO>Kh-DXI&!VdcmF}EBb5yzW@6jvWzW%gI_mr<00eA7;&VajYd%8YJcNYiT zQ&3mw&WCQL+a+_@1=AhB9UQzHR4jMbI##+}bT9V+mW#mUeOc(=L%#dT_t(w&q@<_Cel4PGp;+E7Jp zsHQdqsSR_f4fBy5yqC=#){^;|jx}!AvE$D^_xuawXQYhuz(@~_^uS0DjP$@r4~+D{ zNDqwkz(@~_^uXun0eWU znTa*3o`0Xx%^E6WO(O19ff+xaW>#>X4=X)9Tq+C4!_7aL|4F5fn-5ave#FmMDIZex zzf-c6r}FoIMfiDkd%T%yeCH{;Owkra=g*ycgKr9+{GRIb7vq^+zptdY#9!<$E%r@W z5^eT{B5_qQ-S3|&roq42^=1batH*AS@%Y-}M=;K254p4s^j+3srI5{2sn%uCgXi#50OEL! zG>hfaxXxV!loL=o_Ga+TzrregFIL~j;-c^#;d}%n;}BL_!5G3b^c)`u%4P9Lx6mdl zRQMz)GIwa#WK4wDteIG8*Sd)pS@giVHqA}fQ!29lo`mUcN?@Bvr?7;pi0K4VT2j7A zI2_=$Lj7I9+4MMv@s^f-D=_!%5QOJtu*NA(N_P-UuSCd|$k_o_JDbx4VtoALF9N=ZpiOy(QBY zwg=(0eVeVc-;!zXfV>S$UWQT)!5WeD-)ar;MO(D?nCWXYcocbY2vplg53-E9ExHLB z)2VGwVfhy`IP9h2z~d8QBNpn@CuE<#1nD@I zygO7wXckbP`l(M{JE;H2a*T_nR89rualdT2{WSw^9}UN-9@H07PHQj@E3k}0PuyQY z$YYQmB}9(={R^qpY1n&y1}x*7aK} z5qWQ@-7?RCGUQ8!m;@N5Ivhs2p{5mQ^X@=i8YF1nM`&;EH)QQ(npew^LoJqE*?Yy; zQ|~7m3s3j*WW?@7>l>3SZF1(`$}CHAS~VKbs zXC+i7v{IQ@6Ar=+SiC*60Li>u+1SpoAXTJaDiaGsUT$K@zjOk5I}Z7viJ<|dK8d-J z9v0Z51*NjrR(ph4f(00wP%1My5BVJvLmNtq$aX#s2LUWJ=Vr*{?uT?QmI>t;_!cj8 zP|Ur(w#AsZ6zE5&{tcFi)ex>g-9%Y`c@<`-V{txB0ew7GbwIpo&jfe+a}G2xmlcbVHatMF`@dR{PP(R5do?hws~{Jl zB4b9969>)=E(73VuLNXzwaiQtAj_=mB!e<|$S%}w8YdGmW@Ub1T=_WCavL(9XJ}ou z*R0L4VC4RVan)XGQbqn>R!ZAkBPoJo?BkVa>nLD}tW3;1BvTX1>%B`uSNV~`=&#Wv-Nm6!p>We zS(AjWFve)8&^xvH!jYysb+5~ZEr?j)l5V%jdswF01+=PGn%&7YdPX7D>37r+DVKak zqY1^8!E!cG@_w8A$3y9vnDU6yZAMXk*4g~n{eIh4Z^hv}$fwt)WOri8q`Z?>w<~j; zyZDZ^onWJg?2 z%3is$)mSZ6ns(XVop#x3uyHxLcj~Kl8!|P_c?rldY&6{Z)h&x?d$G=aY=`M;I?ze)Zf$-gG~2POXt$^VVy zUzhwhCI5!xACUZM$sdsXo08uz`L`s0zvSPR{C$!?Bl&%j|E1)=LA>F1>c@q)a6TGi z=>NR6h9LdNqGmyTV7b1zadwTYctTY?EgD(Ae>YS;`ioGN(07!|Pejd%!dJ~Ik@#M>GwHtm-O;o z%ZqE21lSF7lkz`ot@#a&&sm`v|MX0YGPGx7mU zY(d@GJd7+db?O+&JUyc6KI*g#{bxes8jNdl4JHA0yLwzRM(bHMuAgBK?16>%zvl@v z>woUSFm5$QH|+i&XCnQ~Qhto_%Z)7RxFRD*kDtNuBdgK*kMg)94?Oy2&6qp`@aA%3 z@-Aaqxyequ+Q@OWqDSLKj?-(nZUOs@aWxznPS=VA_I2Ybr`FhLjA}%MIaG%8R%~HF{K@N67durY3|F+7WniF)Q;n8X`skc+AF-OfBCuNo3&s(zQv{8N}C0&2dT zRHOf1ZX?^0Alg(eO68qiFVrt?Ng8*LQ~$C?jy4+EXqMsJVUD_-f1f04=IM7sQBH~f z&C1bE{VVXB=X{%d8`M!BCx=CXyUYZ=YS;=3YYH)RD}5N4f<_6(tv4(H9rwUTN^ z4pE$2Nb$$Ul?onDRNovofnA1_o%-h8MlRJLmQvL8jK;XHrmzrQt8a>G+w&gg}n5lhoX@=Q)_dYz z^e()!9>$C1?Xh(}x$2H}wXTcd8Wmms8S*Z=dZQiZg+=Nmcbvl|3`sxM9&3t*=}Jbp zOT7ob7O%SBW)IEpvv;<4$C|rDYpkO?9xg2rQn@wO9PJUvVnal9t#9v)`-bEs9WRYX z;!%Mg(=ZerG944b)dvc1Sv0MWbmH_;HW+XF!^m_=*{W7>fA9|5&_>KKS69>%ac0}&-_X?+Edhyl$D*^> zMPt#<)+UIN&ZhOVaauin<_zETb-w9~OMTN@?&yqkYy_>Xp3C15p!~{^UZR}Fl?W@}LE+Jg8XC0b0!R6d?bmi=k`2 zsQ-%93k}S2ism#MYL<{rQmarZ6AqaDTMJtH4~qSv1vN1Hlm#s{J*8T6l-ZVYJ+qHk z&`M@GnmI{X;((f{XEqUgWvZx*arD!wt(vG~_F*gfGG;j*MX%e>(&Gt5W;qK}k)=dV z%Q(KBaz67cpG%nKaO87|6`Xxzjx)<)OhtQyggiV}BgguV6@E3d$>AGQgm1Km*Tm{X ztOR$Ba-En$tA<h4iI)6|$hg>&lw=r`3BkMXd78#kKeHr>zQRA$3L)dr+lka(m41rdq_dL*z?{N z7Wg{5*%eCT5@fdJv!2;K7F5eDdqkLnTQA{B!d!{{3A0JIhZ#$9!N-(q=&CS^CQ|J* zHO*nx-(qSBdH+qSuV$8RlTp#ca%N{*PFFL#L_ry1&&4f!)3%67`x$Dov}>6yw5CPM zjatUjm5#VoibC)>;Go6q9F-e7@U<;0+-)UXcaLJ_i-2YunB~N!DGTdVs##*swyk^9 z;B;@=r2UN2%`_^SsAYD$1+8V4+cwmPX_;7aj*_O)R?E%Ysg!W^VV38MLv&;@&t2f8 zx#RqkESBq(XSD0|78d@R!--|g-e*B|%yKVCQx@i^7G{WzeVI8e$Rp;%4LE$>Aptuut+O7(&9vUSv!FU=PbcQxnJp}E z^6dTspPBPn)c)rwM*ObEv){_&LX+xKr?@l%aUK;O8ud z;x6lX%%M1r+O$#IijF7Kd?|5!KQ$#j{Clh9QWw}|`)tl7?iRk3xJRr>iRW0~9ZmM8 z({nL%k`a^F@kLku&S-M2F1#Yu^O`!|Jml|@4%HtmL`5=U@;aW8D@%#<)2~Bqbb-e` zQWRZ`OMz0qjlTpw;S%`7OW>DZ0>5GyP6w$p@!_Dof=)Xe`2Mba-07f4_yOB|xJu#t zTr~T;9*maMZxoNpTr66Oar`21^3Ts%lP;BwSTsypem+`)SkZ|=s{Ho@CqMi&2p=)N z16)g*pWKYc6rSS)gTnZw`sXloG(5KY18TUfq{`l%M@<^9`hF^K72nw4)P7aM%u#7@%GNHaHP9OG_`N&Xp6?9&G^)EN)7ql=y0U7GqNchjm10Z>&=l3(QtG3 zh7Frwk|fDbKMzq=x1W%b?PeK02yNc}3Ww({2`s7#SKS<>uT+PdyV}F+@kTm*kUF^h z=D;G{2?~dC!zo-9QmUcg5yHmCRLqECA#;L!P&G+JDR-fau+e1T%!mdpl;*qtW@lKPj zXD-$rj~1?rbr-JfZf$Fx-r6jrv_8_cUKBQOiow#P@lLa5W3;oYwLLaO2&1ku+7=-L z#dWmBMWO71!g#a?y!@niVP|`DBpwlk(e-LFtZ#-bOQwZ6D@+UK$%;b2flMc|p|uGq zw8Jr0g)-XOt}aoCIl2K;4@%Ls-Roc;iLJwgR$^qiZF6dUUDp{j+2HX?!6nKEb;nY`;b^Ov{xapX!;HPuLs&&j48Z z9nba$6vMO(`wc1-msqyvBYOof^3C>qKF9QR)Fl_?&VoYV=v^1K=kq?Md`7_evmR6W z6-e*Su*~O&OnoYnJ%0tuOJ7vS_Iw`6^kJpQ@$K!8p`Pq3mEOJPwL9y)bB)5u9%og< z`mYBV^$A^ulZ6kwigNq8nqnmvx~!9I?^AY6Ym=41+uX}rEy?zLzQc68m6+*>?b+=P zFv<4(J{MCQafTFo{$Ex0-2cL-)D>k>p;rDZ|2Y_n&-Ol_S;Lg)zloY-#XQjiSd#76 z_yC|-lq!=7k3U271D?(ad4BNu8UJ4lyFSZI=`s{uwqSefyq-2}6xK7Pgv|I+R8Wd+ z&*%THKVr}RUI0Tw%=Y{{f&XvGN!5NHH;&8m;1$>=$LHS@r;E%8K9g8$wrBba)Fj)B z3Z+_XQrbTy7q(;iD^wEC`Sb6SGG)(t>_at&Me!~;!j!s&v%PADg|j`=kCeTopqO>a zq1`XrvAzz#j#1rTD#NI4`?KrP8)@UuwHC`#PRoX;x`6cY%R2_fDwgKDirz(4U zJD;jFu&{3elC9MCKtA2jLz5X7}dQ;2L=>+H7vQaN~dwLkZvvJ?x?r+lSM-NSQFL6V$MH!nW01+ base_cipher_state +# - AES_encrypt(base_cipher_state, in, out, length) +# - AES_decrypt(base_cipher_state, in, out, length) +# - AES_stop_operation(base_cipher_state) +# +# Where base_cipher_state is AES_State, a struct with BlockBase (set of +# pointers to encrypt/decrypt/stop) followed by cipher-specific data. +# +# The API of #2 is (replace "CBC" with the name of the actual mode): +# - CBC_start_operation(base_cipher_state) --> mode_state +# - CBC_encrypt(mode_state, in, out, length) +# - CBC_decrypt(mode_state, in, out, length) +# - CBC_stop_operation(mode_state) +# +# where mode_state is a a pointer to base_cipher_state plus mode-specific data. + +import os + +from Cryptodome.Cipher._mode_ecb import _create_ecb_cipher +from Cryptodome.Cipher._mode_cbc import _create_cbc_cipher +from Cryptodome.Cipher._mode_cfb import _create_cfb_cipher +from Cryptodome.Cipher._mode_ofb import _create_ofb_cipher +from Cryptodome.Cipher._mode_ctr import _create_ctr_cipher +from Cryptodome.Cipher._mode_openpgp import _create_openpgp_cipher +from Cryptodome.Cipher._mode_ccm import _create_ccm_cipher +from Cryptodome.Cipher._mode_eax import _create_eax_cipher +from Cryptodome.Cipher._mode_siv import _create_siv_cipher +from Cryptodome.Cipher._mode_gcm import _create_gcm_cipher +from Cryptodome.Cipher._mode_ocb import _create_ocb_cipher + +_modes = { 1:_create_ecb_cipher, + 2:_create_cbc_cipher, + 3:_create_cfb_cipher, + 5:_create_ofb_cipher, + 6:_create_ctr_cipher, + 7:_create_openpgp_cipher, + 9:_create_eax_cipher + } + +_extra_modes = { 8:_create_ccm_cipher, + 10:_create_siv_cipher, + 11:_create_gcm_cipher, + 12:_create_ocb_cipher + } + +def _create_cipher(factory, key, mode, *args, **kwargs): + + kwargs["key"] = key + + modes = dict(_modes) + if kwargs.pop("add_aes_modes", False): + modes.update(_extra_modes) + if not mode in modes: + raise ValueError("Mode not supported") + + if args: + if mode in (8, 9, 10, 11, 12): + if len(args) > 1: + raise TypeError("Too many arguments for this mode") + kwargs["nonce"] = args[0] + elif mode in (2, 3, 5, 7): + if len(args) > 1: + raise TypeError("Too many arguments for this mode") + kwargs["IV"] = args[0] + elif mode == 6: + if len(args) > 0: + raise TypeError("Too many arguments for this mode") + elif mode == 1: + raise TypeError("IV is not meaningful for the ECB mode") + + return modes[mode](factory, **kwargs) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/__init__.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/__init__.pyi new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_chacha20.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_chacha20.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..f1f1fa1e46a37331db3d5b605415fe31b383af57 GIT binary patch literal 30624 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 f9$0HRwb5jMXKT +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +Ciphertext Block Chaining (CBC) mode. +""" + +__all__ = ['CbcMode'] + +from Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr, + is_writeable_buffer) + +from Cryptodome.Random import get_random_bytes + +raw_cbc_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_cbc", """ + int CBC_start_operation(void *cipher, + const uint8_t iv[], + size_t iv_len, + void **pResult); + int CBC_encrypt(void *cbcState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CBC_decrypt(void *cbcState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CBC_stop_operation(void *state); + """ + ) + + +class CbcMode(object): + """*Cipher-Block Chaining (CBC)*. + + Each of the ciphertext blocks depends on the current + and all previous plaintext blocks. + + An Initialization Vector (*IV*) is required. + + See `NIST SP800-38A`_ , Section 6.2 . + + .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + :undocumented: __init__ + """ + + def __init__(self, block_cipher, iv): + """Create a new block cipher, configured in CBC mode. + + :Parameters: + block_cipher : C pointer + A smart pointer to the low-level block cipher instance. + + iv : bytes/bytearray/memoryview + The initialization vector to use for encryption or decryption. + It is as long as the cipher block. + + **The IV must be unpredictable**. Ideally it is picked randomly. + + Reusing the *IV* for encryptions performed with the same key + compromises confidentiality. + """ + + self._state = VoidPointer() + result = raw_cbc_lib.CBC_start_operation(block_cipher.get(), + c_uint8_ptr(iv), + c_size_t(len(iv)), + self._state.address_of()) + if result: + raise ValueError("Error %d while instantiating the CBC mode" + % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher mode + self._state = SmartPointer(self._state.get(), + raw_cbc_lib.CBC_stop_operation) + + # Memory allocated for the underlying block cipher is now owed + # by the cipher mode + block_cipher.release() + + self.block_size = len(iv) + """The block size of the underlying cipher, in bytes.""" + + self.iv = _copy_bytes(None, None, iv) + """The Initialization Vector originally used to create the object. + The value does not change.""" + + self.IV = self.iv + """Alias for `iv`""" + + self._next = ["encrypt", "decrypt"] + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + That also means that you cannot reuse an object for encrypting + or decrypting other data with the same key. + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + Its lenght must be multiple of the cipher block size. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = ["encrypt"] + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_cbc_lib.CBC_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + if result == 3: + raise ValueError("Data must be padded to %d byte boundary in CBC mode" % self.block_size) + raise ValueError("Error %d while encrypting in CBC mode" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + Its length must be multiple of the cipher block size. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = ["decrypt"] + + if output is None: + plaintext = create_string_buffer(len(ciphertext)) + else: + plaintext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(ciphertext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_cbc_lib.CBC_decrypt(self._state.get(), + c_uint8_ptr(ciphertext), + c_uint8_ptr(plaintext), + c_size_t(len(ciphertext))) + if result: + if result == 3: + raise ValueError("Data must be padded to %d byte boundary in CBC mode" % self.block_size) + raise ValueError("Error %d while decrypting in CBC mode" % result) + + if output is None: + return get_raw_buffer(plaintext) + else: + return None + + +def _create_cbc_cipher(factory, **kwargs): + """Instantiate a cipher object that performs CBC encryption/decryption. + + :Parameters: + factory : module + The underlying block cipher, a module from ``Cryptodome.Cipher``. + + :Keywords: + iv : bytes/bytearray/memoryview + The IV to use for CBC. + + IV : bytes/bytearray/memoryview + Alias for ``iv``. + + Any other keyword will be passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present). + """ + + cipher_state = factory._create_base_cipher(kwargs) + iv = kwargs.pop("IV", None) + IV = kwargs.pop("iv", None) + + if (None, None) == (iv, IV): + iv = get_random_bytes(factory.block_size) + if iv is not None: + if IV is not None: + raise TypeError("You must either use 'iv' or 'IV', not both") + else: + iv = IV + + if len(iv) != factory.block_size: + raise ValueError("Incorrect IV length (it must be %d bytes long)" % + factory.block_size) + + if kwargs: + raise TypeError("Unknown parameters for CBC: %s" % str(kwargs)) + + return CbcMode(cipher_state, iv) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.pyi new file mode 100644 index 0000000..526632e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cbc.pyi @@ -0,0 +1,25 @@ +from typing import Union, overload + +from Cryptodome.Util._raw_api import SmartPointer + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['CbcMode'] + +class CbcMode(object): + block_size: int + iv: Buffer + IV: Buffer + + def __init__(self, + block_cipher: SmartPointer, + iv: Buffer) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.py b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.py new file mode 100644 index 0000000..ec2e4f4 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.py @@ -0,0 +1,650 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +Counter with CBC-MAC (CCM) mode. +""" + +__all__ = ['CcmMode'] + +import struct +from binascii import unhexlify + +from Cryptodome.Util.py3compat import (byte_string, bord, + _copy_bytes) +from Cryptodome.Util._raw_api import is_writeable_buffer + +from Cryptodome.Util.strxor import strxor +from Cryptodome.Util.number import long_to_bytes + +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Random import get_random_bytes + + +def enum(**enums): + return type('Enum', (), enums) + +MacStatus = enum(NOT_STARTED=0, PROCESSING_AUTH_DATA=1, PROCESSING_PLAINTEXT=2) + + +class CcmMode(object): + """Counter with CBC-MAC (CCM). + + This is an Authenticated Encryption with Associated Data (`AEAD`_) mode. + It provides both confidentiality and authenticity. + + The header of the message may be left in the clear, if needed, and it will + still be subject to authentication. The decryption step tells the receiver + if the message comes from a source that really knowns the secret key. + Additionally, decryption detects if any part of the message - including the + header - has been modified or corrupted. + + This mode requires a nonce. The nonce shall never repeat for two + different messages encrypted with the same key, but it does not need + to be random. + Note that there is a trade-off between the size of the nonce and the + maximum size of a single message you can encrypt. + + It is important to use a large nonce if the key is reused across several + messages and the nonce is chosen randomly. + + It is acceptable to us a short nonce if the key is only used a few times or + if the nonce is taken from a counter. + + The following table shows the trade-off when the nonce is chosen at + random. The column on the left shows how many messages it takes + for the keystream to repeat **on average**. In practice, you will want to + stop using the key way before that. + + +--------------------+---------------+-------------------+ + | Avg. # of messages | nonce | Max. message | + | before keystream | size | size | + | repeats | (bytes) | (bytes) | + +====================+===============+===================+ + | 2^52 | 13 | 64K | + +--------------------+---------------+-------------------+ + | 2^48 | 12 | 16M | + +--------------------+---------------+-------------------+ + | 2^44 | 11 | 4G | + +--------------------+---------------+-------------------+ + | 2^40 | 10 | 1T | + +--------------------+---------------+-------------------+ + | 2^36 | 9 | 64P | + +--------------------+---------------+-------------------+ + | 2^32 | 8 | 16E | + +--------------------+---------------+-------------------+ + + This mode is only available for ciphers that operate on 128 bits blocks + (e.g. AES but not TDES). + + See `NIST SP800-38C`_ or RFC3610_. + + .. _`NIST SP800-38C`: http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C.pdf + .. _RFC3610: https://tools.ietf.org/html/rfc3610 + .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html + + :undocumented: __init__ + """ + + def __init__(self, factory, key, nonce, mac_len, msg_len, assoc_len, + cipher_params): + + self.block_size = factory.block_size + """The block size of the underlying cipher, in bytes.""" + + self.nonce = _copy_bytes(None, None, nonce) + """The nonce used for this cipher instance""" + + self._factory = factory + self._key = _copy_bytes(None, None, key) + self._mac_len = mac_len + self._msg_len = msg_len + self._assoc_len = assoc_len + self._cipher_params = cipher_params + + self._mac_tag = None # Cache for MAC tag + + if self.block_size != 16: + raise ValueError("CCM mode is only available for ciphers" + " that operate on 128 bits blocks") + + # MAC tag length (Tlen) + if mac_len not in (4, 6, 8, 10, 12, 14, 16): + raise ValueError("Parameter 'mac_len' must be even" + " and in the range 4..16 (not %d)" % mac_len) + + # Nonce value + if not (nonce and 7 <= len(nonce) <= 13): + raise ValueError("Length of parameter 'nonce' must be" + " in the range 7..13 bytes") + + # Create MAC object (the tag will be the last block + # bytes worth of ciphertext) + self._mac = self._factory.new(key, + factory.MODE_CBC, + iv=b'\x00' * 16, + **cipher_params) + self._mac_status = MacStatus.NOT_STARTED + self._t = None + + # Allowed transitions after initialization + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + # Cumulative lengths + self._cumul_assoc_len = 0 + self._cumul_msg_len = 0 + + # Cache for unaligned associated data/plaintext. + # This is a list with byte strings, but when the MAC starts, + # it will become a binary string no longer than the block size. + self._cache = [] + + # Start CTR cipher, by formatting the counter (A.3) + q = 15 - len(nonce) # length of Q, the encoded message length + self._cipher = self._factory.new(key, + self._factory.MODE_CTR, + nonce=struct.pack("B", q - 1) + self.nonce, + **cipher_params) + + # S_0, step 6 in 6.1 for j=0 + self._s_0 = self._cipher.encrypt(b'\x00' * 16) + + # Try to start the MAC + if None not in (assoc_len, msg_len): + self._start_mac() + + def _start_mac(self): + + assert(self._mac_status == MacStatus.NOT_STARTED) + assert(None not in (self._assoc_len, self._msg_len)) + assert(isinstance(self._cache, list)) + + # Formatting control information and nonce (A.2.1) + q = 15 - len(self.nonce) # length of Q, the encoded message length + flags = (64 * (self._assoc_len > 0) + 8 * ((self._mac_len - 2) // 2) + + (q - 1)) + b_0 = struct.pack("B", flags) + self.nonce + long_to_bytes(self._msg_len, q) + + # Formatting associated data (A.2.2) + # Encoded 'a' is concatenated with the associated data 'A' + assoc_len_encoded = b'' + if self._assoc_len > 0: + if self._assoc_len < (2 ** 16 - 2 ** 8): + enc_size = 2 + elif self._assoc_len < (2 ** 32): + assoc_len_encoded = b'\xFF\xFE' + enc_size = 4 + else: + assoc_len_encoded = b'\xFF\xFF' + enc_size = 8 + assoc_len_encoded += long_to_bytes(self._assoc_len, enc_size) + + # b_0 and assoc_len_encoded must be processed first + self._cache.insert(0, b_0) + self._cache.insert(1, assoc_len_encoded) + + # Process all the data cached so far + first_data_to_mac = b"".join(self._cache) + self._cache = b"" + self._mac_status = MacStatus.PROCESSING_AUTH_DATA + self._update(first_data_to_mac) + + def _pad_cache_and_update(self): + + assert(self._mac_status != MacStatus.NOT_STARTED) + assert(len(self._cache) < self.block_size) + + # Associated data is concatenated with the least number + # of zero bytes (possibly none) to reach alignment to + # the 16 byte boundary (A.2.3) + len_cache = len(self._cache) + if len_cache > 0: + self._update(b'\x00' * (self.block_size - len_cache)) + + def update(self, assoc_data): + """Protect associated data + + If there is any associated data, the caller has to invoke + this function one or more times, before using + ``decrypt`` or ``encrypt``. + + By *associated data* it is meant any data (e.g. packet headers) that + will not be encrypted and will be transmitted in the clear. + However, the receiver is still able to detect any modification to it. + In CCM, the *associated data* is also called + *additional authenticated data* (AAD). + + If there is no associated data, this method must not be called. + + The caller may split associated data in segments of any size, and + invoke this method multiple times, each time with the next segment. + + :Parameters: + assoc_data : bytes/bytearray/memoryview + A piece of associated data. There are no restrictions on its size. + """ + + if "update" not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + self._cumul_assoc_len += len(assoc_data) + if self._assoc_len is not None and \ + self._cumul_assoc_len > self._assoc_len: + raise ValueError("Associated data is too long") + + self._update(assoc_data) + return self + + def _update(self, assoc_data_pt=b""): + """Update the MAC with associated data or plaintext + (without FSM checks)""" + + # If MAC has not started yet, we just park the data into a list. + # If the data is mutable, we create a copy and store that instead. + if self._mac_status == MacStatus.NOT_STARTED: + if is_writeable_buffer(assoc_data_pt): + assoc_data_pt = _copy_bytes(None, None, assoc_data_pt) + self._cache.append(assoc_data_pt) + return + + assert(len(self._cache) < self.block_size) + + if len(self._cache) > 0: + filler = min(self.block_size - len(self._cache), + len(assoc_data_pt)) + self._cache += _copy_bytes(None, filler, assoc_data_pt) + assoc_data_pt = _copy_bytes(filler, None, assoc_data_pt) + + if len(self._cache) < self.block_size: + return + + # The cache is exactly one block + self._t = self._mac.encrypt(self._cache) + self._cache = b"" + + update_len = len(assoc_data_pt) // self.block_size * self.block_size + self._cache = _copy_bytes(update_len, None, assoc_data_pt) + if update_len > 0: + self._t = self._mac.encrypt(assoc_data_pt[:update_len])[-16:] + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + This method can be called only **once** if ``msg_len`` was + not passed at initialization. + + If ``msg_len`` was given, the data to encrypt can be broken + up in two or more pieces and `encrypt` can be called + multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + self._next = ["encrypt", "digest"] + + # No more associated data allowed from now + if self._assoc_len is None: + assert(isinstance(self._cache, list)) + self._assoc_len = sum([len(x) for x in self._cache]) + if self._msg_len is not None: + self._start_mac() + else: + if self._cumul_assoc_len < self._assoc_len: + raise ValueError("Associated data is too short") + + # Only once piece of plaintext accepted if message length was + # not declared in advance + if self._msg_len is None: + self._msg_len = len(plaintext) + self._start_mac() + self._next = ["digest"] + + self._cumul_msg_len += len(plaintext) + if self._cumul_msg_len > self._msg_len: + raise ValueError("Message is too long") + + if self._mac_status == MacStatus.PROCESSING_AUTH_DATA: + # Associated data is concatenated with the least number + # of zero bytes (possibly none) to reach alignment to + # the 16 byte boundary (A.2.3) + self._pad_cache_and_update() + self._mac_status = MacStatus.PROCESSING_PLAINTEXT + + self._update(plaintext) + return self._cipher.encrypt(plaintext, output=output) + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + This method can be called only **once** if ``msg_len`` was + not passed at initialization. + + If ``msg_len`` was given, the data to decrypt can be + broken up in two or more pieces and `decrypt` can be + called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = ["decrypt", "verify"] + + # No more associated data allowed from now + if self._assoc_len is None: + assert(isinstance(self._cache, list)) + self._assoc_len = sum([len(x) for x in self._cache]) + if self._msg_len is not None: + self._start_mac() + else: + if self._cumul_assoc_len < self._assoc_len: + raise ValueError("Associated data is too short") + + # Only once piece of ciphertext accepted if message length was + # not declared in advance + if self._msg_len is None: + self._msg_len = len(ciphertext) + self._start_mac() + self._next = ["verify"] + + self._cumul_msg_len += len(ciphertext) + if self._cumul_msg_len > self._msg_len: + raise ValueError("Message is too long") + + if self._mac_status == MacStatus.PROCESSING_AUTH_DATA: + # Associated data is concatenated with the least number + # of zero bytes (possibly none) to reach alignment to + # the 16 byte boundary (A.2.3) + self._pad_cache_and_update() + self._mac_status = MacStatus.PROCESSING_PLAINTEXT + + # Encrypt is equivalent to decrypt with the CTR mode + plaintext = self._cipher.encrypt(ciphertext, output=output) + if output is None: + self._update(plaintext) + else: + self._update(output) + return plaintext + + def digest(self): + """Compute the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method returns the MAC that shall be sent to the receiver, + together with the ciphertext. + + :Return: the MAC, as a byte string. + """ + + if "digest" not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = ["digest"] + return self._digest() + + def _digest(self): + if self._mac_tag: + return self._mac_tag + + if self._assoc_len is None: + assert(isinstance(self._cache, list)) + self._assoc_len = sum([len(x) for x in self._cache]) + if self._msg_len is not None: + self._start_mac() + else: + if self._cumul_assoc_len < self._assoc_len: + raise ValueError("Associated data is too short") + + if self._msg_len is None: + self._msg_len = 0 + self._start_mac() + + if self._cumul_msg_len != self._msg_len: + raise ValueError("Message is too short") + + # Both associated data and payload are concatenated with the least + # number of zero bytes (possibly none) that align it to the + # 16 byte boundary (A.2.2 and A.2.3) + self._pad_cache_and_update() + + # Step 8 in 6.1 (T xor MSB_Tlen(S_0)) + self._mac_tag = strxor(self._t, self._s_0)[:self._mac_len] + + return self._mac_tag + + def hexdigest(self): + """Compute the *printable* MAC tag. + + This method is like `digest`. + + :Return: the MAC, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method checks if the decrypted message is indeed valid + (that is, if the key is correct) and it has not been + tampered with while in transit. + + :Parameters: + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = ["verify"] + + self._digest() + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* MAC tag. + + This method is like `verify`. + + :Parameters: + hex_mac_tag : string + This is the *printable* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext, output=None): + """Perform encrypt() and digest() in one step. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + a tuple with two items: + + - the ciphertext, as ``bytes`` + - the MAC tag, as ``bytes`` + + The first item becomes ``None`` when the ``output`` parameter + specified a location for the result. + """ + + return self.encrypt(plaintext, output=output), self.digest() + + def decrypt_and_verify(self, ciphertext, received_mac_tag, output=None): + """Perform decrypt() and verify() in one step. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` + parameter specified a location for the result. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + plaintext = self.decrypt(ciphertext, output=output) + self.verify(received_mac_tag) + return plaintext + + +def _create_ccm_cipher(factory, **kwargs): + """Create a new block cipher, configured in CCM mode. + + :Parameters: + factory : module + A symmetric cipher module from `Cryptodome.Cipher` (like + `Cryptodome.Cipher.AES`). + + :Keywords: + key : bytes/bytearray/memoryview + The secret key to use in the symmetric cipher. + + nonce : bytes/bytearray/memoryview + A value that must never be reused for any other encryption. + + Its length must be in the range ``[7..13]``. + 11 or 12 bytes are reasonable values in general. Bear in + mind that with CCM there is a trade-off between nonce length and + maximum message size. + + If not specified, a 11 byte long random string is used. + + mac_len : integer + Length of the MAC, in bytes. It must be even and in + the range ``[4..16]``. The default is 16. + + msg_len : integer + Length of the message to (de)cipher. + If not specified, ``encrypt`` or ``decrypt`` may only be called once. + + assoc_len : integer + Length of the associated data. + If not specified, all data is internally buffered. + """ + + try: + key = key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing parameter: " + str(e)) + + nonce = kwargs.pop("nonce", None) # N + if nonce is None: + nonce = get_random_bytes(11) + mac_len = kwargs.pop("mac_len", factory.block_size) + msg_len = kwargs.pop("msg_len", None) # p + assoc_len = kwargs.pop("assoc_len", None) # a + cipher_params = dict(kwargs) + + return CcmMode(factory, key, nonce, mac_len, msg_len, + assoc_len, cipher_params) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.pyi new file mode 100644 index 0000000..4b9f620 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ccm.pyi @@ -0,0 +1,47 @@ +from types import ModuleType +from typing import Union, overload, Dict, Tuple, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['CcmMode'] + +class CcmMode(object): + block_size: int + nonce: bytes + + def __init__(self, + factory: ModuleType, + key: Buffer, + nonce: Buffer, + mac_len: int, + msg_len: int, + assoc_len: int, + cipher_params: Dict) -> None: ... + + def update(self, assoc_data: Buffer) -> CcmMode: ... + + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + @overload + def encrypt_and_digest(self, + plaintext: Buffer) -> Tuple[bytes, bytes]: ... + @overload + def encrypt_and_digest(self, + plaintext: Buffer, + output: Buffer) -> Tuple[None, bytes]: ... + def decrypt_and_verify(self, + ciphertext: Buffer, + received_mac_tag: Buffer, + output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.py b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.py new file mode 100644 index 0000000..1b1b6c3 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.py @@ -0,0 +1,293 @@ +# -*- coding: utf-8 -*- +# +# Cipher/mode_cfb.py : CFB mode +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +""" +Counter Feedback (CFB) mode. +""" + +__all__ = ['CfbMode'] + +from Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr, + is_writeable_buffer) + +from Cryptodome.Random import get_random_bytes + +raw_cfb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_cfb",""" + int CFB_start_operation(void *cipher, + const uint8_t iv[], + size_t iv_len, + size_t segment_len, /* In bytes */ + void **pResult); + int CFB_encrypt(void *cfbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CFB_decrypt(void *cfbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CFB_stop_operation(void *state);""" + ) + + +class CfbMode(object): + """*Cipher FeedBack (CFB)*. + + This mode is similar to CFB, but it transforms + the underlying block cipher into a stream cipher. + + Plaintext and ciphertext are processed in *segments* + of **s** bits. The mode is therefore sometimes + labelled **s**-bit CFB. + + An Initialization Vector (*IV*) is required. + + See `NIST SP800-38A`_ , Section 6.3. + + .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + :undocumented: __init__ + """ + + def __init__(self, block_cipher, iv, segment_size): + """Create a new block cipher, configured in CFB mode. + + :Parameters: + block_cipher : C pointer + A smart pointer to the low-level block cipher instance. + + iv : bytes/bytearray/memoryview + The initialization vector to use for encryption or decryption. + It is as long as the cipher block. + + **The IV must be unpredictable**. Ideally it is picked randomly. + + Reusing the *IV* for encryptions performed with the same key + compromises confidentiality. + + segment_size : integer + The number of bytes the plaintext and ciphertext are segmented in. + """ + + self._state = VoidPointer() + result = raw_cfb_lib.CFB_start_operation(block_cipher.get(), + c_uint8_ptr(iv), + c_size_t(len(iv)), + c_size_t(segment_size), + self._state.address_of()) + if result: + raise ValueError("Error %d while instantiating the CFB mode" % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher mode + self._state = SmartPointer(self._state.get(), + raw_cfb_lib.CFB_stop_operation) + + # Memory allocated for the underlying block cipher is now owed + # by the cipher mode + block_cipher.release() + + self.block_size = len(iv) + """The block size of the underlying cipher, in bytes.""" + + self.iv = _copy_bytes(None, None, iv) + """The Initialization Vector originally used to create the object. + The value does not change.""" + + self.IV = self.iv + """Alias for `iv`""" + + self._next = ["encrypt", "decrypt"] + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = ["encrypt"] + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_cfb_lib.CFB_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + raise ValueError("Error %d while encrypting in CFB mode" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = ["decrypt"] + + if output is None: + plaintext = create_string_buffer(len(ciphertext)) + else: + plaintext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(ciphertext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_cfb_lib.CFB_decrypt(self._state.get(), + c_uint8_ptr(ciphertext), + c_uint8_ptr(plaintext), + c_size_t(len(ciphertext))) + if result: + raise ValueError("Error %d while decrypting in CFB mode" % result) + + if output is None: + return get_raw_buffer(plaintext) + else: + return None + + +def _create_cfb_cipher(factory, **kwargs): + """Instantiate a cipher object that performs CFB encryption/decryption. + + :Parameters: + factory : module + The underlying block cipher, a module from ``Cryptodome.Cipher``. + + :Keywords: + iv : bytes/bytearray/memoryview + The IV to use for CFB. + + IV : bytes/bytearray/memoryview + Alias for ``iv``. + + segment_size : integer + The number of bit the plaintext and ciphertext are segmented in. + If not present, the default is 8. + + Any other keyword will be passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present). + """ + + cipher_state = factory._create_base_cipher(kwargs) + + iv = kwargs.pop("IV", None) + IV = kwargs.pop("iv", None) + + if (None, None) == (iv, IV): + iv = get_random_bytes(factory.block_size) + if iv is not None: + if IV is not None: + raise TypeError("You must either use 'iv' or 'IV', not both") + else: + iv = IV + + if len(iv) != factory.block_size: + raise ValueError("Incorrect IV length (it must be %d bytes long)" % + factory.block_size) + + segment_size_bytes, rem = divmod(kwargs.pop("segment_size", 8), 8) + if segment_size_bytes == 0 or rem != 0: + raise ValueError("'segment_size' must be positive and multiple of 8 bits") + + if kwargs: + raise TypeError("Unknown parameters for CFB: %s" % str(kwargs)) + return CfbMode(cipher_state, iv, segment_size_bytes) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.pyi new file mode 100644 index 0000000..228e464 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_cfb.pyi @@ -0,0 +1,26 @@ +from typing import Union, overload + +from Cryptodome.Util._raw_api import SmartPointer + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['CfbMode'] + + +class CfbMode(object): + block_size: int + iv: Buffer + IV: Buffer + + def __init__(self, + block_cipher: SmartPointer, + iv: Buffer, + segment_size: int) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.py b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.py new file mode 100644 index 0000000..9ce357f --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.py @@ -0,0 +1,393 @@ +# -*- coding: utf-8 -*- +# +# Cipher/mode_ctr.py : CTR mode +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +""" +Counter (CTR) mode. +""" + +__all__ = ['CtrMode'] + +import struct + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr, + is_writeable_buffer) + +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util.py3compat import _copy_bytes, is_native_int +from Cryptodome.Util.number import long_to_bytes + +raw_ctr_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ctr", """ + int CTR_start_operation(void *cipher, + uint8_t initialCounterBlock[], + size_t initialCounterBlock_len, + size_t prefix_len, + unsigned counter_len, + unsigned littleEndian, + void **pResult); + int CTR_encrypt(void *ctrState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CTR_decrypt(void *ctrState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int CTR_stop_operation(void *ctrState);""" + ) + + +class CtrMode(object): + """*CounTeR (CTR)* mode. + + This mode is very similar to ECB, in that + encryption of one block is done independently of all other blocks. + + Unlike ECB, the block *position* contributes to the encryption + and no information leaks about symbol frequency. + + Each message block is associated to a *counter* which + must be unique across all messages that get encrypted + with the same key (not just within the same message). + The counter is as big as the block size. + + Counters can be generated in several ways. The most + straightword one is to choose an *initial counter block* + (which can be made public, similarly to the *IV* for the + other modes) and increment its lowest **m** bits by one + (modulo *2^m*) for each block. In most cases, **m** is + chosen to be half the block size. + + See `NIST SP800-38A`_, Section 6.5 (for the mode) and + Appendix B (for how to manage the *initial counter block*). + + .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + :undocumented: __init__ + """ + + def __init__(self, block_cipher, initial_counter_block, + prefix_len, counter_len, little_endian): + """Create a new block cipher, configured in CTR mode. + + :Parameters: + block_cipher : C pointer + A smart pointer to the low-level block cipher instance. + + initial_counter_block : bytes/bytearray/memoryview + The initial plaintext to use to generate the key stream. + + It is as large as the cipher block, and it embeds + the initial value of the counter. + + This value must not be reused. + It shall contain a nonce or a random component. + Reusing the *initial counter block* for encryptions + performed with the same key compromises confidentiality. + + prefix_len : integer + The amount of bytes at the beginning of the counter block + that never change. + + counter_len : integer + The length in bytes of the counter embedded in the counter + block. + + little_endian : boolean + True if the counter in the counter block is an integer encoded + in little endian mode. If False, it is big endian. + """ + + if len(initial_counter_block) == prefix_len + counter_len: + self.nonce = _copy_bytes(None, prefix_len, initial_counter_block) + """Nonce; not available if there is a fixed suffix""" + + self._state = VoidPointer() + result = raw_ctr_lib.CTR_start_operation(block_cipher.get(), + c_uint8_ptr(initial_counter_block), + c_size_t(len(initial_counter_block)), + c_size_t(prefix_len), + counter_len, + little_endian, + self._state.address_of()) + if result: + raise ValueError("Error %X while instantiating the CTR mode" + % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher mode + self._state = SmartPointer(self._state.get(), + raw_ctr_lib.CTR_stop_operation) + + # Memory allocated for the underlying block cipher is now owed + # by the cipher mode + block_cipher.release() + + self.block_size = len(initial_counter_block) + """The block size of the underlying cipher, in bytes.""" + + self._next = ["encrypt", "decrypt"] + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = ["encrypt"] + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ctr_lib.CTR_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + if result == 0x60002: + raise OverflowError("The counter has wrapped around in" + " CTR mode") + raise ValueError("Error %X while encrypting in CTR mode" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = ["decrypt"] + + if output is None: + plaintext = create_string_buffer(len(ciphertext)) + else: + plaintext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(ciphertext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ctr_lib.CTR_decrypt(self._state.get(), + c_uint8_ptr(ciphertext), + c_uint8_ptr(plaintext), + c_size_t(len(ciphertext))) + if result: + if result == 0x60002: + raise OverflowError("The counter has wrapped around in" + " CTR mode") + raise ValueError("Error %X while decrypting in CTR mode" % result) + + if output is None: + return get_raw_buffer(plaintext) + else: + return None + + +def _create_ctr_cipher(factory, **kwargs): + """Instantiate a cipher object that performs CTR encryption/decryption. + + :Parameters: + factory : module + The underlying block cipher, a module from ``Cryptodome.Cipher``. + + :Keywords: + nonce : bytes/bytearray/memoryview + The fixed part at the beginning of the counter block - the rest is + the counter number that gets increased when processing the next block. + The nonce must be such that no two messages are encrypted under the + same key and the same nonce. + + The nonce must be shorter than the block size (it can have + zero length; the counter is then as long as the block). + + If this parameter is not present, a random nonce will be created with + length equal to half the block size. No random nonce shorter than + 64 bits will be created though - you must really think through all + security consequences of using such a short block size. + + initial_value : posive integer or bytes/bytearray/memoryview + The initial value for the counter. If not present, the cipher will + start counting from 0. The value is incremented by one for each block. + The counter number is encoded in big endian mode. + + counter : object + Instance of ``Cryptodome.Util.Counter``, which allows full customization + of the counter block. This parameter is incompatible to both ``nonce`` + and ``initial_value``. + + Any other keyword will be passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present). + """ + + cipher_state = factory._create_base_cipher(kwargs) + + counter = kwargs.pop("counter", None) + nonce = kwargs.pop("nonce", None) + initial_value = kwargs.pop("initial_value", None) + if kwargs: + raise TypeError("Invalid parameters for CTR mode: %s" % str(kwargs)) + + if counter is not None and (nonce, initial_value) != (None, None): + raise TypeError("'counter' and 'nonce'/'initial_value'" + " are mutually exclusive") + + if counter is None: + # Cryptodome.Util.Counter is not used + if nonce is None: + if factory.block_size < 16: + raise TypeError("Impossible to create a safe nonce for short" + " block sizes") + nonce = get_random_bytes(factory.block_size // 2) + else: + if len(nonce) >= factory.block_size: + raise ValueError("Nonce is too long") + + # What is not nonce is counter + counter_len = factory.block_size - len(nonce) + + if initial_value is None: + initial_value = 0 + + if is_native_int(initial_value): + if (1 << (counter_len * 8)) - 1 < initial_value: + raise ValueError("Initial counter value is too large") + initial_counter_block = nonce + long_to_bytes(initial_value, counter_len) + else: + if len(initial_value) != counter_len: + raise ValueError("Incorrect length for counter byte string (%d bytes, expected %d)" % + (len(initial_value), counter_len)) + initial_counter_block = nonce + initial_value + + return CtrMode(cipher_state, + initial_counter_block, + len(nonce), # prefix + counter_len, + False) # little_endian + + # Cryptodome.Util.Counter is used + + # 'counter' used to be a callable object, but now it is + # just a dictionary for backward compatibility. + _counter = dict(counter) + try: + counter_len = _counter.pop("counter_len") + prefix = _counter.pop("prefix") + suffix = _counter.pop("suffix") + initial_value = _counter.pop("initial_value") + little_endian = _counter.pop("little_endian") + except KeyError: + raise TypeError("Incorrect counter object" + " (use Cryptodome.Util.Counter.new)") + + # Compute initial counter block + words = [] + while initial_value > 0: + words.append(struct.pack('B', initial_value & 255)) + initial_value >>= 8 + words += [b'\x00'] * max(0, counter_len - len(words)) + if not little_endian: + words.reverse() + initial_counter_block = prefix + b"".join(words) + suffix + + if len(initial_counter_block) != factory.block_size: + raise ValueError("Size of the counter block (%d bytes) must match" + " block size (%d)" % (len(initial_counter_block), + factory.block_size)) + + return CtrMode(cipher_state, initial_counter_block, + len(prefix), counter_len, little_endian) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.pyi new file mode 100644 index 0000000..a68a890 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ctr.pyi @@ -0,0 +1,27 @@ +from typing import Union, overload + +from Cryptodome.Util._raw_api import SmartPointer + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['CtrMode'] + +class CtrMode(object): + block_size: int + nonce: bytes + + def __init__(self, + block_cipher: SmartPointer, + initial_counter_block: Buffer, + prefix_len: int, + counter_len: int, + little_endian: bool) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.py b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.py new file mode 100644 index 0000000..44ef21f --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.py @@ -0,0 +1,408 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +EAX mode. +""" + +__all__ = ['EaxMode'] + +import struct +from binascii import unhexlify + +from Cryptodome.Util.py3compat import byte_string, bord, _copy_bytes + +from Cryptodome.Util._raw_api import is_buffer + +from Cryptodome.Util.strxor import strxor +from Cryptodome.Util.number import long_to_bytes, bytes_to_long + +from Cryptodome.Hash import CMAC, BLAKE2s +from Cryptodome.Random import get_random_bytes + + +class EaxMode(object): + """*EAX* mode. + + This is an Authenticated Encryption with Associated Data + (`AEAD`_) mode. It provides both confidentiality and authenticity. + + The header of the message may be left in the clear, if needed, + and it will still be subject to authentication. + + The decryption step tells the receiver if the message comes + from a source that really knowns the secret key. + Additionally, decryption detects if any part of the message - + including the header - has been modified or corrupted. + + This mode requires a *nonce*. + + This mode is only available for ciphers that operate on 64 or + 128 bits blocks. + + There are no official standards defining EAX. + The implementation is based on `a proposal`__ that + was presented to NIST. + + .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html + .. __: http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/eax/eax-spec.pdf + + :undocumented: __init__ + """ + + def __init__(self, factory, key, nonce, mac_len, cipher_params): + """EAX cipher mode""" + + self.block_size = factory.block_size + """The block size of the underlying cipher, in bytes.""" + + self.nonce = _copy_bytes(None, None, nonce) + """The nonce originally used to create the object.""" + + self._mac_len = mac_len + self._mac_tag = None # Cache for MAC tag + + # Allowed transitions after initialization + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + # MAC tag length + if not (2 <= self._mac_len <= self.block_size): + raise ValueError("'mac_len' must be at least 2 and not larger than %d" + % self.block_size) + + # Nonce cannot be empty and must be a byte string + if len(self.nonce) == 0: + raise ValueError("Nonce cannot be empty in EAX mode") + if not is_buffer(nonce): + raise TypeError("nonce must be bytes, bytearray or memoryview") + + self._omac = [ + CMAC.new(key, + b'\x00' * (self.block_size - 1) + struct.pack('B', i), + ciphermod=factory, + cipher_params=cipher_params) + for i in range(0, 3) + ] + + # Compute MAC of nonce + self._omac[0].update(self.nonce) + self._signer = self._omac[1] + + # MAC of the nonce is also the initial counter for CTR encryption + counter_int = bytes_to_long(self._omac[0].digest()) + self._cipher = factory.new(key, + factory.MODE_CTR, + initial_value=counter_int, + nonce=b"", + **cipher_params) + + def update(self, assoc_data): + """Protect associated data + + If there is any associated data, the caller has to invoke + this function one or more times, before using + ``decrypt`` or ``encrypt``. + + By *associated data* it is meant any data (e.g. packet headers) that + will not be encrypted and will be transmitted in the clear. + However, the receiver is still able to detect any modification to it. + + If there is no associated data, this method must not be called. + + The caller may split associated data in segments of any size, and + invoke this method multiple times, each time with the next segment. + + :Parameters: + assoc_data : bytes/bytearray/memoryview + A piece of associated data. There are no restrictions on its size. + """ + + if "update" not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + self._signer.update(assoc_data) + return self + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + self._next = ["encrypt", "digest"] + ct = self._cipher.encrypt(plaintext, output=output) + if output is None: + self._omac[2].update(ct) + else: + self._omac[2].update(output) + return ct + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = ["decrypt", "verify"] + self._omac[2].update(ciphertext) + return self._cipher.decrypt(ciphertext, output=output) + + def digest(self): + """Compute the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method returns the MAC that shall be sent to the receiver, + together with the ciphertext. + + :Return: the MAC, as a byte string. + """ + + if "digest" not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = ["digest"] + + if not self._mac_tag: + tag = b'\x00' * self.block_size + for i in range(3): + tag = strxor(tag, self._omac[i].digest()) + self._mac_tag = tag[:self._mac_len] + + return self._mac_tag + + def hexdigest(self): + """Compute the *printable* MAC tag. + + This method is like `digest`. + + :Return: the MAC, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method checks if the decrypted message is indeed valid + (that is, if the key is correct) and it has not been + tampered with while in transit. + + :Parameters: + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Raises MacMismatchError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = ["verify"] + + if not self._mac_tag: + tag = b'\x00' * self.block_size + for i in range(3): + tag = strxor(tag, self._omac[i].digest()) + self._mac_tag = tag[:self._mac_len] + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* MAC tag. + + This method is like `verify`. + + :Parameters: + hex_mac_tag : string + This is the *printable* MAC, as received from the sender. + :Raises MacMismatchError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext, output=None): + """Perform encrypt() and digest() in one step. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + a tuple with two items: + + - the ciphertext, as ``bytes`` + - the MAC tag, as ``bytes`` + + The first item becomes ``None`` when the ``output`` parameter + specified a location for the result. + """ + + return self.encrypt(plaintext, output=output), self.digest() + + def decrypt_and_verify(self, ciphertext, received_mac_tag, output=None): + """Perform decrypt() and verify() in one step. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` + parameter specified a location for the result. + :Raises MacMismatchError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + pt = self.decrypt(ciphertext, output=output) + self.verify(received_mac_tag) + return pt + + +def _create_eax_cipher(factory, **kwargs): + """Create a new block cipher, configured in EAX mode. + + :Parameters: + factory : module + A symmetric cipher module from `Cryptodome.Cipher` (like + `Cryptodome.Cipher.AES`). + + :Keywords: + key : bytes/bytearray/memoryview + The secret key to use in the symmetric cipher. + + nonce : bytes/bytearray/memoryview + A value that must never be reused for any other encryption. + There are no restrictions on its length, but it is recommended to use + at least 16 bytes. + + The nonce shall never repeat for two different messages encrypted with + the same key, but it does not need to be random. + + If not specified, a 16 byte long random string is used. + + mac_len : integer + Length of the MAC, in bytes. It must be no larger than the cipher + block bytes (which is the default). + """ + + try: + key = kwargs.pop("key") + nonce = kwargs.pop("nonce", None) + if nonce is None: + nonce = get_random_bytes(16) + mac_len = kwargs.pop("mac_len", factory.block_size) + except KeyError as e: + raise TypeError("Missing parameter: " + str(e)) + + return EaxMode(factory, key, nonce, mac_len, kwargs) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.pyi new file mode 100644 index 0000000..cbfa467 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_eax.pyi @@ -0,0 +1,45 @@ +from types import ModuleType +from typing import Any, Union, Tuple, Dict, overload, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['EaxMode'] + +class EaxMode(object): + block_size: int + nonce: bytes + + def __init__(self, + factory: ModuleType, + key: Buffer, + nonce: Buffer, + mac_len: int, + cipher_params: Dict) -> None: ... + + def update(self, assoc_data: Buffer) -> EaxMode: ... + + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + @overload + def encrypt_and_digest(self, + plaintext: Buffer) -> Tuple[bytes, bytes]: ... + @overload + def encrypt_and_digest(self, + plaintext: Buffer, + output: Buffer) -> Tuple[None, bytes]: ... + def decrypt_and_verify(self, + ciphertext: Buffer, + received_mac_tag: Buffer, + output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.py b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.py new file mode 100644 index 0000000..a01a16f --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.py @@ -0,0 +1,220 @@ +# -*- coding: utf-8 -*- +# +# Cipher/mode_ecb.py : ECB mode +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +""" +Electronic Code Book (ECB) mode. +""" + +__all__ = [ 'EcbMode' ] + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, create_string_buffer, + get_raw_buffer, SmartPointer, + c_size_t, c_uint8_ptr, + is_writeable_buffer) + +raw_ecb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ecb", """ + int ECB_start_operation(void *cipher, + void **pResult); + int ECB_encrypt(void *ecbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int ECB_decrypt(void *ecbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int ECB_stop_operation(void *state); + """ + ) + + +class EcbMode(object): + """*Electronic Code Book (ECB)*. + + This is the simplest encryption mode. Each of the plaintext blocks + is directly encrypted into a ciphertext block, independently of + any other block. + + This mode is dangerous because it exposes frequency of symbols + in your plaintext. Other modes (e.g. *CBC*) should be used instead. + + See `NIST SP800-38A`_ , Section 6.1. + + .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + :undocumented: __init__ + """ + + def __init__(self, block_cipher): + """Create a new block cipher, configured in ECB mode. + + :Parameters: + block_cipher : C pointer + A smart pointer to the low-level block cipher instance. + """ + self.block_size = block_cipher.block_size + + self._state = VoidPointer() + result = raw_ecb_lib.ECB_start_operation(block_cipher.get(), + self._state.address_of()) + if result: + raise ValueError("Error %d while instantiating the ECB mode" + % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher + # mode + self._state = SmartPointer(self._state.get(), + raw_ecb_lib.ECB_stop_operation) + + # Memory allocated for the underlying block cipher is now owned + # by the cipher mode + block_cipher.release() + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key set at initialization. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + The length must be multiple of the cipher block length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ecb_lib.ECB_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + if result == 3: + raise ValueError("Data must be aligned to block boundary in ECB mode") + raise ValueError("Error %d while encrypting in ECB mode" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key set at initialization. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + The length must be multiple of the cipher block length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if output is None: + plaintext = create_string_buffer(len(ciphertext)) + else: + plaintext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(ciphertext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ecb_lib.ECB_decrypt(self._state.get(), + c_uint8_ptr(ciphertext), + c_uint8_ptr(plaintext), + c_size_t(len(ciphertext))) + if result: + if result == 3: + raise ValueError("Data must be aligned to block boundary in ECB mode") + raise ValueError("Error %d while decrypting in ECB mode" % result) + + if output is None: + return get_raw_buffer(plaintext) + else: + return None + + +def _create_ecb_cipher(factory, **kwargs): + """Instantiate a cipher object that performs ECB encryption/decryption. + + :Parameters: + factory : module + The underlying block cipher, a module from ``Cryptodome.Cipher``. + + All keywords are passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present""" + + cipher_state = factory._create_base_cipher(kwargs) + cipher_state.block_size = factory.block_size + if kwargs: + raise TypeError("Unknown parameters for ECB: %s" % str(kwargs)) + return EcbMode(cipher_state) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.pyi new file mode 100644 index 0000000..936195f --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ecb.pyi @@ -0,0 +1,19 @@ +from typing import Union, overload + +from Cryptodome.Util._raw_api import SmartPointer + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = [ 'EcbMode' ] + +class EcbMode(object): + def __init__(self, block_cipher: SmartPointer) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py new file mode 100644 index 0000000..9914400 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.py @@ -0,0 +1,620 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +Galois/Counter Mode (GCM). +""" + +__all__ = ['GcmMode'] + +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, _copy_bytes + +from Cryptodome.Util._raw_api import is_buffer + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Random import get_random_bytes + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr) + +from Cryptodome.Util import _cpu_features + + +# C API by module implementing GHASH +_ghash_api_template = """ + int ghash_%imp%(uint8_t y_out[16], + const uint8_t block_data[], + size_t len, + const uint8_t y_in[16], + const void *exp_key); + int ghash_expand_%imp%(const uint8_t h[16], + void **ghash_tables); + int ghash_destroy_%imp%(void *ghash_tables); +""" + +def _build_impl(lib, postfix): + from collections import namedtuple + + funcs = ( "ghash", "ghash_expand", "ghash_destroy" ) + GHASH_Imp = namedtuple('_GHash_Imp', funcs) + try: + imp_funcs = [ getattr(lib, x + "_" + postfix) for x in funcs ] + except AttributeError: # Make sphinx stop complaining with its mocklib + imp_funcs = [ None ] * 3 + params = dict(zip(funcs, imp_funcs)) + return GHASH_Imp(**params) + + +def _get_ghash_portable(): + api = _ghash_api_template.replace("%imp%", "portable") + lib = load_pycryptodome_raw_lib("Cryptodome.Hash._ghash_portable", api) + result = _build_impl(lib, "portable") + return result +_ghash_portable = _get_ghash_portable() + + +def _get_ghash_clmul(): + """Return None if CLMUL implementation is not available""" + + if not _cpu_features.have_clmul(): + return None + try: + api = _ghash_api_template.replace("%imp%", "clmul") + lib = load_pycryptodome_raw_lib("Cryptodome.Hash._ghash_clmul", api) + result = _build_impl(lib, "clmul") + except OSError: + result = None + return result +_ghash_clmul = _get_ghash_clmul() + + +class _GHASH(object): + """GHASH function defined in NIST SP 800-38D, Algorithm 2. + + If X_1, X_2, .. X_m are the blocks of input data, the function + computes: + + X_1*H^{m} + X_2*H^{m-1} + ... + X_m*H + + in the Galois field GF(2^256) using the reducing polynomial + (x^128 + x^7 + x^2 + x + 1). + """ + + def __init__(self, subkey, ghash_c): + assert len(subkey) == 16 + + self.ghash_c = ghash_c + + self._exp_key = VoidPointer() + result = ghash_c.ghash_expand(c_uint8_ptr(subkey), + self._exp_key.address_of()) + if result: + raise ValueError("Error %d while expanding the GHASH key" % result) + + self._exp_key = SmartPointer(self._exp_key.get(), + ghash_c.ghash_destroy) + + # create_string_buffer always returns a string of zeroes + self._last_y = create_string_buffer(16) + + def update(self, block_data): + assert len(block_data) % 16 == 0 + + result = self.ghash_c.ghash(self._last_y, + c_uint8_ptr(block_data), + c_size_t(len(block_data)), + self._last_y, + self._exp_key.get()) + if result: + raise ValueError("Error %d while updating GHASH" % result) + + return self + + def digest(self): + return get_raw_buffer(self._last_y) + + +def enum(**enums): + return type('Enum', (), enums) + + +MacStatus = enum(PROCESSING_AUTH_DATA=1, PROCESSING_CIPHERTEXT=2) + + +class GcmMode(object): + """Galois Counter Mode (GCM). + + This is an Authenticated Encryption with Associated Data (`AEAD`_) mode. + It provides both confidentiality and authenticity. + + The header of the message may be left in the clear, if needed, and it will + still be subject to authentication. The decryption step tells the receiver + if the message comes from a source that really knowns the secret key. + Additionally, decryption detects if any part of the message - including the + header - has been modified or corrupted. + + This mode requires a *nonce*. + + This mode is only available for ciphers that operate on 128 bits blocks + (e.g. AES but not TDES). + + See `NIST SP800-38D`_. + + .. _`NIST SP800-38D`: http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf + .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html + + :undocumented: __init__ + """ + + def __init__(self, factory, key, nonce, mac_len, cipher_params, ghash_c): + + self.block_size = factory.block_size + if self.block_size != 16: + raise ValueError("GCM mode is only available for ciphers" + " that operate on 128 bits blocks") + + if len(nonce) == 0: + raise ValueError("Nonce cannot be empty") + + if not is_buffer(nonce): + raise TypeError("Nonce must be bytes, bytearray or memoryview") + + # See NIST SP 800 38D, 5.2.1.1 + if len(nonce) > 2**64 - 1: + raise ValueError("Nonce exceeds maximum length") + + + self.nonce = _copy_bytes(None, None, nonce) + """Nonce""" + + self._factory = factory + self._key = _copy_bytes(None, None, key) + self._tag = None # Cache for MAC tag + + self._mac_len = mac_len + if not (4 <= mac_len <= 16): + raise ValueError("Parameter 'mac_len' must be in the range 4..16") + + # Allowed transitions after initialization + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + self._no_more_assoc_data = False + + # Length of associated data + self._auth_len = 0 + + # Length of the ciphertext or plaintext + self._msg_len = 0 + + # Step 1 in SP800-38D, Algorithm 4 (encryption) - Compute H + # See also Algorithm 5 (decryption) + hash_subkey = factory.new(key, + self._factory.MODE_ECB, + **cipher_params + ).encrypt(b'\x00' * 16) + + # Step 2 - Compute J0 + if len(self.nonce) == 12: + j0 = self.nonce + b"\x00\x00\x00\x01" + else: + fill = (16 - (len(self.nonce) % 16)) % 16 + 8 + ghash_in = (self.nonce + + b'\x00' * fill + + long_to_bytes(8 * len(self.nonce), 8)) + j0 = _GHASH(hash_subkey, ghash_c).update(ghash_in).digest() + + # Step 3 - Prepare GCTR cipher for encryption/decryption + nonce_ctr = j0[:12] + iv_ctr = (bytes_to_long(j0) + 1) & 0xFFFFFFFF + self._cipher = factory.new(key, + self._factory.MODE_CTR, + initial_value=iv_ctr, + nonce=nonce_ctr, + **cipher_params) + + # Step 5 - Bootstrat GHASH + self._signer = _GHASH(hash_subkey, ghash_c) + + # Step 6 - Prepare GCTR cipher for GMAC + self._tag_cipher = factory.new(key, + self._factory.MODE_CTR, + initial_value=j0, + nonce=b"", + **cipher_params) + + # Cache for data to authenticate + self._cache = b"" + + self._status = MacStatus.PROCESSING_AUTH_DATA + + def update(self, assoc_data): + """Protect associated data + + If there is any associated data, the caller has to invoke + this function one or more times, before using + ``decrypt`` or ``encrypt``. + + By *associated data* it is meant any data (e.g. packet headers) that + will not be encrypted and will be transmitted in the clear. + However, the receiver is still able to detect any modification to it. + In GCM, the *associated data* is also called + *additional authenticated data* (AAD). + + If there is no associated data, this method must not be called. + + The caller may split associated data in segments of any size, and + invoke this method multiple times, each time with the next segment. + + :Parameters: + assoc_data : bytes/bytearray/memoryview + A piece of associated data. There are no restrictions on its size. + """ + + if "update" not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + self._update(assoc_data) + self._auth_len += len(assoc_data) + + # See NIST SP 800 38D, 5.2.1.1 + if self._auth_len > 2**64 - 1: + raise ValueError("Additional Authenticated Data exceeds maximum length") + + return self + + def _update(self, data): + assert(len(self._cache) < 16) + + if len(self._cache) > 0: + filler = min(16 - len(self._cache), len(data)) + self._cache += _copy_bytes(None, filler, data) + data = data[filler:] + + if len(self._cache) < 16: + return + + # The cache is exactly one block + self._signer.update(self._cache) + self._cache = b"" + + update_len = len(data) // 16 * 16 + self._cache = _copy_bytes(update_len, None, data) + if update_len > 0: + self._signer.update(data[:update_len]) + + def _pad_cache_and_update(self): + assert(len(self._cache) < 16) + + # The authenticated data A is concatenated to the minimum + # number of zero bytes (possibly none) such that the + # - ciphertext C is aligned to the 16 byte boundary. + # See step 5 in section 7.1 + # - ciphertext C is aligned to the 16 byte boundary. + # See step 6 in section 7.2 + len_cache = len(self._cache) + if len_cache > 0: + self._update(b'\x00' * (16 - len_cache)) + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + self._next = ["encrypt", "digest"] + + ciphertext = self._cipher.encrypt(plaintext, output=output) + + if self._status == MacStatus.PROCESSING_AUTH_DATA: + self._pad_cache_and_update() + self._status = MacStatus.PROCESSING_CIPHERTEXT + + self._update(ciphertext if output is None else output) + self._msg_len += len(plaintext) + + # See NIST SP 800 38D, 5.2.1.1 + if self._msg_len > 2**39 - 256: + raise ValueError("Plaintext exceeds maximum length") + + return ciphertext + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = ["decrypt", "verify"] + + if self._status == MacStatus.PROCESSING_AUTH_DATA: + self._pad_cache_and_update() + self._status = MacStatus.PROCESSING_CIPHERTEXT + + self._update(ciphertext) + self._msg_len += len(ciphertext) + + return self._cipher.decrypt(ciphertext, output=output) + + def digest(self): + """Compute the *binary* MAC tag in an AEAD mode. + + The caller invokes this function at the very end. + + This method returns the MAC that shall be sent to the receiver, + together with the ciphertext. + + :Return: the MAC, as a byte string. + """ + + if "digest" not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = ["digest"] + + return self._compute_mac() + + def _compute_mac(self): + """Compute MAC without any FSM checks.""" + + if self._tag: + return self._tag + + # Step 5 in NIST SP 800-38D, Algorithm 4 - Compute S + self._pad_cache_and_update() + self._update(long_to_bytes(8 * self._auth_len, 8)) + self._update(long_to_bytes(8 * self._msg_len, 8)) + s_tag = self._signer.digest() + + # Step 6 - Compute T + self._tag = self._tag_cipher.encrypt(s_tag)[:self._mac_len] + + return self._tag + + def hexdigest(self): + """Compute the *printable* MAC tag. + + This method is like `digest`. + + :Return: the MAC, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method checks if the decrypted message is indeed valid + (that is, if the key is correct) and it has not been + tampered with while in transit. + + :Parameters: + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = ["verify"] + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, + data=self._compute_mac()) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, + data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* MAC tag. + + This method is like `verify`. + + :Parameters: + hex_mac_tag : string + This is the *printable* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext, output=None): + """Perform encrypt() and digest() in one step. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + a tuple with two items: + + - the ciphertext, as ``bytes`` + - the MAC tag, as ``bytes`` + + The first item becomes ``None`` when the ``output`` parameter + specified a location for the result. + """ + + return self.encrypt(plaintext, output=output), self.digest() + + def decrypt_and_verify(self, ciphertext, received_mac_tag, output=None): + """Perform decrypt() and verify() in one step. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + received_mac_tag : byte string + This is the *binary* MAC, as received from the sender. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` + parameter specified a location for the result. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + plaintext = self.decrypt(ciphertext, output=output) + self.verify(received_mac_tag) + return plaintext + + +def _create_gcm_cipher(factory, **kwargs): + """Create a new block cipher, configured in Galois Counter Mode (GCM). + + :Parameters: + factory : module + A block cipher module, taken from `Cryptodome.Cipher`. + The cipher must have block length of 16 bytes. + GCM has been only defined for `Cryptodome.Cipher.AES`. + + :Keywords: + key : bytes/bytearray/memoryview + The secret key to use in the symmetric cipher. + It must be 16 (e.g. *AES-128*), 24 (e.g. *AES-192*) + or 32 (e.g. *AES-256*) bytes long. + + nonce : bytes/bytearray/memoryview + A value that must never be reused for any other encryption. + + There are no restrictions on its length, + but it is recommended to use at least 16 bytes. + + The nonce shall never repeat for two + different messages encrypted with the same key, + but it does not need to be random. + + If not provided, a 16 byte nonce will be randomly created. + + mac_len : integer + Length of the MAC, in bytes. + It must be no larger than 16 bytes (which is the default). + """ + + try: + key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing parameter:" + str(e)) + + nonce = kwargs.pop("nonce", None) + if nonce is None: + nonce = get_random_bytes(16) + mac_len = kwargs.pop("mac_len", 16) + + # Not documented - only used for testing + use_clmul = kwargs.pop("use_clmul", True) + if use_clmul and _ghash_clmul: + ghash_c = _ghash_clmul + else: + ghash_c = _ghash_portable + + return GcmMode(factory, key, nonce, mac_len, kwargs, ghash_c) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.pyi new file mode 100644 index 0000000..8912955 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_gcm.pyi @@ -0,0 +1,45 @@ +from types import ModuleType +from typing import Union, Tuple, Dict, overload, Optional + +__all__ = ['GcmMode'] + +Buffer = Union[bytes, bytearray, memoryview] + +class GcmMode(object): + block_size: int + nonce: Buffer + + def __init__(self, + factory: ModuleType, + key: Buffer, + nonce: Buffer, + mac_len: int, + cipher_params: Dict) -> None: ... + + def update(self, assoc_data: Buffer) -> GcmMode: ... + + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + @overload + def encrypt_and_digest(self, + plaintext: Buffer) -> Tuple[bytes, bytes]: ... + @overload + def encrypt_and_digest(self, + plaintext: Buffer, + output: Buffer) -> Tuple[None, bytes]: ... + def decrypt_and_verify(self, + ciphertext: Buffer, + received_mac_tag: Buffer, + output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.py b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.py new file mode 100644 index 0000000..1295e61 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.py @@ -0,0 +1,532 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +Offset Codebook (OCB) mode. + +OCB is Authenticated Encryption with Associated Data (AEAD) cipher mode +designed by Prof. Phillip Rogaway and specified in `RFC7253`_. + +The algorithm provides both authenticity and privacy, it is very efficient, +it uses only one key and it can be used in online mode (so that encryption +or decryption can start before the end of the message is available). + +This module implements the third and last variant of OCB (OCB3) and it only +works in combination with a 128-bit block symmetric cipher, like AES. + +OCB is patented in US but `free licenses`_ exist for software implementations +meant for non-military purposes. + +Example: + >>> from Cryptodome.Cipher import AES + >>> from Cryptodome.Random import get_random_bytes + >>> + >>> key = get_random_bytes(32) + >>> cipher = AES.new(key, AES.MODE_OCB) + >>> plaintext = b"Attack at dawn" + >>> ciphertext, mac = cipher.encrypt_and_digest(plaintext) + >>> # Deliver cipher.nonce, ciphertext and mac + ... + >>> cipher = AES.new(key, AES.MODE_OCB, nonce=nonce) + >>> try: + >>> plaintext = cipher.decrypt_and_verify(ciphertext, mac) + >>> except ValueError: + >>> print "Invalid message" + >>> else: + >>> print plaintext + +:undocumented: __package__ + +.. _RFC7253: http://www.rfc-editor.org/info/rfc7253 +.. _free licenses: http://web.cs.ucdavis.edu/~rogaway/ocb/license.htm +""" + +import struct +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, _copy_bytes, bchr +from Cryptodome.Util.number import long_to_bytes, bytes_to_long +from Cryptodome.Util.strxor import strxor + +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Random import get_random_bytes + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr, + is_buffer) + +_raw_ocb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ocb", """ + int OCB_start_operation(void *cipher, + const uint8_t *offset_0, + size_t offset_0_len, + void **pState); + int OCB_encrypt(void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int OCB_decrypt(void *state, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int OCB_update(void *state, + const uint8_t *in, + size_t data_len); + int OCB_digest(void *state, + uint8_t *tag, + size_t tag_len); + int OCB_stop_operation(void *state); + """) + + +class OcbMode(object): + """Offset Codebook (OCB) mode. + + :undocumented: __init__ + """ + + def __init__(self, factory, nonce, mac_len, cipher_params): + + if factory.block_size != 16: + raise ValueError("OCB mode is only available for ciphers" + " that operate on 128 bits blocks") + + self.block_size = 16 + """The block size of the underlying cipher, in bytes.""" + + self.nonce = _copy_bytes(None, None, nonce) + """Nonce used for this session.""" + if len(nonce) not in range(1, 16): + raise ValueError("Nonce must be at most 15 bytes long") + if not is_buffer(nonce): + raise TypeError("Nonce must be bytes, bytearray or memoryview") + + self._mac_len = mac_len + if not 8 <= mac_len <= 16: + raise ValueError("MAC tag must be between 8 and 16 bytes long") + + # Cache for MAC tag + self._mac_tag = None + + # Cache for unaligned associated data + self._cache_A = b"" + + # Cache for unaligned ciphertext/plaintext + self._cache_P = b"" + + # Allowed transitions after initialization + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + # Compute Offset_0 + params_without_key = dict(cipher_params) + key = params_without_key.pop("key") + + taglen_mod128 = (self._mac_len * 8) % 128 + if len(self.nonce) < 15: + nonce = bchr(taglen_mod128 << 1) +\ + b'\x00' * (14 - len(nonce)) +\ + b'\x01' +\ + self.nonce + else: + nonce = bchr((taglen_mod128 << 1) | 0x01) +\ + self.nonce + + bottom_bits = bord(nonce[15]) & 0x3F # 6 bits, 0..63 + top_bits = bord(nonce[15]) & 0xC0 # 2 bits + + ktop_cipher = factory.new(key, + factory.MODE_ECB, + **params_without_key) + ktop = ktop_cipher.encrypt(struct.pack('15sB', + nonce[:15], + top_bits)) + + stretch = ktop + strxor(ktop[:8], ktop[1:9]) # 192 bits + offset_0 = long_to_bytes(bytes_to_long(stretch) >> + (64 - bottom_bits), 24)[8:] + + # Create low-level cipher instance + raw_cipher = factory._create_base_cipher(cipher_params) + if cipher_params: + raise TypeError("Unknown keywords: " + str(cipher_params)) + + self._state = VoidPointer() + result = _raw_ocb_lib.OCB_start_operation(raw_cipher.get(), + offset_0, + c_size_t(len(offset_0)), + self._state.address_of()) + if result: + raise ValueError("Error %d while instantiating the OCB mode" + % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher mode + self._state = SmartPointer(self._state.get(), + _raw_ocb_lib.OCB_stop_operation) + + # Memory allocated for the underlying block cipher is now owed + # by the cipher mode + raw_cipher.release() + + def _update(self, assoc_data, assoc_data_len): + result = _raw_ocb_lib.OCB_update(self._state.get(), + c_uint8_ptr(assoc_data), + c_size_t(assoc_data_len)) + if result: + raise ValueError("Error %d while computing MAC in OCB mode" % result) + + def update(self, assoc_data): + """Process the associated data. + + If there is any associated data, the caller has to invoke + this method one or more times, before using + ``decrypt`` or ``encrypt``. + + By *associated data* it is meant any data (e.g. packet headers) that + will not be encrypted and will be transmitted in the clear. + However, the receiver shall still able to detect modifications. + + If there is no associated data, this method must not be called. + + The caller may split associated data in segments of any size, and + invoke this method multiple times, each time with the next segment. + + :Parameters: + assoc_data : bytes/bytearray/memoryview + A piece of associated data. + """ + + if "update" not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = ["encrypt", "decrypt", "digest", + "verify", "update"] + + if len(self._cache_A) > 0: + filler = min(16 - len(self._cache_A), len(assoc_data)) + self._cache_A += _copy_bytes(None, filler, assoc_data) + assoc_data = assoc_data[filler:] + + if len(self._cache_A) < 16: + return self + + # Clear the cache, and proceeding with any other aligned data + self._cache_A, seg = b"", self._cache_A + self.update(seg) + + update_len = len(assoc_data) // 16 * 16 + self._cache_A = _copy_bytes(update_len, None, assoc_data) + self._update(assoc_data, update_len) + return self + + def _transcrypt_aligned(self, in_data, in_data_len, + trans_func, trans_desc): + + out_data = create_string_buffer(in_data_len) + result = trans_func(self._state.get(), + in_data, + out_data, + c_size_t(in_data_len)) + if result: + raise ValueError("Error %d while %sing in OCB mode" + % (result, trans_desc)) + return get_raw_buffer(out_data) + + def _transcrypt(self, in_data, trans_func, trans_desc): + # Last piece to encrypt/decrypt + if in_data is None: + out_data = self._transcrypt_aligned(self._cache_P, + len(self._cache_P), + trans_func, + trans_desc) + self._cache_P = b"" + return out_data + + # Try to fill up the cache, if it already contains something + prefix = b"" + if len(self._cache_P) > 0: + filler = min(16 - len(self._cache_P), len(in_data)) + self._cache_P += _copy_bytes(None, filler, in_data) + in_data = in_data[filler:] + + if len(self._cache_P) < 16: + # We could not manage to fill the cache, so there is certainly + # no output yet. + return b"" + + # Clear the cache, and proceeding with any other aligned data + prefix = self._transcrypt_aligned(self._cache_P, + len(self._cache_P), + trans_func, + trans_desc) + self._cache_P = b"" + + # Process data in multiples of the block size + trans_len = len(in_data) // 16 * 16 + result = self._transcrypt_aligned(c_uint8_ptr(in_data), + trans_len, + trans_func, + trans_desc) + if prefix: + result = prefix + result + + # Left-over + self._cache_P = _copy_bytes(trans_len, None, in_data) + + return result + + def encrypt(self, plaintext=None): + """Encrypt the next piece of plaintext. + + After the entire plaintext has been passed (but before `digest`), + you **must** call this method one last time with no arguments to collect + the final piece of ciphertext. + + If possible, use the method `encrypt_and_digest` instead. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The next piece of data to encrypt or ``None`` to signify + that encryption has finished and that any remaining ciphertext + has to be produced. + :Return: + the ciphertext, as a byte string. + Its length may not match the length of the *plaintext*. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + + if plaintext is None: + self._next = ["digest"] + else: + self._next = ["encrypt"] + return self._transcrypt(plaintext, _raw_ocb_lib.OCB_encrypt, "encrypt") + + def decrypt(self, ciphertext=None): + """Decrypt the next piece of ciphertext. + + After the entire ciphertext has been passed (but before `verify`), + you **must** call this method one last time with no arguments to collect + the remaining piece of plaintext. + + If possible, use the method `decrypt_and_verify` instead. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The next piece of data to decrypt or ``None`` to signify + that decryption has finished and that any remaining plaintext + has to be produced. + :Return: + the plaintext, as a byte string. + Its length may not match the length of the *ciphertext*. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() can only be called after" + " initialization or an update()") + + if ciphertext is None: + self._next = ["verify"] + else: + self._next = ["decrypt"] + return self._transcrypt(ciphertext, + _raw_ocb_lib.OCB_decrypt, + "decrypt") + + def _compute_mac_tag(self): + + if self._mac_tag is not None: + return + + if self._cache_A: + self._update(self._cache_A, len(self._cache_A)) + self._cache_A = b"" + + mac_tag = create_string_buffer(16) + result = _raw_ocb_lib.OCB_digest(self._state.get(), + mac_tag, + c_size_t(len(mac_tag)) + ) + if result: + raise ValueError("Error %d while computing digest in OCB mode" + % result) + self._mac_tag = get_raw_buffer(mac_tag)[:self._mac_len] + + def digest(self): + """Compute the *binary* MAC tag. + + Call this method after the final `encrypt` (the one with no arguments) + to obtain the MAC tag. + + The MAC tag is needed by the receiver to determine authenticity + of the message. + + :Return: the MAC, as a byte string. + """ + + if "digest" not in self._next: + raise TypeError("digest() cannot be called now for this cipher") + + assert(len(self._cache_P) == 0) + + self._next = ["digest"] + + if self._mac_tag is None: + self._compute_mac_tag() + + return self._mac_tag + + def hexdigest(self): + """Compute the *printable* MAC tag. + + This method is like `digest`. + + :Return: the MAC, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* MAC tag. + + Call this method after the final `decrypt` (the one with no arguments) + to check if the message is authentic and valid. + + :Parameters: + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called now for this cipher") + + assert(len(self._cache_P) == 0) + + self._next = ["verify"] + + if self._mac_tag is None: + self._compute_mac_tag() + + secret = get_random_bytes(16) + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* MAC tag. + + This method is like `verify`. + + :Parameters: + hex_mac_tag : string + This is the *printable* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext): + """Encrypt the message and create the MAC tag in one step. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The entire message to encrypt. + :Return: + a tuple with two byte strings: + + - the encrypted data + - the MAC + """ + + return self.encrypt(plaintext) + self.encrypt(), self.digest() + + def decrypt_and_verify(self, ciphertext, received_mac_tag): + """Decrypted the message and verify its authenticity in one step. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The entire message to decrypt. + received_mac_tag : byte string + This is the *binary* MAC, as received from the sender. + + :Return: the decrypted data (byte string). + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + plaintext = self.decrypt(ciphertext) + self.decrypt() + self.verify(received_mac_tag) + return plaintext + + +def _create_ocb_cipher(factory, **kwargs): + """Create a new block cipher, configured in OCB mode. + + :Parameters: + factory : module + A symmetric cipher module from `Cryptodome.Cipher` + (like `Cryptodome.Cipher.AES`). + + :Keywords: + nonce : bytes/bytearray/memoryview + A value that must never be reused for any other encryption. + Its length can vary from 1 to 15 bytes. + If not specified, a random 15 bytes long nonce is generated. + + mac_len : integer + Length of the MAC, in bytes. + It must be in the range ``[8..16]``. + The default is 16 (128 bits). + + Any other keyword will be passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present). + """ + + try: + nonce = kwargs.pop("nonce", None) + if nonce is None: + nonce = get_random_bytes(15) + mac_len = kwargs.pop("mac_len", 16) + except KeyError as e: + raise TypeError("Keyword missing: " + str(e)) + + return OcbMode(factory, nonce, mac_len, kwargs) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.pyi new file mode 100644 index 0000000..a1909fc --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ocb.pyi @@ -0,0 +1,36 @@ +from types import ModuleType +from typing import Union, Any, Optional, Tuple, Dict, overload + +Buffer = Union[bytes, bytearray, memoryview] + +class OcbMode(object): + block_size: int + nonce: Buffer + + def __init__(self, + factory: ModuleType, + nonce: Buffer, + mac_len: int, + cipher_params: Dict) -> None: ... + + def update(self, assoc_data: Buffer) -> OcbMode: ... + + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + def encrypt_and_digest(self, + plaintext: Buffer) -> Tuple[bytes, bytes]: ... + def decrypt_and_verify(self, + ciphertext: Buffer, + received_mac_tag: Buffer) -> bytes: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.py b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.py new file mode 100644 index 0000000..8c0ccf6 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.py @@ -0,0 +1,282 @@ +# -*- coding: utf-8 -*- +# +# Cipher/mode_ofb.py : OFB mode +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +""" +Output Feedback (CFB) mode. +""" + +__all__ = ['OfbMode'] + +from Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr, + is_writeable_buffer) + +from Cryptodome.Random import get_random_bytes + +raw_ofb_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._raw_ofb", """ + int OFB_start_operation(void *cipher, + const uint8_t iv[], + size_t iv_len, + void **pResult); + int OFB_encrypt(void *ofbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int OFB_decrypt(void *ofbState, + const uint8_t *in, + uint8_t *out, + size_t data_len); + int OFB_stop_operation(void *state); + """ + ) + + +class OfbMode(object): + """*Output FeedBack (OFB)*. + + This mode is very similar to CBC, but it + transforms the underlying block cipher into a stream cipher. + + The keystream is the iterated block encryption of the + previous ciphertext block. + + An Initialization Vector (*IV*) is required. + + See `NIST SP800-38A`_ , Section 6.4. + + .. _`NIST SP800-38A` : http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf + + :undocumented: __init__ + """ + + def __init__(self, block_cipher, iv): + """Create a new block cipher, configured in OFB mode. + + :Parameters: + block_cipher : C pointer + A smart pointer to the low-level block cipher instance. + + iv : bytes/bytearray/memoryview + The initialization vector to use for encryption or decryption. + It is as long as the cipher block. + + **The IV must be a nonce, to to be reused for any other + message**. It shall be a nonce or a random value. + + Reusing the *IV* for encryptions performed with the same key + compromises confidentiality. + """ + + self._state = VoidPointer() + result = raw_ofb_lib.OFB_start_operation(block_cipher.get(), + c_uint8_ptr(iv), + c_size_t(len(iv)), + self._state.address_of()) + if result: + raise ValueError("Error %d while instantiating the OFB mode" + % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the cipher mode + self._state = SmartPointer(self._state.get(), + raw_ofb_lib.OFB_stop_operation) + + # Memory allocated for the underlying block cipher is now owed + # by the cipher mode + block_cipher.release() + + self.block_size = len(iv) + """The block size of the underlying cipher, in bytes.""" + + self.iv = _copy_bytes(None, None, iv) + """The Initialization Vector originally used to create the object. + The value does not change.""" + + self.IV = self.iv + """Alias for `iv`""" + + self._next = ["encrypt", "decrypt"] + + def encrypt(self, plaintext, output=None): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + If ``output`` is ``None``, the ciphertext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = ["encrypt"] + + if output is None: + ciphertext = create_string_buffer(len(plaintext)) + else: + ciphertext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(plaintext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ofb_lib.OFB_encrypt(self._state.get(), + c_uint8_ptr(plaintext), + c_uint8_ptr(ciphertext), + c_size_t(len(plaintext))) + if result: + raise ValueError("Error %d while encrypting in OFB mode" % result) + + if output is None: + return get_raw_buffer(ciphertext) + else: + return None + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext is written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext is returned as ``bytes``. + Otherwise, ``None``. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = ["decrypt"] + + if output is None: + plaintext = create_string_buffer(len(ciphertext)) + else: + plaintext = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(ciphertext) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(plaintext)) + + result = raw_ofb_lib.OFB_decrypt(self._state.get(), + c_uint8_ptr(ciphertext), + c_uint8_ptr(plaintext), + c_size_t(len(ciphertext))) + if result: + raise ValueError("Error %d while decrypting in OFB mode" % result) + + if output is None: + return get_raw_buffer(plaintext) + else: + return None + + +def _create_ofb_cipher(factory, **kwargs): + """Instantiate a cipher object that performs OFB encryption/decryption. + + :Parameters: + factory : module + The underlying block cipher, a module from ``Cryptodome.Cipher``. + + :Keywords: + iv : bytes/bytearray/memoryview + The IV to use for OFB. + + IV : bytes/bytearray/memoryview + Alias for ``iv``. + + Any other keyword will be passed to the underlying block cipher. + See the relevant documentation for details (at least ``key`` will need + to be present). + """ + + cipher_state = factory._create_base_cipher(kwargs) + iv = kwargs.pop("IV", None) + IV = kwargs.pop("iv", None) + + if (None, None) == (iv, IV): + iv = get_random_bytes(factory.block_size) + if iv is not None: + if IV is not None: + raise TypeError("You must either use 'iv' or 'IV', not both") + else: + iv = IV + + if len(iv) != factory.block_size: + raise ValueError("Incorrect IV length (it must be %d bytes long)" % + factory.block_size) + + if kwargs: + raise TypeError("Unknown parameters for OFB: %s" % str(kwargs)) + + return OfbMode(cipher_state, iv) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.pyi new file mode 100644 index 0000000..d28608e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_ofb.pyi @@ -0,0 +1,25 @@ +from typing import Union, overload + +from Cryptodome.Util._raw_api import SmartPointer + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['OfbMode'] + +class OfbMode(object): + block_size: int + iv: Buffer + IV: Buffer + + def __init__(self, + block_cipher: SmartPointer, + iv: Buffer) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.py b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.py new file mode 100644 index 0000000..d86ed19 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.py @@ -0,0 +1,206 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +OpenPGP mode. +""" + +__all__ = ['OpenPgpMode'] + +from Cryptodome.Util.py3compat import _copy_bytes +from Cryptodome.Random import get_random_bytes + +class OpenPgpMode(object): + """OpenPGP mode. + + This mode is a variant of CFB, and it is only used in PGP and + OpenPGP_ applications. If in doubt, use another mode. + + An Initialization Vector (*IV*) is required. + + Unlike CFB, the *encrypted* IV (not the IV itself) is + transmitted to the receiver. + + The IV is a random data block. For legacy reasons, two of its bytes are + duplicated to act as a checksum for the correctness of the key, which is now + known to be insecure and is ignored. The encrypted IV is therefore 2 bytes + longer than the clean IV. + + .. _OpenPGP: http://tools.ietf.org/html/rfc4880 + + :undocumented: __init__ + """ + + def __init__(self, factory, key, iv, cipher_params): + + #: The block size of the underlying cipher, in bytes. + self.block_size = factory.block_size + + self._done_first_block = False # True after the first encryption + + # Instantiate a temporary cipher to process the IV + IV_cipher = factory.new( + key, + factory.MODE_CFB, + IV=b'\x00' * self.block_size, + segment_size=self.block_size * 8, + **cipher_params) + + iv = _copy_bytes(None, None, iv) + + # The cipher will be used for... + if len(iv) == self.block_size: + # ... encryption + self._encrypted_IV = IV_cipher.encrypt(iv + iv[-2:]) + elif len(iv) == self.block_size + 2: + # ... decryption + self._encrypted_IV = iv + # Last two bytes are for a deprecated "quick check" feature that + # should not be used. (https://eprint.iacr.org/2005/033) + iv = IV_cipher.decrypt(iv)[:-2] + else: + raise ValueError("Length of IV must be %d or %d bytes" + " for MODE_OPENPGP" + % (self.block_size, self.block_size + 2)) + + self.iv = self.IV = iv + + # Instantiate the cipher for the real PGP data + self._cipher = factory.new( + key, + factory.MODE_CFB, + IV=self._encrypted_IV[-self.block_size:], + segment_size=self.block_size * 8, + **cipher_params) + + def encrypt(self, plaintext): + """Encrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have encrypted a message + you cannot encrypt (or decrypt) another message using the same + object. + + The data to encrypt can be broken up in two or + more pieces and `encrypt` can be called multiple times. + + That is, the statement: + + >>> c.encrypt(a) + c.encrypt(b) + + is equivalent to: + + >>> c.encrypt(a+b) + + This function does not add any padding to the plaintext. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + + :Return: + the encrypted data, as a byte string. + It is as long as *plaintext* with one exception: + when encrypting the first message chunk, + the encypted IV is prepended to the returned ciphertext. + """ + + res = self._cipher.encrypt(plaintext) + if not self._done_first_block: + res = self._encrypted_IV + res + self._done_first_block = True + return res + + def decrypt(self, ciphertext): + """Decrypt data with the key and the parameters set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + The data to decrypt can be broken up in two or + more pieces and `decrypt` can be called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + + :Return: the decrypted data (byte string). + """ + + return self._cipher.decrypt(ciphertext) + + +def _create_openpgp_cipher(factory, **kwargs): + """Create a new block cipher, configured in OpenPGP mode. + + :Parameters: + factory : module + The module. + + :Keywords: + key : bytes/bytearray/memoryview + The secret key to use in the symmetric cipher. + + IV : bytes/bytearray/memoryview + The initialization vector to use for encryption or decryption. + + For encryption, the IV must be as long as the cipher block size. + + For decryption, it must be 2 bytes longer (it is actually the + *encrypted* IV which was prefixed to the ciphertext). + """ + + iv = kwargs.pop("IV", None) + IV = kwargs.pop("iv", None) + + if (None, None) == (iv, IV): + iv = get_random_bytes(factory.block_size) + if iv is not None: + if IV is not None: + raise TypeError("You must either use 'iv' or 'IV', not both") + else: + iv = IV + + try: + key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing component: " + str(e)) + + return OpenPgpMode(factory, key, iv, kwargs) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi new file mode 100644 index 0000000..14b8105 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi @@ -0,0 +1,20 @@ +from types import ModuleType +from typing import Union, Dict + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['OpenPgpMode'] + +class OpenPgpMode(object): + block_size: int + iv: Union[bytes, bytearray, memoryview] + IV: Union[bytes, bytearray, memoryview] + + def __init__(self, + factory: ModuleType, + key: Buffer, + iv: Buffer, + cipher_params: Dict) -> None: ... + def encrypt(self, plaintext: Buffer) -> bytes: ... + def decrypt(self, plaintext: Buffer) -> bytes: ... + diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.py b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.py new file mode 100644 index 0000000..4a76ad6 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.py @@ -0,0 +1,392 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +Synthetic Initialization Vector (SIV) mode. +""" + +__all__ = ['SivMode'] + +from binascii import hexlify, unhexlify + +from Cryptodome.Util.py3compat import bord, _copy_bytes + +from Cryptodome.Util._raw_api import is_buffer + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long +from Cryptodome.Protocol.KDF import _S2V +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Random import get_random_bytes + + +class SivMode(object): + """Synthetic Initialization Vector (SIV). + + This is an Authenticated Encryption with Associated Data (`AEAD`_) mode. + It provides both confidentiality and authenticity. + + The header of the message may be left in the clear, if needed, and it will + still be subject to authentication. The decryption step tells the receiver + if the message comes from a source that really knowns the secret key. + Additionally, decryption detects if any part of the message - including the + header - has been modified or corrupted. + + Unlike other AEAD modes such as CCM, EAX or GCM, accidental reuse of a + nonce is not catastrophic for the confidentiality of the message. The only + effect is that an attacker can tell when the same plaintext (and same + associated data) is protected with the same key. + + The length of the MAC is fixed to the block size of the underlying cipher. + The key size is twice the length of the key of the underlying cipher. + + This mode is only available for AES ciphers. + + +--------------------+---------------+-------------------+ + | Cipher | SIV MAC size | SIV key length | + | | (bytes) | (bytes) | + +====================+===============+===================+ + | AES-128 | 16 | 32 | + +--------------------+---------------+-------------------+ + | AES-192 | 16 | 48 | + +--------------------+---------------+-------------------+ + | AES-256 | 16 | 64 | + +--------------------+---------------+-------------------+ + + See `RFC5297`_ and the `original paper`__. + + .. _RFC5297: https://tools.ietf.org/html/rfc5297 + .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html + .. __: http://www.cs.ucdavis.edu/~rogaway/papers/keywrap.pdf + + :undocumented: __init__ + """ + + def __init__(self, factory, key, nonce, kwargs): + + self.block_size = factory.block_size + """The block size of the underlying cipher, in bytes.""" + + self._factory = factory + + self._cipher_params = kwargs + + if len(key) not in (32, 48, 64): + raise ValueError("Incorrect key length (%d bytes)" % len(key)) + + if nonce is not None: + if not is_buffer(nonce): + raise TypeError("When provided, the nonce must be bytes, bytearray or memoryview") + + if len(nonce) == 0: + raise ValueError("When provided, the nonce must be non-empty") + + self.nonce = _copy_bytes(None, None, nonce) + """Public attribute is only available in case of non-deterministic + encryption.""" + + subkey_size = len(key) // 2 + + self._mac_tag = None # Cache for MAC tag + self._kdf = _S2V(key[:subkey_size], + ciphermod=factory, + cipher_params=self._cipher_params) + self._subkey_cipher = key[subkey_size:] + + # Purely for the purpose of verifying that cipher_params are OK + factory.new(key[:subkey_size], factory.MODE_ECB, **kwargs) + + # Allowed transitions after initialization + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + def _create_ctr_cipher(self, v): + """Create a new CTR cipher from V in SIV mode""" + + v_int = bytes_to_long(v) + q = v_int & 0xFFFFFFFFFFFFFFFF7FFFFFFF7FFFFFFF + return self._factory.new( + self._subkey_cipher, + self._factory.MODE_CTR, + initial_value=q, + nonce=b"", + **self._cipher_params) + + def update(self, component): + """Protect one associated data component + + For SIV, the associated data is a sequence (*vector*) of non-empty + byte strings (*components*). + + This method consumes the next component. It must be called + once for each of the components that constitue the associated data. + + Note that the components have clear boundaries, so that: + + >>> cipher.update(b"builtin") + >>> cipher.update(b"securely") + + is not equivalent to: + + >>> cipher.update(b"built") + >>> cipher.update(b"insecurely") + + If there is no associated data, this method must not be called. + + :Parameters: + component : bytes/bytearray/memoryview + The next associated data component. + """ + + if "update" not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = ["update", "encrypt", "decrypt", + "digest", "verify"] + + return self._kdf.update(component) + + def encrypt(self, plaintext): + """ + For SIV, encryption and MAC authentication must take place at the same + point. This method shall not be used. + + Use `encrypt_and_digest` instead. + """ + + raise TypeError("encrypt() not allowed for SIV mode." + " Use encrypt_and_digest() instead.") + + def decrypt(self, ciphertext): + """ + For SIV, decryption and verification must take place at the same + point. This method shall not be used. + + Use `decrypt_and_verify` instead. + """ + + raise TypeError("decrypt() not allowed for SIV mode." + " Use decrypt_and_verify() instead.") + + def digest(self): + """Compute the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method returns the MAC that shall be sent to the receiver, + together with the ciphertext. + + :Return: the MAC, as a byte string. + """ + + if "digest" not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = ["digest"] + if self._mac_tag is None: + self._mac_tag = self._kdf.derive() + return self._mac_tag + + def hexdigest(self): + """Compute the *printable* MAC tag. + + This method is like `digest`. + + :Return: the MAC, as a hexadecimal string. + """ + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def verify(self, received_mac_tag): + """Validate the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method checks if the decrypted message is indeed valid + (that is, if the key is correct) and it has not been + tampered with while in transit. + + :Parameters: + received_mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "verify" not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = ["verify"] + + if self._mac_tag is None: + self._mac_tag = self._kdf.derive() + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=self._mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=received_mac_tag) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Validate the *printable* MAC tag. + + This method is like `verify`. + + :Parameters: + hex_mac_tag : string + This is the *printable* MAC, as received from the sender. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + self.verify(unhexlify(hex_mac_tag)) + + def encrypt_and_digest(self, plaintext, output=None): + """Perform encrypt() and digest() in one step. + + :Parameters: + plaintext : bytes/bytearray/memoryview + The piece of data to encrypt. + :Keywords: + output : bytearray/memoryview + The location where the ciphertext must be written to. + If ``None``, the ciphertext is returned. + :Return: + a tuple with two items: + + - the ciphertext, as ``bytes`` + - the MAC tag, as ``bytes`` + + The first item becomes ``None`` when the ``output`` parameter + specified a location for the result. + """ + + if "encrypt" not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + + self._next = ["digest"] + + # Compute V (MAC) + if hasattr(self, 'nonce'): + self._kdf.update(self.nonce) + self._kdf.update(plaintext) + self._mac_tag = self._kdf.derive() + + cipher = self._create_ctr_cipher(self._mac_tag) + + return cipher.encrypt(plaintext, output=output), self._mac_tag + + def decrypt_and_verify(self, ciphertext, mac_tag, output=None): + """Perform decryption and verification in one step. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + You cannot reuse an object for encrypting + or decrypting other data with the same key. + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + mac_tag : bytes/bytearray/memoryview + This is the *binary* MAC, as received from the sender. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: the plaintext as ``bytes`` or ``None`` when the ``output`` + parameter specified a location for the result. + :Raises ValueError: + if the MAC does not match. The message has been tampered with + or the key is incorrect. + """ + + if "decrypt" not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = ["verify"] + + # Take the MAC and start the cipher for decryption + self._cipher = self._create_ctr_cipher(mac_tag) + + plaintext = self._cipher.decrypt(ciphertext, output=output) + + if hasattr(self, 'nonce'): + self._kdf.update(self.nonce) + self._kdf.update(plaintext if output is None else output) + self.verify(mac_tag) + + return plaintext + + +def _create_siv_cipher(factory, **kwargs): + """Create a new block cipher, configured in + Synthetic Initializaton Vector (SIV) mode. + + :Parameters: + + factory : object + A symmetric cipher module from `Cryptodome.Cipher` + (like `Cryptodome.Cipher.AES`). + + :Keywords: + + key : bytes/bytearray/memoryview + The secret key to use in the symmetric cipher. + It must be 32, 48 or 64 bytes long. + If AES is the chosen cipher, the variants *AES-128*, + *AES-192* and or *AES-256* will be used internally. + + nonce : bytes/bytearray/memoryview + For deterministic encryption, it is not present. + + Otherwise, it is a value that must never be reused + for encrypting message under this key. + + There are no restrictions on its length, + but it is recommended to use at least 16 bytes. + """ + + try: + key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing parameter: " + str(e)) + + nonce = kwargs.pop("nonce", None) + + return SivMode(factory, key, nonce, kwargs) diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.pyi b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.pyi new file mode 100644 index 0000000..2934f23 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Cipher/_mode_siv.pyi @@ -0,0 +1,38 @@ +from types import ModuleType +from typing import Union, Tuple, Dict, Optional, overload + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['SivMode'] + +class SivMode(object): + block_size: int + nonce: bytes + + def __init__(self, + factory: ModuleType, + key: Buffer, + nonce: Buffer, + kwargs: Dict) -> None: ... + + def update(self, component: Buffer) -> SivMode: ... + + def encrypt(self, plaintext: Buffer) -> bytes: ... + def decrypt(self, plaintext: Buffer) -> bytes: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + @overload + def encrypt_and_digest(self, + plaintext: Buffer) -> Tuple[bytes, bytes]: ... + @overload + def encrypt_and_digest(self, + plaintext: Buffer, + output: Buffer) -> Tuple[None, bytes]: ... + def decrypt_and_verify(self, + ciphertext: Buffer, + received_mac_tag: Buffer, + output: Optional[Union[bytearray, memoryview]] = ...) -> bytes: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_pkcs1_decode.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_pkcs1_decode.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..2f8b59f42d0df2aec432b85b28ea82afc0ed61a8 GIT binary patch literal 35688 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 WM0uI!W`FmMragTD(SA5Y@&5qL5Z+Dz literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aes.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aes.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..b37dd95134811f9abd88100ecab29e4d210df2ee GIT binary patch literal 106808 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 !0K5zUDgppc0B`~T z32Wzy|<0h|03Z+mYytp(0D!dsU4fI|S_7ywub0FDEI zE&$+n0PraQSO)+)0RVRZ@D>1=0|2T4fUW@GM*z?i0OSGyI{>Hx01g9yUI3s202l-S zd;vfZ0Eh(uwE@5$0Pr0ESPuZc1^_t#;2;2K4gd}SfL8!O76AAH0Q>>~b^w4T0H7@Z z*bV?{0)Qj{@Hhal0Dw0Dz-a)m6#&ct02=^6e*lmM0FeJ(k^c`N|0^N?TO$8kA^)o( z|5qdbQ;`2*$p6=n|8tQ4zajrqk^dhe|7#)t-$MR>h5WCH{EtWe4?zBJNB&Pm{?9}H zk3{}kk^jNS{|}J=k0bv-LH_qf{wE>-=Oh2~kpI6T|Cb^EYa{>PNB&mM+{9l6nAB_B8kNkfJ`F{iX|0nW)Eb@N=@_#Y%zZ>%ZRpfs*^8Z`p|4`)r>&X8I z{}JSWB=Y|ryZDR$p0UZ{}Yk_&mjLNBmXbU`A7bHBmWyC|EnVZMn{n{;x#-_d@>HK>p80{(p}A zpNsroiu`{O`Tqj)|2Xo$4f4MM^1lo6|32h@59I&v$p3}N|3=9FX~_QqXk0C{I?+guOR=gBLCk&{y&QRKZE=qjr@NS`QIG*-v{~s6Y~Ec@_!@p{~P50 zB;@~c~Lc15xbDsUBm_>_CT>2iA_lC3}QnO z+n?C0#I`2(Cb9d8O+)MnVw)2?iP&|-RwT9{v7w3mP3%x&_YixU*xke?Beor}nTcIQ z>=j~r6#JFfy~N%o_Cv8niVa2VL}DWndzsi~#I7cG53$vVy-;j|VjB{hl-SC|_9M0& zvEPWzMr=`HOA#B6*apQ8CALqosfZ0tY*1oT61$Yxhr~7`_EE9Th&@H@Zep7fd#Bhq z#eOHY7_lYF*%iB=*qp>BC3YjRJBnRZ?3`k+5*w-5g~XmI_B^qviTzIOKw{Std#cz; z#SSF4D6yZ3olop%V#^a7lh_!=4kWfDu~~`jNo=!XqZRv~*d)caD7IU%A&D(fY?We* z6uXbuvBWkjHe9iji7iZQL1Gg$ZCYaU6I-p=mc(8wHcPQBi9J?qq+$aVJD1r1#Qr5V zVX+&E%}{KBV!sl*rr6TN?kP50v0I7_N^HMk6BS#o*yY6bC3au2LyEmqY_ww66#K2% zT*VeFwotJ#iVaX~m0}APo2c0M#NH@2GO;g;ZC7loV#gNSu-N0oJ}dS?vGs{PQ*5_l zixWGW*p9_sCN@E_1&bY7?2}@H78|G762)dI_Cc|4imgy=jABa_8?x9?#r7+d z{aNh5VrLb5ve+xdMklsVvHgloSnSJUlNCFs*we*6C-!HtH;WBcY;|J47Mr=)#KoR2 zwq3EMi_KhYuwug#JGa>C^W{j{ItUR@R~(AAUHnOJt-QR^x*&4;$9& z!TR-osCeVXTZ2FQtkd_ezIyh_apM-m@7-JN>1orPZTIZCGW)>?&j(+*^7>DG`pnAtBA5dE$vOHdT#y>&Ykmy*)j{ zo0Th9`Kc*WzK%O}>OifZe(F4;cI}4`y#D%+1$lYpDtmiZSuuTj@7x9rnl!3ZsaeCy zmA`y_%$PUN_3hj5>dKYR|K6?JxK6EFZ5;IJrw<-{^|#;Ndw)bk;F1|L zUi__l_qT`Z=YMO1pMP#UFf8obYS*q!+`WGNhM)WO`{e!m?wgmeZ{M)b-+wj3U`mlZbCqL`dX=u;r=(3Av z&V1yf`1mscfBxz2;pTQ@>cbDOywIh~1V?Oa&CLY`Dc`PI_3STQyAHVV+;da5v~8;Av| z^1O?rCMXO}FQv)|!p6jPzXV`)2f^t|-aOV_47 z^w6XZadEp>4;ixghXDf`*RNRd`^R%~wyYdDu;S9GQ&)VPn)=+sUw-KrTBAmfhw9a9 z_3FZfKGWySnY%Y3VOQOA=SCjcw5d*PP|!;gzxwLkQ}^CmzKV~}YvTYwtCJ^(^lIEV zw{y#uK~>9?dGw2J z@gvPopT3koapKX&Km3s2e)sM%eVR8vzH#(u%iMYM)(<&)bot@Vos&+!{PM9kM~zy2 zrB|SyWGhsqEcka8Vu<)75Cr%VD&&_RJy;`*=PNbv^`trT^{AT6n+h#uU$jOCc z$4+k7y7m1#-g;~QD?^7aJeHW~p<1nfSbqOKw4A^Hw&w;7x-Y$H(=~slrHwfB_S+Q} z&6>5W_tvc~YgegK`|TAgK5y~OH$MelzFhx}rAuo>mo0nvoe?8m9{c&{p3eF6qhDIQ zxZ#GUo{FtewQBIAvuE!KJ9B1s(!qnT6!q-cWkQ`gFHHLSYwLo!bNgI=<{9rPPG_YG zetwz9KltFYsPDg@v9n#fLz{*VpSIm@ue)y9vcBURHmq9KW_w`Yx^=6r_2@DB(|6u! z(6W5_3;-}00E`C!4*-Bm0AM5l$N~T#0)R*WU;zNb06={Ja038*1^`|K0OJ6_UH~u+ z0PFz(4+4NI0H6;5=l}pN0D#v3z$XCUSpcvW04xUp&jWyL0I&rBYy<$;0l;GbpcVjV z1_0UsfIk4hegMz}0K5PIz5@Uk0l@tL;1~di0sz4Pz#RbW0s!{_fb9Sv1OPk%08{|* zBmnRP0ObI{6aa7v0Q>|1Y6F1R0YDxA@CE?W0YC!)PzeB31^{CKKwki`5&(1q0IdMP zrvTs$08keIdaAL3;?wI9{_{_fNKC?Jpkwj0PX_-`vAcE03ZecBm;ns z0H8Mj_y_tO5XC z0l;$rpe+Dc0015Z08aye769Nk0PrpV*Z=^I1AyuPAOHXq0f1isz+nJz008&`fIt9n z767CJfF%IH0RSohfE@tfB>?ac0EhzsLjb@408kMC0H^~1z6Jnu0l+f=zzG2S0Kf+T z;Clej4gd@X0CoVd3;;9)05$-y4gmB30Pg^R@&F(M089n|;{m_}0N@e;7zqHf0KkU; zAQAvr0KhN+P#*x?005r>fL8&)H~_F0089e_djJ6HfA$ps&<6l?000*Nz-s{D69Dim z09XqEmIHw20YEkY*a84H0)XoP;4uJD3jj0&0Br!k9{^xK0B8aLUH|~!0f37D;C=wW zx8*re03a9uxC4M)0N@?~upIz|0Dva|fC>Pf1OT1@pd0|00su|{fS&+BZ2<5(0LTLX z-T+`a0B8UJDgl7X0ALIN=nDW=0)TD+pcMf46ac&d0O|sOZvj9A0GI&)x&wfZ0f4Um zw>Ag^0M`J(dH~Q50Ne)v_5pzR0YD4@NCp5M0YGm6@DTtw1OUzhfL8#(RRGW)0CWNX z(Ewm30Eh0D%DDEC5Ic080RX0{~P206PG{O90>@01yWN zh5PH7iO$N>NY0l-uMkO~041OPPvKs^Ak5CF^p00{u#901q^0D=I(R{-E%0N?`v zz5oCx0YGB_&=LTY0RTw=zykn;1AzVjU>g890svM6fWZJ@5de4`0GtK@69K>v0AM!& zXbu2I1Aut|;3xp-3;0QeCAWCDOm0ALLO@B#pv0l)+RP!j+&0sx@^ z;6(uNCIHw8015%X2>_4_0IC6i6aerZ0LTXbj{tzN0H8Ghcnbgw1ptWvzzP6<2LS#6 zU=RRk3INgoz}o;|768}^0IC3h6#(EH0B{)qECm2%0l)|V@HqgO4*(VefTsXJRRAy> z0Gt5;2LV7&08j@2d<_8R0)S@#fD-`t0e}wx!1n;49RL^(0PFx@831Sq0BitY9RTP7 z0Nw!r&XB4$p5Rze>?L34dj11@;@H=e-HA%JM#ZD^8YF1 ze;)Gx8{~f+^1mbUe-!fnA>{vW$p7ic|KZ60uE_t7k^g@p|4$+RUq${8M*i1B{(B++ zA4mQtApf66{zoGJneyA^&G0|KCCWe~A1~MgISc{GWyV ze-imW6!~8k`Tq#={|xfq9r=F)`M(nRKLPn)6ZxNl{C^htKLGhZ1^KTc|Jxw{t0Vu% zBL6QU|1*&Pzl;1YkNkfP`Tqs-e+cqF7x^EA{C^br?~D9TME-9={udzs-$VYl zNB-|X{>LEyqmchckpGvE|3{Jk`N;n<$p7QWe+%+|J@S7!@;?dre+>D*8u|YV^8X{` z|6b((ugL!n$o~N3e-`rp0`fl@`QIP;-varchWyV#{x3oP??e7SgZwW<{XkpF)m|3i`g+mQeFA^+DP|3@JIDI`~+3TV0`ee%nXu%R)Yv zuP-XnzD!T@4@mL%QhE@#ir4eR_vW84P!jzE7P!Uxhs?Le`-jbQkN2-LS8eYfIm^TD z-(tF_HQ29=e`I_AI_> zBd&dkxOP5W{JpmC+<)L;7b!DKo$Ef&I$wTb^gs9C4E#3(|4+?;`S+A={`*M=j+Mp6 zXw2~QMp%ALN^|nl;W)vSIP>pS@f-1)Gyi^*{Lr{K`GInA{F4QmGyjg0uw9&){@aZr z`N!Fnfd*I1zqPbd_=S`EMch&&UH%&tAsoP~)>h`}Qrv>hPD}>V`!{^7p=?!Wu_5j*5(mjtr~Q zEptd%;-Fk3pr0?dWMo;r!PESsKeuxa@sGahGv#GD#vJ{^WpBUju?|m0rf%BR4=Q=V}hi5 zsS_lxmuG7}+#K{;jSOjv-(!wMyhR>0xH`LyUBTo(dWn}+^d6Wr|fR6`n9zMaZNV?DSym|O)0WY8TCB@Gtk&ghM)so`x z+mMeC#p5I&o?dcZJ-wu7TC?rQ=q+zVp48r>3Ao8=@vvDX#-lS4zIiPaOWj~8=8>+2 zqZ=!h`oS_F51BYWf8I`8EDgP6y#ARZ6-y&;@hbj9@JDF=3%0F9SR%b;z$YzAfRy}@ zS6Nw!R!YDF_>Y?5BE>_}%Js;MR4mQPNxZkU?GSR}h>b%3nXv=4NQtFeo6Xq%uGnbB za?Okt#fb~-k=aDCw6U1cnz)kaAv8DD72U~Kl?_T25-gVUHn0_NVM#CD<=uwR>jC0?B!;y=j{gtd}ISz>j%j4 zC_Wv@Wo-~Lg+Q3%_8=eDhSowN%g6ENdBoy>KiQg6&Re#F_NG+G!RvX-;+H7#l0gYc zlZu80$O_&3CkidgeSlrXk(m?8(NwmnakiC8yUA`H+Fq(Y$m@Mxl`2Umh7Oc6bMa2* zRrwW(8y--BxX|p(9K||9+Y7NY+LBk5$H8`I<9COwN*6-b2|mZ%6{YG{{P&SXcwhBR z0^j5LQUWg#7|Z~A^QtCA!VdCwg3u9O)$4mH%3DU27MHIYCB<1fx~uO>{k_Q64Nn&d zBoUa1Cr<)#1m48+ICew!+X7}_AC6knJPor=}#_~IjQh_Ck^42o^E`E)%Myf2VR6UOB zJiVkpo?fy^JiTOlgai?7?WZm3&3|9gvU~)&E4`!Th?0dV!|b{9s_}j$B5_9L)?X|= z`G?zA5@U_`&EUhbf$X)kq6t;SUwgzD#hTDWwnpu&JXo1v7m(F@hBs?MC)pmA1xnUL z4N7#cFDW(MBsoH_(wmm`DkF=lj4V-QWQi&xOH|odud)t(R4jem{Vc7isqP^?6d{3n z^o|sVbg!Otk3d)HAN`oZN1Z{uS$a@(qN`{R_u`^GN*3*56s@yI3U#57>|MRRF7A=i zo>E_UZfWbTkL(Lcm&qcgzSbW(Nd)ZDp}NUZPg{3wL=8G;E0%Wd+SyR*bd{8SRzJ%m zL`J=AaJtW0UGqz}ebyLRi+UN1XP-4;isTuq`Mb`--yjE^?YDXhY8&Lhu>Dp)-4D3- zTg&QxXtm!Otod`b{1tV-mcNSb*Ya1_{aXH-;%DyU!_(_N?OiU1I@;doMTh0=X&vrW zqQkw64ofF{86B3+_p%muIITp7(@JzWtwe{@N_05QTHN6@YjKCuti>Hpv+5nLFIT9g zkyT$6IdfVU8(G6;PV34)c|odOCbI5GFhL+qZf|W-BCOh?G#J61X7!VSHn>l`+SzJ& zRLVx`eODSalXi}|Y3-OYL^C-^uH{v@(IaFrkGW|L&tiM@;uWcN;Fz1%fdYEBh*zZ6 zkz;OJM^Y#m$193XeD0?8ry>{j8KN3%Jvi>BE%!)Yh{{W;xrm;)rG?0CZEa7s+G7be zmu(k4UUBQ=F9}MMCnQ%wkTp|s5T8(2^N}~9mE>iSC1aDvd2?$SWSwW!)Uu8oA}P_b zmBf+n1>T#!3lR<(4AIOWL|T^n(xYYvNV4>-`Z*sHZHjU~ud1gBoWyfX0v8B$;CgAp ztNAqoEu^+0qc$qSfebC*I`XXIrPWXlp%}nRt2+iyQwd0W_v6Xp#lH>-p{33z2`%Q; z!oj?^FrGl%lr2(sOYf>9i7h1gdtO!33Hb4cfqi&Y?M9$6o=9FXbJ-|nVRuD9V(I0s zR(+r7KBT8ff!7HI$>e zX)>KMOZn%Cax_aN&}(rPWu27TYE?fmOEo1^G%u~KbUXv3RE+d+qpOr+rPOY#s`YLb z8D^Lz*5O$rC3M$HZnQ||Nt|XUb=tmM>^LW8ow09KG5nk1#Y?#z}gV1GO zE##(KYSitfT#&lEcvp=iwj&P|$-JtD6SyBwmINvgcmmI2UNLf+n1$Vyl?Ve%KQ^5o z``|s&-;n|q0;lktl)!Hk@SMn_2(PMV2t?v(z^j@R4y#DsMTAE13ad%L`G}&7<`ou2 z;JF3-V>!IS;s_jlNm1V56_!L`+b%^}!7HpMfrI-MWdpCUK?JrS1fS&)Hg@48I;iZ@Q*;Q(blxpU#CYhyD$dtrOYby^=j+D|i-MvlCwgQ+bOB^#Ry<1L( zC(RN&@$8TihO?Bl)btPZvHDl`FKa318BhU8mRGF)Eqz+~#P}p}n62T8k56lIaJCIE z=TWs0%Q3E{NFGlKiN`D0QoCYOparkDswI^Pv{?OpeDwMx-p8**^)0Bwm-f7h+w;>3 zsKo{RDd0+%0=7~$FhKzpi{570>a-a_mU2x>lyM8;*~W-aWl$0kM1+je6%ib0@hQ=2 z`9_vD70nznrr3(o`wFF_^~excBy%QtWh&c-ENQ0|si>ChONEW?nBz*sx#rkSkE?9- z$e8!gQbW+QRHcwg}r&(D3C~COpk!cpiEo4zUCMMjBma1zuV)gW;ka2}+?bRyTd9Kis<3mRoMVQ#y z74-sjjRM+SBV3FEMzDU#0%jWxO0JipG%UGViqfcbky6tgQL=VpRw7Gwz=(?~*@6+* zxMVX%T(ptTSe7OwXG9-f(?(2UsXjE*R)ooHF6#g_T}xoD8%MTu9E-x?za>rjsTNfY3=DF2vtFNM39^p0xLeeL9@crPWwX1Rs(M&wJkW?J z9}nvk$?6e7&TD#3YuVm<%2X{Sj+Cog!?sLXFkOwqcSng4arP#bT|p zTlMy^Zhm;7>K7QO273hOsxc{Q@DR0roEr0*8XBwCC#JU=8l#d_KUs}gtJZI+#;j2* zw`rvYS|>G9{XE*KF&+VGLND?)KYtUK^Y#^0Nm;I8|z$Sm$f@=hH zt*si`Tn$bxJrt_5PAb_EYR=Wr;$|39{T6Br)1?hVUl7+4NGlfB zvYxDupNGC8bn%Xh!Z29$l8f?h$HTg`lO{_KNL%@TI2wI>#g$qV1|~C?a=S&L$NJv= zt6@Ym)Hbjz`y_pLu`sf$hOw#qnV?MZ-&B2xeOqEzg|;fSr7EYY_3NrJB+pE4B%=Xe7YM@0vs#b|qgRGO1si>V= zh2tG0qlnYJNrtz)8q`9(!FsezpKLelIE$Q-Agj0ZBMuCVErkI&Kgnro=yEkUPGu(R zQ|M`;QZm&l2OFv}E!8S*TSZWQf|S>qx5u?oLnR#4R;|)m4YrQgk6}`r8q`-B2@DLT zkJ=Qc+|ppoFu_gCcr`dfJ4I_X-ZA!$Y88iC-#U(=k5jAkjc6!i*3VNFj}V;@GUkxx zb{G<`26fijf&w1a@%kVg#H6U9T9^^bgxx&i^2K9K)}flxDo?Fq_1SElNXs(ZmTFL} zS|zTDG)Y&hG@~QA+UNsmUN%mgM%K_cwSFtcEDcp*=B(qB)t~{=gPeYOLrm@oFoYMW4!WHOPsQ9oxnj zBg;9#q6T%7_HQ2O?N>8osaj>ODor+4gIG~cpSA8ZHOAUQhCH0b(U(y>m9;Gkb7iAg zv%Qi7**ihnEfT8+@6nctO~NvBLSk~&P_EwA@-COm8Z{_`Vs@=AHjL~FskVgI&!aEX zG~76EYB^)?$ZiO*GqsbZNlkJBsXkAdlkEXD+o<)q@rmaEa!~Xed8JyVHB;m|5~VSq z6G7h(acTffg)DNn3U)r6bQy)HL!3 zkziB9+NhQoH7rWr>)!NUzmZzEAEmxl)k><3!m7uks;_*Aw5w=++G}C*ip{%e2*is-HqlgsULMw^9@D(a>9Xn1iBc-e!#Y)~K2Fbl)s>r+ z$30@zvYph_*xZ|nOw)>_=tZu$ijeeUL%RD>?J-@)YO@(SAyO^Ua4x!j#HbpR8cTm zWgXRiRMsq3O>HEZ`_Zia4#@B%OXvEva&@b0teIH(?Pl!e3DY~LEgNIi+N+|?8=atg#?)!uBf=Pwu`%y{(*DoxHf^8(?QUa+ zOK!-&+il#=x9+wa*V6uj-KOny*(G=0ZMpj9(KeQB$G_ffTwb@F(&C;Oo38kbYUe;Z zqfCIY-SlJnKb$z%j??iW1mGY{<%njg%~rFmOKdjt6ziKUwT;?OI}U%n-?VADY1%Z> z7=UADZ^}}7RXNZaLy8Y7tICN@$q_Jk#pY$Y){`2U8ksv4*({Ij-X3evTNbrDtZbPi z`l)5CnjWjx%2m^I)#^jlbS~)>HN6!%$w5xC5LauOmQJpc>D?tgS#3#roZ3BEO;3`H z)L2U^6r874NAjnqsNKh_=?RiAUAkvholeJy3vR8Zw{J^)1;mU+EdWh}HTkx49n^SCP*&Ca!go zS}|5_9jj)xO&sHbaItUPm}aywKeH+YFe_I zkt7+Zv7T0_VxC%)iOWb))5fbA36d{Ex+jWUs?MN$#8qsqX2|n*N3CZ>q{XTMTCD-p zl&s1-eZ!-*9Z;%o#L?vKvy|vwgjQ*Z?nzyG_X3zW8VxAfvjFKCy@+MUbyEH5D~#~( zE!Vb+>BA4XRy|gY(3aCLO*UKvtI$dn4W@JJ@JuXWBu?VtvVg7UClB7-y@ zk*rqlty=jH+XS@fOSN*W=F%#EGs+gor&MYJMl?f#$XNo5i$K?1;RU?L} z)zgxaI_9tv zD>kpt`}CWkrJbghzEDz2v*8TuDq41)=QOV{MkVG|Q%nEOI8={3T^P?YWo;~Tjhz0Y zWa3O$RjB59On7Q6rqkleh`mPsunuzP4bv;6nPQzRsX}n1oZL((JnM91x0m($LqpZF z#_gG;rlycEjf7?-kW5zIi}fJtNF*JXjOHo6hi-q#=t5QQd65os%S<(Hnc}-yzm&Nf z@t|Ud6KZS^IV5iON~mp3G;1KIk^TIt-V56+j(&>q6%Un%mCz8@p zyM)pBEnBI+jYMB#l;cqV$?lu1bq;CVJw^2`uI8^~cnOWoBLH>$uV`#d-J1HjVuV_+ zm1u3zouZ19NH(M|3YocUtqE@wFPYNDsr3?(&my={r^JYA)}^~z4s(D}Cz8@pGX^5_TengJ8i~ZN$UoUhO`^NC&Y_OeQq+Lr zYW_-zmyp>!1yINTs?5d^`?knjzEu>-t;y_&&qP;8v{B2oY?vau#*g=8jP?Q!^uNt{$mg?beE`7~9aB^=au&?vA z%S{6RW`P|bGhWe})mxL;HeF&{@8=IXln~jre<8A0mk`-j{}rfgOxB`~EOXU>Xw}kP z^;%3LKgjOq??>=B$2OP8F3F>MJjRy*6+OzTmB*_UA67%Xf>a-T@oFf~rJ7LSCl%FtRn763PU%w* z634e;Y8fr@S1nUz54mNjd>UkXN2{xDuIiu5SBSA{T@pCyjq%3fmFEsYXt|+k1D;8T z7U#+RS9!u)sKIU3aIe3-;)9B z3Ka+k;_Iw^hFb6E+pjiB^7TkS8#O3R4QQ!GcT_{CssVX?EhgVvumaJ2)Sx+Pw0xNv z+DQ%2z7PX9dd48_8^{2@`$^@yw=S$O-@r+UNk$1Cv)agaBsOavF) z1KjpW7Md9?&vJqCQzokQL(hemND8p7Vk;0UKh{ysy32F5JevhrUzuRxHNx4bbqBZiIPm(t|-z4V{98IqZiJ&~VS&mM8#m?48QN5zlP!$Y$(GnL|!QXo5n zHZruzQ}_Y@yy(WcSuN5Bj~J%)#jHrLc2wpVMShTnE)L4gRI;=3#tg|(_`QI1Ny*6^ zHB`yX96i?P#E3B?aut3qDMJ4lqMYGb*|}k*IxC~iG`gm@pjSM$TV_t)sN(L^vF@3< zd1D=!8LlCjaSTm*ARRDAOEzuvdX;7au9h=~56adC*IgTh-Y=PoQCWkAr02EB&5CZU zO~8;rxr4Nk=@rSyl{_+%oU07U%*oBp%gD{jHikQN#F#;&SSy9!8VqY6)%D}py>S=n-UzsGAUdf%`&E6k& z^}dJcHM?w4x|?3JztX85uHHZB8fJIXYxY;qXok!#Q={oMyKGTa|Elc)X4~ct zWp|n0l5O|A&4dlOwe4GW=3lkl(`8nsyzE;$inRC)oT{O^uP!={4JSQ=)E}J-unOmsMPayO>_HUaKr&7wGz!y<->;eN^z9w9VkEIjI%0v0R?7YS8-%mffrN9i;SM|IM)by@5 zqUdW#ff;D%q36>EUgm3&_PUzh;(guM^qRes zn!6U5p?6$e=xch-b1%pR_O)xl&3$Ei%i)uwr+?}`iIu~tr^qJ-C9hfD z?61(z?4@}SCC>Dl=TNX_`pskLrZm3gNV+M}x12~frO7Sl(M@T3%V~5|n%#01-IV6H zoJ0{M<~e-9m{~U^roi-@3-6}1be+r!#xaz!nf}*YaZv@Pzp`-%Wo)M3Jc=?l(;r|Q zKpC6qm*2P)Cu1}H?#6=3*i8R;S6uS~({FA78Jp=hkD&DV=9A~E;wKPfHrs!5Alg#{;_$u%9mE7c}_YqfAAJbdB>+%|yev|!FW_nHVTa-Sg z*Q7qVOmDP-dYUx7<}E-$(`#M<6g0gTT?MTY_?%}dec7BgU8CfxF-H__O<)Mk1+x}y4-Uh~3X1sa(ChQ=1BGSl1671h=BCb**d znqG77)3q-ZGw`!3Usuy>UQ*=yRWSqi7>9%Yn%-KjsP3lMyvekQGXoc0`FfjP^KK*G z^AK_>mn6VfW@}o$TiY>PFtaf|w`MBth`DI2f$23Hx~;+D*6MGko@w!zG1Bi`Q`*J!nzP7Z z4Ke*@cNx_tleDgWqrv50M8a)$&BraHx?QGQo@;N-#PJBb<>o-*|9ykE%XCYF?)pFG zMAwHHH8R50w~P=zx|)1DNE@m=AA}W{f#QMR@;IvJzSDcS(d=`^CyY0}&G|)5arKl3 zmBsFfk-=_>!Pd~4UPYCH-NLJvFBe(2j)&4Bw0y*OMSP+u2 zBWkzxuB%I|=_`Mn=KpK&T7cucs`Fh*Bnky_2YL?kAThc_wX2{5LRnbiyik`4nYXZDd;eedm8MwFSip^B8J>YIx^9^CuU5yU4mQbzJjy5lAu5ag=4|<*J!0mdj zBhVRM88GZBFq2`|X^Jwe58wcG?mp!<%dR8Wdu$Clbe$`cW!EJYW!Y@UwRf9c*D2T8 zZ420S9k@A6*V&D-8>N(>(W9){U-DD4$3tsi3(j@^?Ru^YMHhIbR9bSX_w27OOI}Uw zaFvZM(}k?WlFv|kC0c^IPSzaqaRZtllCUN1x z(CEMO+acdlH4a&FS{=G9dG%k3C7+@8O0)!Zy@!5hEqKwU`D*$Vvf!0jBq5PrVDuRM zmSXTCQt%6j!D~PLI$`jlgdEWO6e+ptEcxzxIB`IwfL^Ca$@9*UrM56kh#pBe{{JgD zZ*VRr3lgFmXn#3>;2I#6Q0K4Mf>CooUo0Cn*XC^R?YjHX6|PcyOSu;2I%2z?>+VG7 zv{IQ8$*JD+!7yXs8e7@Cx~>Mj$4YIXC9kGYbCr$Fr|bOad{!#u>;u1G1MNUBhp)U^kDp)6#Ds6Sqs)OFxC!wcE28w~5J`DkeL zd^83I%ckvfm6R=E*J;uxxKjSiU^ix028~AEh0>%xYPQTS*@E*?r6s5OQu9}rC9nP~ zvE(z)FeyD<(KY0`f$XB2$Y?D&j=j}AGSQSjFx z$7K|JjH;s<1*q%goF=X9kmEmy)f{tf>AFI6e^{x^r(v%30r;!L2Fo>v42@pSnqAu= zTc52w*;Kl=Lw5VTti9h_$Z4+V4jJnDkUF>Q0s62ar4Dn}KdrLNbcVtsDps-tE_(-=noYs1N0~5 zg8)~dl~CtemGw^pMUIeS8rSCRwd1;l(LHRXj)x3?H`jsN^;~x{I>VJZ_cIvQ2k@gX z>+c$l*(|%R4ZX*CNrRg)jjN<=c3r1QXLnwr)|ey%G+N90yGqZVhJ~!z(ksk$#CAQ` zg`x|*QYsydY5dh?$*ccL9F1w9uE-JA9CCb;VM$DqVIga8%^`<2lfT*KDk+hr58veSR zxwb>regfuXQewkH)f_T3I_f&N^PGB5El{0G#TdwMUQ zxxZDNxu@Frto@)mbMN>CpSkZ)XYL&zjhwlsjkELB9<1p1TNc^E$aL@qaRb>4ekW` zc|}S#v89?&KX}mjJw^{Ji`5DAw~Cb9!N%)m^$p@qpr2Btt(JA0N_ z)z5`=0X?QjnX;#M!(PvhX0LKMX`q_JaZO{}dlpxP*3;kf@`2tshvOsDGdmm~xjmu7 z@sa779gdIOnj(h7!ABrzTk0dzti|9G9}A zCGJu&MfzJDQ>;)iMH=W|C{m`A!;Ak^VMfO>4m0jhVMfQ7Im~EP8`uszl1S9ymloSO z@Hj>M2fkHg6pogRxvV2mhhIW_u-x3^yb-pVvrE>Cn;If_TO{i6jjF4e2^!yT;v2L} zQiF{#4ch5qYVb&WgLX-3@Qg@4FC|E$^7YQ@Nw9s$mTY?wGlZ zJ3#An#|+R;o};j%0e%=~NWV7<6upJzwB{K_4=5J1Y=e?02BB&4Lr1Z9%%EPm`D>$N z2q|2WNuZd;;EoyKXpgvxyJH5$vT8mevaG9%7K&W?5-l{t9W&9kA{{okbl4!! z(sMi!#9{m$Gbs4J#d1c28x-qGcq(%~%S&d;;`um_;NtTnjecboXsaS6fqsigm%5#S z?5(3OC6rL<;qz4&K!2)8Nua-D(o=4CSA<>I8#R}N?`MLs={vRQfZ!Bz+!2&CKb_#R zHT+yqjX!p`K~BYDqRe^lc17ng=v?m)xpp~!4rkir+9gy8Co9UeK8Cx)F*rA7^X)u% zz0a?PeL7E>$+z?Rit=qXJl`4e>^yjLsLrz-rj?TQY2Fi?fhy=`M7|mdu74EzuHG_>4D8pH_3+$GMX) zj5=(YJ1-VpsVb<^_3c`?qL0CI#Wwh^68$!Kj&a=3@*dW9pB=Z%TG`s_t>c#LR*`;7 zhO0!eC9|PMOSA+P&i#?vmjf**Qu4nUt$&Lu1@ufsO5VZf{tHwopx;oWydFn3Da5Ba?{R}la&!Z|MUj#~e_PIbIIDjN zl@e?!6QUdFB1K99{YcrMI(K24riC6z$b~oOQQH+4daNwj)eY+3&Mw$q~zQFSlXa1%6fJK?N+4ZK}KK8 zCXlFjEC&eAT5y1UsjE>>o+1L(UrTSMtzXH!!`rSGa- zZwF9hfoRL<+@8HmoY$AWOy(;SHs`_H6&Jd47~2Sa<{y|{4$|h^d70>a&evAiG=$C~ zvw2?VR^O0y%$5;ajzke{8J)#w&&5L5c9|2K^Qi5L&TB?r?iKWbl3l%X&-Gg}TqTMv znGH2sqH(!iZ&leaYqnxK+abH+Lf2@6>nc)ggYPQQZ-eI;$BkU?UzSr7-fDY%YQkGJ zkESL(cieHQ31?eu8}Wr6kw;S#P~nGJm1{fh;~dh4A6c?x?z~uZr&+;J+%V?)7(7>O zgYTN-UQC}TEJ4eEPz8=#?o4cL_11AqcB@FgCBs#s*pgX&#|;(kRR;(i@8<)AV+`qg z0I%aS)@gOt+VNdJEm)^c3sQMLE%;Y;ikkWkpAwWmN!}xm56b^fcv+7+F<7Hc4AMZ; zahMS;y?Sabob( z@`-`B+Fsjn`<+p%@*Ou+_?hxizqhJvn6;YY_BpL&{)`t$0jzvEUu;y+D&JG!HVetq%KBK#wR=66kV1!he1iKNx5Gapz5$zK5;gk(S|>O5nJiIe*q;&Sj)s z0;^l9PT1i1wki;|w9X~4x`zV}x)%WGUPVe?$~Npm^%Z{OQK>HLabru`HdiCL^E}*9?@+Q%1D#T&R)Mftv%%`)%4K!l#V+g5lz-~n zz+uU`%0G2J$LP(<8Fd1^MUhgsv43h(&ZraUMT(SK%GsbD1i0}e*ks$e8N$ic{CDp!*J9}Y(LsK}#Z znj?>kRhZGSmcxuERhSWTD-wQS^I0xTmjqqO_cj?ZNutg!8FRf%q7J`HcOCah&25Tr z&MrB_tw{Ll+L3aD>G%fik~7?jWGBdJgxljAv`fa`iuBlNa+(_XW~DbUywHNp{Co++ z*%Ij|>kpe4OEv44+|W2$de5wZ;!V04v4M7kPYlGW;sT z`xt(cp*?<#6Y&3Pyzk=qUSr8&CV445lsOTe9+3w%GrDTX&Q{2;?U3_r}!=64nMgYnw%|7-kL^LVad*un5RhB)uD$6KlK zJ;d|!D8pYd#NAhO9Y4Iz&)7db%@F>|<`-^dEBlKyLpUV6JiNv~a5?PBpWx?TFno^T zOAO(U?DpU^=F0B{Z<8&yG3;fy{}M^Ro8bY5hZz2xp*@}xKi7+dXse5ss~2^mH?Yu^GHN??R5#zD+Q^np`dZS3bCaxWFVSHnx{%*Z^t!Rp+pDxB@>1T+u zuh3hNc)g(TpgoTMdeJ@@M_(j%$I{;*UfvZ~{!DQ+mQEL4elV{5S)wtPezthxmbmid z5_ZSY-z3^%>8!d|m3qNhrwE<1P!T$ZwGleUxDh(Xyb(GFz7aY{!5Te5c!M}{Oe2M8 zaPMlJh{`>wG3{4dCg-mfI(?2{mnx7DvOl~YQ zFg(_m9nR#6V}*%KcJfBiKQ=NxoG<2cElcA|WVR2D4rQ{1LUt;XA1xN9#P&jVB%jGm zj*LuE740cQC5uMURqHxvIEA6>M|0Wy@O$!89r@zq_`1=4u`S;!3jJfFf{IYP{e`LV zA`#z7e@p4_a{5~qzL(4MdpUY9NAKn6z1%YTYo*@TZ(X%{U1r^uwV6yX{E4y5V0JV& zoEMq3=`E`^Z(KvvtF~O5S+{|UZdkjONZU5AL8YrUU9)=Crpz_#*LSSjmf5yy^`>LPls|Md>YJ742qWA)F{=Iuvn1q?93M?f-#20_#s2@ z74pN`paNs#!$r{&_TEy=-$-~kA1#HkT(+1ME%`xSB!fAsizit_t`=DXcu*_of*J^i zlN}lAry-0{!}PBu?5%HNLbTA@9ib&jh4Ouq15`abIzS7ZABRS_2leG!eSL-ePCN|{ zjpl*V+yEu%0p*rr)Nj_Lz>}X!e+UN=M*=omEjC!sE%f|f$BvDmelH_{ty~^qWusNU zjh;`ZKh#HD3fM??CU^z?1}N$yl4&Pe&^GELeg*s{y{EspIYkQG%`t8Kh;spX^BndO zR6;+1*AndyT7AUBfK5RqdfDTbR3UQw9@<0P40wPG+VcngN4frLE{FIUuve>3QDkKP zZX{YTC+gRu5HB&bBS2gJ6IOl1>ws|oR4ja1&4=N!-aq1c!2L^5)2t8bhX~Q@BmM{E zFbl;IUa99#aDB|bXy>;Wwp;x-@!J5m6B6`~`q)nZu0%nG_WVr~U9XRQ2jGF=P3?vC z57J)~62!n*ABaa^9+4&N@^}WkkBTkQ>SG^s)Up0UR5utR`d9m%U}4e={m7^2^JDZz zu=Y?N`=Um!e~9_VyrDg;qbI1Y-aqzFPmIYPmq?)gqdwr%R(-LXi;hd!#*YA~2lyPl z5#Sg<_G4{aALUTr5~p~P-Uw(*QGg-pUuMx!A5g}-Rv~&E;QsA)Q4clhiD1)$_x5r9 zJ;CDAUUpd-Cu;>5J)ifn_hMq0Zr6Xy4E_IjkF4r|_8yZ>N28drZ{pDY>dQ}mbhDE=2tNX{w% literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aesni.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_aesni.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..5f08fe70a46570491e98266c72677761392723d7 GIT binary patch literal 106384 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

7p@-N=cjOf|Vbjwgkv7hO* z_cNWrex@_n&vXX+na*H8(;4h%I)nX8XRx1vg&Q%|K~H7Deg=Aq3-&Y6Q(Um0fu7=m z{S5T(67^s|13kqB`x)pdF4)gNPwi(q)qbW^?PogGex_6HXFAn>rc>=_I@NxrQ|)Iu z)qbW^?PogGex_6HXFAn>rc>=_I@NxrQ|)Iu)qbW^?PogGex_6HXFAn>rc>=_I@Nxr zQ|)Iu)qbW^?PogGex_6HXFAn>rc>=_I@NxrQ|)Iu)qbW^?PogGex_6HXFAn>rc>=_ zI@NxrQ|)Iu)qbW^?PogGex_6HXFAn>rc>=_I@NxrGjTtI$UG24MrFZ%20g5}U_XN% zR$Q>3K@TVHXJBD_U_oWUeg+m47wl(XL2yD`?wUNrle7XuV~lVCsd;6Hw*cI9OgDZQIRvVW5@5_*t@rR=iDs^{S~iB%-u5JF=Vrww^cN6ulV5E zd0Wyh-Zh;5Z2UN5ZRWOmrH0_ePZU^s+m11g< zePQ#%6&oMP-PoRny=&UFIU{Fu&z#g%zq34NPo4BwHnrYRC*XymL)MYagJM3GHG)(N?>4mZ=lZEiy6C}4>OS^$)9 z+|#?^cm-E#xRr9#G|&bBHvt-kE3p!dwkx#n+B}68X|w}q1=_i-E3M*#=ky)4w7ls# zBWI4t#eP{LTH1cv8Re&!pHcn=yi~aQSoXIb?PYB1;@|-o#;?AA-=*|-8FKy|P~A90!8{9C!Zy6GH6e_VmnapRtWIh!_v2UV1_=_%MNe@N~tgU@X!z&-8}Gn=~^ z&hjeU!NoX#Y-VvEc{i#2AsIRkmErIc*l>0XMdh=b(~2u_D|T~x&ZgtV@|M^e??{v{ zD$bqT{LVwU5L{l7vuZo;Fkd-B%KQEeY88*o7|0@=#4~cQL?z2}R&LA5i#E?F*|B@a z-o3aNJr{CCu;9!p-CO<;PDacJdv{!k!ip;|9I@jP5VNnGQoQ4Q5Id);08LZ=$_rEF z4|U_X^Ek$B?v=`?3ybE-ZRYDyCSDGtmpeA8I@eZKT-kuT#m#HbmG3vy&lJxv^EAJX zs<-Wo>^KM)faT4PN`rri@i_O&3yXFxSCQ7^vHT(Fot@u8q3S=h0Sy;_qyal8(;w+q zdEcx2p$@@sr@WTy2RThHMUeyv&n3dg5YXxQ^z=Ya5A^gvPY?9;Ku-_+t9oEf{nF9u z)!k7`oe{Om)*m&sbY#(?hZYGvWol{3NL|s05yziBb?UgF?D+brQZ%yYqKk@xf(da2 zW8w?S;tIx%9O?Y#y}f%SwIa13H6hg@EkUY8nub(@l#BGHPCrBbIMUNdFChI1>0Tsp zZOz&#~x15vgKX~o-n z_fA0W9Fv`UX=F)u#+*l$-Bv(Xp{!2csF2srIlxoxHL8+yJTbf zob0wp^fzwr?2;MTBg(Ujre_a??DXu6W91#<3ZxxK-~G$pz3M%4lwBQx%$K6mvx~N* zP0t>2RjfR_nHhWHGH8u;I*1_SHPOqZcD)mHoR87@NjhJy^L0AEROi?0{MZ>YCKrvsH^N62 zm6nXcH*<@|l#D4YDIHrGOY3WGkaMT-wCg|WL`s=e37!S*@J4WlT z|2r9O4f?Ln9%whClT#^1j)QjW$%0A9q8YtDfLK~utaep{6PqTGn;|c|MI*fy!bmi& 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_arc2.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_arc2.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..2287d2ebaf45bbface2591f26a3de725bfe2a40a GIT binary patch literal 46464 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 ZZc(5`QeevkCH`opSlT*TFjypo{|B?PrRe|w literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cast.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cast.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..730e178e024a73529fed764615ae91fcaa08e6a7 GIT binary patch literal 57408 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 bxY^)dGj(WU@rx$Ae)CpCe}hTE#ESm`IH3}L literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cfb.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_cfb.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..2c9b852c4dc9ceeb168d0812b4187c228a422c40 GIT binary patch literal 26864 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 RP!r0Z=&__~V+3MQ@t>gs81n!C literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..7f1f8246c45e5e8d893b35997b8bd06dd7fbb2a8 GIT binary patch literal 71560 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des3.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_des3.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..b475c52c6c9233431af8ce533664230f918c5a60 GIT binary patch literal 72520 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ecb.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ecb.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..91e81262dc37862f0250fa1ce3941f5b92834ea0 GIT binary patch literal 19016 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 MH|!RNfrDlL0T9n0a{vGU literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_eksblowfish.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_eksblowfish.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..c3c45d52cf35fe5b98fcf1445bf4492691c306fd GIT binary patch literal 181192 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ofb.abi3.so b/lib/python3.11/site-packages/Cryptodome/Cipher/_raw_ofb.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..a4a629a8e70deddb7c744c0b21ecd36eb761570e GIT binary patch literal 22128 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.py b/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.py new file mode 100644 index 0000000..85da887 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.py @@ -0,0 +1,247 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, tobytes + +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_blake2b_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._BLAKE2b", + """ + int blake2b_init(void **state, + const uint8_t *key, + size_t key_size, + size_t digest_size); + int blake2b_destroy(void *state); + int blake2b_update(void *state, + const uint8_t *buf, + size_t len); + int blake2b_digest(const void *state, + uint8_t digest[64]); + int blake2b_copy(const void *src, void *dst); + """) + + +class BLAKE2b_Hash(object): + """A BLAKE2b hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The internal block size of the hash algorithm in bytes. + block_size = 64 + + def __init__(self, data, key, digest_bytes, update_after_digest): + + # The size of the resulting hash in bytes. + self.digest_size = digest_bytes + + self._update_after_digest = update_after_digest + self._digest_done = False + + # See https://tools.ietf.org/html/rfc7693 + if digest_bytes in (20, 32, 48, 64) and not key: + self.oid = "1.3.6.1.4.1.1722.12.2.1." + str(digest_bytes) + + state = VoidPointer() + result = _raw_blake2b_lib.blake2b_init(state.address_of(), + c_uint8_ptr(key), + c_size_t(len(key)), + c_size_t(digest_bytes) + ) + if result: + raise ValueError("Error %d while instantiating BLAKE2b" % result) + self._state = SmartPointer(state.get(), + _raw_blake2b_lib.blake2b_destroy) + if data: + self.update(data) + + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (bytes/bytearray/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_blake2b_lib.blake2b_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing BLAKE2b data" % result) + return self + + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(64) + result = _raw_blake2b_lib.blake2b_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while creating BLAKE2b digest" % result) + + self._digest_done = True + + return get_raw_buffer(bfr)[:self.digest_size] + + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in tuple(self.digest())]) + + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (bytes/bytearray/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = new(digest_bits=160, key=secret, data=mac_tag) + mac2 = new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + + def new(self, **kwargs): + """Return a new instance of a BLAKE2b hash object. + See :func:`new`. + """ + + if "digest_bytes" not in kwargs and "digest_bits" not in kwargs: + kwargs["digest_bytes"] = self.digest_size + + return new(**kwargs) + + +def new(**kwargs): + """Create a new hash object. + + Args: + data (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`BLAKE2b_Hash.update`. + digest_bytes (integer): + Optional. The size of the digest, in bytes (1 to 64). Default is 64. + digest_bits (integer): + Optional and alternative to ``digest_bytes``. + The size of the digest, in bits (8 to 512, in steps of 8). + Default is 512. + key (bytes/bytearray/memoryview): + Optional. The key to use to compute the MAC (1 to 64 bytes). + If not specified, no key will be used. + update_after_digest (boolean): + Optional. By default, a hash object cannot be updated anymore after + the digest is computed. When this flag is ``True``, such check + is no longer enforced. + + Returns: + A :class:`BLAKE2b_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + + digest_bytes = kwargs.pop("digest_bytes", None) + digest_bits = kwargs.pop("digest_bits", None) + if None not in (digest_bytes, digest_bits): + raise TypeError("Only one digest parameter must be provided") + if (None, None) == (digest_bytes, digest_bits): + digest_bytes = 64 + if digest_bytes is not None: + if not (1 <= digest_bytes <= 64): + raise ValueError("'digest_bytes' not in range 1..64") + else: + if not (8 <= digest_bits <= 512) or (digest_bits % 8): + raise ValueError("'digest_bits' not in range 8..512, " + "with steps of 8") + digest_bytes = digest_bits // 8 + + key = kwargs.pop("key", b"") + if len(key) > 64: + raise ValueError("BLAKE2b key cannot exceed 64 bytes") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return BLAKE2b_Hash(data, key, digest_bytes, update_after_digest) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.pyi new file mode 100644 index 0000000..d37c374 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2b.pyi @@ -0,0 +1,32 @@ +from typing import Any, Union +from types import ModuleType + +Buffer = Union[bytes, bytearray, memoryview] + +class BLAKE2b_Hash(object): + block_size: int + digest_size: int + oid: str + + def __init__(self, + data: Buffer, + key: Buffer, + digest_bytes: bytes, + update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> BLAKE2b_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + def new(self, + data: Buffer = ..., + digest_bytes: int = ..., + digest_bits: int = ..., + key: Buffer = ..., + update_after_digest: bool = ...) -> BLAKE2b_Hash: ... + +def new(data: Buffer = ..., + digest_bytes: int = ..., + digest_bits: int = ..., + key: Buffer = ..., + update_after_digest: bool = ...) -> BLAKE2b_Hash: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.py b/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.py new file mode 100644 index 0000000..43be5c4 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.py @@ -0,0 +1,247 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, tobytes + +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_blake2s_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._BLAKE2s", + """ + int blake2s_init(void **state, + const uint8_t *key, + size_t key_size, + size_t digest_size); + int blake2s_destroy(void *state); + int blake2s_update(void *state, + const uint8_t *buf, + size_t len); + int blake2s_digest(const void *state, + uint8_t digest[32]); + int blake2s_copy(const void *src, void *dst); + """) + + +class BLAKE2s_Hash(object): + """A BLAKE2s hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The internal block size of the hash algorithm in bytes. + block_size = 32 + + def __init__(self, data, key, digest_bytes, update_after_digest): + + # The size of the resulting hash in bytes. + self.digest_size = digest_bytes + + self._update_after_digest = update_after_digest + self._digest_done = False + + # See https://tools.ietf.org/html/rfc7693 + if digest_bytes in (16, 20, 28, 32) and not key: + self.oid = "1.3.6.1.4.1.1722.12.2.2." + str(digest_bytes) + + state = VoidPointer() + result = _raw_blake2s_lib.blake2s_init(state.address_of(), + c_uint8_ptr(key), + c_size_t(len(key)), + c_size_t(digest_bytes) + ) + if result: + raise ValueError("Error %d while instantiating BLAKE2s" % result) + self._state = SmartPointer(state.get(), + _raw_blake2s_lib.blake2s_destroy) + if data: + self.update(data) + + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_blake2s_lib.blake2s_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing BLAKE2s data" % result) + return self + + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(32) + result = _raw_blake2s_lib.blake2s_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while creating BLAKE2s digest" % result) + + self._digest_done = True + + return get_raw_buffer(bfr)[:self.digest_size] + + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in tuple(self.digest())]) + + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte array/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = new(digest_bits=160, key=secret, data=mac_tag) + mac2 = new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + + def new(self, **kwargs): + """Return a new instance of a BLAKE2s hash object. + See :func:`new`. + """ + + if "digest_bytes" not in kwargs and "digest_bits" not in kwargs: + kwargs["digest_bytes"] = self.digest_size + + return new(**kwargs) + + +def new(**kwargs): + """Create a new hash object. + + Args: + data (byte string/byte array/memoryview): + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`BLAKE2s_Hash.update`. + digest_bytes (integer): + Optional. The size of the digest, in bytes (1 to 32). Default is 32. + digest_bits (integer): + Optional and alternative to ``digest_bytes``. + The size of the digest, in bits (8 to 256, in steps of 8). + Default is 256. + key (byte string): + Optional. The key to use to compute the MAC (1 to 64 bytes). + If not specified, no key will be used. + update_after_digest (boolean): + Optional. By default, a hash object cannot be updated anymore after + the digest is computed. When this flag is ``True``, such check + is no longer enforced. + + Returns: + A :class:`BLAKE2s_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + + digest_bytes = kwargs.pop("digest_bytes", None) + digest_bits = kwargs.pop("digest_bits", None) + if None not in (digest_bytes, digest_bits): + raise TypeError("Only one digest parameter must be provided") + if (None, None) == (digest_bytes, digest_bits): + digest_bytes = 32 + if digest_bytes is not None: + if not (1 <= digest_bytes <= 32): + raise ValueError("'digest_bytes' not in range 1..32") + else: + if not (8 <= digest_bits <= 256) or (digest_bits % 8): + raise ValueError("'digest_bits' not in range 8..256, " + "with steps of 8") + digest_bytes = digest_bits // 8 + + key = kwargs.pop("key", b"") + if len(key) > 32: + raise ValueError("BLAKE2s key cannot exceed 32 bytes") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return BLAKE2s_Hash(data, key, digest_bytes, update_after_digest) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.pyi new file mode 100644 index 0000000..374b3a4 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/BLAKE2s.pyi @@ -0,0 +1,26 @@ +from typing import Any, Union + +Buffer = Union[bytes, bytearray, memoryview] + +class BLAKE2s_Hash(object): + block_size: int + digest_size: int + oid: str + + def __init__(self, + data: Buffer, + key: Buffer, + digest_bytes: bytes, + update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> BLAKE2s_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + def new(self, **kwargs: Any) -> BLAKE2s_Hash: ... + +def new(data: Buffer = ..., + digest_bytes: int = ..., + digest_bits: int = ..., + key: Buffer = ..., + update_after_digest: bool = ...) -> BLAKE2s_Hash: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.py b/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.py new file mode 100644 index 0000000..e831700 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.py @@ -0,0 +1,302 @@ +# -*- coding: utf-8 -*- +# +# Hash/CMAC.py - Implements the CMAC algorithm +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from binascii import unhexlify + +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Util.strxor import strxor +from Cryptodome.Util.number import long_to_bytes, bytes_to_long +from Cryptodome.Util.py3compat import bord, tobytes, _copy_bytes +from Cryptodome.Random import get_random_bytes + + +# The size of the authentication tag produced by the MAC. +digest_size = None + + +def _shift_bytes(bs, xor_lsb=0): + num = (bytes_to_long(bs) << 1) ^ xor_lsb + return long_to_bytes(num, len(bs))[-len(bs):] + + +class CMAC(object): + """A CMAC hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting MAC tag + :vartype digest_size: integer + """ + + digest_size = None + + def __init__(self, key, msg, ciphermod, cipher_params, mac_len, + update_after_digest): + + self.digest_size = mac_len + + self._key = _copy_bytes(None, None, key) + self._factory = ciphermod + self._cipher_params = cipher_params + self._block_size = bs = ciphermod.block_size + self._mac_tag = None + self._update_after_digest = update_after_digest + + # Section 5.3 of NIST SP 800 38B and Appendix B + if bs == 8: + const_Rb = 0x1B + self._max_size = 8 * (2 ** 21) + elif bs == 16: + const_Rb = 0x87 + self._max_size = 16 * (2 ** 48) + else: + raise TypeError("CMAC requires a cipher with a block size" + " of 8 or 16 bytes, not %d" % bs) + + # Compute sub-keys + zero_block = b'\x00' * bs + self._ecb = ciphermod.new(key, + ciphermod.MODE_ECB, + **self._cipher_params) + L = self._ecb.encrypt(zero_block) + if bord(L[0]) & 0x80: + self._k1 = _shift_bytes(L, const_Rb) + else: + self._k1 = _shift_bytes(L) + if bord(self._k1[0]) & 0x80: + self._k2 = _shift_bytes(self._k1, const_Rb) + else: + self._k2 = _shift_bytes(self._k1) + + # Initialize CBC cipher with zero IV + self._cbc = ciphermod.new(key, + ciphermod.MODE_CBC, + zero_block, + **self._cipher_params) + + # Cache for outstanding data to authenticate + self._cache = bytearray(bs) + self._cache_n = 0 + + # Last piece of ciphertext produced + self._last_ct = zero_block + + # Last block that was encrypted with AES + self._last_pt = None + + # Counter for total message size + self._data_size = 0 + + if msg: + self.update(msg) + + def update(self, msg): + """Authenticate the next chunk of message. + + Args: + data (byte string/byte array/memoryview): The next chunk of data + """ + + if self._mac_tag is not None and not self._update_after_digest: + raise TypeError("update() cannot be called after digest() or verify()") + + self._data_size += len(msg) + bs = self._block_size + + if self._cache_n > 0: + filler = min(bs - self._cache_n, len(msg)) + self._cache[self._cache_n:self._cache_n+filler] = msg[:filler] + self._cache_n += filler + + if self._cache_n < bs: + return self + + msg = memoryview(msg)[filler:] + self._update(self._cache) + self._cache_n = 0 + + remain = len(msg) % bs + if remain > 0: + self._update(msg[:-remain]) + self._cache[:remain] = msg[-remain:] + else: + self._update(msg) + self._cache_n = remain + return self + + def _update(self, data_block): + """Update a block aligned to the block boundary""" + + bs = self._block_size + assert len(data_block) % bs == 0 + + if len(data_block) == 0: + return + + ct = self._cbc.encrypt(data_block) + if len(data_block) == bs: + second_last = self._last_ct + else: + second_last = ct[-bs*2:-bs] + self._last_ct = ct[-bs:] + self._last_pt = strxor(second_last, data_block[-bs:]) + + def copy(self): + """Return a copy ("clone") of the CMAC object. + + The copy will have the same internal state as the original CMAC + object. + This can be used to efficiently compute the MAC tag of byte + strings that share a common initial substring. + + :return: An :class:`CMAC` + """ + + obj = self.__new__(CMAC) + obj.__dict__ = self.__dict__.copy() + obj._cbc = self._factory.new(self._key, + self._factory.MODE_CBC, + self._last_ct, + **self._cipher_params) + obj._cache = self._cache[:] + obj._last_ct = self._last_ct[:] + return obj + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message + that has been authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bs = self._block_size + + if self._mac_tag is not None and not self._update_after_digest: + return self._mac_tag + + if self._data_size > self._max_size: + raise ValueError("MAC is unsafe for this message") + + if self._cache_n == 0 and self._data_size > 0: + # Last block was full + pt = strxor(self._last_pt, self._k1) + else: + # Last block is partial (or message length is zero) + partial = self._cache[:] + partial[self._cache_n:] = b'\x80' + b'\x00' * (bs - self._cache_n - 1) + pt = strxor(strxor(self._last_ct, partial), self._k2) + + self._mac_tag = self._ecb.encrypt(pt)[:self.digest_size] + + return self._mac_tag + + def hexdigest(self): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) + for x in tuple(self.digest())]) + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte array/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + +def new(key, msg=None, ciphermod=None, cipher_params=None, mac_len=None, + update_after_digest=False): + """Create a new MAC object. + + Args: + key (byte string/byte array/memoryview): + key for the CMAC object. + The key must be valid for the underlying cipher algorithm. + For instance, it must be 16 bytes long for AES-128. + ciphermod (module): + A cipher module from :mod:`Cryptodome.Cipher`. + The cipher's block size has to be 128 bits, + like :mod:`Cryptodome.Cipher.AES`, to reduce the probability + of collisions. + msg (byte string/byte array/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to `CMAC.update`. Optional. + cipher_params (dict): + Optional. A set of parameters to use when instantiating a cipher + object. + mac_len (integer): + Length of the MAC, in bytes. + It must be at least 4 bytes long. + The default (and recommended) length matches the size of a cipher block. + update_after_digest (boolean): + Optional. By default, a hash object cannot be updated anymore after + the digest is computed. When this flag is ``True``, such check + is no longer enforced. + Returns: + A :class:`CMAC` object + """ + + if ciphermod is None: + raise TypeError("ciphermod must be specified (try AES)") + + cipher_params = {} if cipher_params is None else dict(cipher_params) + + if mac_len is None: + mac_len = ciphermod.block_size + + if mac_len < 4: + raise ValueError("MAC tag length must be at least 4 bytes long") + + if mac_len > ciphermod.block_size: + raise ValueError("MAC tag length cannot be larger than a cipher block (%d) bytes" % ciphermod.block_size) + + return CMAC(key, msg, ciphermod, cipher_params, mac_len, + update_after_digest) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.pyi new file mode 100644 index 0000000..acdf055 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/CMAC.pyi @@ -0,0 +1,30 @@ +from types import ModuleType +from typing import Union, Dict, Any + +Buffer = Union[bytes, bytearray, memoryview] + +digest_size: int + +class CMAC(object): + digest_size: int + + def __init__(self, + key: Buffer, + msg: Buffer, + ciphermod: ModuleType, + cipher_params: Dict[str, Any], + mac_len: int, update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> CMAC: ... + def copy(self) -> CMAC: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + +def new(key: Buffer, + msg: Buffer = ..., + ciphermod: ModuleType = ..., + cipher_params: Dict[str, Any] = ..., + mac_len: int = ..., + update_after_digest: bool = ...) -> CMAC: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.py b/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.py new file mode 100644 index 0000000..165dd83 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.py @@ -0,0 +1,213 @@ +# +# HMAC.py - Implements the HMAC algorithm as described by RFC 2104. +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord, tobytes + +from binascii import unhexlify + +from Cryptodome.Hash import MD5 +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Util.strxor import strxor +from Cryptodome.Random import get_random_bytes + +__all__ = ['new', 'HMAC'] + + +class HMAC(object): + """An HMAC hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting MAC tag + :vartype digest_size: integer + """ + + def __init__(self, key, msg=b"", digestmod=None): + + if digestmod is None: + digestmod = MD5 + + if msg is None: + msg = b"" + + # Size of the MAC tag + self.digest_size = digestmod.digest_size + + self._digestmod = digestmod + + if isinstance(key, memoryview): + key = key.tobytes() + + try: + if len(key) <= digestmod.block_size: + # Step 1 or 2 + key_0 = key + b"\x00" * (digestmod.block_size - len(key)) + else: + # Step 3 + hash_k = digestmod.new(key).digest() + key_0 = hash_k + b"\x00" * (digestmod.block_size - len(hash_k)) + except AttributeError: + # Not all hash types have "block_size" + raise ValueError("Hash type incompatible to HMAC") + + # Step 4 + key_0_ipad = strxor(key_0, b"\x36" * len(key_0)) + + # Start step 5 and 6 + self._inner = digestmod.new(key_0_ipad) + self._inner.update(msg) + + # Step 7 + key_0_opad = strxor(key_0, b"\x5c" * len(key_0)) + + # Start step 8 and 9 + self._outer = digestmod.new(key_0_opad) + + def update(self, msg): + """Authenticate the next chunk of message. + + Args: + data (byte string/byte array/memoryview): The next chunk of data + """ + + self._inner.update(msg) + return self + + def _pbkdf2_hmac_assist(self, first_digest, iterations): + """Carry out the expensive inner loop for PBKDF2-HMAC""" + + result = self._digestmod._pbkdf2_hmac_assist( + self._inner, + self._outer, + first_digest, + iterations) + return result + + def copy(self): + """Return a copy ("clone") of the HMAC object. + + The copy will have the same internal state as the original HMAC + object. + This can be used to efficiently compute the MAC tag of byte + strings that share a common initial substring. + + :return: An :class:`HMAC` + """ + + new_hmac = HMAC(b"fake key", digestmod=self._digestmod) + + # Syncronize the state + new_hmac._inner = self._inner.copy() + new_hmac._outer = self._outer.copy() + + return new_hmac + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message + authenticated so far. + + :return: The MAC tag digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + frozen_outer_hash = self._outer.copy() + frozen_outer_hash.update(self._inner.digest()) + return frozen_outer_hash.digest() + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte string/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexdigest(self): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) + for x in tuple(self.digest())]) + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, + as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + +def new(key, msg=b"", digestmod=None): + """Create a new MAC object. + + Args: + key (bytes/bytearray/memoryview): + key for the MAC object. + It must be long enough to match the expected security level of the + MAC. + msg (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to :meth:`HMAC.update`. + digestmod (module): + The hash to use to implement the HMAC. + Default is :mod:`Cryptodome.Hash.MD5`. + + Returns: + An :class:`HMAC` object + """ + + return HMAC(key, msg, digestmod) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.pyi new file mode 100644 index 0000000..b577230 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/HMAC.pyi @@ -0,0 +1,25 @@ +from types import ModuleType +from typing import Union, Dict + +Buffer = Union[bytes, bytearray, memoryview] + +digest_size: int + +class HMAC(object): + digest_size: int + + def __init__(self, + key: Buffer, + msg: Buffer, + digestmod: ModuleType) -> None: ... + def update(self, msg: Buffer) -> HMAC: ... + def copy(self) -> HMAC: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + + +def new(key: Buffer, + msg: Buffer = ..., + digestmod: ModuleType = ...) -> HMAC: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.py b/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.py new file mode 100644 index 0000000..afd91c4 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.py @@ -0,0 +1,179 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, tobytes, is_bytes +from Cryptodome.Random import get_random_bytes + +from . import cSHAKE128, SHA3_256 +from .cSHAKE128 import _bytepad, _encode_str, _right_encode + + +class KMAC_Hash(object): + """A KMAC hash object. + Do not instantiate directly. + Use the :func:`new` function. + """ + + def __init__(self, data, key, mac_len, custom, + oid_variant, cshake, rate): + + # See https://tools.ietf.org/html/rfc8702 + self.oid = "2.16.840.1.101.3.4.2." + oid_variant + self.digest_size = mac_len + + self._mac = None + + partial_newX = _bytepad(_encode_str(tobytes(key)), rate) + self._cshake = cshake._new(partial_newX, custom, b"KMAC") + + if data: + self._cshake.update(data) + + def update(self, data): + """Authenticate the next chunk of message. + + Args: + data (bytes/bytearray/memoryview): The next chunk of the message to + authenticate. + """ + + if self._mac: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + self._cshake.update(data) + return self + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message. + + :return: The MAC tag. Binary form. + :rtype: byte string + """ + + if not self._mac: + self._cshake.update(_right_encode(self.digest_size * 8)) + self._mac = self._cshake.read(self.digest_size) + + return self._mac + + def hexdigest(self): + """Return the **printable** MAC tag of the message. + + :return: The MAC tag. Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in tuple(self.digest())]) + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (bytes/bytearray/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = SHA3_256.new(secret + mac_tag) + mac2 = SHA3_256.new(secret + self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + def new(self, **kwargs): + """Return a new instance of a KMAC hash object. + See :func:`new`. + """ + + if "mac_len" not in kwargs: + kwargs["mac_len"] = self.digest_size + + return new(**kwargs) + + +def new(**kwargs): + """Create a new KMAC128 object. + + Args: + key (bytes/bytearray/memoryview): + The key to use to compute the MAC. + It must be at least 128 bits long (16 bytes). + data (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to :meth:`KMAC_Hash.update`. + mac_len (integer): + Optional. The size of the authentication tag, in bytes. + Default is 64. Minimum is 8. + custom (bytes/bytearray/memoryview): + Optional. A customization byte string (``S`` in SP 800-185). + + Returns: + A :class:`KMAC_Hash` hash object + """ + + key = kwargs.pop("key", None) + if not is_bytes(key): + raise TypeError("You must pass a key to KMAC128") + if len(key) < 16: + raise ValueError("The key must be at least 128 bits long (16 bytes)") + + data = kwargs.pop("data", None) + + mac_len = kwargs.pop("mac_len", 64) + if mac_len < 8: + raise ValueError("'mac_len' must be 8 bytes or more") + + custom = kwargs.pop("custom", b"") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return KMAC_Hash(data, key, mac_len, custom, "19", cSHAKE128, 168) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.pyi new file mode 100644 index 0000000..8947dab --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/KMAC128.pyi @@ -0,0 +1,33 @@ +from typing import Union +from types import ModuleType + +Buffer = Union[bytes, bytearray, memoryview] + +class KMAC_Hash(object): + + def __init__(self, + data: Buffer, + key: Buffer, + mac_len: int, + custom: Buffer, + oid_variant: str, + cshake: ModuleType, + rate: int) -> None: ... + + def update(self, data: Buffer) -> KMAC_Hash: ... + + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + def new(self, + data: Buffer = ..., + mac_len: int = ..., + key: Buffer = ..., + custom: Buffer = ...) -> KMAC_Hash: ... + + +def new(key: Buffer, + data: Buffer = ..., + mac_len: int = ..., + custom: Buffer = ...) -> KMAC_Hash: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.py b/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.py new file mode 100644 index 0000000..82da062 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.py @@ -0,0 +1,74 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.py3compat import is_bytes + +from .KMAC128 import KMAC_Hash +from . import cSHAKE256 + + +def new(**kwargs): + """Create a new KMAC256 object. + + Args: + key (bytes/bytearray/memoryview): + The key to use to compute the MAC. + It must be at least 256 bits long (32 bytes). + data (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to :meth:`KMAC_Hash.update`. + mac_len (integer): + Optional. The size of the authentication tag, in bytes. + Default is 64. Minimum is 8. + custom (bytes/bytearray/memoryview): + Optional. A customization byte string (``S`` in SP 800-185). + + Returns: + A :class:`KMAC_Hash` hash object + """ + + key = kwargs.pop("key", None) + if not is_bytes(key): + raise TypeError("You must pass a key to KMAC256") + if len(key) < 32: + raise ValueError("The key must be at least 256 bits long (32 bytes)") + + data = kwargs.pop("data", None) + + mac_len = kwargs.pop("mac_len", 64) + if mac_len < 8: + raise ValueError("'mac_len' must be 8 bytes or more") + + custom = kwargs.pop("custom", b"") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return KMAC_Hash(data, key, mac_len, custom, "20", cSHAKE256, 136) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.pyi new file mode 100644 index 0000000..86cc500 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/KMAC256.pyi @@ -0,0 +1,10 @@ +from typing import Union + +from .KMAC128 import KMAC_Hash + +Buffer = Union[bytes, bytearray, memoryview] + +def new(key: Buffer, + data: Buffer = ..., + mac_len: int = ..., + custom: Buffer = ...) -> KMAC_Hash: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.py b/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.py new file mode 100644 index 0000000..44d935f --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.py @@ -0,0 +1,262 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util._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 + + +def _length_encode(x): + if x == 0: + return b'\x00' + + S = long_to_bytes(x) + return S + bchr(len(S)) + + +# Possible states for a KangarooTwelve instance, which depend on the amount of data processed so far. +SHORT_MSG = 1 # Still within the first 8192 bytes, but it is not certain we will exceed them. +LONG_MSG_S0 = 2 # Still within the first 8192 bytes, and it is certain we will exceed them. +LONG_MSG_SX = 3 # Beyond the first 8192 bytes. +SQUEEZING = 4 # No more data to process. + + +class K12_XOF(object): + """A KangarooTwelve hash object. + Do not instantiate directly. + Use the :func:`new` function. + """ + + def __init__(self, data, custom): + + if custom == None: + custom = b'' + + self._custom = custom + _length_encode(len(custom)) + self._state = SHORT_MSG + self._padding = None # Final padding is only decided in read() + + # Internal hash that consumes FinalNode + self._hash1 = self._create_keccak() + self._length1 = 0 + + # Internal hash that produces CV_i (reset each time) + self._hash2 = None + self._length2 = 0 + + # Incremented by one for each 8192-byte block + self._ctr = 0 + + if data: + self.update(data) + + def _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. + + .. note:: + For better performance, submit chunks with a length multiple of 8192 bytes. + + Args: + data (byte string/byte array/memoryview): The next chunk of the + message to hash. + """ + + if self._state == SQUEEZING: + raise TypeError("You cannot call 'update' after the first 'read'") + + if self._state == SHORT_MSG: + next_length = self._length1 + len(data) + + if next_length + len(self._custom) <= 8192: + self._length1 = next_length + self._update(data, self._hash1) + return self + + # Switch to tree hashing + self._state = LONG_MSG_S0 + + if self._state == LONG_MSG_S0: + data_mem = memoryview(data) + assert(self._length1 < 8192) + dtc = min(len(data), 8192 - self._length1) + self._update(data_mem[:dtc], self._hash1) + self._length1 += dtc + + if self._length1 < 8192: + return self + + # Finish hashing S_0 and start S_1 + assert(self._length1 == 8192) + + divider = b'\x03' + b'\x00' * 7 + self._update(divider, self._hash1) + self._length1 += 8 + + self._hash2 = self._create_keccak() + self._length2 = 0 + self._ctr = 1 + + self._state = LONG_MSG_SX + return self.update(data_mem[dtc:]) + + # LONG_MSG_SX + assert(self._state == LONG_MSG_SX) + index = 0 + len_data = len(data) + + # All iteractions could actually run in parallel + data_mem = memoryview(data) + while index < len_data: + + new_index = min(index + 8192 - self._length2, len_data) + self._update(data_mem[index:new_index], self._hash2) + 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) + self._length1 += 32 + self._reset(self._hash2) + self._length2 = 0 + self._ctr += 1 + + return self + + def read(self, length): + """ + Produce more bytes of the digest. + + .. note:: + You cannot use :meth:`update` anymore after the first call to + :meth:`read`. + + Args: + length (integer): the amount of bytes this method must return + + :return: the next piece of XOF output (of the given length) + :rtype: byte string + """ + + custom_was_consumed = False + + if self._state == SHORT_MSG: + self._update(self._custom, self._hash1) + self._padding = 0x07 + self._state = SQUEEZING + + if self._state == LONG_MSG_S0: + self.update(self._custom) + custom_was_consumed = True + assert(self._state == LONG_MSG_SX) + + if self._state == LONG_MSG_SX: + if not custom_was_consumed: + self.update(self._custom) + + # Is there still some leftover data in hash2? + if self._length2 > 0: + cv_i = self._squeeze(self._hash2, 32, 0x0B) + self._update(cv_i, self._hash1) + self._length1 += 32 + self._reset(self._hash2) + self._length2 = 0 + self._ctr += 1 + + trailer = _length_encode(self._ctr - 1) + b'\xFF\xFF' + self._update(trailer, self._hash1) + + self._padding = 0x06 + self._state = SQUEEZING + + return self._squeeze(self._hash1, length, self._padding) + + def new(self, data=None, custom=b''): + return type(self)(data, custom) + + +def new(data=None, custom=None): + """Return a fresh instance of a KangarooTwelve object. + + Args: + data (bytes/bytearray/memoryview): + Optional. + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + custom (bytes): + Optional. + A customization byte string. + + :Return: A :class:`K12_XOF` object + """ + + return K12_XOF(data, custom) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.pyi new file mode 100644 index 0000000..8b3fd74 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/KangarooTwelve.pyi @@ -0,0 +1,16 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class K12_XOF(object): + def __init__(self, + data: Optional[Buffer] = ..., + custom: Optional[bytes] = ...) -> None: ... + def update(self, data: Buffer) -> K12_XOF: ... + def read(self, length: int) -> bytes: ... + def new(self, + data: Optional[Buffer] = ..., + custom: Optional[bytes] = ...) -> None: ... + +def new(data: Optional[Buffer] = ..., + custom: Optional[Buffer] = ...) -> K12_XOF: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD2.py b/lib/python3.11/site-packages/Cryptodome/Hash/MD2.py new file mode 100644 index 0000000..47ecc05 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/MD2.py @@ -0,0 +1,166 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_md2_lib = load_pycryptodome_raw_lib( + "Cryptodome.Hash._MD2", + """ + int md2_init(void **shaState); + int md2_destroy(void *shaState); + int md2_update(void *hs, + const uint8_t *buf, + size_t len); + int md2_digest(const void *shaState, + uint8_t digest[20]); + int md2_copy(const void *src, void *dst); + """) + + +class MD2Hash(object): + """An MD2 hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 16 + # The internal block size of the hash algorithm in bytes. + block_size = 16 + # ASN.1 Object ID + oid = "1.2.840.113549.2.2" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_md2_lib.md2_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating MD2" + % result) + self._state = SmartPointer(state.get(), + _raw_md2_lib.md2_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_md2_lib.md2_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while instantiating MD2" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_md2_lib.md2_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while instantiating MD2" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = MD2Hash() + result = _raw_md2_lib.md2_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying MD2" % result) + return clone + + def new(self, data=None): + return MD2Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`MD2Hash.update`. + :type data: bytes/bytearray/memoryview + + :Return: A :class:`MD2Hash` hash object + """ + + return MD2Hash().new(data) + +# The size of the resulting hash in bytes. +digest_size = MD2Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = MD2Hash.block_size diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD2.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/MD2.pyi new file mode 100644 index 0000000..95a97a9 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/MD2.pyi @@ -0,0 +1,19 @@ +from typing import Union + +Buffer = Union[bytes, bytearray, memoryview] + +class MD4Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Buffer = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> MD4Hash: ... + def new(self, data: Buffer = ...) -> MD4Hash: ... + +def new(data: Buffer = ...) -> MD4Hash: ... +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD4.py b/lib/python3.11/site-packages/Cryptodome/Hash/MD4.py new file mode 100644 index 0000000..668fa65 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/MD4.py @@ -0,0 +1,185 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +MD4 is specified in RFC1320_ and produces the 128 bit digest of a message. + + >>> from Cryptodome.Hash import MD4 + >>> + >>> h = MD4.new() + >>> h.update(b'Hello') + >>> print h.hexdigest() + +MD4 stand for Message Digest version 4, and it was invented by Rivest in 1990. +This algorithm is insecure. Do not use it for new designs. + +.. _RFC1320: http://tools.ietf.org/html/rfc1320 +""" + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_md4_lib = load_pycryptodome_raw_lib( + "Cryptodome.Hash._MD4", + """ + int md4_init(void **shaState); + int md4_destroy(void *shaState); + int md4_update(void *hs, + const uint8_t *buf, + size_t len); + int md4_digest(const void *shaState, + uint8_t digest[20]); + int md4_copy(const void *src, void *dst); + """) + + +class MD4Hash(object): + """Class that implements an MD4 hash + """ + + #: The size of the resulting hash in bytes. + digest_size = 16 + #: The internal block size of the hash algorithm in bytes. + block_size = 64 + #: ASN.1 Object ID + oid = "1.2.840.113549.2.4" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_md4_lib.md4_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating MD4" + % result) + self._state = SmartPointer(state.get(), + _raw_md4_lib.md4_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Repeated calls are equivalent to a single call with the concatenation + of all the arguments. In other words: + + >>> m.update(a); m.update(b) + + is equivalent to: + + >>> m.update(a+b) + + :Parameters: + data : byte string/byte array/memoryview + The next chunk of the message being hashed. + """ + + result = _raw_md4_lib.md4_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while instantiating MD4" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that + has been hashed so far. + + This method does not change the state of the hash object. + You can continue updating the object after calling this function. + + :Return: A byte string of `digest_size` bytes. It may contain non-ASCII + characters, including null bytes. + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_md4_lib.md4_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while instantiating MD4" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been + hashed so far. + + This method does not change the state of the hash object. + + :Return: A string of 2* `digest_size` characters. It contains only + hexadecimal ASCII digits. + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :Return: A hash object of the same type + """ + + clone = MD4Hash() + result = _raw_md4_lib.md4_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying MD4" % result) + return clone + + def new(self, data=None): + return MD4Hash(data) + + +def new(data=None): + """Return a fresh instance of the hash object. + + :Parameters: + data : byte string/byte array/memoryview + The very first chunk of the message to hash. + It is equivalent to an early call to `MD4Hash.update()`. + Optional. + + :Return: A `MD4Hash` object + """ + return MD4Hash().new(data) + +#: The size of the resulting hash in bytes. +digest_size = MD4Hash.digest_size + +#: The internal block size of the hash algorithm in bytes. +block_size = MD4Hash.block_size diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD4.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/MD4.pyi new file mode 100644 index 0000000..a9a7295 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/MD4.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class MD4Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> MD4Hash: ... + def new(self, data: Optional[Buffer] = ...) -> MD4Hash: ... + +def new(data: Optional[Buffer] = ...) -> MD4Hash: ... +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD5.py b/lib/python3.11/site-packages/Cryptodome/Hash/MD5.py new file mode 100644 index 0000000..8f573a9 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/MD5.py @@ -0,0 +1,184 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.py3compat import * + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_md5_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._MD5", + """ + #define MD5_DIGEST_SIZE 16 + + int MD5_init(void **shaState); + int MD5_destroy(void *shaState); + int MD5_update(void *hs, + const uint8_t *buf, + size_t len); + int MD5_digest(const void *shaState, + uint8_t digest[MD5_DIGEST_SIZE]); + int MD5_copy(const void *src, void *dst); + + int MD5_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t first_digest[MD5_DIGEST_SIZE], + uint8_t final_digest[MD5_DIGEST_SIZE], + size_t iterations); + """) + +class MD5Hash(object): + """A MD5 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 16 + # The internal block size of the hash algorithm in bytes. + block_size = 64 + # ASN.1 Object ID + oid = "1.2.840.113549.2.5" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_md5_lib.MD5_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating MD5" + % result) + self._state = SmartPointer(state.get(), + _raw_md5_lib.MD5_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_md5_lib.MD5_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while instantiating MD5" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_md5_lib.MD5_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while instantiating MD5" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = MD5Hash() + result = _raw_md5_lib.MD5_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying MD5" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-1 hash object.""" + + return MD5Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`MD5Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`MD5Hash` hash object + """ + return MD5Hash().new(data) + +# The size of the resulting hash in bytes. +digest_size = 16 + +# The internal block size of the hash algorithm in bytes. +block_size = 64 + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert len(first_digest) == digest_size + assert iterations > 0 + + bfr = create_string_buffer(digest_size); + result = _raw_md5_lib.MD5_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations)) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assis for MD5" % result) + + return get_raw_buffer(bfr) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/MD5.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/MD5.pyi new file mode 100644 index 0000000..d819556 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/MD5.pyi @@ -0,0 +1,19 @@ +from typing import Union + +Buffer = Union[bytes, bytearray, memoryview] + +class MD5Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Buffer = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> MD5Hash: ... + def new(self, data: Buffer = ...) -> MD5Hash: ... + +def new(data: Buffer = ...) -> MD5Hash: ... +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.py b/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.py new file mode 100644 index 0000000..c03f522 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.py @@ -0,0 +1,217 @@ +# -*- coding: utf-8 -*- +# +# Hash/Poly1305.py - Implements the Poly1305 MAC +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bord, tobytes, _copy_bytes + +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + + +_raw_poly1305 = load_pycryptodome_raw_lib("Cryptodome.Hash._poly1305", + """ + int poly1305_init(void **state, + const uint8_t *r, + size_t r_len, + const uint8_t *s, + size_t s_len); + int poly1305_destroy(void *state); + int poly1305_update(void *state, + const uint8_t *in, + size_t len); + int poly1305_digest(const void *state, + uint8_t *digest, + size_t len); + """) + + +class Poly1305_MAC(object): + """An Poly1305 MAC object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting MAC tag + :vartype digest_size: integer + """ + + digest_size = 16 + + def __init__(self, r, s, data): + + if len(r) != 16: + raise ValueError("Parameter r is not 16 bytes long") + if len(s) != 16: + raise ValueError("Parameter s is not 16 bytes long") + + self._mac_tag = None + + state = VoidPointer() + result = _raw_poly1305.poly1305_init(state.address_of(), + c_uint8_ptr(r), + c_size_t(len(r)), + c_uint8_ptr(s), + c_size_t(len(s)) + ) + if result: + raise ValueError("Error %d while instantiating Poly1305" % result) + self._state = SmartPointer(state.get(), + _raw_poly1305.poly1305_destroy) + if data: + self.update(data) + + def update(self, data): + """Authenticate the next chunk of message. + + Args: + data (byte string/byte array/memoryview): The next chunk of data + """ + + if self._mac_tag: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_poly1305.poly1305_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing Poly1305 data" % result) + return self + + def copy(self): + raise NotImplementedError() + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message + authenticated so far. + + :return: The MAC tag digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + if self._mac_tag: + return self._mac_tag + + bfr = create_string_buffer(16) + result = _raw_poly1305.poly1305_digest(self._state.get(), + bfr, + c_size_t(len(bfr))) + if result: + raise ValueError("Error %d while creating Poly1305 digest" % result) + + self._mac_tag = get_raw_buffer(bfr) + return self._mac_tag + + def hexdigest(self): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) + for x in tuple(self.digest())]) + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte string/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, + as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + + +def new(**kwargs): + """Create a new Poly1305 MAC object. + + Args: + key (bytes/bytearray/memoryview): + The 32-byte key for the Poly1305 object. + cipher (module from ``Cryptodome.Cipher``): + The cipher algorithm to use for deriving the Poly1305 + key pair *(r, s)*. + It can only be ``Cryptodome.Cipher.AES`` or ``Cryptodome.Cipher.ChaCha20``. + nonce (bytes/bytearray/memoryview): + Optional. The non-repeatable value to use for the MAC of this message. + It must be 16 bytes long for ``AES`` and 8 or 12 bytes for ``ChaCha20``. + If not passed, a random nonce is created; you will find it in the + ``nonce`` attribute of the new object. + data (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to ``update()``. + + Returns: + A :class:`Poly1305_MAC` object + """ + + cipher = kwargs.pop("cipher", None) + if not hasattr(cipher, '_derive_Poly1305_key_pair'): + raise ValueError("Parameter 'cipher' must be AES or ChaCha20") + + cipher_key = kwargs.pop("key", None) + if cipher_key is None: + raise TypeError("You must pass a parameter 'key'") + + nonce = kwargs.pop("nonce", None) + data = kwargs.pop("data", None) + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + r, s, nonce = cipher._derive_Poly1305_key_pair(cipher_key, nonce) + + new_mac = Poly1305_MAC(r, s, data) + new_mac.nonce = _copy_bytes(None, None, nonce) # nonce may still be just a memoryview + return new_mac diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.pyi new file mode 100644 index 0000000..f97a14a --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/Poly1305.pyi @@ -0,0 +1,24 @@ +from types import ModuleType +from typing import Union + +Buffer = Union[bytes, bytearray, memoryview] + +class Poly1305_MAC(object): + block_size: int + digest_size: int + oid: str + + def __init__(self, + r : int, + s : int, + data : Buffer) -> None: ... + def update(self, data: Buffer) -> Poly1305_MAC: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, mac_tag: Buffer) -> None: ... + def hexverify(self, hex_mac_tag: str) -> None: ... + +def new(key: Buffer, + cipher: ModuleType, + nonce: Buffer = ..., + data: Buffer = ...) -> Poly1305_MAC: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.py b/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.py new file mode 100644 index 0000000..35ad576 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +# This file exists for backward compatibility with old code that refers to +# Cryptodome.Hash.RIPEMD + +"""Deprecated alias for `Cryptodome.Hash.RIPEMD160`""" + +from Cryptodome.Hash.RIPEMD160 import new, block_size, digest_size diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.pyi new file mode 100644 index 0000000..cfb2252 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD.pyi @@ -0,0 +1,3 @@ +# This file exists for backward compatibility with old code that refers to +# Cryptodome.Hash.SHA + diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.py b/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.py new file mode 100644 index 0000000..f959027 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.py @@ -0,0 +1,169 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_ripemd160_lib = load_pycryptodome_raw_lib( + "Cryptodome.Hash._RIPEMD160", + """ + int ripemd160_init(void **shaState); + int ripemd160_destroy(void *shaState); + int ripemd160_update(void *hs, + const uint8_t *buf, + size_t len); + int ripemd160_digest(const void *shaState, + uint8_t digest[20]); + int ripemd160_copy(const void *src, void *dst); + """) + + +class RIPEMD160Hash(object): + """A RIPEMD-160 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 20 + # The internal block size of the hash algorithm in bytes. + block_size = 64 + # ASN.1 Object ID + oid = "1.3.36.3.2.1" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_ripemd160_lib.ripemd160_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating RIPEMD160" + % result) + self._state = SmartPointer(state.get(), + _raw_ripemd160_lib.ripemd160_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_ripemd160_lib.ripemd160_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while instantiating ripemd160" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_ripemd160_lib.ripemd160_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while instantiating ripemd160" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = RIPEMD160Hash() + result = _raw_ripemd160_lib.ripemd160_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying ripemd160" % result) + return clone + + def new(self, data=None): + """Create a fresh RIPEMD-160 hash object.""" + + return RIPEMD160Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`RIPEMD160Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`RIPEMD160Hash` hash object + """ + + return RIPEMD160Hash().new(data) + +# The size of the resulting hash in bytes. +digest_size = RIPEMD160Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = RIPEMD160Hash.block_size diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.pyi new file mode 100644 index 0000000..b619473 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/RIPEMD160.pyi @@ -0,0 +1,19 @@ +from typing import Union + +Buffer = Union[bytes, bytearray, memoryview] + +class RIPEMD160Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Buffer = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> RIPEMD160Hash: ... + def new(self, data: Buffer = ...) -> RIPEMD160Hash: ... + +def new(data: Buffer = ...) -> RIPEMD160Hash: ... +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHA.py new file mode 100644 index 0000000..95f8745 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +# This file exists for backward compatibility with old code that refers to +# Cryptodome.Hash.SHA + +from Cryptodome.Hash.SHA1 import __doc__, new, block_size, digest_size diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHA.pyi new file mode 100644 index 0000000..7d01a5f --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA.pyi @@ -0,0 +1,4 @@ +# This file exists for backward compatibility with old code that refers to +# Cryptodome.Hash.SHA + +from Cryptodome.Hash.SHA1 import __doc__, new, block_size, digest_size diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.py new file mode 100644 index 0000000..dea51bc --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.py @@ -0,0 +1,185 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.py3compat import * + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_sha1_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._SHA1", + """ + #define SHA1_DIGEST_SIZE 20 + + int SHA1_init(void **shaState); + int SHA1_destroy(void *shaState); + int SHA1_update(void *hs, + const uint8_t *buf, + size_t len); + int SHA1_digest(const void *shaState, + uint8_t digest[SHA1_DIGEST_SIZE]); + int SHA1_copy(const void *src, void *dst); + + int SHA1_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t first_digest[SHA1_DIGEST_SIZE], + uint8_t final_digest[SHA1_DIGEST_SIZE], + size_t iterations); + """) + +class SHA1Hash(object): + """A SHA-1 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 20 + # The internal block size of the hash algorithm in bytes. + block_size = 64 + # ASN.1 Object ID + oid = "1.3.14.3.2.26" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_sha1_lib.SHA1_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating SHA1" + % result) + self._state = SmartPointer(state.get(), + _raw_sha1_lib.SHA1_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_sha1_lib.SHA1_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while instantiating SHA1" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_sha1_lib.SHA1_digest(self._state.get(), + bfr) + if result: + raise ValueError("Error %d while instantiating SHA1" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = SHA1Hash() + result = _raw_sha1_lib.SHA1_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA1" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-1 hash object.""" + + return SHA1Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`SHA1Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`SHA1Hash` hash object + """ + return SHA1Hash().new(data) + + +# The size of the resulting hash in bytes. +digest_size = SHA1Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = SHA1Hash.block_size + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert len(first_digest) == digest_size + assert iterations > 0 + + bfr = create_string_buffer(digest_size); + result = _raw_sha1_lib.SHA1_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations)) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assis for SHA1" % result) + + return get_raw_buffer(bfr) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.pyi new file mode 100644 index 0000000..d6c8e25 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA1.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA1Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA1Hash: ... + def new(self, data: Optional[Buffer] = ...) -> SHA1Hash: ... + +def new(data: Optional[Buffer] = ...) -> SHA1Hash: ... +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.py new file mode 100644 index 0000000..fca7622 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_sha224_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._SHA224", + """ + int SHA224_init(void **shaState); + int SHA224_destroy(void *shaState); + int SHA224_update(void *hs, + const uint8_t *buf, + size_t len); + int SHA224_digest(const void *shaState, + uint8_t *digest, + size_t digest_size); + int SHA224_copy(const void *src, void *dst); + + int SHA224_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t *first_digest, + uint8_t *final_digest, + size_t iterations, + size_t digest_size); + """) + +class SHA224Hash(object): + """A SHA-224 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 28 + # The internal block size of the hash algorithm in bytes. + block_size = 64 + # ASN.1 Object ID + oid = '2.16.840.1.101.3.4.2.4' + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_sha224_lib.SHA224_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating SHA224" + % result) + self._state = SmartPointer(state.get(), + _raw_sha224_lib.SHA224_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_sha224_lib.SHA224_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing data with SHA224" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_sha224_lib.SHA224_digest(self._state.get(), + bfr, + c_size_t(self.digest_size)) + if result: + raise ValueError("Error %d while making SHA224 digest" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = SHA224Hash() + result = _raw_sha224_lib.SHA224_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA224" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-224 hash object.""" + + return SHA224Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`SHA224Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`SHA224Hash` hash object + """ + return SHA224Hash().new(data) + + +# The size of the resulting hash in bytes. +digest_size = SHA224Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = SHA224Hash.block_size + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert iterations > 0 + + bfr = create_string_buffer(len(first_digest)); + result = _raw_sha224_lib.SHA224_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations), + c_size_t(len(first_digest))) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assist for SHA224" % result) + + return get_raw_buffer(bfr) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.pyi new file mode 100644 index 0000000..613a7f9 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA224.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA224Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA224Hash: ... + def new(self, data: Optional[Buffer] = ...) -> SHA224Hash: ... + +def new(data: Optional[Buffer] = ...) -> SHA224Hash: ... +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.py new file mode 100644 index 0000000..c1a81b1 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.py @@ -0,0 +1,185 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_sha256_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._SHA256", + """ + int SHA256_init(void **shaState); + int SHA256_destroy(void *shaState); + int SHA256_update(void *hs, + const uint8_t *buf, + size_t len); + int SHA256_digest(const void *shaState, + uint8_t *digest, + size_t digest_size); + int SHA256_copy(const void *src, void *dst); + + int SHA256_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t *first_digest, + uint8_t *final_digest, + size_t iterations, + size_t digest_size); + """) + +class SHA256Hash(object): + """A SHA-256 hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 32 + # The internal block size of the hash algorithm in bytes. + block_size = 64 + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.1" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_sha256_lib.SHA256_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating SHA256" + % result) + self._state = SmartPointer(state.get(), + _raw_sha256_lib.SHA256_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_sha256_lib.SHA256_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing data with SHA256" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_sha256_lib.SHA256_digest(self._state.get(), + bfr, + c_size_t(self.digest_size)) + if result: + raise ValueError("Error %d while making SHA256 digest" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = SHA256Hash() + result = _raw_sha256_lib.SHA256_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA256" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-256 hash object.""" + + return SHA256Hash(data) + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`SHA256Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`SHA256Hash` hash object + """ + + return SHA256Hash().new(data) + + +# The size of the resulting hash in bytes. +digest_size = SHA256Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = SHA256Hash.block_size + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert iterations > 0 + + bfr = create_string_buffer(len(first_digest)); + result = _raw_sha256_lib.SHA256_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations), + c_size_t(len(first_digest))) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assist for SHA256" % result) + + return get_raw_buffer(bfr) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.pyi new file mode 100644 index 0000000..cbf21bf --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA256.pyi @@ -0,0 +1,18 @@ +from typing import Union, Optional + + +class SHA256Hash(object): + digest_size: int + block_size: int + oid: str + def __init__(self, data: Optional[Union[bytes, bytearray, memoryview]]=None) -> None: ... + def update(self, data: Union[bytes, bytearray, memoryview]) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA256Hash: ... + def new(self, data: Optional[Union[bytes, bytearray, memoryview]]=None) -> SHA256Hash: ... + +def new(data: Optional[Union[bytes, bytearray, memoryview]]=None) -> SHA256Hash: ... + +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.py new file mode 100644 index 0000000..711aa73 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_sha384_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._SHA384", + """ + int SHA384_init(void **shaState); + int SHA384_destroy(void *shaState); + int SHA384_update(void *hs, + const uint8_t *buf, + size_t len); + int SHA384_digest(const void *shaState, + uint8_t *digest, + size_t digest_size); + int SHA384_copy(const void *src, void *dst); + + int SHA384_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t *first_digest, + uint8_t *final_digest, + size_t iterations, + size_t digest_size); + """) + +class SHA384Hash(object): + """A SHA-384 hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 48 + # The internal block size of the hash algorithm in bytes. + block_size = 128 + # ASN.1 Object ID + oid = '2.16.840.1.101.3.4.2.2' + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_sha384_lib.SHA384_init(state.address_of()) + if result: + raise ValueError("Error %d while instantiating SHA384" + % result) + self._state = SmartPointer(state.get(), + _raw_sha384_lib.SHA384_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_sha384_lib.SHA384_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing data with SHA384" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_sha384_lib.SHA384_digest(self._state.get(), + bfr, + c_size_t(self.digest_size)) + if result: + raise ValueError("Error %d while making SHA384 digest" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = SHA384Hash() + result = _raw_sha384_lib.SHA384_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA384" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-384 hash object.""" + + return SHA384Hash(data) + + +def new(data=None): + """Create a new hash object. + + :parameter data: + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`SHA384Hash.update`. + :type data: byte string/byte array/memoryview + + :Return: A :class:`SHA384Hash` hash object + """ + + return SHA384Hash().new(data) + + +# The size of the resulting hash in bytes. +digest_size = SHA384Hash.digest_size + +# The internal block size of the hash algorithm in bytes. +block_size = SHA384Hash.block_size + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert iterations > 0 + + bfr = create_string_buffer(len(first_digest)); + result = _raw_sha384_lib.SHA384_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations), + c_size_t(len(first_digest))) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assist for SHA384" % result) + + return get_raw_buffer(bfr) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.pyi new file mode 100644 index 0000000..c2aab9e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA384.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA384Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA384Hash: ... + def new(self, data: Optional[Buffer] = ...) -> SHA384Hash: ... + +def new(data: Optional[Buffer] = ...) -> SHA384Hash: ... +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.py new file mode 100644 index 0000000..34888c5 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHA3_224_Hash(object): + """A SHA3-224 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 28 + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.7" + + # Input block size for HMAC + block_size = 144 + + def __init__(self, data, update_after_digest): + self._update_after_digest = update_after_digest + self._digest_done = False + self._padding = 0x06 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHA-3/224" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data)) + ) + if result: + raise ValueError("Error %d while updating SHA-3/224" + % result) + return self + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + self._digest_done = True + + bfr = create_string_buffer(self.digest_size) + result = _raw_keccak_lib.keccak_digest(self._state.get(), + bfr, + c_size_t(self.digest_size), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while instantiating SHA-3/224" + % result) + + self._digest_value = get_raw_buffer(bfr) + return self._digest_value + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = self.new() + result = _raw_keccak_lib.keccak_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA3-224" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA3-224 hash object.""" + + return type(self)(data, self._update_after_digest) + + +def new(*args, **kwargs): + """Create a new hash object. + + Args: + data (byte string/byte array/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + update_after_digest (boolean): + Whether :meth:`digest` can be followed by another :meth:`update` + (default: ``False``). + + :Return: A :class:`SHA3_224_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + if len(args) == 1: + if data: + raise ValueError("Initial data for hash specified twice") + data = args[0] + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return SHA3_224_Hash(data, update_after_digest) + +# The size of the resulting hash in bytes. +digest_size = SHA3_224_Hash.digest_size + +# Input block size for HMAC +block_size = 144 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.pyi new file mode 100644 index 0000000..2180821 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_224.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA3_224_Hash(object): + digest_size: int + block_size: int + oid: str + def __init__(self, data: Optional[Buffer], update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> SHA3_224_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA3_224_Hash: ... + def new(self, data: Optional[Buffer]) -> SHA3_224_Hash: ... + +def new(__data: Buffer = ..., update_after_digest: bool = ...) -> SHA3_224_Hash: ... + +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.py new file mode 100644 index 0000000..024962f --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHA3_256_Hash(object): + """A SHA3-256 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 32 + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.8" + + # Input block size for HMAC + block_size = 136 + + def __init__(self, data, update_after_digest): + self._update_after_digest = update_after_digest + self._digest_done = False + self._padding = 0x06 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHA-3/256" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data)) + ) + if result: + raise ValueError("Error %d while updating SHA-3/256" + % result) + return self + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + self._digest_done = True + + bfr = create_string_buffer(self.digest_size) + result = _raw_keccak_lib.keccak_digest(self._state.get(), + bfr, + c_size_t(self.digest_size), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while instantiating SHA-3/256" + % result) + + self._digest_value = get_raw_buffer(bfr) + return self._digest_value + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = self.new() + result = _raw_keccak_lib.keccak_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA3-256" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA3-256 hash object.""" + + return type(self)(data, self._update_after_digest) + + +def new(*args, **kwargs): + """Create a new hash object. + + Args: + data (byte string/byte array/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + update_after_digest (boolean): + Whether :meth:`digest` can be followed by another :meth:`update` + (default: ``False``). + + :Return: A :class:`SHA3_256_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + if len(args) == 1: + if data: + raise ValueError("Initial data for hash specified twice") + data = args[0] + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return SHA3_256_Hash(data, update_after_digest) + +# The size of the resulting hash in bytes. +digest_size = SHA3_256_Hash.digest_size + +# Input block size for HMAC +block_size = 136 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.pyi new file mode 100644 index 0000000..88436bd --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_256.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA3_256_Hash(object): + digest_size: int + block_size: int + oid: str + def __init__(self, data: Optional[Buffer], update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> SHA3_256_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA3_256_Hash: ... + def new(self, data: Optional[Buffer]) -> SHA3_256_Hash: ... + +def new(__data: Buffer = ..., update_after_digest: bool = ...) -> SHA3_256_Hash: ... + +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.py new file mode 100644 index 0000000..26eeb79 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHA3_384_Hash(object): + """A SHA3-384 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 48 + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.9" + + # Input block size for HMAC + block_size = 104 + + def __init__(self, data, update_after_digest): + self._update_after_digest = update_after_digest + self._digest_done = False + self._padding = 0x06 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHA-3/384" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while updating SHA-3/384" + % result) + return self + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + self._digest_done = True + + bfr = create_string_buffer(self.digest_size) + result = _raw_keccak_lib.keccak_digest(self._state.get(), + bfr, + c_size_t(self.digest_size), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while instantiating SHA-3/384" + % result) + + self._digest_value = get_raw_buffer(bfr) + return self._digest_value + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = self.new() + result = _raw_keccak_lib.keccak_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA3-384" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA3-256 hash object.""" + + return type(self)(data, self._update_after_digest) + + + def new(self, data=None): + """Create a fresh SHA3-384 hash object.""" + + return type(self)(data, self._update_after_digest) + + +def new(*args, **kwargs): + """Create a new hash object. + + Args: + data (byte string/byte array/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + update_after_digest (boolean): + Whether :meth:`digest` can be followed by another :meth:`update` + (default: ``False``). + + :Return: A :class:`SHA3_384_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + if len(args) == 1: + if data: + raise ValueError("Initial data for hash specified twice") + data = args[0] + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return SHA3_384_Hash(data, update_after_digest) + +# The size of the resulting hash in bytes. +digest_size = SHA3_384_Hash.digest_size + +# Input block size for HMAC +block_size = 104 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.pyi new file mode 100644 index 0000000..98d00c6 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_384.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA3_384_Hash(object): + digest_size: int + block_size: int + oid: str + def __init__(self, data: Optional[Buffer], update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> SHA3_384_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA3_384_Hash: ... + def new(self, data: Optional[Buffer]) -> SHA3_384_Hash: ... + +def new(__data: Buffer = ..., update_after_digest: bool = ...) -> SHA3_384_Hash: ... + +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.py new file mode 100644 index 0000000..99b1c37 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHA3_512_Hash(object): + """A SHA3-512 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The size of the resulting hash in bytes. + digest_size = 64 + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.10" + + # Input block size for HMAC + block_size = 72 + + def __init__(self, data, update_after_digest): + self._update_after_digest = update_after_digest + self._digest_done = False + self._padding = 0x06 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHA-3/512" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while updating SHA-3/512" + % result) + return self + + def digest(self): + + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + self._digest_done = True + + bfr = create_string_buffer(self.digest_size) + result = _raw_keccak_lib.keccak_digest(self._state.get(), + bfr, + c_size_t(self.digest_size), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while instantiating SHA-3/512" + % result) + + self._digest_value = get_raw_buffer(bfr) + return self._digest_value + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = self.new() + result = _raw_keccak_lib.keccak_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA3-512" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA3-521 hash object.""" + + return type(self)(data, self._update_after_digest) + + +def new(*args, **kwargs): + """Create a new hash object. + + Args: + data (byte string/byte array/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + update_after_digest (boolean): + Whether :meth:`digest` can be followed by another :meth:`update` + (default: ``False``). + + :Return: A :class:`SHA3_512_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + if len(args) == 1: + if data: + raise ValueError("Initial data for hash specified twice") + data = args[0] + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return SHA3_512_Hash(data, update_after_digest) + +# The size of the resulting hash in bytes. +digest_size = SHA3_512_Hash.digest_size + +# Input block size for HMAC +block_size = 72 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.pyi new file mode 100644 index 0000000..cdeec16 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA3_512.pyi @@ -0,0 +1,19 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA3_512_Hash(object): + digest_size: int + block_size: int + oid: str + def __init__(self, data: Optional[Buffer], update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> SHA3_512_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA3_512_Hash: ... + def new(self, data: Optional[Buffer]) -> SHA3_512_Hash: ... + +def new(__data: Buffer = ..., update_after_digest: bool = ...) -> SHA3_512_Hash: ... + +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.py new file mode 100644 index 0000000..5066197 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.py @@ -0,0 +1,204 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_sha512_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._SHA512", + """ + int SHA512_init(void **shaState, + size_t digest_size); + int SHA512_destroy(void *shaState); + int SHA512_update(void *hs, + const uint8_t *buf, + size_t len); + int SHA512_digest(const void *shaState, + uint8_t *digest, + size_t digest_size); + int SHA512_copy(const void *src, void *dst); + + int SHA512_pbkdf2_hmac_assist(const void *inner, + const void *outer, + const uint8_t *first_digest, + uint8_t *final_digest, + size_t iterations, + size_t digest_size); + """) + +class SHA512Hash(object): + """A SHA-512 hash object (possibly in its truncated version SHA-512/224 or + SHA-512/256. + Do not instantiate directly. Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + + :ivar block_size: the size in bytes of the internal message block, + input to the compression function + :vartype block_size: integer + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + # The internal block size of the hash algorithm in bytes. + block_size = 128 + + def __init__(self, data, truncate): + self._truncate = truncate + + if truncate is None: + self.oid = "2.16.840.1.101.3.4.2.3" + self.digest_size = 64 + elif truncate == "224": + self.oid = "2.16.840.1.101.3.4.2.5" + self.digest_size = 28 + elif truncate == "256": + self.oid = "2.16.840.1.101.3.4.2.6" + self.digest_size = 32 + else: + raise ValueError("Incorrect truncation length. It must be '224' or '256'.") + + state = VoidPointer() + result = _raw_sha512_lib.SHA512_init(state.address_of(), + c_size_t(self.digest_size)) + if result: + raise ValueError("Error %d while instantiating SHA-512" + % result) + self._state = SmartPointer(state.get(), + _raw_sha512_lib.SHA512_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + result = _raw_sha512_lib.SHA512_update(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while hashing data with SHA512" + % result) + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bfr = create_string_buffer(self.digest_size) + result = _raw_sha512_lib.SHA512_digest(self._state.get(), + bfr, + c_size_t(self.digest_size)) + if result: + raise ValueError("Error %d while making SHA512 digest" + % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + This can be used to efficiently compute the digests of strings that + share a common initial substring. + + :return: A hash object of the same type + """ + + clone = SHA512Hash(None, self._truncate) + result = _raw_sha512_lib.SHA512_copy(self._state.get(), + clone._state.get()) + if result: + raise ValueError("Error %d while copying SHA512" % result) + return clone + + def new(self, data=None): + """Create a fresh SHA-512 hash object.""" + + return SHA512Hash(data, self._truncate) + + +def new(data=None, truncate=None): + """Create a new hash object. + + Args: + data (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`SHA512Hash.update`. + truncate (string): + Optional. The desired length of the digest. It can be either "224" or + "256". If not present, the digest is 512 bits long. + Passing this parameter is **not** equivalent to simply truncating + the output digest. + + :Return: A :class:`SHA512Hash` hash object + """ + + return SHA512Hash(data, truncate) + + +# The size of the full SHA-512 hash in bytes. +digest_size = 64 + +# The internal block size of the hash algorithm in bytes. +block_size = 128 + + +def _pbkdf2_hmac_assist(inner, outer, first_digest, iterations): + """Compute the expensive inner loop in PBKDF-HMAC.""" + + assert iterations > 0 + + bfr = create_string_buffer(len(first_digest)); + result = _raw_sha512_lib.SHA512_pbkdf2_hmac_assist( + inner._state.get(), + outer._state.get(), + first_digest, + bfr, + c_size_t(iterations), + c_size_t(len(first_digest))) + + if result: + raise ValueError("Error %d with PBKDF2-HMAC assist for SHA512" % result) + + return get_raw_buffer(bfr) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.pyi new file mode 100644 index 0000000..f219ee9 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHA512.pyi @@ -0,0 +1,22 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHA512Hash(object): + digest_size: int + block_size: int + oid: str + + def __init__(self, + data: Optional[Buffer], + truncate: Optional[str]) -> None: ... + def update(self, data: Buffer) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def copy(self) -> SHA512Hash: ... + def new(self, data: Optional[Buffer] = ...) -> SHA512Hash: ... + +def new(data: Optional[Buffer] = ..., + truncate: Optional[str] = ...) -> SHA512Hash: ... +digest_size: int +block_size: int diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.py new file mode 100644 index 0000000..5bde2b6 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.py @@ -0,0 +1,129 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHAKE128_XOF(object): + """A SHAKE128 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + """ + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.11" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(32), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHAKE128" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + self._is_squeezing = False + self._padding = 0x1F + 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 SHAKE128 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._padding)) + if result: + raise ValueError("Error %d while extracting from SHAKE128" + % result) + + return get_raw_buffer(bfr) + + def new(self, data=None): + return type(self)(data=data) + + +def new(data=None): + """Return a fresh instance of a SHAKE128 object. + + Args: + data (bytes/bytearray/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + Optional. + + :Return: A :class:`SHAKE128_XOF` object + """ + + return SHAKE128_XOF(data=data) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.pyi new file mode 100644 index 0000000..f618881 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE128.pyi @@ -0,0 +1,13 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHAKE128_XOF(object): + oid: str + def __init__(self, + data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> SHAKE128_XOF: ... + def read(self, length: int) -> bytes: ... + def new(self, data: Optional[Buffer] = ...) -> SHAKE128_XOF: ... + +def new(data: Optional[Buffer] = ...) -> SHAKE128_XOF: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.py b/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.py new file mode 100644 index 0000000..8c37f6a --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.py @@ -0,0 +1,130 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Hash.keccak import _raw_keccak_lib + +class SHAKE256_XOF(object): + """A SHAKE256 hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar oid: ASN.1 Object ID + :vartype oid: string + """ + + # ASN.1 Object ID + oid = "2.16.840.1.101.3.4.2.12" + + def __init__(self, data=None): + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(64), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating SHAKE256" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + self._is_squeezing = False + self._padding = 0x1F + + 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 SHAKE256 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._padding)) + if result: + raise ValueError("Error %d while extracting from SHAKE256" + % result) + + return get_raw_buffer(bfr) + + def new(self, data=None): + return type(self)(data=data) + + +def new(data=None): + """Return a fresh instance of a SHAKE256 object. + + Args: + data (bytes/bytearray/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + Optional. + + :Return: A :class:`SHAKE256_XOF` object + """ + + return SHAKE256_XOF(data=data) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.pyi new file mode 100644 index 0000000..029347a --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/SHAKE256.pyi @@ -0,0 +1,13 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class SHAKE256_XOF(object): + oid: str + def __init__(self, + data: Optional[Buffer] = ...) -> None: ... + def update(self, data: Buffer) -> SHAKE256_XOF: ... + def read(self, length: int) -> bytes: ... + def new(self, data: Optional[Buffer] = ...) -> SHAKE256_XOF: ... + +def new(data: Optional[Buffer] = ...) -> SHAKE256_XOF: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.py b/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.py new file mode 100644 index 0000000..5c910e4 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.py @@ -0,0 +1,138 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord, is_bytes, tobytes + +from . import cSHAKE128 +from .cSHAKE128 import _encode_str, _right_encode + + +class TupleHash(object): + """A Tuple hash object. + Do not instantiate directly. + Use the :func:`new` function. + """ + + def __init__(self, custom, cshake, digest_size): + + self.digest_size = digest_size + + self._cshake = cshake._new(b'', custom, b'TupleHash') + self._digest = None + + def update(self, data): + """Authenticate the next byte string in the tuple. + + Args: + data (bytes/bytearray/memoryview): The next byte string. + """ + + 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))) + + return self + + def digest(self): + """Return the **binary** (non-printable) digest of the tuple of byte strings. + + :return: The hash digest. Binary form. + :rtype: byte string + """ + + if self._digest is None: + self._cshake.update(_right_encode(self.digest_size * 8)) + self._digest = self._cshake.read(self.digest_size) + + return self._digest + + def hexdigest(self): + """Return the **printable** digest of the tuple of byte strings. + + :return: The hash digest. Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in tuple(self.digest())]) + + def new(self, **kwargs): + """Return a new instance of a TupleHash object. + See :func:`new`. + """ + + if "digest_bytes" not in kwargs and "digest_bits" not in kwargs: + kwargs["digest_bytes"] = self.digest_size + + return new(**kwargs) + + +def new(**kwargs): + """Create a new TupleHash128 object. + + Args: + digest_bytes (integer): + Optional. The size of the digest, in bytes. + Default is 64. Minimum is 8. + digest_bits (integer): + Optional and alternative to ``digest_bytes``. + The size of the digest, in bits (and in steps of 8). + Default is 512. Minimum is 64. + custom (bytes): + Optional. + A customization bytestring (``S`` in SP 800-185). + + :Return: A :class:`TupleHash` object + """ + + digest_bytes = kwargs.pop("digest_bytes", None) + digest_bits = kwargs.pop("digest_bits", None) + if None not in (digest_bytes, digest_bits): + raise TypeError("Only one digest parameter must be provided") + if (None, None) == (digest_bytes, digest_bits): + digest_bytes = 64 + if digest_bytes is not None: + if digest_bytes < 8: + raise ValueError("'digest_bytes' must be at least 8") + else: + if digest_bits < 64 or digest_bits % 8: + raise ValueError("'digest_bytes' must be at least 64 " + "in steps of 8") + digest_bytes = digest_bits // 8 + + custom = kwargs.pop("custom", b'') + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return TupleHash(custom, cSHAKE128, digest_bytes) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.pyi new file mode 100644 index 0000000..3b1e81e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash128.pyi @@ -0,0 +1,22 @@ +from typing import Any, Union +from types import ModuleType + +Buffer = Union[bytes, bytearray, memoryview] + +class TupleHash(object): + digest_size: int + def __init__(self, + custom: bytes, + cshake: ModuleType, + digest_size: int) -> None: ... + def update(self, data: Buffer) -> TupleHash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def new(self, + digest_bytes: int = ..., + digest_bits: int = ..., + custom: int = ...) -> TupleHash: ... + +def new(digest_bytes: int = ..., + digest_bits: int = ..., + custom: int = ...) -> TupleHash: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.py b/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.py new file mode 100644 index 0000000..9b4fba0 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.py @@ -0,0 +1,73 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from . import cSHAKE256 +from .TupleHash128 import TupleHash + + +def new(**kwargs): + """Create a new TupleHash256 object. + + Args: + digest_bytes (integer): + Optional. The size of the digest, in bytes. + Default is 64. Minimum is 8. + digest_bits (integer): + Optional and alternative to ``digest_bytes``. + The size of the digest, in bits (and in steps of 8). + Default is 512. Minimum is 64. + custom (bytes): + Optional. + A customization bytestring (``S`` in SP 800-185). + + :Return: A :class:`TupleHash` object + """ + + digest_bytes = kwargs.pop("digest_bytes", None) + digest_bits = kwargs.pop("digest_bits", None) + if None not in (digest_bytes, digest_bits): + raise TypeError("Only one digest parameter must be provided") + if (None, None) == (digest_bytes, digest_bits): + digest_bytes = 64 + if digest_bytes is not None: + if digest_bytes < 8: + raise ValueError("'digest_bytes' must be at least 8") + else: + if digest_bits < 64 or digest_bits % 8: + raise ValueError("'digest_bytes' must be at least 64 " + "in steps of 8") + digest_bytes = digest_bits // 8 + + custom = kwargs.pop("custom", b'') + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return TupleHash(custom, cSHAKE256, digest_bytes) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.pyi new file mode 100644 index 0000000..82d943f --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/TupleHash256.pyi @@ -0,0 +1,5 @@ +from .TupleHash128 import TupleHash + +def new(digest_bytes: int = ..., + digest_bits: int = ..., + custom: int = ...) -> TupleHash: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2b.abi3.so b/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2b.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..40cf664bb6b7068a84f1a19a28269813270449dc GIT binary patch literal 27424 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2s.abi3.so b/lib/python3.11/site-packages/Cryptodome/Hash/_BLAKE2s.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..04a1ace0a89d2c21f112ede4c0ae7d97f319e7d4 GIT binary patch literal 26952 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_MD5.abi3.so b/lib/python3.11/site-packages/Cryptodome/Hash/_MD5.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..b22cf365e3d0a6bad52864a2c54bc8e2c60ce348 GIT binary patch literal 32008 zcmeHwdw5jUx%XbPXHO<1%uGmt00ILBh_JXaoK|SSCg@~4%-@EpD_gpfl{l4>j z&-sI$XYci{-+FKBU6;M~ZE{E9f;l!JG~RS=mPWZpJtmT?3cegv1d?1WTT8@oq&7nG z+QUV?sFMy8;#5<5$%a8iDj%DE(QV3c%H<>{?Rm{|Ehg=>nK-ABa^y<)c(c5FW^`Jn zk=JC1O-oEz zW7P!qq49KlwDo%l7yUnEgYtCcvS$_fZX^ej?1 zvGqd>tQ)QXmE0}yByF|QKUCR$SmE1-n2d(%7g`{&c71(apeb117z_loKy^)BjTV?! zvM^9t)mXK*rYTs}Sh6s`w!W^aqv#CBai}DpjP1WWum^V8=Ffr3N*&-)qPC*bT z05*A~K5o-Q%%2%2fs)rjaa4}6(L;_xSW4YHtkFVo}e&Fx+8G5O?Y}P9W{-3RTq(YZ>~%vPI2LF zbgoGeKhIf&WaZM))D!7XcCLh_p2&GEHv(6u2+8P=z$5)MwOlz~iNKWzT#3My2waK4 zl?Yskz?BGa1pF=UJN>Q3A0}v;f9HXq(RCwA{4Fmy51Jf3Q~r#io>6b(=pLR6it_8I z@YKm3Y@>chd0GOVIx6$WDNjqzQwL=JCCbxM@YK^X-$8j=0-kzQ=AWfJE&WdIlKG!d zo|b&4wju9toB4eJ{x;*=luYjq_J_OI5Dj+|drrECZv(G(P^IACEcvH2QZnX}KXk_5 z{`VXF?cKUx9P%H#6ikDH4{w>62S{H zIsq@w5=RR{FSQ1;3R-J3e$##+!JSf)@kW8~I0^%~1){U{_Kf`nIQ)J@hdbq_j4rTs zwcRsq+0PDlfeQr(#7hOC7u!3MeeJW`_6~fr!J7f}1<^6$*zC6b?!O;-uD!tbqBt8m z)c&H|cS0N+am05>TtZp;kKMO_7&_X1q>ryt92s%OcT{vk^c8r~wtwK*LwC&$y(G@~ z&W-5sy(BK8R?FS5T235*^Cig(-oUdcVOQ;jY>h1Q9MA3n0E&0OD*M!=A z$3~p>wTq7s_NhNO{L@pR6YcFT)Z)m9Luivr5O}5iNU}7t$}{0al#!EcWNBJ~Ey~CT zY~)MteCv%UBf~mBe(i5DMo{&HcYgiWh)}0A#nk|ub|PWg!O%HrC!!87u=>0D{`P~g z`nLVU{wwVZh0)qCv<4CKSChr7ZF?QYslR+5Rp^#+I)jn}q`JFp?||;dPJa@*C~aI6 z=knV2_We&={n}8ww1gmi)V6=Z-3!LHAy!91$J!6M#0lTo(1MJ;A!?$%BM$ps7q7N1 zK(t;>ZrdSdPrulM++K0P_mSvqyJzs1&VTVPs)*fpQFQw{#7iheQzW(R^^GilWPRu( z>b9tHPIC5N|LHphBkk>nJRo33_JaNGFD4>R1@AupozPKn)^~+1-MpN@k zaC^$?8-H$$eQqyPGiH{S_$w|CgZOTJEw?nA8w=;eo? zIJ^7yZx0W3qSi-Y@G$TLQn9mY*;6l|-WO2sZqYfr?VgDRBgcGzdUqyXI8OEcTF=;g z(Vf@f47fb`z#Q`oJepe&oW@ zL>bn${bLWVSXqStb|zgoF3v!!Ie5_V92h$Hzmj|}O$8T@NyXFyPC_-pw&jDJ+PD;xckA)7Q z<3%*yy;ShRZ(v)-8KL^eO?XMbQ z-Ez^{m=-$fJKl1#J9MI@!|4y@_@;L>{=?sz5A%QWhw}YhPjq8l5PHLZ;izA9`CGbO z?mK@4O*jSW?vz5gdRe)Os)X};%R6@WPO`Z3c<>j8H0^wcE%=P@#p=)k&!zW%P`wM@ z75WaeeB^Ab^0zfaIG3%Qdk4;)5uNa-rQ6xq52^2X=oma(5VE_ZXQ4lJ4S+}c=oa7e zxj6WG4(AskHLH$_yIXXu3QjfPaK7E%ylCf(!53TJvca8TyYGB;D42cey?v&?t$L_X zYt6TZ3hk}=&QPJVH9t92m`p1&s?#nrc!vu-pOAr5f4$Vx!%(&f)xwIut#3Y-P|qfz z{rqiH27<;4W-yYj8_#2X5?-L}qm`R~XHRg}(&twb8T$B_1a(aUpFgD2A}OQVU2mj9 z_;9XSt;4xxVA0$un(x3$tbAzww2zj2D-Tld>3aRco*v%;xr&5p_m0yj%3GedY+mTR zxd@W0&YkDoJDx*H>)fJwp-)=6(cfM{)*pH;@3~wMQm=pKo59+`(CNG}hYLdg^iTgo zqa%;H!5O(mKRX{h~RyFAQ@3Y>tTsg zz+!M2*Mn$>m+fc=3IN*SUeIWV`;l}V{Gg}DJ)A=C-tj7m<-l8qK3rdfLjv~29vqf? zaR_ALur}8{rZ%GplX{VRj6K6WWJ*FhX>mGAcMwWX_Wk#+Xv%BDpHD;-PRLRCb z=okj9KlBeQXAc!5Tf>#&6g6ZYBUeS28nR6{$N@9}I(Hs#ZuCyPpEc}Dyb@kac6_fvcinM3wYHDpiShTbjXF1pNd+cXnH%DwY0 zxQ$`uQNzlqhSe@O+qDUy4v$Xm0;dK*75w|`LH~>1gZ{n8)%6AsJ~bZS>^&aIWAuY( z(BF7G-US-{;BF*czc?2)9%(4%`*)rX&O(zX_zt*J93U2Z+$oF9?%+;YW_Ag8%FU`< zq*UjEr@qLYQdblke;Rgb%zf$oE(B=-n$9VE-4Zk^=5H8t?aOVN{jCzuc&Oq)~^1lh)dO?PFUdyipa$87pq3q!3 z+c#wpM=43Jl3l$BRFxbMt3j=YXfUI}J!ZeO=^k@W#x7`gkJ+8^s7xQucv`04$v7a> zr!tNr?YiS^Pmk$Wm;Ixj9_f-=fXr(b%3LLD(BV4lErHs%m@S&h>F9a~dl#RNQB%dF7WHI1KD(cD;DRp-s| zPMxgWTVFXP{6r2IJ%&?H*(8U!x^Qji$zPwo^!sPOzM*8IM-0(t(6ebg)Y6Wg?&)bj z>Om~Oj`YBVo}S+$eHyV&qwaFCrzab!2Wb(~tdDzoP9n|yC(1E4b|D>&ls00i<3xV&xl*{;#|7kwwJ9;ev%ig2e9u(M=C<9-RSbP z*fzSHa}I*P#Wn}JseW%`KL8#N@f5f`Hv+#0B%Rmy0hiBWA$zZFHu+r`$L|7HuI-^d zuIzkQR-W`8obY}&`BVUWPA|MLsUR+V@X#y2KJw}uS8hwfosN5qHv3ofd(jqI@Z}!V z-H$eu&w%Gg#9*7SJ?Bc#moe}kJmhz66D|6kHmc77YAduaKY#WE`wg(wz~r-S*&ec9 zh^jg?=h;^MK!vUK%084RKsiLa-(ZE z+PM6~OFi|JU#+hD_?^I9+%uz%F5PH*LY31kIojmiTBLY0R&MDkr3cS)%QX`vrafV1 zt?SAJl^>|mY-Nb?UCI&mljZ3;mo~PC`#+}tiXZm}WS--S%TJllR^_;il6lKdQ{Df! zBfrlcYjCQ(2-UPXDqW`1YL#wK>76S5s!HeP=U?v~jW@!_czs!!cx~1@F>9hP%Qq>@ zJG!{4((5k|s)F%8-x%#W*fpEP4D4$4T5EzU)*&P2~P0?#5DO4#kY+cR^@Hf zF#559^ro)vOc+CnaC#u3+Y;`koIQb_?(4$QPlCoUBzC(|Qx}AQQHV0biPAxU9n?e# z&JD!xG;(EZ8ZC&f%6G?oB#@secBLm$FUEGM7ra) zTHNeOMA~PaCIT*^v_5N^t2ME@FPZfuy$VE>yGTt@(ss(MaglVHmP}fSsjsY|mP}^H zaQ+6(HW#$0&|d`XAl&r`4#q6kdH`Pl=_bM*paTU*b3KoPF;wARm!xFozLq|%oNCR3)p)Gr|~mI@EK5c`(9cz7}f zM4AucV3|&tK47CQ?K`GiF@bjhxPw3+fh8j6dVu8UI|SyCc&V703$P3fbdM?R1WLp* zF@-$o0PrmK{xoZeGU1^>>Gy5h+MjN@0JzEoPHr7gqlpzFnS{nd>qzYVe?>fB5Pj!B zy?)=BEdz^y4!A`V>qK9w)RV}Du&0aR$YC=ur@RhekSMj?fn$m7b{v<8TrE9Wu^hoL z_%Mb=OTQ{YK{~9Ff~`>s245SYAhH-{6P!~}tpw+{B~ATAc9vyOBs-5=OC1dcG0SX= z*e?ad!(RvI5ZovvmT?qzQ97g&FU=#HLuH}_+9^`0*T8k*GxfxNDIgyH2Ijo9VJ6FX z(lZ1@*^NDoVhXug)KYr^d=Gnns*#vvHOd`Vk^H@ULeUz?=j(+r^k;xqVqc7X=#x17 z4f|iP4gRYehe9J0)l)(=@Ht~q{k%^Z-dRDSEHyCjEArfO-JS|h|}0L zFIn%;rz?%_Q;GzUJR7L=U}ypiVwWD&f~Y2d*rW%Ckb55cF!CT5if3W>X5o;jbPCN& zQOFR6opjDcQ8o5T>_cbb(1yJgyEfu`IOZxT0%#NCMB;Uj8~GfNkGEF-R0A>RyEr+trWbKmiF* zdIowk)-@3@ih9VXuR|#^6RCl(nMUH3ky4Xi^kVl!fqD1^fx)}Ru zk9hb4a7>T`;V)yz>7Syxeu91Q3T1#MS+s%v4^awTYe?72QWvkEipVlH@$hmqqp9oV zYl!|BdQM}{qL}>9jb5YB0L2d~lYk;H>^6ywF)?v>=SnJXVdB%nL5PMc7kb#73 z$62uq`=m{psCSVOOulzyp-VI*Qa>7pFRaGUS61?DN5fW4Sd$Z|KUJBXjRukI0aYWY z7E|b@gW6*9J}G`*OZ8bFStE;x20s9A)e>M!6pxtRDCr;}IuR>iwm_M-9N zT_P)~O~ezfrh*r{oKF4(;uv;0p=DEKvXmNOQP3hcn%tJ7`Q_xc z0S_92*yZH52gD=vt9;C)JhM`ja1Eq%Va8X>e08fdCR$>0wa{(m#oO{24T?ALMPVVWw2 z4nWZd@aG+Ja0D_B!mWF;4;_!p+aUgkefk1qH1v?6kQufRnW^w63;VDY$b1>Z4(!)c zt6oqeR%p2p5SLP9BX*$pdF-+gZD6^CjHb;X*KW2>kW8tS0nM1w!yE`?W0xLo0MSSp z^6+U8PhlUtMJf5r0NI?U<*9(@RCtj?3(39M;l4-_qg<&;x@(B5bYP0`ATG86n(n$j zX-3lYqXl>?J~B8bK)4$J9d5NYaC4KqeZ;beW>+O`@`lNJp?3h^#x71CiC%v}+?Pjq^5@ z&P$y<$c74xv0{qe6V^Xg=~rE99Gw8JQ(6@^UTIa?%veQHjWaS}CsVrtJ-g0jjt&gCuVLoYwO2q1@v*Bfj`H^cXg;Egf(i8v!3mA) zCRA2!2-ervHdO`3`?4l9*4GCoG&eO)z?ZZW)>c$Z*pxjrFm>|y#;VG7<-zf_HFeFK zCV;P|uA;WNvPzS@oT0Z2@J0eGRMl11l-E@?HD%%wS<{+=m6cW1ps|7kjcaw#IPc;! z;F`L%CT)H+%y=d2n{>{a=9=2z_?kNN&XXauL>sSk^!GJk7^$hL{S7yW0jY*?=*=S2 zaJ^?F+-kTAjf9&F!*OG(VefCa9Qwwm47;9q!f@#ucMB8%KZdQtg~6UXbEcoB2n>6`Dit>x z$qs$iHw_~#4V23;ZZQ&{L-7eCS$};i$r~w(KMUzV{Yg=649NjUnK2N6Bv%@JBu}%E z=$M&lIA@U3`dx;h4-u)Lp(baS!*+eD-Dafe?NY5B6WA}se7g<#ocU%>tfbj3(K$i# zUED(E9oy}~NOS1hZ32Z*B?gv3ad5lyZCKMc2*U#~F~>HspW{UYV+EK6*{?;Vqg$+kI4O*dm1w>JhG#3tX4Nt~aasWC29zg* zEhc!Y4UZo5qH`sec^y|nIjp1@#*GM%aHKjm5<&{ay@u17Y8bm6)ke~OXzBlyk>o~T zSER{)lIU1#3<94!N3+>Q869$rL?m{2$neH@o$k`@rMSw;x~;XhyG=ODme7CG9!7OAtuc4 zgwSo6Aw~N9Oe7wC?R>;wkfh#LltZsXLpai(4a(3T)V9mmo8jFp$KNK|fl908sOaO+ zGZA^c*fvWz9taN$biVJwe2V_NtyWBY-fG(ulzKf}4on1zNEFl;!S8Qh-@$L{7dxo&ZI?l+P;jWp**Bk=(vt-?tBmZLRI zj@V&u8EK0i+4IPXxB{GN^Vvol2S@6ANK z1RJamuBiz&X-(_u8-v~`3*lF5qh6v71mr@rrY@j2t5{xH8IWFB_AAzvH!7c~X5_H^`J3vRMm9#Vnlury zg7NaEb@U59`01S5`tr&^b9S&EMYT1-Abzl?dFtd~eYTaGG%+GaisSs84k@Hx;lag# zCjF$}i1Oz9rhT4=g5L4#@w-10kp!FTs%EaOLQ~dMAY0y8v2G@=BgRji>>a<>JAUyb z@A&GCjpYp+kQU9$*DB1P2BMl}qhjkTm&!WHrZayBNcIb@wyHX)A*9WJ*=l`@&H?x6^6DU)**WY=($b`R%DEyhwN*G4h2vDmb?@e(%9x`nokN!Bg25+)QACL?!>_$fPS{W#aPPZ zVhdWzB)j|BKJg>!JWELtlkA91YtoozH*{Ksu>*_3vP`lgB+E2AC1uSpMj!d^@Nd*h zX$Uft3Alexo4~7BF&myWe(sGetWg$hTC?^OMNgy$-`Ip!#N-VMnyzh1-fh24yLPiS zn5b(vX}j$sw`wDkzr6Cn(N|4NOUp>ci-$df2M#dP0mHBMjvBF98@Y#7JP_9Ys3JcK zLk>JLpshls@ZnZPc7~y&iX4R}!?cm7ifj!-4=D0n82Ut!3-QcY36?7I@i6o=MRr?I zNg_QW#GAW-aL(q=q@b39{#c;x6 zEMoFa3o2pq&kC|@LC8w`|N21)n@!uHI>KnHT~;u;#ez!iR^&Tj=!_!gT1{25M3LVQ zLqAod%W9XBA&RUGLz@+O*n&#mR^)Y7yOhpUSD{53_s8-_knWWLo@#S0brZ3`-T zN|6pLwng;Zn6^L|VzMeK+}l*H!(uFD@ zV)EZCsF=w+6lB+^CGS@`dZ~mqwB&h3F0^_YFzhG}huB7YEuex}F)R_iUHH-~83 z5{7mv^3P%DT}9?t4Z38WBEK7keyB(z+8Vpb-6G#q@k z<}}_?FU)UJ{C3weYr#;;Wl*!*I$Xq9J?kV|p4+VB9lRr|B$;i1AVMZp;SWqdG z{Pxpj7h|~B5#G20D=cqIn0(EGmNCgLlkSo|ocp2W#4;w?Ws{L}>@{w6F?q_8EnzaU z0-t^bikA|Vk9C%>#g`O0#nN2NWT6F>HYoCT3o2%^#ezzhyxW3G4=R!?5cg`0-`1m7 zc4)io)mkhg)}W?D#4)0|)+l}49tb2i0#_SQiE@$a2#71d?E{EOZk*_*;%b61!WEPJ zREL)Kc4%pDhnBKK+~Ys9^M@T;8tV}KOgl%0J3=C^5Sxx--F(#^w!TV*C88)+6Hd}L zwQ2m$A-}Ci(*b+^pi)H`(+^pgZx7SovapGJn10;CChcLG+rXwxjv_JRR&;k9FHz%X<2Ve8{%2o5YN(v-j<@< zkuQ-SvMv-$nH*w$7jP4kBNb%Mmz!s@lPYpQwIUc`^5+(`jLDZ34s;)Wh&3JA)h36DV(RI zr&XTk-Pq9br1X@s^JA6rBo)ig(L}b{V&(bckH0H9el?rrWBK`xGpD~+`uRrTYIQ4+?>)!L^A}2-{#nVNQfVwd-vW)* zzfal8RW~#FE^Vwl-=dtP_@}CrZ&}9j^JB34Vjh9<6PI56>QZLy@Ys^io7XYi`Tr&82Yp>W%$1;q+%Z)74@ln!heE1N%>GkMn-bMX{C{U6OLZ+(i}!u8j<2ry|Ii_+kpZxp%wc z`v{32jp-*N6wcrAOC>l=!!9D?M)qjS$1b$q?RX1tvdg~Lg9Ql$zMC|2QJWWy#O!3p@h-`Gt{^ zJ?aq8&-0SMcfZwPK*Z^{$ufYw$I)=f-@jM?9H;Qu{+tI~-Jyx{aVcZ)=hW|~8_x`_O?2W_(?j;|cl&@M7zJkn?kHU*pU3%C_p z_#c!7g6jhn^e@WjC9BH%z}njSHRZK|%3ytCQ=q(glSc1g)m8lOLRSY}OAW4Sck>;1IL zpgvffQ=GT3Fi^Otfc`66pt7kRuX)u~;(e|_!HPwB3-P*CAb_{B0)>9X>Mtk;g#XpX zLUR`^o}ITKuz1d#rG+JdlDydq3Ip=Jx!hd-uW0nI&_3;-y;(1w$@oBh#J_Zl)*@fh zQvc7*e2*)-Jm&w*neWbpS@7@KNQ3%mN+RRDmL_eOFM>&@KgWNe3tOP7k^=cp=(NnH z&Fh2ZYmf#T&2$}8b@joj%(ZpRne?7t<@lOPP3Gh~aha8y>maGgG}vgCY^Z8%!rOjP znE=Wft7^-MQBe(eTP;&s&kR;=0xkd5US?xG{^wn}mRYq z6Hp-CDPLbx0T=3_7>7)0Z4KT!%tYT`k1h?Ssx{4PAzogG|Eb5>n!0L|H;dM+X{_47 zIeg<&#WZ5WB>nR~#jiB+(ENW%=}b*eUNP+D#_L2*GZfBA?D8)Y1^8LddX`_U2u=%> zAm7@;M~YEfHgcG4Ec?9f%W4vN)S}W^1LqQ^a;ht_G9Z`r{rfVK3+d_ z8Yz!eVz2mZ0!A^xSFGm7=L40-uJFj$$gK&PNO@k5bGj{(8FY+#ZEKADql$sk!?b{l z*jS#S9Uvm@^Y1BfiZfi)7VH1rN}l7dc@?`#i&U1ASo`;*fb6q;k=Nwpw8YF>$5{K1 zq9jtDuPZq9vSOuy+n*Kw00f1I`vlx=~$g@8Br5@^gEYH_H{C|Uwl5%VuH@3^|@CM2v?eq1~$q7??MHxI~hCoCqDnt{1y{pAewfjK_=SV80E44#Z0SmTTz|!K!TA{nPi`8wRSV7ss|9S5{&pVTuNub;Q zcl-POnfzwn=RWtG_q_MqbI<#}XYS41Q@MO`ifvnb`K$$&Y~7phG392*b8i^{QEru5 znfRP&6}n|pqq`E&x-^fXw2WS9!!NtccD#IftXGec`=y@SUWvEgijxP-p-{%w6H`vj z_v)QmF;G^ec-z%RvYu>8z5E5<{`~6)O149p;q7*96gx|ezIa(=%2B$<1g`pLy={U= znd6F=Aybc%^=eShbhRllv|zW_n)U|kmkeV+rRiSx_(q`#AKpu@Z?J~_=AQfa%nQ8q zYTEig{mdm#E5fBp8Jb~ zzslXXy=%%}?|JU=kBxt1vy@Brx)0=tBs<1{D@elM1}<57u`5~m&kRz2`XJ?(gP(|Z z{OfTLBdjdz;VZp8H<|*s8~&LqJc8$=&E+$r*M%uB`$t&W)(evjVMMdbXIZO^o+`tC z!tgr{zsK-T8~&KF=aAv8aCq&8uFh~zZ)pO1U*t@Q~y|t~lr>nR` zwpR<9Z7o^8v|>?sdU0T;!s*4c03P$L_zZB~Lc%GL>wtp&3O1^HmO_y}w zB&AqC!?wIQpU7C3SIKZsT4uf=f6OS%h~v3^boE>^uUE4xX=R^df-A2 zTb`d~s+rG1Ux;${Eo_(a?T=vRn&P|(_ls55!@--DMm}7V_p6=38-oqO`i8m_d0jUYY`du- zv~5Yowk4_C?o7=azP#u;&^MLLSdtO!-#Ki?lI+m7wIz}IqGv;aJ-&EV-;(^i;VX+?1-Z65uxHyn`M!@9?TGZ-XM)@Ag2J|<=O*`}Yh(!5{Va=LPmw+WjHBKd?WD z9s7g*{n>$&LHp%UV1LLyTp4+>f3M%(+uuLT7b4z=@FkS}<|~&Gz?ay2ZX1v|rn{(p6b0 z`$TaT3c?ELgV}GOAy(4QxKoZ9ZhbJ+SpOuk{e@dKVg( z^p#~*Mm|6j>5Kcy@`91?1p~(`10TSEV`#Rr@6tKadB;ML!~J_RLw%Q)h9YNS#Ct*M zfpAU^TC${w^d{>?t3uHaM>ph1hXnKf-@>o z?Ng!1-oD4KmOVHV&!XXuldcjgggg@?g+D5XyY9?~y5{m7Sr0)E#EO z9>RIum2>i-y(^Tt+o+Jy7&r(OZ`rSgB(cQ-1Zrgi?otUEyK(i5$F57ybQ_wPy<6JemetM7ilvHTgdmI>R%LStP< zQtNhj*5Tk?>ni&myh^Qu@keN3?qC)^AF_7`Bd7Xz=LSz6un$&dz7Xv{4CGfsFzeY_ zpV_kYX6cLmUD@_7vA4o>VrAq7)C*?5+P@p83x~Ti6gd?Nyc)!IsPGt$AT1O)6|_&; zdoW^xazX4#$9{WX1v*mH79Nw$eheqMSWx;{2$uv-f@yO{;R`NzDj3<1Q4L$Q`*&mRfMq9WF)VolCdZqb9dGVSiRR`RbFVVS>>OZj zKaOUAt;Yu1ngv5~9%8x|v&>1cH>Q&ZGx?b$CSw*G*uw`rlW~5FUS6>h2l`gfJ{gMa z2^_)DeVUB?)T)`hcKqi{$~Rx3QuF|@a6?f(Yw+y#ARAB1>OxD3>Cf@khxnf z-h*f=8{;=>@JqOE3s2y>JS?-u-V9g>dt;0|5;$FW(4Bh3$k$|cf)lWhW0;vXFyvnh z748m*Lor5X#TxluQX>~*elQB2Ni;HjfRS$uFmf0CNjB`n{FZyy=)Z&5W?o2c{&ofu%2Gi7!;!GA( z2AKS;XR>FmOq$pa^Tk~D%K_==1e2u;V@-ZH!DQ*YfhNC|XtE!L%yecC$7kZ`=Gnb9VWa{eQg^oUC{~9OVl)ykfR2kS4vfmFz zWP}hUp~~!8N)wT`mQ8a7R0LM<^4K0Zu^RB>L)&9pfGn2W!6)c|EWT;eM#_ zL;EDq&SCb;k=GHHoAGT5z7_a>;jX~z7=A(fVC4H4huN4-BtkI-j)VfQ7rq|&zI%#4 zM0C-=D_4TK$!7nv!N4o7n?=xo$qI8+o?eZn$TKoUiNk*dXEx-9GKk3BE76od@P0U0 z_zKFoQ=B`6^kd$AP2vhEBU6+(X_;BP*$$1s?Ht5enWoHJAAB{er>dwmL9VR^J$5zU!yjWstd z*4&-R%=O21D>`1f6_?rDcWk%|!vb2RhY^N^BHs%I`em#aB42|441BNBK8)_Z{QBS4 z{hhrJ)61Sbl)x1!bF-2`^KK`@&6CPukeM6#+wGF!pFhazx-d;Bu{y_tCcm%S8``66%(C4OY@jvSCM=>X=B zQ06h2prinH?UZ~>hM+_*$jDq5{wiF%%pI;0X~v6@BsFs51^XbP17oUtgpxrW!Nn-y z%`QyB2m^i%uP$RhYU?W~bWCF@xE9RDZw518VM7R%11C{thdar=A|4wN$8N+c=8&-u z^N`Gx5_iLDm~0Y0b2QJ0(oC7=Vr>?K(7j1)ek-`QVwJ2{dA6hb@`hIwV2%!Dx{|6=-cbbwk3GgJ=q;>>8@Gf&K;=F|GC)8Io9@&-snwt=X0zdcWEq^HR z(_sJe7!vzrW$2l}@u2;^Py}3mZa_S-X&c!TEPFwsBuV7G_U%(xEjkcwJOdEc1U?A) z+KP6{y%)XhW!N?0}`T5Gg3vNHiO2J+%K)7pV$831dQ@)j0N82+j@>}oV zcK3gGSkQM{DlUtV{o7DqY8F;C6~_qd$hvyx~@) zIzOXD%M&4_vb62$=ct7v{ z2fQY$B0moPOS#|&e%O1>wneKdBfkw@{U;E=tm^xyuVCq%U*0jbD)Nivk)I!32Icmj ztm^-nugdZON*t$l_Ijom{U@qCfBcz32&aQse~sX)_wjyZ?*QH`{Jn z1x@K#5Qn(IYcO&EILxL}i`=HFuynoZzMXdDhqAT}>*|YO*~%hV)m8+H))!Up35_ba z_r6o5ch0Wb7AhKB75UZPP|+&)6huNrjYpq9diE@KNFy_gB8zak^M=nrXK!wnCHHcS z6RmLc(6fynimh+Ae#>@8@(XTCVI2T?Qdf-A2T+7a$*l zd>8U5$W#P$A3b^Y?0U#IAn%2gd&A{r-&JeboAd2)+36V%gD(PiDc)Z`eD>@rNGmsg zaqie(!{1#?U9OZTOY&MgV%PR729+_5NIk(*%^pxP(!{^)NIYC>Aq<>ud)a(iw@Xm?Q1 zVw4d(pThggD3dQ`Lb>_Zfo}tR9`DD&yZ26`?n5ci9ov3L+YjZIrz{(mTe>L0imI&M z+|tDfbmi_nFa2QOe)s<3YtSzl=ttfgJ`?ShgR2MU-k-fJH~-@)!Q8R;`Ih89Y^OXl zEO#spAefs`nYA)^>|zh@cFjc93$F`3aG?h-^uUE4xX=R^df-A2TXHtqbfDTnVX+!xzBbJnwetSOJX#ogm!KOQsNADZL&z--4pb7@rmj|e`` z9^cq(HyO69#YWy}EA%dMd;I6#6jxQqz&E;tHn7K=ZwPkv!Pz z%SbN~VQ0w7gfAssPL?k<-Q8!WrMaYk1Vn18zoWAk75vLl#Gm1_({ezk$teT5#1-jR zL!@UsgwKqW6j+~HGPVpGX%FKgB`9iUT(nGxCxn=YkJM|&Nn>eW!$;;idsgOIfMM$_ zdv>lME9(~2vaijR{bPsSx@nDN&&|mLSCAz-?0LDOZPG$nw-Gxg;vT3 z*tW}j@~}pl@Y#<6EoOmKw_2W+RstrscDZF=KSp-u)?!iSCJ)wuU1K2FE*EBh1#13G z)mUkF0_RyZ~e*yExJ&0YGgDb>) z+*WK{2e4EMUHT5TWZ2qE?aVZ&xhw@^|FTnHt??f<+HS?QFdq9R*bOOnV6=QWhBq8W z>ebMP)izYjMj_WGcOc|jX$w(#)O75(CwU$7@RcZm*NvXA?8iQZB85HOtEEUldd6-j zY{L`w*sPF!c0H6!KaBb|>exO{PyGKGupe6qTip)!*;A$7U8u4V@6jEdQmb6{pTf2b zh0*KVUGh3PeIG|h-G%qWpNM|HJwmR9kSn`B2TDivKxKM{Tr8LWxwP_B4rd~Fu~DeUK8Gp1NJfDD)HQMdtMFcl z_oO>5`ybs?|1Px2o-1Sp&;G~ZV(88IFB6S;PpY@2GPUF!1cu!g+)EJ?TVIgoc-jhN?T_V)cxmcmZds3xPIG z@2jr*A6H>h-W5W*>VHscS^rrBYLQT``uCdA&v;J?3FWGvz1p%Kz7h5dmja_lFRLj#nNLv8!f8~ z?}Be$fm(RUD8PyFov?8kO}-af_I6iQ{6Ds^AM3&;QS=McvA16%_&Ml#3hzmx{x64% z`sKG{1r_frJEhp8<7Cdt^znbi6nxAyDpLv?wF5GUGSj&^tSL80slX`T&!hzSz%?#{ z-oOGW3vHrdO1G4oG|HEQku9xG(pD!e5Dw*JTAq3cA1}!!4sEzSDR*R+FLzvS!$rgG ze0b56F_tfPZq~f4Iay0F@O(v9R@MTPfcr2o0|PA&EN0FtEGd&NTLLn!fZEKFc2<_B zzy>!g2cD4nN>M2bgf<{VwrwvRDMfP%p>7(O+?g?T;5cG8FC7L?P;4)}m`bj^c3Z>ziZA2-Rqx|b>+q0zL5h-Rv8sf54T68mydn4!c{oh@7V!8OGl<$^o%8eaBcoi=Om%DW2OhmYsTxJJG*4oci_!};2%xd!AlqKem^IHM7a;cPv z-Fcbp!~_-DYU88@-2R&I$*s1PGIo0fS}foWOuhrG#=eQta-7MR7u(Se9B|M@<^bIR zU=DhcIi6VV3ZpfayK(@BrYCFvqL`ei0Zm&Rp-PFb-ECHSk$`fNcA8ZVo=(e^Z5v#1`)~t!rcNwC;7&+S>2v?dn?J)80EZ zP%^E%tE+d~rk?I;`2R1{)~;SXZFA}D@a&mWyW88=wf0V3-_f~g^E8y}=v=*iQ(L>` zmgR<3yR^D;MF{_?rWoGOvf4Y_I$As1dwPlyxna)gZEI^^1B_V%7=a_O%w@gZ9i3~5 z+t9Ly%WmD&vA%a|N2m9%qx`m&nL;n)d&;)`{*m$;<d#r~AMWd2 zpH=41Oq-8z*FVnoPqqECZU4pjrk&wwzFym{(74P${yNm}f%N4x`g7)a6|XZDQL@L@ zUE`37;Rvp;_pBeP9FBBp@#fOo{8?WfOyfm<_pGK&8!=dkkzR?6f}sn@DaXhZ z(+58`|9A{Tlya2~UJRFynC{Q|YiJw1LtSksB`18SQr`G_>%1&G$M8RI`@iklFBkaW zmSL{&E|jd;iz?X(|6PtCL(b&jeXFOScu3p6=-aYvLoYtO8G{GmUGdA}ulTLr(B9x( zR=zD|HU2Do4ra(D?vNVabRL(W(d>=&!H;Sy#?-RGnsY}m6lKi!Bf1#6bH3tE4kuj8 zdWS6A>mTnG8+s1$ieb#3t5{Y>c{!vsSBlgh(G7Qaf!1q=-j}w;5mSy&jNCR`GrO2 zJ*Am*Ei)e{hQy|ShhrF85zNYH@@FkQ*A;mk4s<{)Hsty6hU?HR|G^FcbJ&&FtsJ5JOKy-kCjTT#RB8f|_A^&S^X=W9aUKy8k~0pF3Us zv5q|np(MuVl{(14lj+YJbc&VLw&N=Nz-DT1?Ij5c1 zeBcgc*YysmD_V>_lyolhE;C77&ZC$d=eZg+vB}|!|H*(oREH@mt(`~p=aCkc2?(=L2%Zfg~^UVoCQLQ?OyK=S@I9+ZO`if;=4HU z03;RmX1oo)Eo&AD%<^p>G`08UyK}BWxgO68%LeZe;~38sy>Ve_=#{Uh7~M&Dk@SLb zr%k`4ESM&SR>qlnK-QPocdjyA{ux8Z`vbHM-W^yMa);8nvj@+OoYx_Y@Qv)nLhA-x z7jD$;_l=PC+0I7kF28R$RzPH9s4m-zawC>`m7>)LgmKBb#xrt&(@iY)*SD4WvtpMv zlFYOtldU1UVIK~{b-Y+XmUBAvVIU~}-nnK#w^wqede_51!xC-B61S`e4t_#$T}d?V ztpuE7B@^K$tdr<|@UaW)UOA5=_}RJi;GCapA=AxI=`n^feF+xc&vk&9z`fIS9{uk+ zv%wpLDoG6dS+d?ac+bOQluhyHtZ+;B_|t>_tZPvrx!z>s%RhFce1r`8e18T^_NO&tDKHzzo>s8TpMR;}URjX#m(T!h!~Op2 z(waQA|7!Ju9OYKB`}`Rhqy1TF|KT5#Hp-vXhTgi_KPv4a{}}1GJN(0;Z`4A6b_2G2 zxs6}JK73<@CNGj5GXGr%tz-Q8i~aWW0(>o$=IcBJgFE~=bI{;el*&Po$s(8g$Ig|l zkxe5p`}ElOj>Yy}{FFc6*S-vBT%(}3T$J{-*zFzG7yQFe+n<(FHqt%3{LlLBTigOX zhzI={kD$O`!Wy^Ww9&44<6z#^{&5)(VBgI~Sxah)f0XaZyHRd*D!%r51D%*Z52WAs z#k;pQ3iYqHJ+gTuz9kbj&3EKu_P0`Pf41+*6qoV+j^ z_C9olFZTr;Mu!~GMU4dl*SIhRzxH5H+t}T8Tl?zXn4g#6uTk{irz^s})+T(-H+v=k ze)wW-f%~zkv!`QiC+=;NTgTiVt%&XuDjcq^t*oza3NLQBeo_6>8?MLCY2X&GJ1zP7 zi;mXy;dQaic|Tv#)4qO947<8(!^UoW@hJ5+cJ)|2>$sou($!~oCs@B!(TDwh4av1oMbz1BfqTOAa zI%D*N-QVGm?wK*&?Vi@Q@TSt9_#Rh&Po`i|;M()Kp|D`;hMu1G=@7k}I@{;3ZSQRF?pTe@*6!8o=HtuXsk3Jm zOkGKtXQpi584D7mpH~uV?drq4nzsX@gi)uNHkPT97c>c71${DHd-p`-G{NVwE`Y zrEI;W?M_oF)!P1vd(NYr&)Qy-B7XifUNNc7joguu`e|1_Nn=ZLK7XT9eTIu4(SA4auyjp*5Fk zJ2%oA-qdDWHxk}rN~KwMSa(~OI^3omC`uSL3AcqMdz~>Sq(ED~g)Ltnr3k6kwpx-Y z#Gf(eM>yjB$^{(a|59$c zL!6D99Oac_&2We>Q*Ne1T&CPChqzw3*$(jr<*s#z|4g}3hxke5<~YRPR&K6Cd{DW0 z4)Ht6l{t!Wqn39Z^PLofCn>kUA+Awwp+iiWVwEd*zm_X;h(D`bz#;ysa?>5+gUZct zh~HCgrb9ex6m6d65KmWbwnKb_a@RV-$d#2+X(&mq3pJRp%`l{v&A<>ouYw<)*4 zA%0Z3g$^;L^eOR|v|Ncp{C(vD4)HIPo9++~!_9*7l53y%8s%m>#LJbNb%^=T*ax)#`cI9R{#Gg=ZwnO|C<*s#z_bXTG z5dT`aIS%pIakOQwLp)Epc@FU^<;oo5t;)@Jh`*}b0*CljWKH^(8~pxj)C_%D>3=MX=u zT$w}sigNQE;t!Nt;1JI&pnVG+VoK>#;-y-y#3AldF5nP9tlV^m`0L8eaEO1b+)Rh~ zH_FX&h{qRN?kmNb?GP_g?plYqL%C9i_yOhSIK=;;++2rvpK|jY;uFf1Im8!Fq%HFu z;#tZqaEM!#Tj&r|N}m$6Kh9pVX>)8<(YafNcT z9pZJ$UF#5kQn^xx_#c#;;}9QIZmvU|Tf}zfIm9!SD|3i%RBpaQ+@stAhnOy?}15Z|rbT!;Ac%FT0#pHZ&NA>Oate24giatj<{O6gN#Ca^M2y`zkN=B6{VV&s}^ zam7lX}c^Ulj1uaZ5K=-t^Fd0eXF5oUk@FR!i&-JmGx4K@dggtUu#0IQB~Ayk zK1!T4CViAR9nASCaXOgtQQ|x@Y46QLOruRN~mYDM+x=J^(b+S zO!X+y;_D{sW5$OTnbc9DMdoyrI2}ysC~-QN(NV%KCUlfI9n9w_aXOgJQ9?blIZCK! zGDivZ%;hMdo~axq)H9Q#gnA}&lu-XwldCbGgL0r7> z2_u-TQQ~xby})xPlsFyC)hKZ~j+;_U*`S`88YR>-QKN)<=4q5r&oqq^>Y1fcLOqi- zN~mX!MhW#y(I}yw85$+jGZ~|Vdgfx3I2}yIC~-QNiBV!iGZCZ2>0lm4iIc`Oj1uaZ zg;7F1lQ2rCXAVXQ^-RGip`IBSCDbzkql9|qUzDiG^otTLZZz2svo8!LLdu!eMyud% ztMDG{%8ytRw?BK&BdHU!zn1dUjhD_IHL55Z|1;?9B^QnH#jGA*OTSC!1lC}l{R1c(yqnUhgMJySADsAon-iC$+yMhWYg zk5NKB(=kdI!EB5Y>X~>^!U#gjsTS_tu&&%}UD<7Ie@Z%d;=Donb_@Ep-h2lcP3025 z0ne0&z~yOl?c*U_{}T0eB!4}Idm@}6Q~sHu6$x< zPT;bMqp4FPAyX(^HH3vGtHM=7$ZYBc>#o#CQt!%mB=yR>vhlI~zwXASHPlJFD<6C3 z4su5ITg7s1v!0OY+CBfxHpNmIR${>R``v-HU=TCpSO&L|hR8pQamSTaOUV53@b6*c z@7|lg>yce~J9+_!h`T`KOf4Lw7dBgi_W=)dqxL})6Xicws)32}mz1hzqWmvP)iY5( zq*N^vVGs+Nh&!%8(Xk@-JLwJ?!6q*OH%nGckzVKT|{ZoUvf2*SWTq*R!Jd7Dzz49x#bsX7Mcf2UL}1M?p!)y%;B zmrB(zFwZuTG{yu2^Jz-eF)*)Ds+NKICZ(Dgn14p88V2a!R;rqT`I}1BF)+6ZbYh%o zV3|_Q3^eaH3;6If3^boms+xi3^Gek*(EOQFVFsF+W>Fq}&p`7krD_;xu28Clfo8W- zbqq8gQL37O=07Rb%s}%eO4TsX9An}~TnY>{7bsQ7Ky#H+;lzNmnStgNdTUk9`9wIw z`0qATQl#tsc)7?g8y-PKDP{aI`=dCqe5^K83vHmB+ma^}KjTZXdkV~DK9EjP581>%?w=rO{sdqqe?Y1 zmSF$`QwbTsAk!pd0E3x~a8oq?ApD3@)eLX8D^*YUs8ZF8co^ou2ttNAa2bSWv|=-% zU*nH3gP_ZmY9YKzsW9WBN~P)vuTv__P>Jyo>>~U#EmckU=SqbcJ$*%~X2NHc3NxVk zp;9e`uPPO0jK#nTQ5|7)MZK1Au0~JQgh8dk47*k-)l9fnsW2lkhF@?QgbcqhCJ29^ zVOJgDL8Zck4AN5Zk53Eq_N4c;U@hTkrNV@a=DfPxVnBznNH|X;tro(dQei@deV#gQ z-J%7n30Er>CS-i*)#cVbTCk4r0j0u(3?#j}+j+Dg3KKGh_3Co#MlD!Nc#BeDLI%5DU2ZYn#gP$4 z7w*G^uc|s-%V)fcr6EGbySRD@8Sg?pA>&;He1wd5G4~KM-i3NX#=B5Y$aoj(2^sG~ zJt5;=s3&B+3-yGIccGpzx)9w=$aoj(2^sG~J>kp(iE`vw2wj_Iyo(E(knt|8CuF<} z^@NOfG0+GZ??OEx<6Rg*$aoj(2^sG~Jt5;=s3&B+3-yGIccGpzO(R%cYh}C(^@NOf zQIU|rEm|a`MCTA*ZbIMx-dZbbGk~6f72Dr=!S;MY?kxHD=C-_TAo-L3^UXiu)fP_gcpni#s(GIXQd`+G!|e@rV^`pm*) zjl^_?YP(VziH*=Dq*_K|B}#<}rz_RK;4B;sl^9UHrc^Bhs$VFjD?uO8_(K*hFS&)pH}zXLikyw>IfeK#_qAY{@Q_l~bn*f9j_UM|MJYNxTU|p7 zVXC1#Pm}0Yn(0<{YTYnB%y3=IsHR&fQL2t^rBgT7t5RXQl`ksQOt-REsT#VKUn$i>x00>v8+CLm*CgZOEC{;}#5-j3j*ChIoYB~(c7`MU+9Bzehs4s}J<-Y;@@bW$d zo!{$x$`4g$sC}LV_}|_cSnEhS?`Lz~=Nyl((+Igz0FO+_*&l<5kh4B!971O463dx+ zk|{a9<|AbOja7I;=HF0H$YdMp37J_#Jt5O*s3&C34E2P}nW3JLGd0u`a$1IZLMF%< z3xv#u5g-wA^2Q({>^yDQ+qSv2BlgEnZZImA=6c;CuD94^@Pk# zVLc(;1*|7zA`10{%sQc-kWK~a3F#}Ko{*^})DtpCL`6cn4@8fIi_~q@5;CKMdO{{@ zP*2GG3+f4(e?dK=x+1HVaIAWkW8)@f6Vh8jJt4gn)DzNMK|LY871R^bTR}Y`y%p3G(py12 zA-xsU6Vh8jJt4i7BnHNZ(OW@1A-xsU6Vh9uR|)B@pq`N43hD{zt#Gyp>8+riklqSL z5Yk&gJt4gn)DzNMK|LYY|Dm3ai{1*l2%}!AhL93Q5FVc7dAxB*S_b`+oQ3Gxa1RLK zP+l$vOXlz-f4r~sbR2wAPnSxJg6t6&x3kG`aGy7q|bwT zLi#*hTZHs^7_fx&c^K)0^m$NENS_Dwg!Fl^i;zAK>Iv!dpq`LE59$f&^PrxPJ`d^% z`Smx{6Vm5FJt2J_)DzO@K|LXT9@G=k=RrLoeIC>k(&wQfA$=ZZ215Egv`9#w2la&X zc~DPCp9l4X^m$NENS_Dwg!Fk(Pe`8!^@Q|!P*2FOzoDLxJ`d^%>GPnTkUkINi;zAK z>Iv!dpq`LE59$f&^PrxPJ`Wc%A$=ay6Vm5FJt2J_)DzO@K|LXT9@G=^>u;zhq|bwT zLi#+YC#27VdP4dxJg6t6&qJ>g(&s@vA$=ay6Vm75Y!lMwK|LXT9*iKQ z&x3kG`aGy7jJm%TLb^eyC!`yM^@RNT8|n$^2BDsi3wp4N@G7%Hm@0Q;p64Ba=}GSW z<9&etYj*%*=`i6hGc&mhv^b&j!5_FgiS+aaL zXw1Q4KT!=egnW7k8gPrJL%$Zcwu|NPNU zKHx7M?l# zWqK@4gnSxnsr`FdI@DP#C>&~({LgojdmrP(?T?*DuMRP~2fxpeUD~9*-N*;rKB80& zA8>nAscJsp_HCsa_<-B%N;UBTx6?{B@&UKYMsuvz@IkjlN>%d#x2?K9+`tF6o>r>q z`v$(ORNXHOJg!s?AJ`gUp0Gm9%m=n+DAm9Rx9XK@>N4;SrRw>>)~A%J;R9RWP^ys+ zY`v;f10UG>K&d7^ur*d!sOzU1D8J<iGatxl)aM0I5}}20noF38iZI0Mg$pRnG^I_9@lG2arxE)yM~sM(Hhv z4SWEpRH+(1fONA`^?U&7Zl#*|0Me66HSz(Z?<&>62a$fJR1F_M8eZV`GdjAS57g8s z)xrmA?o_JjVFN#{RO8nT{AZ;aer(_yO4akhn*UO&mJifiVg5Y<(jh)jbDdI+e4yrb zr5gA^&4WtS^MRVLDOJk{Y7QyY#0P3lE7iycY6^6XynzqYEL5t#)xgcVVqMFpJswi3 ziBEfcNvTFY?Xgp-20rcaBc2tiSE`Xud(2m=flqrhD7BJL zdu&vyo=w5!N+Bq#(Y9%#r1p zBwy~PCW-q}RhY0nA(I>v^2Iz*@^q(g*y z!nf2BHW0p}R1+cHW~#LX$rraW)qk}R<|)-gNdM~9gNMS_l~|cy+nOcmZ8N$an!Km+(6E?G1!AO0^I&s_20NI36Ck&!q6#CgQ6zFF-o;CnqmkAy9gOV z;iM7XAB}(rBTCgVz;cw*$7;W>ls;C=s0u9-GO9w0gee-e=wr3xl+wp)XDg+T)iSDr zdct*DN*}9bRE32x!p~|ceXN#I6|QJPMpYQTgbblzJs~BGAUti<|37%FHp@y+#S1sK zMc=V^w3)lsaNk?>FZo?=7G7SN*t_JCmd(yi9wucZ36nD7!z3()r7})>Jh}`;$arbN z@3#!4{{r?q+C&2(wwqUa3?AW9w~7H8HmS8>JcFrv>&K$YM~tn%qf{ef>my1vFt)Zd_-$frU7%EbVr*T**m|{=YGiEvfKm;Nt-q*L z6T|H9Dpk+e`W>Ze7+a_6T2Uio>&umDU~IiesV2tOtCgx}Z2gc@HBTD&0}Z4b2@fdM zLU_nfUI@j2wo4;H4e*MiAru3=GNl>`7aGb_ml#5|FoZg$b(o>nqs*x~FLjqlf`Mgr4Z`j8mPaOB9XgvqXV^d6(?o!RVcSQ6%LCZY8T3&kd|Ga4WuSvhA#_ zNGb{G-H^}|(s`gm2{{8IydmTa2=#=V0im9dGa%Fxat4HY z!q4lRR!7K55iJsOQbdb{oD|U_Atyz&NXSVMEfR84gnB|wiU{-wIVnOtAtyx`LC8rF z>Ipe1LOmfTMTCQdoD`v+kdq?R6F#joUjrd0MW`p_qzLtdoD`v+kdq?R6LM07^@N-h zp`MVFBGeOd9RcbIxjX>%gj@rFdO}W;s7UyyI$zckGDn9IgiO7mo{$+e)DtqJhI&Fy zxUim(i89m^GXI5oLZ-D)PslkL>Ipd~Lp>qqWaPnwoRiTaA=6s4NXQ%(EfO+eg?hpt z>m*)F$jKb)37MTjJt0$3s3&CJ3H5}`JCSA+axot237KRTJonK9&^Q%sDehrDvuPM>_H6}X0nndSUP3K4VhLJ)@_l6-x zNcV;zMo9ODnTU{IJHz=A(!D`FA>A9)6Vkn5Y!cGFK|LYe8;l^NdxLsHe(enPgk9>x z>IolGs)q1sr5Xw8-k_e4?hWb*>E3XG5YoNDdP2H4SWigz2K9t=Z%|K2_XhQZbZ<~k zNcRTygmiCEPe}KMiiC7;P)|tr1|taR-k_e4?hWb*>E588knRoY3F+RTo{;Vh>Iv!I zpq`LlJ3~Do-5b;s(!Ig?5z@V(MMAnav`9$zh879w-k_e4Upr&cB&2(TdP2H4s3)X* zgL*=`H>fA1dxLsHx;LmNqf9!db$QedOWBn zq{qXBOh}Ih^@Q|zP)|sY2kQyx@!$^$>G9AaAw3?{6Vl^BJs~|F)DzOgN215QSo%btuQh2b}DpPrLR0-i@O4Sj5-cX)iZatv| z8wkIoR2|`$2h<(R9^pS`N`6k2R1?yW6g*E#Of!7)tBN$>Z=-byX^7M%rcrL)c$@gU ziEAf&d%BI}4;aRmkN+9OPnz<5M#h)t*X;al#rXZ_+V){tq%Fxs-(QndORtg zYGq*YJpSdw?ExPq<Ho7uS&{iSjUp`nUKdjN9w8%(7qtZ=RP+;LXBd0&h~?1l}y@CGh6?<`~`vPPLAojiFqa zjn5P-@x136{+axNHDrxX${&m4uLW;g(SDQm*|S)&r#Tx*I@my)7_V6y%dmA17FG7-G?H!l{gOn)#Ve% z;ajfC#OvauTYhxHc=N$f+e#dt7lSv?>$)2GaW(h?Zp6qXZu!LPcZJJmS@cg;rp`*2 zk5ORYM(_oRv~|xQ<^RIvv#f{BFOlA8>ONt3deA+F{~GvY`d>2T>5Mt--ZVUaj`xt! z^DFRX(b+JbxX~@2WIkNo-P_ZedbI z;kHd1Hf%wan60q(P{miYPa#lwZRpY;mYen_!(;$ z+tU?Z*V@^(zTFCknywG7Sh@%-ez7@RSrzt*R)uOo)vs8@N=ugCP!U`nzG3m=y2|=+ zeXwGAW!U}U?DFy@%a>Lx3QsSdUOWr`bG?2=INC>0AU#yydaJZ0ha3G7Yxj`MPdLXZ z39sGI)hR!1-Q5d=y`RF4775IZQR4oBb@V5w`8(QT22a!gBcet5BjGWO_dDL<@aoO2 zVr=Vr{C;?}T{%9hxM$0T-qu?od%Hckj;OP%x4n36=cZ!$4ez$89c`AoB|p<`6}N5a zL`_fjc6)p7Xz%Xn=;|D>5yrmm_Vuk&!Jv)nd#z$QpH^{i`(}K){aD=H)z;eEY8AJy zGXrH^8|re)tKp3puLiNyk|vSMgGUG5x z^Zk%&jt`@XvFH7>XS*1VtulbJ+|ifK>af@^%+l6mY9~}?WX~40J4wz z7B*%V~^@yFk3>Q|U@j87>y$J7^>9baGeOP{2favH}P2M`}YiLJ4(9&E(cXS_?f zDz-2%{R-vXarN&tJ17_PL>oPtA1O?~#i#@QuaHO4bk65sw` z#MNg!P8niFBjekDJgz?DcFN6h1D5BHYX2TUVn~h;#&f6UdnMw_bDQ$(D3%vfU-N(k z=U0ChiiwGApZP+@IqG}bEo(o3j6K$8UXgF=A27$yexuzy53izbZ2QbVjx6+ADDZ@S zvOeWcuqU>@<|*Y~6(hV2e6k+p&kaZWna`A)iY!M3=5V-ay#pki8E(q6{xoGg!1|Q$ zfhLYE+Ewmt#p{hP>&3sZH9hQ@`V+)C#Ju9`=Yfdlr1*E1c$MDJ3(MP%FMHV_^*_7J zE8iBElEv4*%G8fP&NFMg`ojikpL%8v(tbvVSN})1dy=25$L)oK)PLi3uf)A9Xk>hS z*^V>OExAe(9C?|Exd3oF-W*Sy7G-|p*aOtps-Jo=D^7WQ`;rzWtN$ne?$ww4CH57! GY5iZnBQc%; literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_SHA1.abi3.so b/lib/python3.11/site-packages/Cryptodome/Hash/_SHA1.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..acd08adca11a51c5032d564d013d6e2632d65a49 GIT binary patch literal 72064 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 z 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_SHA224.abi3.so b/lib/python3.11/site-packages/Cryptodome/Hash/_SHA224.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..9cf3ef6de1034b0309a98b92536d46dee7bde02b GIT binary patch literal 45768 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 Wx1Ua9BgtR+U%LFvFoCeF@_zyFBYFe? literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_SHA384.abi3.so b/lib/python3.11/site-packages/Cryptodome/Hash/_SHA384.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..7c72fd09c9f497c295df96b5948e242ace07e567 GIT binary patch literal 54160 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

K9`!?` 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 IAuOu=A7NDCvj6}9 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_SHA512.abi3.so b/lib/python3.11/site-packages/Cryptodome/Hash/_SHA512.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..058653c46c3e0b15ddfa221cebf1dadec06347c5 GIT binary patch literal 54200 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 Hh${aN`FI_Q literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/__init__.py b/lib/python3.11/site-packages/Cryptodome/Hash/__init__.py new file mode 100644 index 0000000..4bda084 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +__all__ = ['HMAC', 'MD2', 'MD4', 'MD5', 'RIPEMD160', 'SHA1', + 'SHA224', 'SHA256', 'SHA384', 'SHA512', 'CMAC', 'Poly1305', + 'cSHAKE128', 'cSHAKE256', 'KMAC128', 'KMAC256', + 'TupleHash128', 'TupleHash256', 'KangarooTwelve'] diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/__init__.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/__init__.pyi new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_clmul.abi3.so b/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_clmul.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..d13832ca9c5e0446207fc9b2a3897f4fc21d478b GIT binary patch literal 58376 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_portable.abi3.so b/lib/python3.11/site-packages/Cryptodome/Hash/_ghash_portable.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..555c6fccf45daef5d5d8f33f1cd471a38b8f71d0 GIT binary patch literal 25024 zcmeHP3v^WFo&WCKxsyA2%;YHvpc!Oo*L9nf% z23$r=i)*#?=rNpbx7uxOS=&WwPq!IqExLOY?6&o>b^)=1Pt?`L$C~~9@BRLh$z-se zv*+xd(~~df-v9gm{lEYB$bEcs2kIM^+Z07`QN>b0R8OYGsgZ)68zllzBPxXx=NZCd z>e|Od6R@M2#bPL=U#i0tNt*c#ohgq74bzj!3f0EVksCOUJ`wvOb2oB{pNEI4h;UMCg@z49zxyx8~JwtBHH0LIS)( zvKg}7HL#;Nzi8pKua)&(C@;E_B-6q3B;nryUNU`(Cz*cb1^8>hzZ6Ge=>a2Kq=^%GmP8}RC@naMUz%l-;)k-M zDDT;rJv_cFsSp>L{B$9vFvo&JCO=J_BLx)hHxUT5ZSC#~^o3h`!-0SZbaZuuMPLhn z2>6>C1FfOnP+Lb|IMmzJxU93gE7a7oxie(Rl1l=??JeY>rL*JKkZ5af>1z-4boYi$ zJBti$?`i339peUDIy<|AQnxkK7w+xeF(%#88w!cej?F#c_TErSYjIz9aVgP3!WN1Z z4gT6?f%4+=;sw+)8feyFvthKv|NT6!-ThNLkUX0>LMA9Yk9ppCWWKSCnT7c$Wa9J$ zKGP?zvh-<;${}wu&cyL~u94te9A7SRrvCXje*ApQuQA23xnNNkgK>PCD_n|dER5z! ze7&V{{CNMC_T+go1Ctq;%)n#@CNnUZfyoR^W?(V{pPvC^@J-#=tG!$zgt2=htesf` zePi&~y1c+1U2qDb(OIW)b{EzFBf6cOo;@*&GV4X6>8|JOF_V6dXu5h@3N`Z(n6Z z&#Q*=q;dSSa4sCok`DCI6I2RBhCjn<}KuBlW zae7jl3!!oY*URwiS0LO{>@M6zQHg!NYkeDh>wQh@*BOzodXE{Auy@3WGA{VOu{W!6s0zTR z8<8nSWQA_*e#yP-5@@&&{kuPMykRKpJ+r6Dd(a)reV7dWk&lhYAAeitJxUGo zN6%y$(RcFq)Oq(C(KD6Et%rObFrsIR;Ma)0Ug?j%0iCxzWh4IRn?-edzv?||?7iMQ zQdd4-^$o31>dJEo+Um;f1l4-?q33GKs|dH(!SUf5OHo5ib>2NS?n9&H=_GXk{gAAP zzu$f6Dbn6kKeQsH7A^txS_lE1@VLDE3PMw@NKfg@%cm2aMz#k~yKkt+;Tu|`L1&L|s9mX#yozCQpe}OKA3Wz9c`F5#@2`uTsEfSf8+;YwQ+1Ko zqG#2*$f?Gm&VJ!L{-zNOd-v2uTD=cP-*D6qHQRjA*R}c~Lyf*;uOHf!GI&xMJfTEi zw++6c_y$iYgRd!#!KaL&^qU)lr^$G~5qzsL_|mE&@1~VQRjZ+53{AhuAAQxndMNix z{^)7D5q-sO4CVIvqo;tsW=Ap}ZdCr;h@P}JDxWqepEN2THz=bG%0~@Bb1a^+`}fuh ze}&y^RH*(6n^BQsR45I~$Af=XRu0Wyg>KW03Y&lMNyUi%+1{XhW>h$gGGr5Wy1$~% z3-K}_wSbsj6_{xzzFa4*!@jSd--*1tcmM1&tWkSmXU-SuonwQTDw#$kYEH!`{E-n% zjY=c(TO;yh6nZgiB_^}TC!V{im1GERK>gc2?>BF`GfU&mm$ z$~b=3aDLoS7BwQ!iRi|aPxc>!d;C+nF19`=s*@h6L-%`SBX2xsw)V(j`akr>Z?=pr z;MDjti#{41wHzKXlQH)14(gL-G6Rztn9RUr1|~BwnSsd+{B>tQnWiqGcgeWb6dqij z8Gxnlj*j*Kp7>yNlx`BweKs)xiWn&-ALQy(vLj3+~pZm@30AK&%fa~13O#>BRE&))h?Z|$ugON$qY

6D1M!SjLL{IKfcyFco-V`+NdE77Mw11e&vlhUP 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_keccak.abi3.so b/lib/python3.11/site-packages/Cryptodome/Hash/_keccak.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..4e494b0f7fbd6f9c44ba8c351c4bb93d1bb64098 GIT binary patch literal 41632 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 Q@#IhKRr1AA0#T^=Utza+T>t<8 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/_poly1305.abi3.so b/lib/python3.11/site-packages/Cryptodome/Hash/_poly1305.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..901b8c2c5b990d8b89554b147b370c9eae17f265 GIT binary patch literal 33424 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 +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.py3compat import bchr + +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.Hash.keccak import _raw_keccak_lib + + +def _left_encode(x): + """Left encode function as defined in NIST SP 800-185""" + + assert (x < (1 << 2040) and x >= 0) + + # Get number of bytes needed to represent this integer. + num = 1 if x == 0 else (x.bit_length() + 7) // 8 + + return bchr(num) + long_to_bytes(x) + + +def _right_encode(x): + """Right encode function as defined in NIST SP 800-185""" + + assert (x < (1 << 2040) and x >= 0) + + # Get number of bytes needed to represent this integer. + num = 1 if x == 0 else (x.bit_length() + 7) // 8 + + return long_to_bytes(x) + bchr(num) + + +def _encode_str(x): + """Encode string function as defined in NIST SP 800-185""" + + bitlen = len(x) * 8 + if bitlen >= (1 << 2040): + raise ValueError("String too large to encode in cSHAKE") + + return _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 + + # Note: this implementation works with byte aligned strings, + # hence no additional bit padding is needed at this point. + npad = (length - len(to_pad) % length) % length + + return to_pad + b'\x00' * npad + + +class cSHAKE_XOF(object): + """A cSHAKE hash object. + Do not instantiate directly. + Use the :func:`new` function. + """ + + def __init__(self, data, custom, capacity, function): + state = VoidPointer() + + if custom or function: + prefix_unpad = _encode_str(function) + _encode_str(custom) + prefix = _bytepad(prefix_unpad, (1600 - capacity)//8) + self._padding = 0x04 + else: + prefix = None + self._padding = 0x1F # for SHAKE + + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(capacity//8), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating cSHAKE" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + self._is_squeezing = False + + if prefix: + self.update(prefix) + + 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 %s state" + % (result, self.name)) + 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._padding)) + if result: + raise ValueError("Error %d while extracting from %s" + % (result, self.name)) + + return get_raw_buffer(bfr) + + +def _new(data, custom, function): + # Use Keccak[256] + return cSHAKE_XOF(data, custom, 256, function) + + +def new(data=None, custom=None): + """Return a fresh instance of a cSHAKE128 object. + + Args: + data (bytes/bytearray/memoryview): + Optional. + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + custom (bytes): + Optional. + A customization bytestring (``S`` in SP 800-185). + + :Return: A :class:`cSHAKE_XOF` object + """ + + # Use Keccak[256] + return cSHAKE_XOF(data, custom, 256, b'') diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.pyi new file mode 100644 index 0000000..1452fea --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE128.pyi @@ -0,0 +1,14 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +class cSHAKE_XOF(object): + def __init__(self, + data: Optional[Buffer] = ..., + function: Optional[bytes] = ..., + custom: Optional[bytes] = ...) -> None: ... + def update(self, data: Buffer) -> cSHAKE_XOF: ... + def read(self, length: int) -> bytes: ... + +def new(data: Optional[Buffer] = ..., + custom: Optional[Buffer] = ...) -> cSHAKE_XOF: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.py b/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.py new file mode 100644 index 0000000..a5b8701 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.py @@ -0,0 +1,56 @@ +# =================================================================== +# +# Copyright (c) 2021, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util._raw_api import c_size_t +from Cryptodome.Hash.cSHAKE128 import cSHAKE_XOF + + +def _new(data, custom, function): + # Use Keccak[512] + return cSHAKE_XOF(data, custom, 512, function) + + +def new(data=None, custom=None): + """Return a fresh instance of a cSHAKE256 object. + + Args: + data (bytes/bytearray/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + Optional. + custom (bytes): + Optional. + A customization bytestring (``S`` in SP 800-185). + + :Return: A :class:`cSHAKE_XOF` object + """ + + # Use Keccak[512] + return cSHAKE_XOF(data, custom, 512, b'') diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.pyi new file mode 100644 index 0000000..b910bb6 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/cSHAKE256.pyi @@ -0,0 +1,8 @@ +from typing import Union, Optional + +from Cryptodome.Hash.cSHAKE128 import cSHAKE_XOF + +Buffer = Union[bytes, bytearray, memoryview] + +def new(data: Optional[Buffer] = ..., + custom: Optional[Buffer] = ...) -> cSHAKE_XOF: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/keccak.py b/lib/python3.11/site-packages/Cryptodome/Hash/keccak.py new file mode 100644 index 0000000..f2af202 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/keccak.py @@ -0,0 +1,181 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.py3compat import bord + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +_raw_keccak_lib = load_pycryptodome_raw_lib("Cryptodome.Hash._keccak", + """ + int keccak_init(void **state, + size_t capacity_bytes, + uint8_t rounds); + int keccak_destroy(void *state); + int keccak_absorb(void *state, + const uint8_t *in, + size_t len); + int keccak_squeeze(const void *state, + uint8_t *out, + size_t len, + uint8_t padding); + int keccak_digest(void *state, + uint8_t *digest, + size_t len, + uint8_t padding); + int keccak_copy(const void *src, void *dst); + int keccak_reset(void *state); + """) + +class Keccak_Hash(object): + """A Keccak hash object. + Do not instantiate directly. + Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting hash + :vartype digest_size: integer + """ + + def __init__(self, data, digest_bytes, update_after_digest): + # The size of the resulting hash in bytes. + self.digest_size = digest_bytes + + self._update_after_digest = update_after_digest + self._digest_done = False + self._padding = 0x01 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + c_ubyte(24)) + if result: + raise ValueError("Error %d while instantiating keccak" % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + if data: + self.update(data) + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._digest_done and not self._update_after_digest: + raise TypeError("You can only call 'digest' or 'hexdigest' on this object") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while updating keccak" % result) + return self + + def digest(self): + """Return the **binary** (non-printable) digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + self._digest_done = True + bfr = create_string_buffer(self.digest_size) + result = _raw_keccak_lib.keccak_digest(self._state.get(), + bfr, + c_size_t(self.digest_size), + c_ubyte(self._padding)) + if result: + raise ValueError("Error %d while squeezing keccak" % result) + + return get_raw_buffer(bfr) + + def hexdigest(self): + """Return the **printable** digest of the message that has been hashed so far. + + :return: The hash digest, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) for x in self.digest()]) + + def new(self, **kwargs): + """Create a fresh Keccak hash object.""" + + if "digest_bytes" not in kwargs and "digest_bits" not in kwargs: + kwargs["digest_bytes"] = self.digest_size + + return new(**kwargs) + + +def new(**kwargs): + """Create a new hash object. + + Args: + data (bytes/bytearray/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`Keccak_Hash.update`. + digest_bytes (integer): + The size of the digest, in bytes (28, 32, 48, 64). + digest_bits (integer): + The size of the digest, in bits (224, 256, 384, 512). + update_after_digest (boolean): + Whether :meth:`Keccak.digest` can be followed by another + :meth:`Keccak.update` (default: ``False``). + + :Return: A :class:`Keccak_Hash` hash object + """ + + data = kwargs.pop("data", None) + update_after_digest = kwargs.pop("update_after_digest", False) + + digest_bytes = kwargs.pop("digest_bytes", None) + digest_bits = kwargs.pop("digest_bits", None) + if None not in (digest_bytes, digest_bits): + raise TypeError("Only one digest parameter must be provided") + if (None, None) == (digest_bytes, digest_bits): + raise TypeError("Digest size (bits, bytes) not provided") + if digest_bytes is not None: + if digest_bytes not in (28, 32, 48, 64): + raise ValueError("'digest_bytes' must be: 28, 32, 48 or 64") + else: + if digest_bits not in (224, 256, 384, 512): + raise ValueError("'digest_bytes' must be: 224, 256, 384 or 512") + digest_bytes = digest_bits // 8 + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return Keccak_Hash(data, digest_bytes, update_after_digest) diff --git a/lib/python3.11/site-packages/Cryptodome/Hash/keccak.pyi b/lib/python3.11/site-packages/Cryptodome/Hash/keccak.pyi new file mode 100644 index 0000000..844d256 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Hash/keccak.pyi @@ -0,0 +1,23 @@ +from typing import Union, Any + +Buffer = Union[bytes, bytearray, memoryview] + +class Keccak_Hash(object): + digest_size: int + def __init__(self, + data: Buffer, + digest_bytes: int, + update_after_digest: bool) -> None: ... + def update(self, data: Buffer) -> Keccak_Hash: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def new(self, + data: Buffer = ..., + digest_bytes: int = ..., + digest_bits: int = ..., + update_after_digest: bool = ...) -> Keccak_Hash: ... + +def new(data: Buffer = ..., + digest_bytes: int = ..., + digest_bits: int = ..., + update_after_digest: bool = ...) -> Keccak_Hash: ... diff --git a/lib/python3.11/site-packages/Cryptodome/IO/PEM.py b/lib/python3.11/site-packages/Cryptodome/IO/PEM.py new file mode 100644 index 0000000..7655368 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/IO/PEM.py @@ -0,0 +1,189 @@ +# +# Util/PEM.py : Privacy Enhanced Mail utilities +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +__all__ = ['encode', 'decode'] + +import re +from binascii import a2b_base64, b2a_base64, hexlify, unhexlify + +from Cryptodome.Hash import MD5 +from Cryptodome.Util.Padding import pad, unpad +from Cryptodome.Cipher import DES, DES3, AES +from Cryptodome.Protocol.KDF import PBKDF1 +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util.py3compat import tobytes, tostr + + +def encode(data, marker, passphrase=None, randfunc=None): + """Encode a piece of binary data into PEM format. + + Args: + data (byte string): + The piece of binary data to encode. + marker (string): + The marker for the PEM block (e.g. "PUBLIC KEY"). + Note that there is no official master list for all allowed markers. + Still, you can refer to the OpenSSL_ source code. + passphrase (byte string): + If given, the PEM block will be encrypted. The key is derived from + the passphrase. + randfunc (callable): + Random number generation function; it accepts an integer N and returns + a byte string of random data, N bytes long. If not given, a new one is + instantiated. + + Returns: + The PEM block, as a string. + + .. _OpenSSL: https://github.com/openssl/openssl/blob/master/include/openssl/pem.h + """ + + if randfunc is None: + randfunc = get_random_bytes + + out = "-----BEGIN %s-----\n" % marker + if passphrase: + # We only support 3DES for encryption + salt = randfunc(8) + key = PBKDF1(passphrase, salt, 16, 1, MD5) + key += PBKDF1(key + passphrase, salt, 8, 1, MD5) + objenc = DES3.new(key, DES3.MODE_CBC, salt) + out += "Proc-Type: 4,ENCRYPTED\nDEK-Info: DES-EDE3-CBC,%s\n\n" %\ + tostr(hexlify(salt).upper()) + # Encrypt with PKCS#7 padding + data = objenc.encrypt(pad(data, objenc.block_size)) + elif passphrase is not None: + raise ValueError("Empty password") + + # Each BASE64 line can take up to 64 characters (=48 bytes of data) + # b2a_base64 adds a new line character! + chunks = [tostr(b2a_base64(data[i:i + 48])) + for i in range(0, len(data), 48)] + out += "".join(chunks) + out += "-----END %s-----" % marker + return out + + +def _EVP_BytesToKey(data, salt, key_len): + d = [ b'' ] + m = (key_len + 15 ) // 16 + for _ in range(m): + nd = MD5.new(d[-1] + data + salt).digest() + d.append(nd) + return b"".join(d)[:key_len] + + +def decode(pem_data, passphrase=None): + """Decode a PEM block into binary. + + Args: + pem_data (string): + The PEM block. + passphrase (byte string): + If given and the PEM block is encrypted, + the key will be derived from the passphrase. + + Returns: + A tuple with the binary data, the marker string, and a boolean to + indicate if decryption was performed. + + Raises: + ValueError: if decoding fails, if the PEM file is encrypted and no passphrase has + been provided or if the passphrase is incorrect. + """ + + # Verify Pre-Encapsulation Boundary + r = re.compile(r"\s*-----BEGIN (.*)-----\s+") + m = r.match(pem_data) + if not m: + raise ValueError("Not a valid PEM pre boundary") + marker = m.group(1) + + # Verify Post-Encapsulation Boundary + r = re.compile(r"-----END (.*)-----\s*$") + m = r.search(pem_data) + if not m or m.group(1) != marker: + raise ValueError("Not a valid PEM post boundary") + + # Removes spaces and slit on lines + lines = pem_data.replace(" ", '').split() + + # Decrypts, if necessary + if lines[1].startswith('Proc-Type:4,ENCRYPTED'): + if not passphrase: + raise ValueError("PEM is encrypted, but no passphrase available") + DEK = lines[2].split(':') + if len(DEK) != 2 or DEK[0] != 'DEK-Info': + raise ValueError("PEM encryption format not supported.") + algo, salt = DEK[1].split(',') + salt = unhexlify(tobytes(salt)) + + padding = True + + if algo == "DES-CBC": + key = _EVP_BytesToKey(passphrase, salt, 8) + objdec = DES.new(key, DES.MODE_CBC, salt) + elif algo == "DES-EDE3-CBC": + key = _EVP_BytesToKey(passphrase, salt, 24) + objdec = DES3.new(key, DES3.MODE_CBC, salt) + elif algo == "AES-128-CBC": + key = _EVP_BytesToKey(passphrase, salt[:8], 16) + objdec = AES.new(key, AES.MODE_CBC, salt) + elif algo == "AES-192-CBC": + key = _EVP_BytesToKey(passphrase, salt[:8], 24) + objdec = AES.new(key, AES.MODE_CBC, salt) + elif algo == "AES-256-CBC": + key = _EVP_BytesToKey(passphrase, salt[:8], 32) + objdec = AES.new(key, AES.MODE_CBC, salt) + elif algo.lower() == "id-aes256-gcm": + key = _EVP_BytesToKey(passphrase, salt[:8], 32) + objdec = AES.new(key, AES.MODE_GCM, nonce=salt) + padding = False + else: + raise ValueError("Unsupport PEM encryption algorithm (%s)." % algo) + lines = lines[2:] + else: + objdec = None + + # Decode body + data = a2b_base64(''.join(lines[1:-1])) + enc_flag = False + if objdec: + if padding: + data = unpad(objdec.decrypt(data), objdec.block_size) + else: + # There is no tag, so we don't use decrypt_and_verify + data = objdec.decrypt(data) + enc_flag = True + + return (data, marker, enc_flag) diff --git a/lib/python3.11/site-packages/Cryptodome/IO/PEM.pyi b/lib/python3.11/site-packages/Cryptodome/IO/PEM.pyi new file mode 100644 index 0000000..2e324c4 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/IO/PEM.pyi @@ -0,0 +1,10 @@ +from typing import Tuple, Optional, Callable + +def encode(data: bytes, + marke: str, + passphrase: Optional[bytes] = ..., + randfunc: Optional[Callable[[int],bytes]] = ...) -> str: ... + + +def decode(pem_data: str, + passphrase: Optional[bytes] = ...) -> Tuple[bytes, str, bool]: ... diff --git a/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.py b/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.py new file mode 100644 index 0000000..d02aed9 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.py @@ -0,0 +1,239 @@ +# +# PublicKey/PKCS8.py : PKCS#8 functions +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + + +from Cryptodome.Util.py3compat import * + +from Cryptodome.Util.asn1 import ( + DerNull, + DerSequence, + DerObjectId, + DerOctetString, + ) + +from Cryptodome.IO._PBES import PBES1, PBES2, PbesError + + +__all__ = ['wrap', 'unwrap'] + + +def wrap(private_key, key_oid, passphrase=None, protection=None, + prot_params=None, key_params=DerNull(), randfunc=None): + """Wrap a private key into a PKCS#8 blob (clear or encrypted). + + Args: + + private_key (byte string): + 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). + + passphrase (bytes string 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``. + + 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. | + +------------------+-----------------------------------------------+ + + key_params (DER object or None): + The ``parameters`` field to use in the ``AlgorithmIdentifier`` + SEQUENCE. If ``None``, no ``parameters`` field will be added. + By default, the ASN.1 type ``NULL`` is used. + + randfunc (callable): + Random number generation function; it should accept a single integer + N and return a string of random data, N bytes long. + 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. + """ + + # + # PrivateKeyInfo ::= SEQUENCE { + # version Version, + # privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, + # privateKey PrivateKey, + # attributes [0] IMPLICIT Attributes OPTIONAL + # } + # + if key_params is None: + algorithm = DerSequence([DerObjectId(key_oid)]) + else: + algorithm = DerSequence([DerObjectId(key_oid), key_params]) + + pk_info = DerSequence([ + 0, + algorithm, + DerOctetString(private_key) + ]) + pk_info_der = pk_info.encode() + + if passphrase is None: + return pk_info_der + + if not passphrase: + raise ValueError("Empty passphrase") + + # Encryption with PBES2 + passphrase = tobytes(passphrase) + if protection is None: + protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC' + return PBES2.encrypt(pk_info_der, passphrase, + protection, prot_params, randfunc) + + +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. + passphrase (byte string or string): + The passphrase to use to decrypt the blob (if it is encrypted). + + Return: + 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`` + + Raises: + ValueError : if decoding fails + """ + + if passphrase: + passphrase = tobytes(passphrase) + + found = False + try: + p8_private_key = PBES1.decrypt(p8_private_key, passphrase) + found = True + except PbesError as e: + error_str = "PBES1[%s]" % str(e) + except ValueError: + error_str = "PBES1[Invalid]" + + if not found: + try: + p8_private_key = PBES2.decrypt(p8_private_key, passphrase) + found = True + except PbesError as e: + error_str += ",PBES2[%s]" % str(e) + except ValueError: + error_str += ",PBES2[Invalid]" + + if not found: + raise ValueError("Error decoding PKCS#8 (%s)" % error_str) + + pk_info = DerSequence().decode(p8_private_key, nr_elements=(2, 3, 4, 5)) + if len(pk_info) == 2 and not passphrase: + raise ValueError("Not a valid clear PKCS#8 structure " + "(maybe it is encrypted?)") + + # RFC5208, PKCS#8, version is v1(0) + # + # PrivateKeyInfo ::= SEQUENCE { + # version Version, + # privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, + # privateKey PrivateKey, + # attributes [0] IMPLICIT Attributes OPTIONAL + # } + # + # RFC5915, Asymmetric Key Package, version is v2(1) + # + # OneAsymmetricKey ::= SEQUENCE { + # version Version, + # privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, + # privateKey PrivateKey, + # attributes [0] Attributes OPTIONAL, + # ..., + # [[2: publicKey [1] PublicKey OPTIONAL ]], + # ... + # } + + if pk_info[0] == 0: + if len(pk_info) not in (3, 4): + raise ValueError("Not a valid PrivateKeyInfo SEQUENCE") + elif pk_info[0] == 1: + if len(pk_info) not in (3, 4, 5): + raise ValueError("Not a valid PrivateKeyInfo SEQUENCE") + else: + raise ValueError("Not a valid PrivateKeyInfo SEQUENCE") + + algo = DerSequence().decode(pk_info[1], nr_elements=(1, 2)) + algo_oid = DerObjectId().decode(algo[0]).value + if len(algo) == 1: + algo_params = None + else: + try: + DerNull().decode(algo[1]) + algo_params = None + except: + algo_params = algo[1] + + # PrivateKey ::= OCTET STRING + private_key = DerOctetString().decode(pk_info[2]).payload + + # We ignore attributes and (for v2 only) publickey + + return (algo_oid, private_key, algo_params) diff --git a/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.pyi b/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.pyi new file mode 100644 index 0000000..be716af --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/IO/PKCS8.pyi @@ -0,0 +1,14 @@ +from typing import Dict, Tuple, Optional, Union, Callable + +from Cryptodome.Util.asn1 import DerObject + +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: ... + + +def unwrap(p8_private_key: bytes, passphrase: Optional[Union[bytes, str]] = ...) -> Tuple[str, bytes, Optional[bytes]]: ... diff --git a/lib/python3.11/site-packages/Cryptodome/IO/_PBES.py b/lib/python3.11/site-packages/Cryptodome/IO/_PBES.py new file mode 100644 index 0000000..9ee5385 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/IO/_PBES.py @@ -0,0 +1,435 @@ +# +# PublicKey/_PBES.py : Password-Based Encryption functions +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome import Random +from Cryptodome.Util.asn1 import ( + DerSequence, DerOctetString, + DerObjectId, DerInteger, + ) + +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" +_OID_PBE_WITH_MD5_AND_RC2_CBC = "1.2.840.113549.1.5.6" +_OID_PBE_WITH_SHA1_AND_DES_CBC = "1.2.840.113549.1.5.10" +_OID_PBE_WITH_SHA1_AND_RC2_CBC = "1.2.840.113549.1.5.11" + +_OID_PBES2 = "1.2.840.113549.1.5.13" + +_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" + + +class PbesError(ValueError): + pass + +# These are the ASN.1 definitions used by the PBES1/2 logic: +# +# EncryptedPrivateKeyInfo ::= SEQUENCE { +# encryptionAlgorithm EncryptionAlgorithmIdentifier, +# encryptedData EncryptedData +# } +# +# EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier +# +# EncryptedData ::= OCTET STRING +# +# AlgorithmIdentifier ::= SEQUENCE { +# algorithm OBJECT IDENTIFIER, +# parameters ANY DEFINED BY algorithm OPTIONAL +# } +# +# PBEParameter ::= SEQUENCE { +# salt OCTET STRING (SIZE(8)), +# iterationCount INTEGER +# } +# +# PBES2-params ::= SEQUENCE { +# keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}}, +# encryptionScheme AlgorithmIdentifier {{PBES2-Encs}} +# } +# +# PBKDF2-params ::= SEQUENCE { +# salt CHOICE { +# specified OCTET STRING, +# otherSource AlgorithmIdentifier {{PBKDF2-SaltSources}} +# }, +# iterationCount INTEGER (1..MAX), +# keyLength INTEGER (1..MAX) OPTIONAL, +# prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1 +# } +# +# scrypt-params ::= SEQUENCE { +# salt OCTET STRING, +# costParameter INTEGER (1..MAX), +# blockSize INTEGER (1..MAX), +# parallelizationParameter INTEGER (1..MAX), +# 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`__). + + .. __: http://www.ietf.org/rfc/rfc2898.txt + """ + + @staticmethod + def decrypt(data, passphrase): + """Decrypt a piece of data using a passphrase and *PBES1*. + + The algorithm to use is automatically detected. + + :Parameters: + data : byte string + The piece of data to decrypt. + passphrase : byte string + The passphrase to use for decrypting the data. + :Returns: + The decrypted data, as a binary string. + """ + + enc_private_key_info = DerSequence().decode(data) + encrypted_algorithm = DerSequence().decode(enc_private_key_info[0]) + encrypted_data = DerOctetString().decode(enc_private_key_info[1]).payload + + pbe_oid = DerObjectId().decode(encrypted_algorithm[0]).value + cipher_params = {} + if pbe_oid == _OID_PBE_WITH_MD5_AND_DES_CBC: + # PBE_MD5_DES_CBC + hashmod = MD5 + ciphermod = DES + elif pbe_oid == _OID_PBE_WITH_MD5_AND_RC2_CBC: + # PBE_MD5_RC2_CBC + hashmod = MD5 + ciphermod = ARC2 + cipher_params['effective_keylen'] = 64 + elif pbe_oid == _OID_PBE_WITH_SHA1_AND_DES_CBC: + # PBE_SHA1_DES_CBC + hashmod = SHA1 + ciphermod = DES + elif pbe_oid == _OID_PBE_WITH_SHA1_AND_RC2_CBC: + # PBE_SHA1_RC2_CBC + hashmod = SHA1 + ciphermod = ARC2 + cipher_params['effective_keylen'] = 64 + else: + raise PbesError("Unknown OID for PBES1") + + pbe_params = DerSequence().decode(encrypted_algorithm[1], nr_elements=2) + salt = DerOctetString().decode(pbe_params[0]).payload + iterations = pbe_params[1] + + 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) + pt = cipher.decrypt(encrypted_data) + return unpad(pt, cipher.block_size) + + +class PBES2(object): + """Encryption scheme with password-based key derivation + (defined in `PKCS#5 v2.0`__). + + .. __: http://www.ietf.org/rfc/rfc2898.txt.""" + + @staticmethod + def encrypt(data, passphrase, protection, prot_params=None, randfunc=None): + """Encrypt a piece of data using a passphrase and *PBES2*. + + :Parameters: + data : byte string + The piece of data to encrypt. + passphrase : byte string + The passphrase to use for encrypting the data. + protection : string + The identifier of the encryption algorithm to use. + The default value is '``PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC``'. + prot_params : dictionary + Parameters of 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 1 000. | + | | The default value for scrypt is 16 384. | + +------------------+-----------------------------------------------+ + | 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. | + +------------------+-----------------------------------------------+ + + + randfunc : callable + Random number generation function; it should accept + a single integer N and return a string of random data, + N bytes long. If not specified, a new RNG will be + instantiated from ``Cryptodome.Random``. + + :Returns: + The encrypted data, as a binary string. + """ + + if prot_params is None: + prot_params = {} + + if randfunc is None: + randfunc = Random.new().read + + if protection == 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC': + key_size = 24 + module = DES3 + cipher_mode = DES3.MODE_CBC + enc_oid = _OID_DES_EDE3_CBC + elif protection in ('PBKDF2WithHMAC-SHA1AndAES128-CBC', + 'scryptAndAES128-CBC'): + key_size = 16 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES128_CBC + elif protection in ('PBKDF2WithHMAC-SHA1AndAES192-CBC', + 'scryptAndAES192-CBC'): + key_size = 24 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES192_CBC + elif protection in ('PBKDF2WithHMAC-SHA1AndAES256-CBC', + 'scryptAndAES256-CBC'): + key_size = 32 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES256_CBC + else: + raise ValueError("Unknown PBES2 mode") + + # Get random data + iv = randfunc(module.block_size) + salt = randfunc(prot_params.get("salt_size", 8)) + + # Derive key from password + if protection.startswith('PBKDF2'): + count = prot_params.get("iteration_count", 1000) + key = PBKDF2(passphrase, salt, key_size, count) + kdf_info = DerSequence([ + DerObjectId(_OID_PBKDF2), # PBKDF2 + DerSequence([ + DerOctetString(salt), + DerInteger(count) + ]) + ]) + else: + # It must be scrypt + count = prot_params.get("iteration_count", 16384) + scrypt_r = prot_params.get('block_size', 8) + scrypt_p = prot_params.get('parallelization', 1) + key = scrypt(passphrase, salt, key_size, + count, scrypt_r, scrypt_p) + kdf_info = DerSequence([ + DerObjectId(_OID_SCRYPT), # scrypt + DerSequence([ + DerOctetString(salt), + DerInteger(count), + DerInteger(scrypt_r), + DerInteger(scrypt_p) + ]) + ]) + + # Create cipher and use it + cipher = module.new(key, cipher_mode, iv) + encrypted_data = cipher.encrypt(pad(data, cipher.block_size)) + enc_info = DerSequence([ + DerObjectId(enc_oid), + DerOctetString(iv) + ]) + + # Result + enc_private_key_info = DerSequence([ + # encryptionAlgorithm + DerSequence([ + DerObjectId(_OID_PBES2), + DerSequence([ + kdf_info, + enc_info + ]), + ]), + DerOctetString(encrypted_data) + ]) + return enc_private_key_info.encode() + + @staticmethod + def decrypt(data, passphrase): + """Decrypt a piece of data using a passphrase and *PBES2*. + + The algorithm to use is automatically detected. + + :Parameters: + data : byte string + The piece of data to decrypt. + passphrase : byte string + The passphrase to use for decrypting the data. + :Returns: + The decrypted data, as a binary string. + """ + + enc_private_key_info = DerSequence().decode(data, nr_elements=2) + enc_algo = DerSequence().decode(enc_private_key_info[0]) + encrypted_data = DerOctetString().decode(enc_private_key_info[1]).payload + + pbe_oid = DerObjectId().decode(enc_algo[0]).value + if pbe_oid != _OID_PBES2: + raise PbesError("Not a PBES2 object") + + pbes2_params = DerSequence().decode(enc_algo[1], nr_elements=2) + + ### Key Derivation Function selection + kdf_info = DerSequence().decode(pbes2_params[0], nr_elements=2) + kdf_oid = DerObjectId().decode(kdf_info[0]).value + + kdf_key_length = None + + # We only support PBKDF2 or scrypt + if kdf_oid == _OID_PBKDF2: + + pbkdf2_params = DerSequence().decode(kdf_info[1], nr_elements=(2, 3, 4)) + salt = DerOctetString().decode(pbkdf2_params[0]).payload + iteration_count = pbkdf2_params[1] + + left = len(pbkdf2_params) - 2 + idx = 2 + + if left > 0: + try: + kdf_key_length = pbkdf2_params[idx] - 0 + left -= 1 + idx += 1 + except TypeError: + pass + + # Default is HMAC-SHA1 + pbkdf2_prf_oid = "1.2.840.113549.2.7" + if left > 0: + pbkdf2_prf_algo_id = DerSequence().decode(pbkdf2_params[idx]) + pbkdf2_prf_oid = DerObjectId().decode(pbkdf2_prf_algo_id[0]).value + + elif kdf_oid == _OID_SCRYPT: + + scrypt_params = DerSequence().decode(kdf_info[1], nr_elements=(4, 5)) + salt = DerOctetString().decode(scrypt_params[0]).payload + iteration_count, scrypt_r, scrypt_p = [scrypt_params[x] + for x in (1, 2, 3)] + if len(scrypt_params) > 4: + kdf_key_length = scrypt_params[4] + else: + kdf_key_length = None + else: + raise PbesError("Unsupported PBES2 KDF") + + ### Cipher selection + enc_info = DerSequence().decode(pbes2_params[1]) + enc_oid = DerObjectId().decode(enc_info[0]).value + + if enc_oid == _OID_DES_EDE3_CBC: + # DES_EDE3_CBC + ciphermod = DES3 + key_size = 24 + elif enc_oid == _OID_AES128_CBC: + # AES128_CBC + ciphermod = AES + key_size = 16 + elif enc_oid == _OID_AES192_CBC: + # AES192_CBC + ciphermod = AES + key_size = 24 + elif enc_oid == _OID_AES256_CBC: + # AES256_CBC + ciphermod = AES + key_size = 32 + else: + raise PbesError("Unsupported PBES2 cipher") + + 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 + + # 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: + raise PbesError("Unsupported HMAC %s" % pbkdf2_prf_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) + + # Decrypt data + pt = cipher.decrypt(encrypted_data) + return unpad(pt, cipher.block_size) diff --git a/lib/python3.11/site-packages/Cryptodome/IO/_PBES.pyi b/lib/python3.11/site-packages/Cryptodome/IO/_PBES.pyi new file mode 100644 index 0000000..a8a34ce --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/IO/_PBES.pyi @@ -0,0 +1,19 @@ +from typing import Dict, Optional, Callable + +class PbesError(ValueError): + ... + +class PBES1(object): + @staticmethod + def decrypt(data: bytes, passphrase: bytes) -> bytes: ... + +class PBES2(object): + @staticmethod + def encrypt(data: bytes, + passphrase: bytes, + protection: str, + prot_params: Optional[Dict] = ..., + randfunc: Optional[Callable[[int],bytes]] = ...) -> bytes: ... + + @staticmethod + def decrypt(data:bytes, passphrase: bytes) -> bytes: ... diff --git a/lib/python3.11/site-packages/Cryptodome/IO/__init__.py b/lib/python3.11/site-packages/Cryptodome/IO/__init__.py new file mode 100644 index 0000000..85a0d0b --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/IO/__init__.py @@ -0,0 +1,31 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +__all__ = ['PEM', 'PKCS8'] diff --git a/lib/python3.11/site-packages/Cryptodome/Math/Numbers.py b/lib/python3.11/site-packages/Cryptodome/Math/Numbers.py new file mode 100644 index 0000000..c9ff848 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/Numbers.py @@ -0,0 +1,42 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +__all__ = ["Integer"] + +try: + from Cryptodome.Math._IntegerGMP import IntegerGMP as Integer + from Cryptodome.Math._IntegerGMP import implementation as _implementation +except (ImportError, OSError, AttributeError): + try: + from Cryptodome.Math._IntegerCustom import IntegerCustom as Integer + from Cryptodome.Math._IntegerCustom import implementation as _implementation + except (ImportError, OSError): + from Cryptodome.Math._IntegerNative import IntegerNative as Integer + _implementation = {} diff --git a/lib/python3.11/site-packages/Cryptodome/Math/Numbers.pyi b/lib/python3.11/site-packages/Cryptodome/Math/Numbers.pyi new file mode 100644 index 0000000..b0206ca --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/Numbers.pyi @@ -0,0 +1,2 @@ +from Cryptodome.Math._IntegerBase import IntegerBase as Integer +__all__ = ['Integer'] diff --git a/lib/python3.11/site-packages/Cryptodome/Math/Primality.py b/lib/python3.11/site-packages/Cryptodome/Math/Primality.py new file mode 100644 index 0000000..33814fa --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/Primality.py @@ -0,0 +1,369 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Functions to create and test prime numbers. + +:undocumented: __package__ +""" + +from Cryptodome import Random +from Cryptodome.Math.Numbers import Integer + +from Cryptodome.Util.py3compat import iter_range + +COMPOSITE = 0 +PROBABLY_PRIME = 1 + + +def miller_rabin_test(candidate, iterations, randfunc=None): + """Perform a Miller-Rabin primality test on an integer. + + The test is specified in Section C.3.1 of `FIPS PUB 186-4`__. + + :Parameters: + candidate : integer + The number to test for primality. + iterations : integer + The maximum number of iterations to perform before + declaring a candidate a probable prime. + randfunc : callable + An RNG function where bases are taken from. + + :Returns: + ``Primality.COMPOSITE`` or ``Primality.PROBABLY_PRIME``. + + .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + """ + + if not isinstance(candidate, Integer): + candidate = Integer(candidate) + + if candidate in (1, 2, 3, 5): + return PROBABLY_PRIME + + if candidate.is_even(): + return COMPOSITE + + one = Integer(1) + minus_one = Integer(candidate - 1) + + if randfunc is None: + randfunc = Random.new().read + + # Step 1 and 2 + m = Integer(minus_one) + a = 0 + while m.is_even(): + m >>= 1 + a += 1 + + # Skip step 3 + + # Step 4 + for i in iter_range(iterations): + + # Step 4.1-2 + base = 1 + while base in (one, minus_one): + base = Integer.random_range(min_inclusive=2, + max_inclusive=candidate - 2, + randfunc=randfunc) + assert(2 <= base <= candidate - 2) + + # Step 4.3-4.4 + z = pow(base, m, candidate) + if z in (one, minus_one): + continue + + # Step 4.5 + for j in iter_range(1, a): + z = pow(z, 2, candidate) + if z == minus_one: + break + if z == one: + return COMPOSITE + else: + return COMPOSITE + + # Step 5 + return PROBABLY_PRIME + + +def lucas_test(candidate): + """Perform a Lucas primality test on an integer. + + The test is specified in Section C.3.3 of `FIPS PUB 186-4`__. + + :Parameters: + candidate : integer + The number to test for primality. + + :Returns: + ``Primality.COMPOSITE`` or ``Primality.PROBABLY_PRIME``. + + .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + """ + + if not isinstance(candidate, Integer): + candidate = Integer(candidate) + + # Step 1 + if candidate in (1, 2, 3, 5): + return PROBABLY_PRIME + if candidate.is_even() or candidate.is_perfect_square(): + return COMPOSITE + + # Step 2 + def alternate(): + value = 5 + while True: + yield value + if value > 0: + value += 2 + else: + value -= 2 + value = -value + + for D in alternate(): + if candidate in (D, -D): + continue + js = Integer.jacobi_symbol(D, candidate) + if js == 0: + return COMPOSITE + if js == -1: + break + # Found D. P=1 and Q=(1-D)/4 (note that Q is guaranteed to be an integer) + + # Step 3 + # This is \delta(n) = n - jacobi(D/n) + K = candidate + 1 + # Step 4 + r = K.size_in_bits() - 1 + # Step 5 + # U_1=1 and V_1=P + U_i = Integer(1) + V_i = Integer(1) + U_temp = Integer(0) + V_temp = Integer(0) + # Step 6 + for i in iter_range(r - 1, -1, -1): + # Square + # U_temp = U_i * V_i % candidate + U_temp.set(U_i) + U_temp *= V_i + U_temp %= candidate + # V_temp = (((V_i ** 2 + (U_i ** 2 * D)) * K) >> 1) % candidate + V_temp.set(U_i) + V_temp *= U_i + V_temp *= D + V_temp.multiply_accumulate(V_i, V_i) + if V_temp.is_odd(): + V_temp += candidate + V_temp >>= 1 + V_temp %= candidate + # Multiply + if K.get_bit(i): + # U_i = (((U_temp + V_temp) * K) >> 1) % candidate + U_i.set(U_temp) + U_i += V_temp + if U_i.is_odd(): + U_i += candidate + U_i >>= 1 + U_i %= candidate + # V_i = (((V_temp + U_temp * D) * K) >> 1) % candidate + V_i.set(V_temp) + V_i.multiply_accumulate(U_temp, D) + if V_i.is_odd(): + V_i += candidate + V_i >>= 1 + V_i %= candidate + else: + U_i.set(U_temp) + V_i.set(V_temp) + # Step 7 + if U_i == 0: + return PROBABLY_PRIME + return COMPOSITE + + +from Cryptodome.Util.number import sieve_base as _sieve_base_large +## The optimal number of small primes to use for the sieve +## is probably dependent on the platform and the candidate size +_sieve_base = set(_sieve_base_large[:100]) + + +def test_probable_prime(candidate, randfunc=None): + """Test if a number is prime. + + A number is qualified as prime if it passes a certain + number of Miller-Rabin tests (dependent on the size + of the number, but such that probability of a false + positive is less than 10^-30) and a single Lucas test. + + For instance, a 1024-bit candidate will need to pass + 4 Miller-Rabin tests. + + :Parameters: + candidate : integer + The number to test for primality. + randfunc : callable + The routine to draw random bytes from to select Miller-Rabin bases. + :Returns: + ``PROBABLE_PRIME`` if the number if prime with very high probability. + ``COMPOSITE`` if the number is a composite. + For efficiency reasons, ``COMPOSITE`` is also returned for small primes. + """ + + if randfunc is None: + randfunc = Random.new().read + + if not isinstance(candidate, Integer): + candidate = Integer(candidate) + + # First, check trial division by the smallest primes + if int(candidate) in _sieve_base: + return PROBABLY_PRIME + try: + map(candidate.fail_if_divisible_by, _sieve_base) + except ValueError: + return COMPOSITE + + # These are the number of Miller-Rabin iterations s.t. p(k, t) < 1E-30, + # with p(k, t) being the probability that a randomly chosen k-bit number + # is composite but still survives t MR iterations. + mr_ranges = ((220, 30), (280, 20), (390, 15), (512, 10), + (620, 7), (740, 6), (890, 5), (1200, 4), + (1700, 3), (3700, 2)) + + bit_size = candidate.size_in_bits() + try: + mr_iterations = list(filter(lambda x: bit_size < x[0], + mr_ranges))[0][1] + except IndexError: + mr_iterations = 1 + + if miller_rabin_test(candidate, mr_iterations, + randfunc=randfunc) == COMPOSITE: + return COMPOSITE + if lucas_test(candidate) == COMPOSITE: + return COMPOSITE + return PROBABLY_PRIME + + +def generate_probable_prime(**kwargs): + """Generate a random probable prime. + + The prime will not have any specific properties + (e.g. it will not be a *strong* prime). + + Random numbers are evaluated for primality until one + passes all tests, consisting of a certain number of + Miller-Rabin tests with random bases followed by + a single Lucas test. + + The number of Miller-Rabin iterations is chosen such that + the probability that the output number is a non-prime is + less than 1E-30 (roughly 2^{-100}). + + This approach is compliant to `FIPS PUB 186-4`__. + + :Keywords: + exact_bits : integer + The desired size in bits of the probable prime. + It must be at least 160. + randfunc : callable + An RNG function where candidate primes are taken from. + prime_filter : callable + A function that takes an Integer as parameter and returns + True if the number can be passed to further primality tests, + False if it should be immediately discarded. + + :Return: + A probable prime in the range 2^exact_bits > p > 2^(exact_bits-1). + + .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + """ + + exact_bits = kwargs.pop("exact_bits", None) + randfunc = kwargs.pop("randfunc", None) + prime_filter = kwargs.pop("prime_filter", lambda x: True) + if kwargs: + raise ValueError("Unknown parameters: " + kwargs.keys()) + + if exact_bits is None: + raise ValueError("Missing exact_bits parameter") + if exact_bits < 160: + raise ValueError("Prime number is not big enough.") + + if randfunc is None: + randfunc = Random.new().read + + result = COMPOSITE + while result == COMPOSITE: + candidate = Integer.random(exact_bits=exact_bits, + randfunc=randfunc) | 1 + if not prime_filter(candidate): + continue + result = test_probable_prime(candidate, randfunc) + return candidate + + +def generate_probable_safe_prime(**kwargs): + """Generate a random, probable safe prime. + + Note this operation is much slower than generating a simple prime. + + :Keywords: + exact_bits : integer + The desired size in bits of the probable safe prime. + randfunc : callable + An RNG function where candidate primes are taken from. + + :Return: + A probable safe prime in the range + 2^exact_bits > p > 2^(exact_bits-1). + """ + + exact_bits = kwargs.pop("exact_bits", None) + randfunc = kwargs.pop("randfunc", None) + if kwargs: + raise ValueError("Unknown parameters: " + kwargs.keys()) + + if randfunc is None: + randfunc = Random.new().read + + result = COMPOSITE + while result == COMPOSITE: + q = generate_probable_prime(exact_bits=exact_bits - 1, randfunc=randfunc) + candidate = q * 2 + 1 + if candidate.size_in_bits() != exact_bits: + continue + result = test_probable_prime(candidate, randfunc=randfunc) + return candidate diff --git a/lib/python3.11/site-packages/Cryptodome/Math/Primality.pyi b/lib/python3.11/site-packages/Cryptodome/Math/Primality.pyi new file mode 100644 index 0000000..7813483 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/Primality.pyi @@ -0,0 +1,18 @@ +from typing import Callable, Optional, Union, Set + +PrimeResult = int + +COMPOSITE: PrimeResult +PROBABLY_PRIME: PrimeResult + +def miller_rabin_test(candidate: int, iterations: int, randfunc: Optional[Callable[[int],bytes]]=None) -> PrimeResult: ... +def lucas_test(candidate: int) -> PrimeResult: ... +_sieve_base: Set[int] +def test_probable_prime(candidate: int, randfunc: Optional[Callable[[int],bytes]]=None) -> PrimeResult: ... +def generate_probable_prime(*, + exact_bits: int = ..., + randfunc: Callable[[int],bytes] = ..., + prime_filter: Callable[[int],bool] = ...) -> int: ... +def generate_probable_safe_prime(*, + exact_bits: int = ..., + randfunc: Callable[[int],bytes] = ...) -> int: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.py b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.py new file mode 100644 index 0000000..7d78c4b --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.py @@ -0,0 +1,392 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import abc + +from Cryptodome.Util.py3compat import iter_range, bord, bchr, ABC + +from Cryptodome import Random + + +class IntegerBase(ABC): + + # Conversions + @abc.abstractmethod + def __int__(self): + pass + + @abc.abstractmethod + def __str__(self): + pass + + @abc.abstractmethod + def __repr__(self): + pass + + @abc.abstractmethod + def to_bytes(self, block_size=0, byteorder='big'): + pass + + @staticmethod + @abc.abstractmethod + def from_bytes(byte_string, byteorder='big'): + pass + + # Relations + @abc.abstractmethod + def __eq__(self, term): + pass + + @abc.abstractmethod + def __ne__(self, term): + pass + + @abc.abstractmethod + def __lt__(self, term): + pass + + @abc.abstractmethod + def __le__(self, term): + pass + + @abc.abstractmethod + def __gt__(self, term): + pass + + @abc.abstractmethod + def __ge__(self, term): + pass + + @abc.abstractmethod + def __nonzero__(self): + pass + __bool__ = __nonzero__ + + @abc.abstractmethod + def is_negative(self): + pass + + # Arithmetic operations + @abc.abstractmethod + def __add__(self, term): + pass + + @abc.abstractmethod + def __sub__(self, term): + pass + + @abc.abstractmethod + def __mul__(self, factor): + pass + + @abc.abstractmethod + def __floordiv__(self, divisor): + pass + + @abc.abstractmethod + def __mod__(self, divisor): + pass + + @abc.abstractmethod + def inplace_pow(self, exponent, modulus=None): + pass + + @abc.abstractmethod + def __pow__(self, exponent, modulus=None): + pass + + @abc.abstractmethod + def __abs__(self): + pass + + @abc.abstractmethod + def sqrt(self, modulus=None): + pass + + @abc.abstractmethod + def __iadd__(self, term): + pass + + @abc.abstractmethod + def __isub__(self, term): + pass + + @abc.abstractmethod + def __imul__(self, term): + pass + + @abc.abstractmethod + def __imod__(self, term): + pass + + # Boolean/bit operations + @abc.abstractmethod + def __and__(self, term): + pass + + @abc.abstractmethod + def __or__(self, term): + pass + + @abc.abstractmethod + def __rshift__(self, pos): + pass + + @abc.abstractmethod + def __irshift__(self, pos): + pass + + @abc.abstractmethod + def __lshift__(self, pos): + pass + + @abc.abstractmethod + def __ilshift__(self, pos): + pass + + @abc.abstractmethod + def get_bit(self, n): + pass + + # Extra + @abc.abstractmethod + def is_odd(self): + pass + + @abc.abstractmethod + def is_even(self): + pass + + @abc.abstractmethod + def size_in_bits(self): + pass + + @abc.abstractmethod + def size_in_bytes(self): + pass + + @abc.abstractmethod + def is_perfect_square(self): + pass + + @abc.abstractmethod + def fail_if_divisible_by(self, small_prime): + pass + + @abc.abstractmethod + def multiply_accumulate(self, a, b): + pass + + @abc.abstractmethod + def set(self, source): + pass + + @abc.abstractmethod + def inplace_inverse(self, modulus): + pass + + @abc.abstractmethod + def inverse(self, modulus): + pass + + @abc.abstractmethod + def gcd(self, term): + pass + + @abc.abstractmethod + def lcm(self, term): + pass + + @staticmethod + @abc.abstractmethod + def jacobi_symbol(a, n): + pass + + @staticmethod + def _tonelli_shanks(n, p): + """Tonelli-shanks algorithm for computing the square root + of n modulo a prime p. + + n must be in the range [0..p-1]. + p must be at least even. + + The return value r is the square root of modulo p. If non-zero, + another solution will also exist (p-r). + + Note we cannot assume that p is really a prime: if it's not, + we can either raise an exception or return the correct value. + """ + + # See https://rosettacode.org/wiki/Tonelli-Shanks_algorithm + + if n in (0, 1): + return n + + if p % 4 == 3: + root = pow(n, (p + 1) // 4, p) + if pow(root, 2, p) != n: + raise ValueError("Cannot compute square root") + return root + + s = 1 + q = (p - 1) // 2 + while not (q & 1): + s += 1 + q >>= 1 + + z = n.__class__(2) + while True: + euler = pow(z, (p - 1) // 2, p) + if euler == 1: + z += 1 + continue + if euler == p - 1: + break + # Most probably p is not a prime + raise ValueError("Cannot compute square root") + + m = s + c = pow(z, q, p) + t = pow(n, q, p) + r = pow(n, (q + 1) // 2, p) + + while t != 1: + for i in iter_range(0, m): + if pow(t, 2**i, p) == 1: + break + if i == m: + raise ValueError("Cannot compute square root of %d mod %d" % (n, p)) + b = pow(c, 2**(m - i - 1), p) + m = i + c = b**2 % p + t = (t * b**2) % p + r = (r * b) % p + + if pow(r, 2, p) != n: + raise ValueError("Cannot compute square root") + + return r + + @classmethod + def random(cls, **kwargs): + """Generate a random natural integer of a certain size. + + :Keywords: + exact_bits : positive integer + The length in bits of the resulting random Integer number. + The number is guaranteed to fulfil the relation: + + 2^bits > result >= 2^(bits - 1) + + max_bits : positive integer + The maximum length in bits of the resulting random Integer number. + The number is guaranteed to fulfil the relation: + + 2^bits > result >=0 + + randfunc : callable + A function that returns a random byte string. The length of the + byte string is passed as parameter. Optional. + If not provided (or ``None``), randomness is read from the system RNG. + + :Return: a Integer object + """ + + exact_bits = kwargs.pop("exact_bits", None) + max_bits = kwargs.pop("max_bits", None) + randfunc = kwargs.pop("randfunc", None) + + if randfunc is None: + randfunc = Random.new().read + + if exact_bits is None and max_bits is None: + raise ValueError("Either 'exact_bits' or 'max_bits' must be specified") + + if exact_bits is not None and max_bits is not None: + raise ValueError("'exact_bits' and 'max_bits' are mutually exclusive") + + bits = exact_bits or max_bits + bytes_needed = ((bits - 1) // 8) + 1 + significant_bits_msb = 8 - (bytes_needed * 8 - bits) + msb = bord(randfunc(1)[0]) + if exact_bits is not None: + msb |= 1 << (significant_bits_msb - 1) + msb &= (1 << significant_bits_msb) - 1 + + return cls.from_bytes(bchr(msb) + randfunc(bytes_needed - 1)) + + @classmethod + def random_range(cls, **kwargs): + """Generate a random integer within a given internal. + + :Keywords: + min_inclusive : integer + The lower end of the interval (inclusive). + max_inclusive : integer + The higher end of the interval (inclusive). + max_exclusive : integer + The higher end of the interval (exclusive). + randfunc : callable + A function that returns a random byte string. The length of the + byte string is passed as parameter. Optional. + If not provided (or ``None``), randomness is read from the system RNG. + :Returns: + An Integer randomly taken in the given interval. + """ + + min_inclusive = kwargs.pop("min_inclusive", None) + max_inclusive = kwargs.pop("max_inclusive", None) + max_exclusive = kwargs.pop("max_exclusive", None) + randfunc = kwargs.pop("randfunc", None) + + if kwargs: + raise ValueError("Unknown keywords: " + str(kwargs.keys)) + if None not in (max_inclusive, max_exclusive): + raise ValueError("max_inclusive and max_exclusive cannot be both" + " specified") + if max_exclusive is not None: + max_inclusive = max_exclusive - 1 + if None in (min_inclusive, max_inclusive): + raise ValueError("Missing keyword to identify the interval") + + if randfunc is None: + randfunc = Random.new().read + + norm_maximum = max_inclusive - min_inclusive + bits_needed = cls(norm_maximum).size_in_bits() + + norm_candidate = -1 + while not 0 <= norm_candidate <= norm_maximum: + norm_candidate = cls.random( + max_bits=bits_needed, + randfunc=randfunc + ) + return norm_candidate + min_inclusive + diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.pyi b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.pyi new file mode 100644 index 0000000..a42a48b --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerBase.pyi @@ -0,0 +1,63 @@ +from typing import Optional, Union, Callable + +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: ... + def to_bytes(self, block_size: Optional[int]=0, byteorder: str= ...) -> bytes: ... + @staticmethod + def from_bytes(byte_string: bytes, byteorder: Optional[str] = ...) -> IntegerBase: ... + def __eq__(self, term: object) -> bool: ... + def __ne__(self, term: object) -> bool: ... + def __lt__(self, term: Union[IntegerBase, int]) -> bool: ... + def __le__(self, term: Union[IntegerBase, int]) -> bool: ... + def __gt__(self, term: Union[IntegerBase, int]) -> bool: ... + def __ge__(self, term: Union[IntegerBase, int]) -> bool: ... + def __nonzero__(self) -> bool: ... + def is_negative(self) -> bool: ... + def __add__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __sub__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __mul__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __floordiv__(self, divisor: Union[IntegerBase, int]) -> IntegerBase: ... + def __mod__(self, divisor: Union[IntegerBase, int]) -> IntegerBase: ... + def inplace_pow(self, exponent: int, modulus: Optional[Union[IntegerBase, int]]=None) -> IntegerBase: ... + def __pow__(self, exponent: int, modulus: Optional[int]) -> IntegerBase: ... + def __abs__(self) -> IntegerBase: ... + def sqrt(self, modulus: Optional[int]) -> IntegerBase: ... + def __iadd__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __isub__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __imul__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __imod__(self, divisor: Union[IntegerBase, int]) -> IntegerBase: ... + def __and__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __or__(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def __rshift__(self, pos: Union[IntegerBase, int]) -> IntegerBase: ... + def __irshift__(self, pos: Union[IntegerBase, int]) -> IntegerBase: ... + def __lshift__(self, pos: Union[IntegerBase, int]) -> IntegerBase: ... + def __ilshift__(self, pos: Union[IntegerBase, int]) -> IntegerBase: ... + def get_bit(self, n: int) -> bool: ... + def is_odd(self) -> bool: ... + def is_even(self) -> bool: ... + def size_in_bits(self) -> int: ... + def size_in_bytes(self) -> int: ... + def is_perfect_square(self) -> bool: ... + def fail_if_divisible_by(self, small_prime: Union[IntegerBase, int]) -> None: ... + def multiply_accumulate(self, a: Union[IntegerBase, int], b: Union[IntegerBase, int]) -> IntegerBase: ... + def set(self, source: Union[IntegerBase, int]) -> IntegerBase: ... + def inplace_inverse(self, modulus: Union[IntegerBase, int]) -> IntegerBase: ... + def inverse(self, modulus: Union[IntegerBase, int]) -> IntegerBase: ... + def gcd(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + def lcm(self, term: Union[IntegerBase, int]) -> IntegerBase: ... + @staticmethod + def jacobi_symbol(a: Union[IntegerBase, int], n: Union[IntegerBase, int]) -> IntegerBase: ... + @staticmethod + def _tonelli_shanks(n: Union[IntegerBase, int], p: Union[IntegerBase, int]) -> IntegerBase : ... + @classmethod + def random(cls, **kwargs: Union[int,RandFunc]) -> IntegerBase : ... + @classmethod + def random_range(cls, **kwargs: Union[int,RandFunc]) -> IntegerBase : ... + diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.py b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.py new file mode 100644 index 0000000..0e23152 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.py @@ -0,0 +1,118 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from ._IntegerNative import IntegerNative + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, backend, + c_size_t, c_ulonglong) + + +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); +""" + + +_raw_montgomery = load_pycryptodome_raw_lib("Cryptodome.Math._modexp", c_defs) +implementation = {"library": "custom", "api": backend} + + +class IntegerCustom(IntegerNative): + + @staticmethod + def from_bytes(byte_string, byteorder='big'): + if byteorder == 'big': + pass + elif byteorder == 'little': + byte_string = bytearray(byte_string) + byte_string.reverse() + else: + raise ValueError("Incorrect byteorder") + return IntegerCustom(bytes_to_long(byte_string)) + + def inplace_pow(self, exponent, modulus=None): + exp_value = int(exponent) + if exp_value < 0: + raise ValueError("Exponent must not be negative") + + # No modular reduction + if modulus is None: + self._value = pow(self._value, exp_value) + return self + + # 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: + self._value = pow(self._value, exp_value, mod_value) + return self + + # C extension only works with bases smaller than modulus + if self._value >= mod_value: + self._value %= mod_value + + max_len = len(long_to_bytes(max(self._value, exp_value, mod_value))) + + base_b = long_to_bytes(self._value, max_len) + exp_b = long_to_bytes(exp_value, max_len) + modulus_b = long_to_bytes(mod_value, max_len) + + out = create_string_buffer(max_len) + + error = _raw_montgomery.monty_pow( + out, + base_b, + exp_b, + modulus_b, + c_size_t(max_len), + c_ulonglong(getrandbits(64)) + ) + + if error: + raise ValueError("monty_pow failed with error: %d" % error) + + result = bytes_to_long(get_raw_buffer(out)) + self._value = result + return self diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.pyi b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.pyi new file mode 100644 index 0000000..2dd75c7 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerCustom.pyi @@ -0,0 +1,8 @@ +from typing import Any + +from ._IntegerNative import IntegerNative + +_raw_montgomery = Any + +class IntegerCustom(IntegerNative): + pass diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.py b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.py new file mode 100644 index 0000000..3ab7c59 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.py @@ -0,0 +1,762 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import sys + +from Cryptodome.Util.py3compat import tobytes, is_native_int + +from Cryptodome.Util._raw_api import (backend, load_lib, + get_raw_buffer, get_c_string, + null_pointer, create_string_buffer, + c_ulong, c_size_t, c_uint8_ptr) + +from ._IntegerBase import IntegerBase + +gmp_defs = """typedef unsigned long UNIX_ULONG; + typedef struct { int a; int b; void *c; } MPZ; + typedef MPZ mpz_t[1]; + typedef UNIX_ULONG mp_bitcnt_t; + + void __gmpz_init (mpz_t x); + void __gmpz_init_set (mpz_t rop, const mpz_t op); + void __gmpz_init_set_ui (mpz_t rop, UNIX_ULONG op); + + UNIX_ULONG __gmpz_get_ui (const mpz_t op); + void __gmpz_set (mpz_t rop, const mpz_t op); + void __gmpz_set_ui (mpz_t rop, UNIX_ULONG op); + void __gmpz_add (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_add_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_sub_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_addmul (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_addmul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_submul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_import (mpz_t rop, size_t count, int order, size_t size, + int endian, size_t nails, const void *op); + void * __gmpz_export (void *rop, size_t *countp, int order, + size_t size, + int endian, size_t nails, const mpz_t op); + size_t __gmpz_sizeinbase (const mpz_t op, int base); + void __gmpz_sub (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_mul (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_mul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + int __gmpz_cmp (const mpz_t op1, const mpz_t op2); + void __gmpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const + mpz_t mod); + void __gmpz_powm_ui (mpz_t rop, const mpz_t base, UNIX_ULONG exp, + const mpz_t mod); + void __gmpz_pow_ui (mpz_t rop, const mpz_t base, UNIX_ULONG exp); + void __gmpz_sqrt(mpz_t rop, const mpz_t op); + void __gmpz_mod (mpz_t r, const mpz_t n, const mpz_t d); + void __gmpz_neg (mpz_t rop, const mpz_t op); + void __gmpz_abs (mpz_t rop, const mpz_t op); + void __gmpz_and (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_ior (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_clear (mpz_t x); + void __gmpz_tdiv_q_2exp (mpz_t q, const mpz_t n, mp_bitcnt_t b); + void __gmpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d); + void __gmpz_mul_2exp (mpz_t rop, const mpz_t op1, mp_bitcnt_t op2); + int __gmpz_tstbit (const mpz_t op, mp_bitcnt_t bit_index); + int __gmpz_perfect_square_p (const mpz_t op); + int __gmpz_jacobi (const mpz_t a, const mpz_t b); + void __gmpz_gcd (mpz_t rop, const mpz_t op1, const mpz_t op2); + UNIX_ULONG __gmpz_gcd_ui (mpz_t rop, const mpz_t op1, + UNIX_ULONG op2); + void __gmpz_lcm (mpz_t rop, const mpz_t op1, const mpz_t op2); + int __gmpz_invert (mpz_t rop, const mpz_t op1, const mpz_t op2); + int __gmpz_divisible_p (const mpz_t n, const mpz_t d); + int __gmpz_divisible_ui_p (const mpz_t n, UNIX_ULONG d); + """ + +if sys.platform == "win32": + raise ImportError("Not using GMP on Windows") + +lib = load_lib("gmp", gmp_defs) +implementation = {"library": "gmp", "api": backend} + +if hasattr(lib, "__mpir_version"): + raise ImportError("MPIR library detected") + +# In order to create a function that returns a pointer to +# a new MPZ structure, we need to break the abstraction +# and know exactly what ffi backend we have +if implementation["api"] == "ctypes": + from ctypes import Structure, c_int, c_void_p, byref + + class _MPZ(Structure): + _fields_ = [('_mp_alloc', c_int), + ('_mp_size', c_int), + ('_mp_d', c_void_p)] + + def new_mpz(): + return byref(_MPZ()) + +else: + # We are using CFFI + from Cryptodome.Util._raw_api import ffi + + def new_mpz(): + return ffi.new("MPZ*") + + +# Lazy creation of GMP methods +class _GMP(object): + + def __getattr__(self, name): + if name.startswith("mpz_"): + func_name = "__gmpz_" + name[4:] + elif name.startswith("gmp_"): + func_name = "__gmp_" + name[4:] + else: + raise AttributeError("Attribute %s is invalid" % name) + func = getattr(lib, func_name) + setattr(self, name, func) + return func + + +_gmp = _GMP() + + +class IntegerGMP(IntegerBase): + """A fast, arbitrary precision integer""" + + _zero_mpz_p = new_mpz() + _gmp.mpz_init_set_ui(_zero_mpz_p, c_ulong(0)) + + def __init__(self, value): + """Initialize the integer to the given value.""" + + self._mpz_p = new_mpz() + self._initialized = False + + if isinstance(value, float): + raise ValueError("A floating point type is not a natural number") + + if is_native_int(value): + _gmp.mpz_init(self._mpz_p) + self._initialized = True + if value == 0: + return + + tmp = new_mpz() + _gmp.mpz_init(tmp) + + try: + positive = value >= 0 + reduce = abs(value) + slots = (reduce.bit_length() - 1) // 32 + 1 + + while slots > 0: + slots = slots - 1 + _gmp.mpz_set_ui(tmp, + c_ulong(0xFFFFFFFF & (reduce >> (slots * 32)))) + _gmp.mpz_mul_2exp(tmp, tmp, c_ulong(slots * 32)) + _gmp.mpz_add(self._mpz_p, self._mpz_p, tmp) + finally: + _gmp.mpz_clear(tmp) + + if not positive: + _gmp.mpz_neg(self._mpz_p, self._mpz_p) + + elif isinstance(value, IntegerGMP): + _gmp.mpz_init_set(self._mpz_p, value._mpz_p) + self._initialized = True + else: + raise NotImplementedError + + + # Conversions + def __int__(self): + tmp = new_mpz() + _gmp.mpz_init_set(tmp, self._mpz_p) + + try: + value = 0 + slot = 0 + while _gmp.mpz_cmp(tmp, self._zero_mpz_p) != 0: + lsb = _gmp.mpz_get_ui(tmp) & 0xFFFFFFFF + value |= lsb << (slot * 32) + _gmp.mpz_tdiv_q_2exp(tmp, tmp, c_ulong(32)) + slot = slot + 1 + finally: + _gmp.mpz_clear(tmp) + + if self < 0: + value = -value + return int(value) + + def __str__(self): + return str(int(self)) + + def __repr__(self): + return "Integer(%s)" % str(self) + + # Only Python 2.x + def __hex__(self): + return hex(int(self)) + + # Only Python 3.x + def __index__(self): + return int(self) + + def to_bytes(self, block_size=0, byteorder='big'): + """Convert the number into a byte string. + + This method encodes the number in network order and prepends + as many zero bytes as required. It only works for non-negative + values. + + :Parameters: + block_size : integer + The exact size the output byte string must have. + If zero, the string has the minimal length. + byteorder : string + 'big' for big-endian integers (default), 'little' for litte-endian. + :Returns: + A byte string. + :Raise ValueError: + If the value is negative or if ``block_size`` is + provided and the length of the byte string would exceed it. + """ + + if self < 0: + raise ValueError("Conversion only valid for non-negative numbers") + + buf_len = (_gmp.mpz_sizeinbase(self._mpz_p, 2) + 7) // 8 + if buf_len > block_size > 0: + raise ValueError("Number is too big to convert to byte string" + " of prescribed length") + buf = create_string_buffer(buf_len) + + + _gmp.mpz_export( + buf, + null_pointer, # Ignore countp + 1, # Big endian + c_size_t(1), # Each word is 1 byte long + 0, # Endianess within a word - not relevant + c_size_t(0), # No nails + self._mpz_p) + + result = b'\x00' * max(0, block_size - buf_len) + get_raw_buffer(buf) + if byteorder == 'big': + pass + elif byteorder == 'little': + result = bytearray(result) + result.reverse() + result = bytes(result) + else: + raise ValueError("Incorrect byteorder") + return result + + @staticmethod + def from_bytes(byte_string, byteorder='big'): + """Convert a byte string into a number. + + :Parameters: + byte_string : byte string + The input number, encoded in network order. + It can only be non-negative. + byteorder : string + 'big' for big-endian integers (default), 'little' for litte-endian. + + :Return: + The ``Integer`` object carrying the same value as the input. + """ + result = IntegerGMP(0) + if byteorder == 'big': + pass + elif byteorder == 'little': + byte_string = bytearray(byte_string) + byte_string.reverse() + else: + raise ValueError("Incorrect byteorder") + _gmp.mpz_import( + result._mpz_p, + c_size_t(len(byte_string)), # Amount of words to read + 1, # Big endian + c_size_t(1), # Each word is 1 byte long + 0, # Endianess within a word - not relevant + c_size_t(0), # No nails + c_uint8_ptr(byte_string)) + return result + + # Relations + def _apply_and_return(self, func, term): + if not isinstance(term, IntegerGMP): + term = IntegerGMP(term) + return func(self._mpz_p, term._mpz_p) + + def __eq__(self, term): + if not (isinstance(term, IntegerGMP) or is_native_int(term)): + return False + return self._apply_and_return(_gmp.mpz_cmp, term) == 0 + + def __ne__(self, term): + if not (isinstance(term, IntegerGMP) or is_native_int(term)): + return True + return self._apply_and_return(_gmp.mpz_cmp, term) != 0 + + def __lt__(self, term): + return self._apply_and_return(_gmp.mpz_cmp, term) < 0 + + def __le__(self, term): + return self._apply_and_return(_gmp.mpz_cmp, term) <= 0 + + def __gt__(self, term): + return self._apply_and_return(_gmp.mpz_cmp, term) > 0 + + def __ge__(self, term): + return self._apply_and_return(_gmp.mpz_cmp, term) >= 0 + + def __nonzero__(self): + return _gmp.mpz_cmp(self._mpz_p, self._zero_mpz_p) != 0 + __bool__ = __nonzero__ + + def is_negative(self): + return _gmp.mpz_cmp(self._mpz_p, self._zero_mpz_p) < 0 + + # Arithmetic operations + def __add__(self, term): + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + try: + term = IntegerGMP(term) + except NotImplementedError: + return NotImplemented + _gmp.mpz_add(result._mpz_p, + self._mpz_p, + term._mpz_p) + return result + + def __sub__(self, term): + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + try: + term = IntegerGMP(term) + except NotImplementedError: + return NotImplemented + _gmp.mpz_sub(result._mpz_p, + self._mpz_p, + term._mpz_p) + return result + + def __mul__(self, term): + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + try: + term = IntegerGMP(term) + except NotImplementedError: + return NotImplemented + _gmp.mpz_mul(result._mpz_p, + self._mpz_p, + term._mpz_p) + return result + + def __floordiv__(self, divisor): + if not isinstance(divisor, IntegerGMP): + divisor = IntegerGMP(divisor) + if _gmp.mpz_cmp(divisor._mpz_p, + self._zero_mpz_p) == 0: + raise ZeroDivisionError("Division by zero") + result = IntegerGMP(0) + _gmp.mpz_fdiv_q(result._mpz_p, + self._mpz_p, + divisor._mpz_p) + return result + + def __mod__(self, divisor): + if not isinstance(divisor, IntegerGMP): + divisor = IntegerGMP(divisor) + comp = _gmp.mpz_cmp(divisor._mpz_p, + self._zero_mpz_p) + if comp == 0: + raise ZeroDivisionError("Division by zero") + if comp < 0: + raise ValueError("Modulus must be positive") + result = IntegerGMP(0) + _gmp.mpz_mod(result._mpz_p, + self._mpz_p, + divisor._mpz_p) + return result + + def inplace_pow(self, exponent, modulus=None): + + if modulus is None: + if exponent < 0: + raise ValueError("Exponent must not be negative") + + # Normal exponentiation + if exponent > 256: + raise ValueError("Exponent is too big") + _gmp.mpz_pow_ui(self._mpz_p, + self._mpz_p, # Base + c_ulong(int(exponent)) + ) + else: + # Modular exponentiation + if not isinstance(modulus, IntegerGMP): + modulus = IntegerGMP(modulus) + if not modulus: + raise ZeroDivisionError("Division by zero") + if modulus.is_negative(): + raise ValueError("Modulus must be positive") + if is_native_int(exponent): + if exponent < 0: + raise ValueError("Exponent must not be negative") + if exponent < 65536: + _gmp.mpz_powm_ui(self._mpz_p, + self._mpz_p, + c_ulong(exponent), + modulus._mpz_p) + return self + exponent = IntegerGMP(exponent) + elif exponent.is_negative(): + raise ValueError("Exponent must not be negative") + _gmp.mpz_powm(self._mpz_p, + self._mpz_p, + exponent._mpz_p, + modulus._mpz_p) + return self + + def __pow__(self, exponent, modulus=None): + result = IntegerGMP(self) + return result.inplace_pow(exponent, modulus) + + def __abs__(self): + result = IntegerGMP(0) + _gmp.mpz_abs(result._mpz_p, self._mpz_p) + return result + + def sqrt(self, modulus=None): + """Return the largest Integer that does not + exceed the square root""" + + if modulus is None: + if self < 0: + raise ValueError("Square root of negative value") + result = IntegerGMP(0) + _gmp.mpz_sqrt(result._mpz_p, + self._mpz_p) + else: + if modulus <= 0: + raise ValueError("Modulus must be positive") + modulus = int(modulus) + result = IntegerGMP(self._tonelli_shanks(int(self) % modulus, modulus)) + + return result + + def __iadd__(self, term): + if is_native_int(term): + if 0 <= term < 65536: + _gmp.mpz_add_ui(self._mpz_p, + self._mpz_p, + c_ulong(term)) + return self + if -65535 < term < 0: + _gmp.mpz_sub_ui(self._mpz_p, + self._mpz_p, + c_ulong(-term)) + return self + term = IntegerGMP(term) + _gmp.mpz_add(self._mpz_p, + self._mpz_p, + term._mpz_p) + return self + + def __isub__(self, term): + if is_native_int(term): + if 0 <= term < 65536: + _gmp.mpz_sub_ui(self._mpz_p, + self._mpz_p, + c_ulong(term)) + return self + if -65535 < term < 0: + _gmp.mpz_add_ui(self._mpz_p, + self._mpz_p, + c_ulong(-term)) + return self + term = IntegerGMP(term) + _gmp.mpz_sub(self._mpz_p, + self._mpz_p, + term._mpz_p) + return self + + def __imul__(self, term): + if is_native_int(term): + if 0 <= term < 65536: + _gmp.mpz_mul_ui(self._mpz_p, + self._mpz_p, + c_ulong(term)) + return self + if -65535 < term < 0: + _gmp.mpz_mul_ui(self._mpz_p, + self._mpz_p, + c_ulong(-term)) + _gmp.mpz_neg(self._mpz_p, self._mpz_p) + return self + term = IntegerGMP(term) + _gmp.mpz_mul(self._mpz_p, + self._mpz_p, + term._mpz_p) + return self + + def __imod__(self, divisor): + if not isinstance(divisor, IntegerGMP): + divisor = IntegerGMP(divisor) + comp = _gmp.mpz_cmp(divisor._mpz_p, + divisor._zero_mpz_p) + if comp == 0: + raise ZeroDivisionError("Division by zero") + if comp < 0: + raise ValueError("Modulus must be positive") + _gmp.mpz_mod(self._mpz_p, + self._mpz_p, + divisor._mpz_p) + return self + + # Boolean/bit operations + def __and__(self, term): + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + term = IntegerGMP(term) + _gmp.mpz_and(result._mpz_p, + self._mpz_p, + term._mpz_p) + return result + + def __or__(self, term): + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + term = IntegerGMP(term) + _gmp.mpz_ior(result._mpz_p, + self._mpz_p, + term._mpz_p) + return result + + def __rshift__(self, pos): + result = IntegerGMP(0) + if pos < 0: + raise ValueError("negative shift count") + if pos > 65536: + if self < 0: + return -1 + else: + return 0 + _gmp.mpz_tdiv_q_2exp(result._mpz_p, + self._mpz_p, + c_ulong(int(pos))) + return result + + def __irshift__(self, pos): + if pos < 0: + raise ValueError("negative shift count") + if pos > 65536: + if self < 0: + return -1 + else: + return 0 + _gmp.mpz_tdiv_q_2exp(self._mpz_p, + self._mpz_p, + c_ulong(int(pos))) + return self + + def __lshift__(self, pos): + result = IntegerGMP(0) + if not 0 <= pos < 65536: + raise ValueError("Incorrect shift count") + _gmp.mpz_mul_2exp(result._mpz_p, + self._mpz_p, + c_ulong(int(pos))) + return result + + def __ilshift__(self, pos): + if not 0 <= pos < 65536: + raise ValueError("Incorrect shift count") + _gmp.mpz_mul_2exp(self._mpz_p, + self._mpz_p, + c_ulong(int(pos))) + return self + + def get_bit(self, n): + """Return True if the n-th bit is set to 1. + Bit 0 is the least significant.""" + + if self < 0: + raise ValueError("no bit representation for negative values") + if n < 0: + raise ValueError("negative bit count") + if n > 65536: + return 0 + return bool(_gmp.mpz_tstbit(self._mpz_p, + c_ulong(int(n)))) + + # Extra + def is_odd(self): + return _gmp.mpz_tstbit(self._mpz_p, 0) == 1 + + def is_even(self): + return _gmp.mpz_tstbit(self._mpz_p, 0) == 0 + + def size_in_bits(self): + """Return the minimum number of bits that can encode the number.""" + + if self < 0: + raise ValueError("Conversion only valid for non-negative numbers") + return _gmp.mpz_sizeinbase(self._mpz_p, 2) + + def size_in_bytes(self): + """Return the minimum number of bytes that can encode the number.""" + return (self.size_in_bits() - 1) // 8 + 1 + + def is_perfect_square(self): + return _gmp.mpz_perfect_square_p(self._mpz_p) != 0 + + def fail_if_divisible_by(self, small_prime): + """Raise an exception if the small prime is a divisor.""" + + if is_native_int(small_prime): + if 0 < small_prime < 65536: + if _gmp.mpz_divisible_ui_p(self._mpz_p, + c_ulong(small_prime)): + raise ValueError("The value is composite") + return + small_prime = IntegerGMP(small_prime) + if _gmp.mpz_divisible_p(self._mpz_p, + small_prime._mpz_p): + raise ValueError("The value is composite") + + def multiply_accumulate(self, a, b): + """Increment the number by the product of a and b.""" + + if not isinstance(a, IntegerGMP): + a = IntegerGMP(a) + if is_native_int(b): + if 0 < b < 65536: + _gmp.mpz_addmul_ui(self._mpz_p, + a._mpz_p, + c_ulong(b)) + return self + if -65535 < b < 0: + _gmp.mpz_submul_ui(self._mpz_p, + a._mpz_p, + c_ulong(-b)) + return self + b = IntegerGMP(b) + _gmp.mpz_addmul(self._mpz_p, + a._mpz_p, + b._mpz_p) + return self + + def set(self, source): + """Set the Integer to have the given value""" + + if not isinstance(source, IntegerGMP): + source = IntegerGMP(source) + _gmp.mpz_set(self._mpz_p, + source._mpz_p) + return self + + def inplace_inverse(self, modulus): + """Compute the inverse of this number in the ring of + modulo integers. + + Raise an exception if no inverse exists. + """ + + if not isinstance(modulus, IntegerGMP): + modulus = IntegerGMP(modulus) + + comp = _gmp.mpz_cmp(modulus._mpz_p, + self._zero_mpz_p) + if comp == 0: + raise ZeroDivisionError("Modulus cannot be zero") + if comp < 0: + raise ValueError("Modulus must be positive") + + result = _gmp.mpz_invert(self._mpz_p, + self._mpz_p, + modulus._mpz_p) + if not result: + raise ValueError("No inverse value can be computed") + return self + + def inverse(self, modulus): + result = IntegerGMP(self) + result.inplace_inverse(modulus) + return result + + def gcd(self, term): + """Compute the greatest common denominator between this + number and another term.""" + + result = IntegerGMP(0) + if is_native_int(term): + if 0 < term < 65535: + _gmp.mpz_gcd_ui(result._mpz_p, + self._mpz_p, + c_ulong(term)) + return result + term = IntegerGMP(term) + _gmp.mpz_gcd(result._mpz_p, self._mpz_p, term._mpz_p) + return result + + def lcm(self, term): + """Compute the least common multiplier between this + number and another term.""" + + result = IntegerGMP(0) + if not isinstance(term, IntegerGMP): + term = IntegerGMP(term) + _gmp.mpz_lcm(result._mpz_p, self._mpz_p, term._mpz_p) + return result + + @staticmethod + def jacobi_symbol(a, n): + """Compute the Jacobi symbol""" + + if not isinstance(a, IntegerGMP): + a = IntegerGMP(a) + if not isinstance(n, IntegerGMP): + n = IntegerGMP(n) + if n <= 0 or n.is_even(): + raise ValueError("n must be positive odd for the Jacobi symbol") + return _gmp.mpz_jacobi(a._mpz_p, n._mpz_p) + + # Clean-up + def __del__(self): + + try: + if self._mpz_p is not None: + if self._initialized: + _gmp.mpz_clear(self._mpz_p) + + self._mpz_p = None + except AttributeError: + pass diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.pyi b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.pyi new file mode 100644 index 0000000..2181b47 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerGMP.pyi @@ -0,0 +1,3 @@ +from ._IntegerBase import IntegerBase +class IntegerGMP(IntegerBase): + pass diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.py b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.py new file mode 100644 index 0000000..0cf8173 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.py @@ -0,0 +1,370 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from ._IntegerBase import IntegerBase + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long, inverse, GCD + + +class IntegerNative(IntegerBase): + """A class to model a natural integer (including zero)""" + + def __init__(self, value): + if isinstance(value, float): + raise ValueError("A floating point type is not a natural number") + try: + self._value = value._value + except AttributeError: + self._value = value + + # Conversions + def __int__(self): + return self._value + + def __str__(self): + return str(int(self)) + + def __repr__(self): + return "Integer(%s)" % str(self) + + # Only Python 2.x + def __hex__(self): + return hex(self._value) + + # Only Python 3.x + def __index__(self): + return int(self._value) + + def to_bytes(self, block_size=0, byteorder='big'): + if self._value < 0: + raise ValueError("Conversion only valid for non-negative numbers") + result = long_to_bytes(self._value, block_size) + if len(result) > block_size > 0: + raise ValueError("Value too large to encode") + if byteorder == 'big': + pass + elif byteorder == 'little': + result = bytearray(result) + result.reverse() + result = bytes(result) + else: + raise ValueError("Incorrect byteorder") + return result + + @classmethod + def from_bytes(cls, byte_string, byteorder='big'): + if byteorder == 'big': + pass + elif byteorder == 'little': + byte_string = bytearray(byte_string) + byte_string.reverse() + else: + raise ValueError("Incorrect byteorder") + return cls(bytes_to_long(byte_string)) + + # Relations + def __eq__(self, term): + if term is None: + return False + return self._value == int(term) + + def __ne__(self, term): + return not self.__eq__(term) + + def __lt__(self, term): + return self._value < int(term) + + def __le__(self, term): + return self.__lt__(term) or self.__eq__(term) + + def __gt__(self, term): + return not self.__le__(term) + + def __ge__(self, term): + return not self.__lt__(term) + + def __nonzero__(self): + return self._value != 0 + __bool__ = __nonzero__ + + def is_negative(self): + return self._value < 0 + + # Arithmetic operations + def __add__(self, term): + try: + return self.__class__(self._value + int(term)) + except (ValueError, AttributeError, TypeError): + return NotImplemented + + def __sub__(self, term): + try: + return self.__class__(self._value - int(term)) + except (ValueError, AttributeError, TypeError): + return NotImplemented + + def __mul__(self, factor): + try: + return self.__class__(self._value * int(factor)) + except (ValueError, AttributeError, TypeError): + return NotImplemented + + def __floordiv__(self, divisor): + return self.__class__(self._value // int(divisor)) + + def __mod__(self, divisor): + divisor_value = int(divisor) + if divisor_value < 0: + raise ValueError("Modulus must be positive") + return self.__class__(self._value % divisor_value) + + def inplace_pow(self, exponent, modulus=None): + exp_value = int(exponent) + if exp_value < 0: + raise ValueError("Exponent must not be negative") + + if modulus is not None: + mod_value = int(modulus) + if mod_value < 0: + raise ValueError("Modulus must be positive") + if mod_value == 0: + raise ZeroDivisionError("Modulus cannot be zero") + else: + mod_value = None + self._value = pow(self._value, exp_value, mod_value) + return self + + def __pow__(self, exponent, modulus=None): + result = self.__class__(self) + return result.inplace_pow(exponent, modulus) + + def __abs__(self): + return abs(self._value) + + def sqrt(self, modulus=None): + + value = self._value + if modulus is None: + if value < 0: + raise ValueError("Square root of negative value") + # http://stackoverflow.com/questions/15390807/integer-square-root-in-python + + x = value + y = (x + 1) // 2 + while y < x: + x = y + y = (x + value // x) // 2 + result = x + else: + if modulus <= 0: + raise ValueError("Modulus must be positive") + result = self._tonelli_shanks(self % modulus, modulus) + + return self.__class__(result) + + def __iadd__(self, term): + self._value += int(term) + return self + + def __isub__(self, term): + self._value -= int(term) + return self + + def __imul__(self, term): + self._value *= int(term) + return self + + def __imod__(self, term): + modulus = int(term) + if modulus == 0: + raise ZeroDivisionError("Division by zero") + if modulus < 0: + raise ValueError("Modulus must be positive") + self._value %= modulus + return self + + # Boolean/bit operations + def __and__(self, term): + return self.__class__(self._value & int(term)) + + def __or__(self, term): + return self.__class__(self._value | int(term)) + + def __rshift__(self, pos): + try: + return self.__class__(self._value >> int(pos)) + except OverflowError: + if self._value >= 0: + return 0 + else: + return -1 + + def __irshift__(self, pos): + try: + self._value >>= int(pos) + except OverflowError: + if self._value >= 0: + return 0 + else: + return -1 + return self + + def __lshift__(self, pos): + try: + return self.__class__(self._value << int(pos)) + except OverflowError: + raise ValueError("Incorrect shift count") + + def __ilshift__(self, pos): + try: + self._value <<= int(pos) + except OverflowError: + raise ValueError("Incorrect shift count") + return self + + def get_bit(self, n): + if self._value < 0: + raise ValueError("no bit representation for negative values") + try: + try: + result = (self._value >> n._value) & 1 + if n._value < 0: + raise ValueError("negative bit count") + except AttributeError: + result = (self._value >> n) & 1 + if n < 0: + raise ValueError("negative bit count") + except OverflowError: + result = 0 + return result + + # Extra + def is_odd(self): + return (self._value & 1) == 1 + + def is_even(self): + return (self._value & 1) == 0 + + def size_in_bits(self): + + if self._value < 0: + raise ValueError("Conversion only valid for non-negative numbers") + + if self._value == 0: + return 1 + + return self._value.bit_length() + + def size_in_bytes(self): + return (self.size_in_bits() - 1) // 8 + 1 + + def is_perfect_square(self): + if self._value < 0: + return False + if self._value in (0, 1): + return True + + x = self._value // 2 + square_x = x ** 2 + + while square_x > self._value: + x = (square_x + self._value) // (2 * x) + square_x = x ** 2 + + return self._value == x ** 2 + + def fail_if_divisible_by(self, small_prime): + if (self._value % int(small_prime)) == 0: + raise ValueError("Value is composite") + + def multiply_accumulate(self, a, b): + self._value += int(a) * int(b) + return self + + def set(self, source): + self._value = int(source) + + def inplace_inverse(self, modulus): + self._value = inverse(self._value, int(modulus)) + return self + + def inverse(self, modulus): + result = self.__class__(self) + result.inplace_inverse(modulus) + return result + + def gcd(self, term): + return self.__class__(GCD(abs(self._value), abs(int(term)))) + + def lcm(self, term): + term = int(term) + if self._value == 0 or term == 0: + return self.__class__(0) + return self.__class__(abs((self._value * term) // self.gcd(term)._value)) + + @staticmethod + def jacobi_symbol(a, n): + a = int(a) + n = int(n) + + if n <= 0: + raise ValueError("n must be a positive integer") + + if (n & 1) == 0: + raise ValueError("n must be odd for the Jacobi symbol") + + # Step 1 + a = a % n + # Step 2 + if a == 1 or n == 1: + return 1 + # Step 3 + if a == 0: + return 0 + # Step 4 + e = 0 + a1 = a + while (a1 & 1) == 0: + a1 >>= 1 + e += 1 + # Step 5 + if (e & 1) == 0: + s = 1 + elif n % 8 in (1, 7): + s = 1 + else: + s = -1 + # Step 6 + if n % 4 == 3 and a1 % 4 == 3: + s = -s + # Step 7 + n1 = n % a1 + # Step 8 + return s * IntegerNative.jacobi_symbol(n1, a1) diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.pyi b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.pyi new file mode 100644 index 0000000..3f65a39 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Math/_IntegerNative.pyi @@ -0,0 +1,3 @@ +from ._IntegerBase import IntegerBase +class IntegerNative(IntegerBase): + pass diff --git a/lib/python3.11/site-packages/Cryptodome/Math/__init__.py b/lib/python3.11/site-packages/Cryptodome/Math/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/Cryptodome/Math/_modexp.abi3.so b/lib/python3.11/site-packages/Cryptodome/Math/_modexp.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..078fa6afad904da2b71d28d4eb0c637e3fc8d025 GIT binary patch literal 207672 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.py b/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.py new file mode 100644 index 0000000..b6d747e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.py @@ -0,0 +1,642 @@ +# coding=utf-8 +# +# KDF.py : a collection of Key Derivation Functions +# +# Part of the Python Cryptography Toolkit +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +import re +import struct +from functools import reduce + +from Cryptodome.Util.py3compat import (tobytes, bord, _copy_bytes, iter_range, + tostr, bchr, bstr) + +from Cryptodome.Hash import SHA1, SHA256, HMAC, CMAC, BLAKE2s +from Cryptodome.Util.strxor import strxor +from Cryptodome.Random import get_random_bytes +from Cryptodome.Util.number import size as bit_size, long_to_bytes, bytes_to_long + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, c_size_t) + +_raw_salsa20_lib = load_pycryptodome_raw_lib("Cryptodome.Cipher._Salsa20", + """ + int Salsa20_8_core(const uint8_t *x, const uint8_t *y, + uint8_t *out); + """) + +_raw_scrypt_lib = load_pycryptodome_raw_lib("Cryptodome.Protocol._scrypt", + """ + typedef int (core_t)(const uint8_t [64], const uint8_t [64], uint8_t [64]); + int scryptROMix(const uint8_t *data_in, uint8_t *data_out, + size_t data_len, unsigned N, core_t *core); + """) + + +def PBKDF1(password, salt, dkLen, count=1000, hashAlgo=None): + """Derive one key from a password (or passphrase). + + This function performs key derivation according to an old version of + the PKCS#5 standard (v1.5) or `RFC2898 + `_. + + Args: + password (string): + The secret password to generate the key from. + salt (byte string): + An 8 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. + dkLen (integer): + The length of the desired key. The default is 16 bytes, suitable for + instance for :mod:`Cryptodome.Cipher.AES`. + count (integer): + The number of iterations to carry out. The recommendation is 1000 or + more. + hashAlgo (module): + The hash algorithm to use, as a module or an object from the :mod:`Cryptodome.Hash` package. + The digest length must be no shorter than ``dkLen``. + The default algorithm is :mod:`Cryptodome.Hash.SHA1`. + + Return: + A byte string of length ``dkLen`` that can be used as key. + """ + + if not hashAlgo: + hashAlgo = SHA1 + password = tobytes(password) + pHash = hashAlgo.new(password+salt) + digest = pHash.digest_size + if dkLen > digest: + raise TypeError("Selected hash algorithm has a too short digest (%d bytes)." % digest) + if len(salt) != 8: + raise ValueError("Salt is not 8 bytes long (%d bytes instead)." % len(salt)) + for i in iter_range(count-1): + pHash = pHash.new(pHash.digest()) + return pHash.digest()[:dkLen] + + +def PBKDF2(password, salt, dkLen=16, count=1000, prf=None, hmac_hash_module=None): + """Derive one or more keys from a password (or passphrase). + + This function performs key derivation according to the PKCS#5 standard (v2.0). + + 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. + + Due to a flaw in the PBKDF2 design, you should not request more bytes + than the ``prf`` can output. For instance, ``dkLen`` should not exceed + 20 bytes in combination with ``HMAC-SHA1``. + count (integer): + The number of iterations to carry out. The higher the value, the slower + and the more secure the function becomes. + + You should find the maximum number of iterations that keeps the + key derivation still acceptable on the slowest hardware you must support. + + Although the default value is 1000, **it is recommended to use at least + 1000000 (1 million) iterations**. + prf (callable): + A pseudorandom function. It must be a function that returns a + pseudorandom byte string from two parameters: a secret and a salt. + The slower the algorithm, the more secure the derivation function. + If not specified, **HMAC-SHA1** is used. + hmac_hash_module (module): + A module from ``Cryptodome.Hash`` implementing a Merkle-Damgard cryptographic + hash, which PBKDF2 must use in combination with HMAC. + This parameter is mutually exclusive with ``prf``. + + Return: + A byte string of length ``dkLen`` that can be used as key material. + If you want multiple keys, just break up this string into segments of the desired length. + """ + + password = tobytes(password) + salt = tobytes(salt) + + if prf and hmac_hash_module: + raise ValueError("'prf' and 'hmac_hash_module' are mutually exlusive") + + if prf is None and hmac_hash_module is None: + hmac_hash_module = SHA1 + + if prf or not hasattr(hmac_hash_module, "_pbkdf2_hmac_assist"): + # Generic (and slow) implementation + + if prf is None: + prf = lambda p,s: HMAC.new(p, s, hmac_hash_module).digest() + + def link(s): + s[0], s[1] = s[1], prf(password, s[1]) + return s[0] + + key = b'' + i = 1 + while len(key) < dkLen: + s = [ prf(password, salt + struct.pack(">I", i)) ] * 2 + key += reduce(strxor, (link(s) for j in range(count)) ) + i += 1 + + else: + # Optimized implementation + key = b'' + i = 1 + while len(key)I", i)).digest() + key += base._pbkdf2_hmac_assist(first_digest, count) + i += 1 + + return key[:dkLen] + + +class _S2V(object): + """String-to-vector PRF as defined in `RFC5297`_. + + This class implements a pseudorandom function family + based on CMAC that takes as input a vector of strings. + + .. _RFC5297: http://tools.ietf.org/html/rfc5297 + """ + + def __init__(self, key, ciphermod, cipher_params=None): + """Initialize the S2V PRF. + + :Parameters: + key : byte string + A secret that can be used as key for CMACs + based on ciphers from ``ciphermod``. + ciphermod : module + A block cipher module from `Cryptodome.Cipher`. + cipher_params : dictionary + A set of extra parameters to use to create a cipher instance. + """ + + 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: + self._cipher_params = dict(cipher_params) + + @staticmethod + def new(key, ciphermod): + """Create a new S2V PRF. + + :Parameters: + key : byte string + A secret that can be used as key for CMACs + based on ciphers from ``ciphermod``. + ciphermod : module + A block cipher module from `Cryptodome.Cipher`. + """ + return _S2V(key, ciphermod) + + def _double(self, bs): + doubled = bytes_to_long(bs)<<1 + if bord(bs[0]) & 0x80: + doubled ^= 0x87 + return long_to_bytes(doubled, len(bs))[-len(bs):] + + def update(self, item): + """Pass the next component of the vector. + + The maximum number of components you can pass is equal to the block + length of the cipher (in bits) minus 1. + + :Parameters: + item : byte string + The next component of the vector. + :Raise TypeError: when the limit on the number of components has been reached. + """ + + if self._n_updates == 0: + raise TypeError("Too many components passed to S2V") + self._n_updates -= 1 + + mac = CMAC.new(self._key, + msg=self._last_string, + ciphermod=self._ciphermod, + cipher_params=self._cipher_params) + self._cache = strxor(self._double(self._cache), mac.digest()) + self._last_string = _copy_bytes(None, None, item) + + def derive(self): + """"Derive a secret from the vector of components. + + :Return: a byte string, as long as the block length of the cipher. + """ + + if len(self._last_string) >= 16: + # xorend + final = self._last_string[:-16] + strxor(self._last_string[-16:], self._cache) + else: + # zero-pad & xor + padded = (self._last_string + b'\x80' + b'\x00' * 15)[:16] + final = strxor(padded, self._double(self._cache)) + mac = CMAC.new(self._key, + msg=final, + ciphermod=self._ciphermod, + cipher_params=self._cipher_params) + return mac.digest() + + +def HKDF(master, key_len, salt, hashmod, num_keys=1, context=None): + """Derive one or more keys from a master secret using + the HMAC-based KDF defined in RFC5869_. + + Args: + master (byte string): + 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. + hashmod (module): + A cryptographic hash algorithm from :mod:`Cryptodome.Hash`. + :mod:`Cryptodome.Hash.SHA512` is a good choice. + num_keys (integer): + The number of keys to derive. Every key is :data:`key_len` bytes long. + The maximum cumulative length of all keys is + 255 times the digest size. + context (byte string): + Optional identifier describing what the keys are used for. + + Return: + A byte string or a tuple of byte strings. + + .. _RFC5869: http://tools.ietf.org/html/rfc5869 + """ + + output_len = key_len * num_keys + if output_len > (255 * hashmod.digest_size): + raise ValueError("Too much secret data to derive") + if not salt: + salt = b'\x00' * hashmod.digest_size + if context is None: + context = b"" + + # Step 1: extract + hmac = HMAC.new(salt, master, digestmod=hashmod) + prk = hmac.digest() + + # Step 2: expand + t = [ b"" ] + n = 1 + tlen = 0 + while tlen < output_len: + hmac = HMAC.new(prk, t[-1] + context + struct.pack('B', n), digestmod=hashmod) + t.append(hmac.digest()) + tlen += hashmod.digest_size + n += 1 + derived_output = b"".join(t) + if num_keys == 1: + return derived_output[:key_len] + kol = [derived_output[idx:idx + key_len] + for idx in iter_range(0, output_len, key_len)] + return list(kol[:num_keys]) + + + +def scrypt(password, salt, key_len, N, r, p, num_keys=1): + """Derive one or more keys from a passphrase. + + Args: + password (string): + The secret pass phrase to generate the keys from. + salt (string): + A 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 be at least 16 bytes long. + key_len (integer): + 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}`. + r (integer): + Block size parameter. + p (integer): + Parallelization parameter. + It must be no greater than :math:`(2^{32}-1)/(4r)`. + num_keys (integer): + The number of keys to derive. Every key is :data:`key_len` bytes long. + By default, only 1 key is generated. + The maximum cumulative length of all keys is :math:`(2^{32}-1)*32` + (that is, 128TB). + + A good choice of parameters *(N, r , p)* was suggested + by Colin Percival in his `presentation in 2009`__: + + - *( 2¹â´, 8, 1 )* for interactive logins (≤100ms) + - *( 2²â°, 8, 1 )* for file encryption (≤5s) + + Return: + A byte string or a tuple of byte strings. + + .. __: http://www.tarsnap.com/scrypt/scrypt-slides.pdf + """ + + if 2 ** (bit_size(N) - 1) != N: + raise ValueError("N must be a power of 2") + if N >= 2 ** 32: + raise ValueError("N is too big") + if p > ((2 ** 32 - 1) * 32) // (128 * r): + raise ValueError("p or r are too big") + + prf_hmac_sha256 = lambda p, s: HMAC.new(p, s, SHA256).digest() + + stage_1 = PBKDF2(password, salt, p * 128 * r, 1, prf=prf_hmac_sha256) + + scryptROMix = _raw_scrypt_lib.scryptROMix + core = _raw_salsa20_lib.Salsa20_8_core + + # Parallelize into p flows + data_out = [] + for flow in iter_range(p): + idx = flow * 128 * r + buffer_out = create_string_buffer(128 * r) + result = scryptROMix(stage_1[idx : idx + 128 * r], + buffer_out, + c_size_t(128 * r), + N, + core) + if result: + raise ValueError("Error %X while running scrypt" % result) + data_out += [ get_raw_buffer(buffer_out) ] + + dk = PBKDF2(password, + b"".join(data_out), + key_len * num_keys, 1, + prf=prf_hmac_sha256) + + if num_keys == 1: + return dk + + kol = [dk[idx:idx + key_len] + for idx in iter_range(0, key_len * num_keys, key_len)] + return kol + + +def _bcrypt_encode(data): + s = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + + bits = [] + for c in data: + bits_c = bin(bord(c))[2:].zfill(8) + bits.append(bstr(bits_c)) + bits = b"".join(bits) + + bits6 = [ bits[idx:idx+6] for idx in range(0, len(bits), 6) ] + + result = [] + for g in bits6[:-1]: + idx = int(g, 2) + result.append(s[idx]) + + g = bits6[-1] + idx = int(g, 2) << (6 - len(g)) + result.append(s[idx]) + result = "".join(result) + + return tobytes(result) + + +def _bcrypt_decode(data): + s = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + + bits = [] + for c in tostr(data): + idx = s.find(c) + bits6 = bin(idx)[2:].zfill(6) + bits.append(bits6) + bits = "".join(bits) + + modulo4 = len(data) % 4 + if modulo4 == 1: + raise ValueError("Incorrect length") + elif modulo4 == 2: + bits = bits[:-4] + elif modulo4 == 3: + bits = bits[:-2] + + bits8 = [ bits[idx:idx+8] for idx in range(0, len(bits), 8) ] + + result = [] + for g in bits8: + result.append(bchr(int(g, 2))) + result = b"".join(result) + + return result + + +def _bcrypt_hash(password, cost, salt, constant, invert): + from Cryptodome.Cipher import _EKSBlowfish + + if len(password) > 72: + raise ValueError("The password is too long. It must be 72 bytes at most.") + + if not (4 <= cost <= 31): + raise ValueError("bcrypt cost factor must be in the range 4..31") + + cipher = _EKSBlowfish.new(password, _EKSBlowfish.MODE_ECB, salt, cost, invert) + ctext = constant + for _ in range(64): + ctext = cipher.encrypt(ctext) + return ctext + + +def bcrypt(password, cost, salt=None): + """Hash a password into a key, using the OpenBSD bcrypt protocol. + + Args: + password (byte string or string): + The secret password or pass phrase. + It must be at most 72 bytes long. + It must not contain the zero byte. + Unicode strings will be encoded as UTF-8. + cost (integer): + The exponential factor that makes it slower to compute the hash. + It must be in the range 4 to 31. + A value of at least 12 is recommended. + salt (byte string): + Optional. Random byte string to thwarts dictionary and rainbow table + attacks. It must be 16 bytes long. + If not passed, a random value is generated. + + Return (byte string): + The bcrypt hash + + Raises: + ValueError: if password is longer than 72 bytes or if it contains the zero byte + + """ + + password = tobytes(password, "utf-8") + + if password.find(bchr(0)[0]) != -1: + raise ValueError("The password contains the zero byte") + + if len(password) < 72: + password += b"\x00" + + if salt is None: + salt = get_random_bytes(16) + if len(salt) != 16: + raise ValueError("bcrypt salt must be 16 bytes long") + + ctext = _bcrypt_hash(password, cost, salt, b"OrpheanBeholderScryDoubt", True) + + cost_enc = b"$" + bstr(str(cost).zfill(2)) + salt_enc = b"$" + _bcrypt_encode(salt) + hash_enc = _bcrypt_encode(ctext[:-1]) # only use 23 bytes, not 24 + return b"$2a" + cost_enc + salt_enc + hash_enc + + +def bcrypt_check(password, bcrypt_hash): + """Verify if the provided password matches the given bcrypt hash. + + Args: + password (byte string or string): + The secret password or pass phrase to test. + It must be at most 72 bytes long. + It must not contain the zero byte. + Unicode strings will be encoded as UTF-8. + bcrypt_hash (byte string, bytearray): + The reference bcrypt hash the password needs to be checked against. + + Raises: + ValueError: if the password does not match + """ + + bcrypt_hash = tobytes(bcrypt_hash) + + if len(bcrypt_hash) != 60: + raise ValueError("Incorrect length of the bcrypt hash: %d bytes instead of 60" % len(bcrypt_hash)) + + if bcrypt_hash[:4] != b'$2a$': + raise ValueError("Unsupported prefix") + + p = re.compile(br'\$2a\$([0-9][0-9])\$([A-Za-z0-9./]{22,22})([A-Za-z0-9./]{31,31})') + r = p.match(bcrypt_hash) + if not r: + raise ValueError("Incorrect bcrypt hash format") + + cost = int(r.group(1)) + if not (4 <= cost <= 31): + raise ValueError("Incorrect cost") + + salt = _bcrypt_decode(r.group(2)) + + bcrypt_hash2 = bcrypt(password, cost, salt) + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=bcrypt_hash).digest() + 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/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.pyi b/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.pyi new file mode 100644 index 0000000..df6c287 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Protocol/KDF.pyi @@ -0,0 +1,40 @@ +from types import ModuleType +from typing import Optional, Callable, Tuple, Union, Dict, Any, ByteString, overload +from typing_extensions import Literal + +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: ... + +class _S2V(object): + def __init__(self, key: bytes, ciphermod: ModuleType, cipher_params: Optional[Dict[Any, Any]]=None) -> None: ... + + @staticmethod + def new(key: bytes, ciphermod: ModuleType) -> None: ... + def update(self, item: bytes) -> None: ... + def derive(self) -> bytes: ... + +def HKDF(master: bytes, key_len: int, salt: bytes, hashmod: ModuleType, num_keys: Optional[int]=1, context: Optional[bytes]=None) -> Union[bytes, Tuple[bytes, ...]]: ... + +def scrypt(password: str, salt: str, key_len: int, N: int, r: int, p: int, num_keys: Optional[int]=1) -> Union[bytes, Tuple[bytes, ...]]: ... + +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: ByteString, + key_len: int, + prf: PRF, + num_keys: Literal[None] = None, + label: ByteString = b'', context: ByteString = b'') -> bytes: ... + +@overload +def SP800_108_Counter(master: ByteString, + key_len: int, + prf: PRF, + num_keys: int, + label: ByteString = b'', context: ByteString = b'') -> Tuple[bytes]: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.py b/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.py new file mode 100644 index 0000000..6fdc9b4 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.py @@ -0,0 +1,278 @@ +# +# SecretSharing.py : distribute a secret amongst a group of participants +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.py3compat import is_native_int +from Cryptodome.Util import number +from Cryptodome.Util.number import long_to_bytes, bytes_to_long +from Cryptodome.Random import get_random_bytes as rng + + +def _mult_gf2(f1, f2): + """Multiply two polynomials in GF(2)""" + + # Ensure f2 is the smallest + if f2 > f1: + f1, f2 = f2, f1 + z = 0 + while f2: + if f2 & 1: + z ^= f1 + f1 <<= 1 + f2 >>= 1 + return z + + +def _div_gf2(a, b): + """ + Compute division of polynomials over GF(2). + Given a and b, it finds two polynomials q and r such that: + + a = b*q + r with deg(r)= d: + s = 1 << (deg(r) - d) + q ^= s + r ^= _mult_gf2(b, s) + return (q, r) + + +class _Element(object): + """Element of GF(2^128) field""" + + # The irreducible polynomial defining this field is 1+x+x^2+x^7+x^128 + irr_poly = 1 + 2 + 4 + 128 + 2 ** 128 + + def __init__(self, encoded_value): + """Initialize the element to a certain value. + + The value passed as parameter is internally encoded as + a 128-bit integer, where each bit represents a polynomial + coefficient. The LSB is the constant coefficient. + """ + + if is_native_int(encoded_value): + self._value = encoded_value + elif len(encoded_value) == 16: + self._value = bytes_to_long(encoded_value) + else: + raise ValueError("The encoded value must be an integer or a 16 byte string") + + def __eq__(self, other): + return self._value == other._value + + def __int__(self): + """Return the field element, encoded as a 128-bit integer.""" + return self._value + + def encode(self): + """Return the field element, encoded as a 16 byte string.""" + return long_to_bytes(self._value, 16) + + def __mul__(self, factor): + + f1 = self._value + f2 = factor._value + + # Make sure that f2 is the smallest, to speed up the loop + if f2 > f1: + f1, f2 = f2, f1 + + if self.irr_poly in (f1, f2): + return _Element(0) + + mask1 = 2 ** 128 + v, z = f1, 0 + while f2: + # if f2 ^ 1: z ^= v + mask2 = int(bin(f2 & 1)[2:] * 128, base=2) + z = (mask2 & (z ^ v)) | ((mask1 - mask2 - 1) & z) + v <<= 1 + # if v & mask1: v ^= self.irr_poly + mask3 = int(bin((v >> 128) & 1)[2:] * 128, base=2) + v = (mask3 & (v ^ self.irr_poly)) | ((mask1 - mask3 - 1) & v) + f2 >>= 1 + return _Element(z) + + def __add__(self, term): + return _Element(self._value ^ term._value) + + def inverse(self): + """Return the inverse of this element in GF(2^128).""" + + # We use the Extended GCD algorithm + # http://en.wikipedia.org/wiki/Polynomial_greatest_common_divisor + + if self._value == 0: + raise ValueError("Inversion of zero") + + r0, r1 = self._value, self.irr_poly + s0, s1 = 1, 0 + while r1 > 0: + q = _div_gf2(r0, r1)[0] + r0, r1 = r1, r0 ^ _mult_gf2(q, r1) + s0, s1 = s1, s0 ^ _mult_gf2(q, s1) + return _Element(s0) + + def __pow__(self, exponent): + result = _Element(self._value) + for _ in range(exponent - 1): + result = result * self + return result + + +class Shamir(object): + """Shamir's secret sharing scheme. + + A secret is split into ``n`` shares, and it is sufficient to collect + ``k`` of them to reconstruct the secret. + """ + + @staticmethod + def split(k, n, secret, ssss=False): + """Split a secret into ``n`` shares. + + The secret can be reconstructed later using just ``k`` shares + out of the original ``n``. + Each share must be kept confidential to the person it was + assigned to. + + Each share is associated to an index (starting from 1). + + Args: + k (integer): + The sufficient number of shares to reconstruct the secret (``k < n``). + n (integer): + The number of shares that this method will create. + secret (byte string): + A byte string of 16 bytes (e.g. the AES 128 key). + ssss (bool): + If ``True``, the shares can be used with the ``ssss`` utility. + Default: ``False``. + + Return (tuples): + ``n`` tuples. A tuple is meant for each participant and it contains two items: + + 1. the unique index (an integer) + 2. the share (a byte string, 16 bytes) + """ + + # + # We create a polynomial with random coefficients in GF(2^128): + # + # p(x) = \sum_{i=0}^{k-1} c_i * x^i + # + # c_0 is the encoded secret + # + + coeffs = [_Element(rng(16)) for i in range(k - 1)] + coeffs.append(_Element(secret)) + + # Each share is y_i = p(x_i) where x_i is the public index + # associated to each of the n users. + + def make_share(user, coeffs, ssss): + idx = _Element(user) + share = _Element(0) + for coeff in coeffs: + share = idx * share + coeff + if ssss: + share += _Element(user) ** len(coeffs) + return share.encode() + + return [(i, make_share(i, coeffs, ssss)) for i in range(1, n + 1)] + + @staticmethod + def combine(shares, ssss=False): + """Recombine a secret, if enough shares are presented. + + Args: + shares (tuples): + The *k* tuples, each containin the index (an integer) and + the share (a byte string, 16 bytes long) that were assigned to + a participant. + ssss (bool): + If ``True``, the shares were produced by the ``ssss`` utility. + Default: ``False``. + + Return: + The original secret, as a byte string (16 bytes long). + """ + + # + # Given k points (x,y), the interpolation polynomial of degree k-1 is: + # + # L(x) = \sum_{j=0}^{k-1} y_i * l_j(x) + # + # where: + # + # l_j(x) = \prod_{ \overset{0 \le m \le k-1}{m \ne j} } + # \frac{x - x_m}{x_j - x_m} + # + # However, in this case we are purely interested in the constant + # coefficient of L(x). + # + + k = len(shares) + + gf_shares = [] + for x in shares: + idx = _Element(x[0]) + value = _Element(x[1]) + if any(y[0] == idx for y in gf_shares): + raise ValueError("Duplicate share") + if ssss: + value += idx ** k + gf_shares.append((idx, value)) + + result = _Element(0) + for j in range(k): + x_j, y_j = gf_shares[j] + + numerator = _Element(1) + denominator = _Element(1) + + for m in range(k): + x_m = gf_shares[m][0] + if m != j: + numerator *= x_m + denominator *= x_j + x_m + result += y_j * numerator * denominator.inverse() + return result.encode() diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.pyi b/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.pyi new file mode 100644 index 0000000..5952c99 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Protocol/SecretSharing.pyi @@ -0,0 +1,22 @@ +from typing import Union, List, Tuple, Optional + +def _mult_gf2(f1: int, f2: int) -> int : ... +def _div_gf2(a: int, b: int) -> int : ... + +class _Element(object): + irr_poly: int + def __init__(self, encoded_value: Union[int, bytes]) -> None: ... + def __eq__(self, other) -> bool: ... + def __int__(self) -> int: ... + def encode(self) -> bytes: ... + def __mul__(self, factor: int) -> _Element: ... + def __add__(self, term: _Element) -> _Element: ... + def inverse(self) -> _Element: ... + def __pow__(self, exponent) -> _Element: ... + +class Shamir(object): + @staticmethod + def split(k: int, n: int, secret: bytes, ssss: Optional[bool]) -> List[Tuple[int, bytes]]: ... + @staticmethod + def combine(shares: List[Tuple[int, bytes]], ssss: Optional[bool]) -> bytes: ... + diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.py b/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.py new file mode 100644 index 0000000..efdf034 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.py @@ -0,0 +1,31 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +__all__ = ['KDF', 'SecretSharing'] diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.pyi b/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.pyi new file mode 100644 index 0000000..377ed90 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Protocol/__init__.pyi @@ -0,0 +1 @@ +__all__ = ['KDF.pyi', 'SecretSharing.pyi'] diff --git a/lib/python3.11/site-packages/Cryptodome/Protocol/_scrypt.abi3.so b/lib/python3.11/site-packages/Cryptodome/Protocol/_scrypt.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..baf83a8478584e1d98561442002e0c6edb23b8eb GIT binary patch literal 26176 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.py b/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.py new file mode 100644 index 0000000..dddd304 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.py @@ -0,0 +1,682 @@ +# -*- coding: utf-8 -*- +# +# PublicKey/DSA.py : DSA signature primitive +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +__all__ = ['generate', 'construct', 'DsaKey', 'import_key' ] + +import binascii +import struct +import itertools + +from Cryptodome.Util.py3compat import bchr, bord, tobytes, tostr, iter_range + +from Cryptodome import Random +from Cryptodome.IO import PKCS8, PEM +from Cryptodome.Hash import SHA256 +from Cryptodome.Util.asn1 import ( + DerObject, DerSequence, + DerInteger, DerObjectId, + DerBitString, + ) + +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Math.Primality import (test_probable_prime, COMPOSITE, + PROBABLY_PRIME) + +from Cryptodome.PublicKey import (_expand_subject_public_key_info, + _create_subject_public_key_info, + _extract_subject_public_key_info) + +# ; The following ASN.1 types are relevant for DSA +# +# SubjectPublicKeyInfo ::= SEQUENCE { +# algorithm AlgorithmIdentifier, +# subjectPublicKey BIT STRING +# } +# +# id-dsa ID ::= { iso(1) member-body(2) us(840) x9-57(10040) x9cm(4) 1 } +# +# ; See RFC3279 +# Dss-Parms ::= SEQUENCE { +# p INTEGER, +# q INTEGER, +# g INTEGER +# } +# +# DSAPublicKey ::= INTEGER +# +# DSSPrivatKey_OpenSSL ::= SEQUENCE +# version INTEGER, +# p INTEGER, +# q INTEGER, +# g INTEGER, +# y INTEGER, +# x INTEGER +# } +# + +class DsaKey(object): + r"""Class defining an actual DSA key. + Do not instantiate directly. + Use :func:`generate`, :func:`construct` or :func:`import_key` instead. + + :ivar p: DSA modulus + :vartype p: integer + + :ivar q: Order of the subgroup + :vartype q: integer + + :ivar g: Generator + :vartype g: integer + + :ivar y: Public key + :vartype y: integer + + :ivar x: Private key + :vartype x: integer + + :undocumented: exportKey, publickey + """ + + _keydata = ['y', 'g', 'p', 'q', 'x'] + + def __init__(self, key_dict): + input_set = set(key_dict.keys()) + public_set = set(('y' , 'g', 'p', 'q')) + if not public_set.issubset(input_set): + raise ValueError("Some DSA components are missing = %s" % + str(public_set - input_set)) + extra_set = input_set - public_set + if extra_set and extra_set != set(('x',)): + raise ValueError("Unknown DSA components = %s" % + str(extra_set - set(('x',)))) + self._key = dict(key_dict) + + def _sign(self, m, k): + if not self.has_private(): + raise TypeError("DSA public key cannot be used for signing") + if not (1 < k < self.q): + raise ValueError("k is not between 2 and q-1") + + x, q, p, g = [self._key[comp] for comp in ['x', 'q', 'p', 'g']] + + blind_factor = Integer.random_range(min_inclusive=1, + max_exclusive=q) + inv_blind_k = (blind_factor * k).inverse(q) + blind_x = x * blind_factor + + r = pow(g, k, p) % q # r = (g**k mod p) mod q + s = (inv_blind_k * (blind_factor * m + blind_x * r)) % q + return map(int, (r, s)) + + def _verify(self, m, sig): + r, s = sig + y, q, p, g = [self._key[comp] for comp in ['y', 'q', 'p', 'g']] + if not (0 < r < q) or not (0 < s < q): + return False + w = Integer(s).inverse(q) + u1 = (w * m) % q + u2 = (w * r) % q + v = (pow(g, u1, p) * pow(y, u2, p) % p) % q + return v == r + + def has_private(self): + """Whether this is a DSA private key""" + + return 'x' in self._key + + def can_encrypt(self): # legacy + return False + + def can_sign(self): # legacy + return True + + def public_key(self): + """A matching DSA public key. + + Returns: + a new :class:`DsaKey` object + """ + + public_components = dict((k, self._key[k]) for k in ('y', 'g', 'p', 'q')) + return DsaKey(public_components) + + def __eq__(self, other): + if bool(self.has_private()) != bool(other.has_private()): + return False + + result = True + for comp in self._keydata: + result = result and (getattr(self._key, comp, None) == + getattr(other._key, comp, None)) + return result + + def __ne__(self, other): + return not self.__eq__(other) + + def __getstate__(self): + # DSA key is not pickable + from pickle import PicklingError + raise PicklingError + + def domain(self): + """The DSA domain parameters. + + Returns + tuple : (p,q,g) + """ + + return [int(self._key[comp]) for comp in ('p', 'q', 'g')] + + def __repr__(self): + attrs = [] + for k in self._keydata: + if k == 'p': + bits = Integer(self.p).size_in_bits() + attrs.append("p(%d)" % (bits,)) + elif hasattr(self, k): + attrs.append(k) + if self.has_private(): + attrs.append("private") + # PY3K: This is meant to be text, do not change to bytes (data) + return "<%s @0x%x %s>" % (self.__class__.__name__, id(self), ",".join(attrs)) + + def __getattr__(self, item): + try: + return int(self._key[item]) + except KeyError: + raise AttributeError(item) + + def export_key(self, format='PEM', pkcs8=None, passphrase=None, + protection=None, randfunc=None): + """Export this DSA key. + + Args: + format (string): + The encoding for the output: + + - *'PEM'* (default). ASCII as per `RFC1421`_/ `RFC1423`_. + - *'DER'*. Binary ASN.1 encoding. + - *'OpenSSH'*. ASCII one-liner as per `RFC4253`_. + Only suitable for public keys, not for private keys. + + passphrase (string): + *Private keys only*. The pass phrase to protect the output. + + pkcs8 (boolean): + *Private keys only*. If ``True`` (default), the key is encoded + with `PKCS#8`_. If ``False``, it is encoded in the custom + OpenSSL/OpenSSH container. + + protection (string): + *Only in combination with a pass phrase*. + The encryption scheme to use to protect the output. + + If :data:`pkcs8` takes value ``True``, this is the PKCS#8 + algorithm to use for deriving the secret and encrypting + the private DSA key. + For a complete list of algorithms, see :mod:`Cryptodome.IO.PKCS8`. + The default is *PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC*. + + If :data:`pkcs8` is ``False``, the obsolete PEM encryption scheme is + used. It is based on MD5 for key derivation, and Triple DES for + encryption. Parameter :data:`protection` is then ignored. + + The combination ``format='DER'`` and ``pkcs8=False`` is not allowed + if a passphrase is present. + + randfunc (callable): + A function that returns random bytes. + By default it is :func:`Cryptodome.Random.get_random_bytes`. + + Returns: + byte string : the encoded key + + Raises: + ValueError : when the format is unknown or when you try to encrypt a private + key with *DER* format and OpenSSL/OpenSSH. + + .. warning:: + If you don't provide a pass phrase, the private key will be + exported in the clear! + + .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt + .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt + .. _RFC4253: http://www.ietf.org/rfc/rfc4253.txt + .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt + """ + + if passphrase is not None: + passphrase = tobytes(passphrase) + + if randfunc is None: + randfunc = Random.get_random_bytes + + if format == 'OpenSSH': + tup1 = [self._key[x].to_bytes() for x in ('p', 'q', 'g', 'y')] + + def func(x): + if (bord(x[0]) & 0x80): + return bchr(0) + x + else: + return x + + tup2 = [func(x) for x in tup1] + keyparts = [b'ssh-dss'] + tup2 + keystring = b''.join( + [struct.pack(">I", len(kp)) + kp for kp in keyparts] + ) + return b'ssh-dss ' + binascii.b2a_base64(keystring)[:-1] + + # DER format is always used, even in case of PEM, which simply + # encodes it into BASE64. + params = DerSequence([self.p, self.q, self.g]) + if self.has_private(): + if pkcs8 is None: + pkcs8 = True + if pkcs8: + if not protection: + protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC' + private_key = DerInteger(self.x).encode() + binary_key = PKCS8.wrap( + private_key, oid, passphrase, + protection, key_params=params, + randfunc=randfunc + ) + if passphrase: + key_type = 'ENCRYPTED PRIVATE' + else: + key_type = 'PRIVATE' + passphrase = None + else: + if format != 'PEM' and passphrase: + raise ValueError("DSA private key cannot be encrypted") + ints = [0, self.p, self.q, self.g, self.y, self.x] + binary_key = DerSequence(ints).encode() + key_type = "DSA PRIVATE" + else: + if pkcs8: + raise ValueError("PKCS#8 is only meaningful for private keys") + + binary_key = _create_subject_public_key_info(oid, + DerInteger(self.y), params) + key_type = "PUBLIC" + + if format == 'DER': + return binary_key + if format == 'PEM': + pem_str = PEM.encode( + binary_key, key_type + " KEY", + passphrase, randfunc + ) + return tobytes(pem_str) + raise ValueError("Unknown key format '%s'. Cannot export the DSA key." % format) + + # Backward-compatibility + exportKey = export_key + publickey = public_key + + # Methods defined in PyCryptodome that we don't support anymore + + def sign(self, M, K): + raise NotImplementedError("Use module Cryptodome.Signature.DSS instead") + + def verify(self, M, signature): + raise NotImplementedError("Use module Cryptodome.Signature.DSS instead") + + def encrypt(self, plaintext, K): + raise NotImplementedError + + def decrypt(self, ciphertext): + raise NotImplementedError + + def blind(self, M, B): + raise NotImplementedError + + def unblind(self, M, B): + raise NotImplementedError + + def size(self): + raise NotImplementedError + + +def _generate_domain(L, randfunc): + """Generate a new set of DSA domain parameters""" + + N = { 1024:160, 2048:224, 3072:256 }.get(L) + if N is None: + raise ValueError("Invalid modulus length (%d)" % L) + + outlen = SHA256.digest_size * 8 + n = (L + outlen - 1) // outlen - 1 # ceil(L/outlen) -1 + b_ = L - 1 - (n * outlen) + + # Generate q (A.1.1.2) + q = Integer(4) + upper_bit = 1 << (N - 1) + while test_probable_prime(q, randfunc) != PROBABLY_PRIME: + seed = randfunc(64) + U = Integer.from_bytes(SHA256.new(seed).digest()) & (upper_bit - 1) + q = U | upper_bit | 1 + + assert(q.size_in_bits() == N) + + # Generate p (A.1.1.2) + offset = 1 + upper_bit = 1 << (L - 1) + while True: + V = [ SHA256.new(seed + Integer(offset + j).to_bytes()).digest() + for j in iter_range(n + 1) ] + V = [ Integer.from_bytes(v) for v in V ] + W = sum([V[i] * (1 << (i * outlen)) for i in iter_range(n)], + (V[n] & ((1 << b_) - 1)) * (1 << (n * outlen))) + + X = Integer(W + upper_bit) # 2^{L-1} < X < 2^{L} + assert(X.size_in_bits() == L) + + c = X % (q * 2) + p = X - (c - 1) # 2q divides (p-1) + if p.size_in_bits() == L and \ + test_probable_prime(p, randfunc) == PROBABLY_PRIME: + break + offset += n + 1 + + # Generate g (A.2.3, index=1) + e = (p - 1) // q + for count in itertools.count(1): + U = seed + b"ggen" + bchr(1) + Integer(count).to_bytes() + W = Integer.from_bytes(SHA256.new(U).digest()) + g = pow(W, e, p) + if g != 1: + break + + return (p, q, g, seed) + + +def generate(bits, randfunc=None, domain=None): + """Generate a new DSA key pair. + + The algorithm follows Appendix A.1/A.2 and B.1 of `FIPS 186-4`_, + respectively for domain generation and key pair generation. + + Args: + bits (integer): + Key length, or size (in bits) of the DSA modulus *p*. + It must be 1024, 2048 or 3072. + + randfunc (callable): + Random number generation function; it accepts a single integer N + and return a string of random data N bytes long. + If not specified, :func:`Cryptodome.Random.get_random_bytes` is used. + + domain (tuple): + The DSA domain parameters *p*, *q* and *g* as a list of 3 + integers. Size of *p* and *q* must comply to `FIPS 186-4`_. + If not specified, the parameters are created anew. + + Returns: + :class:`DsaKey` : a new DSA key object + + Raises: + ValueError : when **bits** is too little, too big, or not a multiple of 64. + + .. _FIPS 186-4: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + + if domain: + p, q, g = map(Integer, domain) + + ## Perform consistency check on domain parameters + # P and Q must be prime + fmt_error = test_probable_prime(p) == COMPOSITE + fmt_error |= test_probable_prime(q) == COMPOSITE + # Verify Lagrange's theorem for sub-group + fmt_error |= ((p - 1) % q) != 0 + fmt_error |= g <= 1 or g >= p + fmt_error |= pow(g, q, p) != 1 + if fmt_error: + raise ValueError("Invalid DSA domain parameters") + else: + p, q, g, _ = _generate_domain(bits, randfunc) + + L = p.size_in_bits() + N = q.size_in_bits() + + if L != bits: + raise ValueError("Mismatch between size of modulus (%d)" + " and 'bits' parameter (%d)" % (L, bits)) + + if (L, N) not in [(1024, 160), (2048, 224), + (2048, 256), (3072, 256)]: + raise ValueError("Lengths of p and q (%d, %d) are not compatible" + "to FIPS 186-3" % (L, N)) + + if not 1 < g < p: + raise ValueError("Incorrent DSA generator") + + # B.1.1 + c = Integer.random(exact_bits=N + 64, randfunc=randfunc) + x = c % (q - 1) + 1 # 1 <= x <= q-1 + y = pow(g, x, p) + + key_dict = { 'y':y, 'g':g, 'p':p, 'q':q, 'x':x } + return DsaKey(key_dict) + + +def construct(tup, consistency_check=True): + """Construct a DSA key from a tuple of valid DSA components. + + Args: + tup (tuple): + A tuple of long integers, with 4 or 5 items + in the following order: + + 1. Public key (*y*). + 2. Sub-group generator (*g*). + 3. Modulus, finite field order (*p*). + 4. Sub-group order (*q*). + 5. Private key (*x*). Optional. + + consistency_check (boolean): + If ``True``, the library will verify that the provided components + fulfil the main DSA properties. + + Raises: + ValueError: when the key being imported fails the most basic DSA validity checks. + + Returns: + :class:`DsaKey` : a DSA key object + """ + + key_dict = dict(zip(('y', 'g', 'p', 'q', 'x'), map(Integer, tup))) + key = DsaKey(key_dict) + + fmt_error = False + if consistency_check: + # P and Q must be prime + fmt_error = test_probable_prime(key.p) == COMPOSITE + fmt_error |= test_probable_prime(key.q) == COMPOSITE + # Verify Lagrange's theorem for sub-group + fmt_error |= ((key.p - 1) % key.q) != 0 + fmt_error |= key.g <= 1 or key.g >= key.p + fmt_error |= pow(key.g, key.q, key.p) != 1 + # Public key + fmt_error |= key.y <= 0 or key.y >= key.p + if hasattr(key, 'x'): + fmt_error |= key.x <= 0 or key.x >= key.q + fmt_error |= pow(key.g, key.x, key.p) != key.y + + if fmt_error: + raise ValueError("Invalid DSA key components") + + return key + + +# Dss-Parms ::= SEQUENCE { +# p OCTET STRING, +# q OCTET STRING, +# g OCTET STRING +# } +# DSAPublicKey ::= INTEGER -- public key, y + +def _import_openssl_private(encoded, passphrase, params): + if params: + raise ValueError("DSA private key already comes with parameters") + der = DerSequence().decode(encoded, nr_elements=6, only_ints_expected=True) + if der[0] != 0: + raise ValueError("No version found") + tup = [der[comp] for comp in (4, 3, 1, 2, 5)] + return construct(tup) + + +def _import_subjectPublicKeyInfo(encoded, passphrase, params): + + algoid, encoded_key, emb_params = _expand_subject_public_key_info(encoded) + if algoid != oid: + raise ValueError("No DSA subjectPublicKeyInfo") + if params and emb_params: + raise ValueError("Too many DSA parameters") + + y = DerInteger().decode(encoded_key).value + p, q, g = list(DerSequence().decode(params or emb_params)) + tup = (y, g, p, q) + return construct(tup) + + +def _import_x509_cert(encoded, passphrase, params): + + sp_info = _extract_subject_public_key_info(encoded) + return _import_subjectPublicKeyInfo(sp_info, None, params) + + +def _import_pkcs8(encoded, passphrase, params): + if params: + raise ValueError("PKCS#8 already includes parameters") + k = PKCS8.unwrap(encoded, passphrase) + if k[0] != oid: + raise ValueError("No PKCS#8 encoded DSA key") + x = DerInteger().decode(k[1]).value + p, q, g = list(DerSequence().decode(k[2])) + tup = (pow(g, x, p), g, p, q, x) + return construct(tup) + + +def _import_key_der(key_data, passphrase, params): + """Import a DSA key (public or private half), encoded in DER form.""" + + decodings = (_import_openssl_private, + _import_subjectPublicKeyInfo, + _import_x509_cert, + _import_pkcs8) + + for decoding in decodings: + try: + return decoding(key_data, passphrase, params) + except ValueError: + pass + + raise ValueError("DSA key format is not supported") + + +def import_key(extern_key, passphrase=None): + """Import a DSA key. + + Args: + extern_key (string or byte string): + The DSA key to import. + + The following formats are supported for a DSA **public** key: + + - X.509 certificate (binary DER or PEM) + - X.509 ``subjectPublicKeyInfo`` (binary DER or PEM) + - OpenSSH (ASCII one-liner, see `RFC4253`_) + + The following formats are supported for a DSA **private** key: + + - `PKCS#8`_ ``PrivateKeyInfo`` or ``EncryptedPrivateKeyInfo`` + DER SEQUENCE (binary or PEM) + - OpenSSL/OpenSSH custom format (binary or PEM) + + For details about the PEM encoding, see `RFC1421`_/`RFC1423`_. + + passphrase (string): + In case of an encrypted private key, this is the pass phrase + from which the decryption key is derived. + + Encryption may be applied either at the `PKCS#8`_ or at the PEM level. + + Returns: + :class:`DsaKey` : a DSA key object + + Raises: + ValueError : when the given key cannot be parsed (possibly because + the pass phrase is wrong). + + .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt + .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt + .. _RFC4253: http://www.ietf.org/rfc/rfc4253.txt + .. _PKCS#8: http://www.ietf.org/rfc/rfc5208.txt + """ + + extern_key = tobytes(extern_key) + if passphrase is not None: + passphrase = tobytes(passphrase) + + if extern_key.startswith(b'-----'): + # This is probably a PEM encoded key + (der, marker, enc_flag) = PEM.decode(tostr(extern_key), passphrase) + if enc_flag: + passphrase = None + return _import_key_der(der, passphrase, None) + + if extern_key.startswith(b'ssh-dss '): + # This is probably a public OpenSSH key + keystring = binascii.a2b_base64(extern_key.split(b' ')[1]) + keyparts = [] + while len(keystring) > 4: + length = struct.unpack(">I", keystring[:4])[0] + keyparts.append(keystring[4:4 + length]) + keystring = keystring[4 + length:] + if keyparts[0] == b"ssh-dss": + tup = [Integer.from_bytes(keyparts[x]) for x in (4, 3, 1, 2)] + return construct(tup) + + if len(extern_key) > 0 and bord(extern_key[0]) == 0x30: + # This is probably a DER encoded key + return _import_key_der(extern_key, passphrase, None) + + raise ValueError("DSA key format is not supported") + + +# Backward compatibility +importKey = import_key + +#: `Object ID`_ for a DSA key. +#: +#: id-dsa ID ::= { iso(1) member-body(2) us(840) x9-57(10040) x9cm(4) 1 } +#: +#: .. _`Object ID`: http://www.alvestrand.no/objectid/1.2.840.10040.4.1.html +oid = "1.2.840.10040.4.1" diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.pyi b/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.pyi new file mode 100644 index 0000000..354ac1f --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/PublicKey/DSA.pyi @@ -0,0 +1,31 @@ +from typing import Dict, Tuple, Callable, Union, Optional + +__all__ = ['generate', 'construct', 'DsaKey', 'import_key' ] + +RNG = Callable[[int], bytes] + +class DsaKey(object): + def __init__(self, key_dict: Dict[str, int]) -> None: ... + def has_private(self) -> bool: ... + def can_encrypt(self) -> bool: ... # legacy + def can_sign(self) -> bool: ... # legacy + def public_key(self) -> DsaKey: ... + def __eq__(self, other: object) -> bool: ... + def __ne__(self, other: object) -> bool: ... + def __getstate__(self) -> None: ... + def domain(self) -> Tuple[int, int, int]: ... + def __repr__(self) -> str: ... + def __getattr__(self, item: str) -> int: ... + def export_key(self, format: Optional[str]="PEM", pkcs8: Optional[bool]=None, passphrase: Optional[str]=None, + protection: Optional[str]=None, randfunc: Optional[RNG]=None) -> bytes: ... + # Backward-compatibility + exportKey = export_key + publickey = public_key + +def generate(bits: int, randfunc: Optional[RNG]=None, domain: Optional[Tuple[int, int, int]]=None) -> DsaKey: ... +def construct(tup: Union[Tuple[int, int, int, int], Tuple[int, int, int, int, int]], consistency_check: Optional[bool]=True) -> DsaKey: ... +def import_key(extern_key: Union[str, bytes], passphrase: Optional[str]=None) -> DsaKey: ... +# Backward compatibility +importKey = import_key + +oid: str diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.py b/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.py new file mode 100644 index 0000000..e9c57ba --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.py @@ -0,0 +1,1800 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from __future__ import print_function + +import re +import struct +import binascii +from collections import namedtuple + +from Cryptodome.Util.py3compat import bord, tobytes, tostr, bchr, is_string +from Cryptodome.Util.number import bytes_to_long, long_to_bytes + +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Util.asn1 import (DerObjectId, DerOctetString, DerSequence, + DerBitString) + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + SmartPointer, c_size_t, c_uint8_ptr, + c_ulonglong, null_pointer) + +from Cryptodome.PublicKey import (_expand_subject_public_key_info, + _create_subject_public_key_info, + _extract_subject_public_key_info) + +from Cryptodome.Hash import SHA512, SHAKE256 + +from Cryptodome.Random import get_random_bytes +from Cryptodome.Random.random import getrandbits + + +_ec_lib = load_pycryptodome_raw_lib("Cryptodome.PublicKey._ec_ws", """ +typedef void EcContext; +typedef void EcPoint; +int ec_ws_new_context(EcContext **pec_ctx, + const uint8_t *modulus, + const uint8_t *b, + const uint8_t *order, + size_t len, + uint64_t seed); +void ec_free_context(EcContext *ec_ctx); +int ec_ws_new_point(EcPoint **pecp, + const uint8_t *x, + const uint8_t *y, + size_t len, + const EcContext *ec_ctx); +void ec_ws_free_point(EcPoint *ecp); +int ec_ws_get_xy(uint8_t *x, + uint8_t *y, + size_t len, + const EcPoint *ecp); +int ec_ws_double(EcPoint *p); +int ec_ws_add(EcPoint *ecpa, EcPoint *ecpb); +int ec_ws_scalar(EcPoint *ecp, + const uint8_t *k, + size_t len, + uint64_t seed); +int ec_ws_clone(EcPoint **pecp2, const EcPoint *ecp); +int ec_ws_cmp(const EcPoint *ecp1, const EcPoint *ecp2); +int ec_ws_neg(EcPoint *p); +""") + +_ed25519_lib = load_pycryptodome_raw_lib("Cryptodome.PublicKey._ed25519", """ +typedef void Point; +int ed25519_new_point(Point **out, + const uint8_t x[32], + const uint8_t y[32], + size_t modsize, + const void *context); +int ed25519_clone(Point **P, const Point *Q); +void ed25519_free_point(Point *p); +int ed25519_cmp(const Point *p1, const Point *p2); +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, const uint8_t *scalar, size_t scalar_len, uint64_t seed); +""") + +_ed448_lib = load_pycryptodome_raw_lib("Cryptodome.PublicKey._ed448", """ +typedef void EcContext; +typedef void PointEd448; +int ed448_new_context(EcContext **pec_ctx); +void ed448_context(EcContext *ec_ctx); +void ed448_free_context(EcContext *ec_ctx); +int ed448_new_point(PointEd448 **out, + const uint8_t x[56], + const uint8_t y[56], + size_t len, + const EcContext *context); +int ed448_clone(PointEd448 **P, const PointEd448 *Q); +void ed448_free_point(PointEd448 *p); +int ed448_cmp(const PointEd448 *p1, const PointEd448 *p2); +int ed448_neg(PointEd448 *p); +int ed448_get_xy(uint8_t *xb, uint8_t *yb, size_t len, const PointEd448 *p); +int ed448_double(PointEd448 *p); +int ed448_add(PointEd448 *P1, const PointEd448 *P2); +int ed448_scalar(PointEd448 *P, const uint8_t *scalar, size_t scalar_len, uint64_t seed); +""") + + +def lib_func(ecc_obj, func_name): + if ecc_obj._curve.desc == "Ed25519": + result = getattr(_ed25519_lib, "ed25519_" + func_name) + elif ecc_obj._curve.desc == "Ed448": + result = getattr(_ed448_lib, "ed448_" + func_name) + else: + result = getattr(_ec_lib, "ec_ws_" + func_name) + return result + +# +# _curves is a database of curve parameters. Items are indexed by their +# human-friendly name, suchas "P-256". Each item has the following fields: +# - p: the prime number that defines the finite field for all modulo operations +# - b: the constant in the Short Weierstrass curve equation +# - order: the number of elements in the group with the generator below +# - Gx the affine coordinate X of the generator point +# - Gy the affine coordinate Y of the generator point +# - G the generator, as an EccPoint object +# - modulus_bits the minimum number of bits for encoding the modulus p +# - oid an ASCII string with the registered ASN.1 Object ID +# - context a raw pointer to memory holding a context for all curve operations (can be NULL) +# - desc an ASCII string describing the curve +# - openssh the ASCII string used in OpenSSH id files for public keys on this curve +# - name the ASCII string which is also a valid key in _curves + + +_Curve = namedtuple("_Curve", "p b order Gx Gy G modulus_bits oid context desc openssh name") +_curves = {} + + +p192_names = ["p192", "NIST P-192", "P-192", "prime192v1", "secp192r1", + "nistp192"] + + +def init_p192(): + p = 0xfffffffffffffffffffffffffffffffeffffffffffffffff + b = 0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1 + order = 0xffffffffffffffffffffffff99def836146bc9b1b4d22831 + Gx = 0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012 + Gy = 0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811 + + p192_modulus = long_to_bytes(p, 24) + p192_b = long_to_bytes(b, 24) + p192_order = long_to_bytes(order, 24) + + ec_p192_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p192_context.address_of(), + c_uint8_ptr(p192_modulus), + c_uint8_ptr(p192_b), + c_uint8_ptr(p192_order), + c_size_t(len(p192_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-192 context" % result) + + context = SmartPointer(ec_p192_context.get(), _ec_lib.ec_free_context) + p192 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 192, + "1.2.840.10045.3.1.1", # ANSI X9.62 / SEC2 + context, + "NIST P-192", + "ecdsa-sha2-nistp192", + "p192") + global p192_names + _curves.update(dict.fromkeys(p192_names, p192)) + + +init_p192() +del init_p192 + + +p224_names = ["p224", "NIST P-224", "P-224", "prime224v1", "secp224r1", + "nistp224"] + + +def init_p224(): + p = 0xffffffffffffffffffffffffffffffff000000000000000000000001 + b = 0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4 + order = 0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d + Gx = 0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21 + Gy = 0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34 + + p224_modulus = long_to_bytes(p, 28) + p224_b = long_to_bytes(b, 28) + p224_order = long_to_bytes(order, 28) + + ec_p224_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p224_context.address_of(), + c_uint8_ptr(p224_modulus), + c_uint8_ptr(p224_b), + c_uint8_ptr(p224_order), + c_size_t(len(p224_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-224 context" % result) + + context = SmartPointer(ec_p224_context.get(), _ec_lib.ec_free_context) + p224 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 224, + "1.3.132.0.33", # SEC 2 + context, + "NIST P-224", + "ecdsa-sha2-nistp224", + "p224") + global p224_names + _curves.update(dict.fromkeys(p224_names, p224)) + + +init_p224() +del init_p224 + + +p256_names = ["p256", "NIST P-256", "P-256", "prime256v1", "secp256r1", + "nistp256"] + + +def init_p256(): + p = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff + b = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b + order = 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + Gx = 0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296 + Gy = 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5 + + p256_modulus = long_to_bytes(p, 32) + p256_b = long_to_bytes(b, 32) + p256_order = long_to_bytes(order, 32) + + ec_p256_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p256_context.address_of(), + c_uint8_ptr(p256_modulus), + c_uint8_ptr(p256_b), + c_uint8_ptr(p256_order), + c_size_t(len(p256_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-256 context" % result) + + context = SmartPointer(ec_p256_context.get(), _ec_lib.ec_free_context) + p256 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 256, + "1.2.840.10045.3.1.7", # ANSI X9.62 / SEC2 + context, + "NIST P-256", + "ecdsa-sha2-nistp256", + "p256") + global p256_names + _curves.update(dict.fromkeys(p256_names, p256)) + + +init_p256() +del init_p256 + + +p384_names = ["p384", "NIST P-384", "P-384", "prime384v1", "secp384r1", + "nistp384"] + + +def init_p384(): + p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + b = 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef + order = 0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + Gx = 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760aB7 + Gy = 0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5F + + p384_modulus = long_to_bytes(p, 48) + p384_b = long_to_bytes(b, 48) + p384_order = long_to_bytes(order, 48) + + ec_p384_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p384_context.address_of(), + c_uint8_ptr(p384_modulus), + c_uint8_ptr(p384_b), + c_uint8_ptr(p384_order), + c_size_t(len(p384_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-384 context" % result) + + context = SmartPointer(ec_p384_context.get(), _ec_lib.ec_free_context) + p384 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 384, + "1.3.132.0.34", # SEC 2 + context, + "NIST P-384", + "ecdsa-sha2-nistp384", + "p384") + global p384_names + _curves.update(dict.fromkeys(p384_names, p384)) + + +init_p384() +del init_p384 + + +p521_names = ["p521", "NIST P-521", "P-521", "prime521v1", "secp521r1", + "nistp521"] + + +def init_p521(): + p = 0x000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + b = 0x00000051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00 + order = 0x000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + Gx = 0x000000c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66 + Gy = 0x0000011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650 + + p521_modulus = long_to_bytes(p, 66) + p521_b = long_to_bytes(b, 66) + p521_order = long_to_bytes(order, 66) + + ec_p521_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p521_context.address_of(), + c_uint8_ptr(p521_modulus), + c_uint8_ptr(p521_b), + c_uint8_ptr(p521_order), + c_size_t(len(p521_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-521 context" % result) + + context = SmartPointer(ec_p521_context.get(), _ec_lib.ec_free_context) + p521 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 521, + "1.3.132.0.35", # SEC 2 + context, + "NIST P-521", + "ecdsa-sha2-nistp521", + "p521") + global p521_names + _curves.update(dict.fromkeys(p521_names, p521)) + + +init_p521() +del init_p521 + + +ed25519_names = ["ed25519", "Ed25519"] + + +def init_ed25519(): + p = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed # 2**255 - 19 + order = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed + Gx = 0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a + Gy = 0x6666666666666666666666666666666666666666666666666666666666666658 + + ed25519 = _Curve(Integer(p), + None, + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 255, + "1.3.101.112", # RFC8410 + None, + "Ed25519", # Used throughout; do not change + "ssh-ed25519", + "ed25519") + global ed25519_names + _curves.update(dict.fromkeys(ed25519_names, ed25519)) + + +init_ed25519() +del init_ed25519 + + +ed448_names = ["ed448", "Ed448"] + + +def init_ed448(): + p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff # 2**448 - 2**224 - 1 + order = 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffff7cca23e9c44edb49aed63690216cc2728dc58f552378c292ab5844f3 + Gx = 0x4f1970c66bed0ded221d15a622bf36da9e146570470f1767ea6de324a3d3a46412ae1af72ab66511433b80e18b00938e2626a82bc70cc05e + Gy = 0x693f46716eb6bc248876203756c9c7624bea73736ca3984087789c1e05a0c2d73ad3ff1ce67c39c4fdbd132c4ed7c8ad9808795bf230fa14 + + ed448_context = VoidPointer() + result = _ed448_lib.ed448_new_context(ed448_context.address_of()) + if result: + raise ImportError("Error %d initializing Ed448 context" % result) + + context = SmartPointer(ed448_context.get(), _ed448_lib.ed448_free_context) + + ed448 = _Curve(Integer(p), + None, + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 448, + "1.3.101.113", # RFC8410 + context, + "Ed448", # Used throughout; do not change + None, + "ed448") + global ed448_names + _curves.update(dict.fromkeys(ed448_names, ed448)) + + +init_ed448() +del init_ed448 + + +class UnsupportedEccFeature(ValueError): + pass + + +class EccPoint(object): + """A class to model a point on an Elliptic Curve. + + The class supports operators for: + + * Adding two points: ``R = S + T`` + * In-place addition: ``S += T`` + * Negating a point: ``R = -T`` + * Comparing two points: ``if S == T: ...`` or ``if S != T: ...`` + * Multiplying a point by a scalar: ``R = S*k`` + * In-place multiplication by a scalar: ``T *= k`` + + :ivar x: The affine X-coordinate of the ECC point + :vartype x: integer + + :ivar y: The affine Y-coordinate of the ECC point + :vartype y: integer + + :ivar xy: The tuple with affine X- and Y- coordinates + """ + + def __init__(self, x, y, curve="p256"): + + try: + self._curve = _curves[curve] + except KeyError: + raise ValueError("Unknown curve name %s" % str(curve)) + self._curve_name = curve + + modulus_bytes = self.size_in_bytes() + + xb = long_to_bytes(x, modulus_bytes) + yb = long_to_bytes(y, modulus_bytes) + if len(xb) != modulus_bytes or len(yb) != modulus_bytes: + raise ValueError("Incorrect coordinate length") + + new_point = lib_func(self, "new_point") + free_func = lib_func(self, "free_point") + + self._point = VoidPointer() + try: + context = self._curve.context.get() + except AttributeError: + context = null_pointer + result = new_point(self._point.address_of(), + c_uint8_ptr(xb), + c_uint8_ptr(yb), + c_size_t(modulus_bytes), + context) + + if result: + if result == 15: + raise ValueError("The EC point does not belong to the curve") + raise ValueError("Error %d while instantiating an EC point" % result) + + # Ensure that object disposal of this Python object will (eventually) + # free the memory allocated by the raw library for the EC point + self._point = SmartPointer(self._point.get(), free_func) + + def set(self, point): + clone = lib_func(self, "clone") + free_func = lib_func(self, "free_point") + + self._point = VoidPointer() + result = clone(self._point.address_of(), + point._point.get()) + + if result: + raise ValueError("Error %d while cloning an EC point" % result) + + self._point = SmartPointer(self._point.get(), free_func) + 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()) + + # Only needed for Python 2 + def __ne__(self, point): + return not self == point + + def __neg__(self): + neg_func = lib_func(self, "neg") + np = self.copy() + result = neg_func(np._point.get()) + if result: + raise ValueError("Error %d while inverting an EC point" % result) + return np + + def copy(self): + """Return a copy of this point.""" + x, y = self.xy + np = EccPoint(x, y, self._curve_name) + return np + + def _is_eddsa(self): + return self._curve.name in ("ed25519", "ed448") + + def is_point_at_infinity(self): + """``True`` if this is the *point-at-infinity*.""" + + if self._is_eddsa(): + return self.x == 0 + else: + return self.xy == (0, 0) + + def point_at_infinity(self): + """Return the *point-at-infinity* for the curve.""" + + if self._is_eddsa(): + return EccPoint(0, 1, self._curve_name) + else: + return EccPoint(0, 0, self._curve_name) + + @property + def x(self): + return self.xy[0] + + @property + def y(self): + return self.xy[1] + + @property + def xy(self): + modulus_bytes = self.size_in_bytes() + xb = bytearray(modulus_bytes) + yb = bytearray(modulus_bytes) + get_xy = lib_func(self, "get_xy") + result = get_xy(c_uint8_ptr(xb), + c_uint8_ptr(yb), + c_size_t(modulus_bytes), + self._point.get()) + if result: + raise ValueError("Error %d while encoding an EC point" % result) + + return (Integer(bytes_to_long(xb)), Integer(bytes_to_long(yb))) + + def size_in_bytes(self): + """Size of each coordinate, in bytes.""" + return (self.size_in_bits() + 7) // 8 + + def size_in_bits(self): + """Size of each coordinate, in bits.""" + return self._curve.modulus_bits + + def double(self): + """Double this point (in-place operation). + + Returns: + This same object (to enable chaining). + """ + + double_func = lib_func(self, "double") + result = double_func(self._point.get()) + if result: + raise ValueError("Error %d while doubling an EC point" % result) + return self + + def __iadd__(self, point): + """Add a second point to this one""" + + add_func = lib_func(self, "add") + result = add_func(self._point.get(), point._point.get()) + if result: + if result == 16: + raise ValueError("EC points are not on the same curve") + raise ValueError("Error %d while adding two EC points" % result) + return self + + def __add__(self, point): + """Return a new point, the addition of this one and another""" + + np = self.copy() + np += point + return np + + def __imul__(self, scalar): + """Multiply this point by a scalar""" + + scalar_func = lib_func(self, "scalar") + if scalar < 0: + raise ValueError("Scalar multiplication is only defined for non-negative integers") + sb = long_to_bytes(scalar) + result = scalar_func(self._point.get(), + c_uint8_ptr(sb), + c_size_t(len(sb)), + c_ulonglong(getrandbits(64))) + if result: + raise ValueError("Error %d during scalar multiplication" % result) + return self + + def __mul__(self, scalar): + """Return a new point, the scalar product of this one""" + + np = self.copy() + np *= scalar + return np + + def __rmul__(self, left_hand): + return self.__mul__(left_hand) + + +# Last piece of initialization +p192_G = EccPoint(_curves['p192'].Gx, _curves['p192'].Gy, "p192") +p192 = _curves['p192']._replace(G=p192_G) +_curves.update(dict.fromkeys(p192_names, p192)) +del p192_G, p192, p192_names + +p224_G = EccPoint(_curves['p224'].Gx, _curves['p224'].Gy, "p224") +p224 = _curves['p224']._replace(G=p224_G) +_curves.update(dict.fromkeys(p224_names, p224)) +del p224_G, p224, p224_names + +p256_G = EccPoint(_curves['p256'].Gx, _curves['p256'].Gy, "p256") +p256 = _curves['p256']._replace(G=p256_G) +_curves.update(dict.fromkeys(p256_names, p256)) +del p256_G, p256, p256_names + +p384_G = EccPoint(_curves['p384'].Gx, _curves['p384'].Gy, "p384") +p384 = _curves['p384']._replace(G=p384_G) +_curves.update(dict.fromkeys(p384_names, p384)) +del p384_G, p384, p384_names + +p521_G = EccPoint(_curves['p521'].Gx, _curves['p521'].Gy, "p521") +p521 = _curves['p521']._replace(G=p521_G) +_curves.update(dict.fromkeys(p521_names, p521)) +del p521_G, p521, p521_names + +ed25519_G = EccPoint(_curves['Ed25519'].Gx, _curves['Ed25519'].Gy, "Ed25519") +ed25519 = _curves['Ed25519']._replace(G=ed25519_G) +_curves.update(dict.fromkeys(ed25519_names, ed25519)) +del ed25519_G, ed25519, ed25519_names + +ed448_G = EccPoint(_curves['Ed448'].Gx, _curves['Ed448'].Gy, "Ed448") +ed448 = _curves['Ed448']._replace(G=ed448_G) +_curves.update(dict.fromkeys(ed448_names, ed448)) +del ed448_G, ed448, ed448_names + + +class EccKey(object): + r"""Class defining an ECC key. + Do not instantiate directly. + Use :func:`generate`, :func:`construct` or :func:`import_key` instead. + + :ivar curve: The name of the curve as defined in the `ECC table`_. + :vartype curve: string + + :ivar pointQ: an ECC point representating the public component. + :vartype pointQ: :class:`EccPoint` + + :ivar d: A scalar that represents the private component + in NIST P curves. It is smaller than the + order of the generator point. + :vartype d: integer + + :ivar seed: A seed that representats the private component + in EdDSA curves + (Ed25519, 32 bytes; Ed448, 57 bytes). + :vartype seed: bytes + """ + + def __init__(self, **kwargs): + """Create a new ECC key + + Keywords: + curve : string + The name of the curve. + d : integer + Mandatory for a private key one NIST P curves. + It must be in the range ``[1..order-1]``. + seed : bytes + Mandatory for a private key on the Ed25519 (32 bytes) + or Ed448 (57 bytes) curve. + point : EccPoint + Mandatory for a public key. If provided for a private key, + the implementation will NOT check whether it matches ``d``. + + Only one parameter among ``d``, ``seed`` or ``point`` may be used. + """ + + kwargs_ = dict(kwargs) + curve_name = kwargs_.pop("curve", None) + self._d = kwargs_.pop("d", None) + self._seed = kwargs_.pop("seed", None) + self._point = kwargs_.pop("point", None) + if curve_name is None and self._point: + curve_name = self._point._curve_name + if kwargs_: + raise TypeError("Unknown parameters: " + str(kwargs_)) + + if curve_name not in _curves: + raise ValueError("Unsupported curve (%s)" % curve_name) + self._curve = _curves[curve_name] + self.curve = self._curve.desc + + count = int(self._d is not None) + int(self._seed is not None) + + if count == 0: + if self._point is None: + raise ValueError("At lest one between parameters 'point', 'd' or 'seed' must be specified") + return + + if count == 2: + raise ValueError("Parameters d and seed are mutually exclusive") + + # NIST P curves work with d, EdDSA works with seed + + if not self._is_eddsa(): + if self._seed is not None: + raise ValueError("Parameter 'seed' can only be used with Ed25519 or Ed448") + self._d = Integer(self._d) + if not 1 <= self._d < self._curve.order: + raise ValueError("Parameter d must be an integer smaller than the curve order") + else: + if self._d is not None: + raise ValueError("Parameter d can only be used with NIST P curves") + # RFC 8032, 5.1.5 + if self._curve.name == "ed25519": + if len(self._seed) != 32: + raise ValueError("Parameter seed must be 32 bytes long for Ed25519") + seed_hash = SHA512.new(self._seed).digest() # h + self._prefix = seed_hash[32:] + tmp = bytearray(seed_hash[:32]) + tmp[0] &= 0xF8 + tmp[31] = (tmp[31] & 0x7F) | 0x40 + # RFC 8032, 5.2.5 + elif self._curve.name == "ed448": + if len(self._seed) != 57: + raise ValueError("Parameter seed must be 57 bytes long for Ed448") + seed_hash = SHAKE256.new(self._seed).read(114) # h + self._prefix = seed_hash[57:] + tmp = bytearray(seed_hash[:57]) + tmp[0] &= 0xFC + tmp[55] |= 0x80 + tmp[56] = 0 + self._d = Integer.from_bytes(tmp, byteorder='little') + + def _is_eddsa(self): + 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 + + return other.pointQ == self.pointQ + + def __repr__(self): + if self.has_private(): + if self._is_eddsa(): + extra = ", seed=%s" % tostr(binascii.hexlify(self._seed)) + else: + extra = ", d=%d" % int(self._d) + else: + extra = "" + x, y = self.pointQ.xy + return "EccKey(curve='%s', point_x=%d, point_y=%d%s)" % (self._curve.desc, x, y, extra) + + def has_private(self): + """``True`` if this key can be used for making signatures or decrypting data.""" + + return self._d is not None + + # ECDSA + def _sign(self, z, k): + assert 0 < k < self._curve.order + + order = self._curve.order + blind = Integer.random_range(min_inclusive=1, + max_exclusive=order) + + blind_d = self._d * blind + inv_blind_k = (blind * k).inverse(order) + + r = (self._curve.G * k).x % order + s = inv_blind_k * (blind * z + blind_d * r) % order + return (r, s) + + # ECDSA + def _verify(self, z, rs): + order = self._curve.order + sinv = rs[1].inverse(order) + point1 = self._curve.G * ((sinv * z) % order) + point2 = self.pointQ * ((sinv * rs[0]) % order) + return (point1 + point2).x == rs[0] + + @property + def d(self): + if not self.has_private(): + raise ValueError("This is not a private ECC key") + return self._d + + @property + def seed(self): + if not self.has_private(): + raise ValueError("This is not a private ECC key") + return self._seed + + @property + def pointQ(self): + if self._point is None: + self._point = self._curve.G * self._d + return self._point + + def public_key(self): + """A matching ECC public key. + + Returns: + a new :class:`EccKey` object + """ + + return EccKey(curve=self._curve.desc, point=self.pointQ) + + def _export_SEC1(self, compress): + if self._is_eddsa(): + raise ValueError("SEC1 format is unsupported for EdDSA curves") + + # See 2.2 in RFC5480 and 2.3.3 in SEC1 + # + # The first byte is: + # - 0x02: compressed, only X-coordinate, Y-coordinate is even + # - 0x03: compressed, only X-coordinate, Y-coordinate is odd + # - 0x04: uncompressed, X-coordinate is followed by Y-coordinate + # + # PAI is in theory encoded as 0x00. + + modulus_bytes = self.pointQ.size_in_bytes() + + if compress: + if self.pointQ.y.is_odd(): + first_byte = b'\x03' + else: + first_byte = b'\x02' + public_key = (first_byte + + self.pointQ.x.to_bytes(modulus_bytes)) + else: + public_key = (b'\x04' + + self.pointQ.x.to_bytes(modulus_bytes) + + self.pointQ.y.to_bytes(modulus_bytes)) + return public_key + + def _export_eddsa(self): + x, y = self.pointQ.xy + if self._curve.name == "ed25519": + result = bytearray(y.to_bytes(32, byteorder='little')) + result[31] = ((x & 1) << 7) | result[31] + elif self._curve.name == "ed448": + result = bytearray(y.to_bytes(57, byteorder='little')) + result[56] = (x & 1) << 7 + else: + raise ValueError("Not an EdDSA key to export") + return bytes(result) + + def _export_subjectPublicKeyInfo(self, compress): + if self._is_eddsa(): + oid = self._curve.oid + public_key = self._export_eddsa() + params = None + else: + oid = "1.2.840.10045.2.1" # unrestricted + public_key = self._export_SEC1(compress) + params = DerObjectId(self._curve.oid) + + return _create_subject_public_key_info(oid, + public_key, + params) + + def _export_rfc5915_private_der(self, include_ec_params=True): + + assert self.has_private() + + # ECPrivateKey ::= SEQUENCE { + # version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), + # privateKey OCTET STRING, + # parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, + # publicKey [1] BIT STRING OPTIONAL + # } + + # Public key - uncompressed form + modulus_bytes = self.pointQ.size_in_bytes() + public_key = (b'\x04' + + self.pointQ.x.to_bytes(modulus_bytes) + + self.pointQ.y.to_bytes(modulus_bytes)) + + seq = [1, + DerOctetString(self.d.to_bytes(modulus_bytes)), + DerObjectId(self._curve.oid, explicit=0), + DerBitString(public_key, explicit=1)] + + if not include_ec_params: + del seq[2] + + return DerSequence(seq).encode() + + def _export_pkcs8(self, **kwargs): + 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") + + if self._is_eddsa(): + oid = self._curve.oid + private_key = DerOctetString(self._seed).encode() + params = None + else: + oid = "1.2.840.10045.2.1" # unrestricted + private_key = self._export_rfc5915_private_der(include_ec_params=False) + params = DerObjectId(self._curve.oid) + + result = PKCS8.wrap(private_key, + oid, + key_params=params, + **kwargs) + return result + + def _export_public_pem(self, compress): + from Cryptodome.IO import PEM + + encoded_der = self._export_subjectPublicKeyInfo(compress) + return PEM.encode(encoded_der, "PUBLIC KEY") + + def _export_private_pem(self, passphrase, **kwargs): + from Cryptodome.IO import PEM + + encoded_der = self._export_rfc5915_private_der() + return PEM.encode(encoded_der, "EC PRIVATE KEY", passphrase, **kwargs) + + def _export_private_clear_pkcs8_in_clear_pem(self): + from Cryptodome.IO import PEM + + encoded_der = self._export_pkcs8() + return PEM.encode(encoded_der, "PRIVATE KEY") + + def _export_private_encrypted_pkcs8_in_clear_pem(self, passphrase, **kwargs): + from Cryptodome.IO import PEM + + assert passphrase + if 'protection' not in kwargs: + raise ValueError("At least the 'protection' parameter should be present") + encoded_der = self._export_pkcs8(passphrase=passphrase, **kwargs) + return PEM.encode(encoded_der, "ENCRYPTED PRIVATE KEY") + + def _export_openssh(self, compress): + if self.has_private(): + raise ValueError("Cannot export OpenSSH private keys") + + desc = self._curve.openssh + + if desc is None: + raise ValueError("Cannot export %s keys as OpenSSH" % self._curve.name) + elif desc == "ssh-ed25519": + public_key = self._export_eddsa() + comps = (tobytes(desc), tobytes(public_key)) + else: + modulus_bytes = self.pointQ.size_in_bytes() + + if compress: + first_byte = 2 + self.pointQ.y.is_odd() + public_key = (bchr(first_byte) + + self.pointQ.x.to_bytes(modulus_bytes)) + else: + public_key = (b'\x04' + + self.pointQ.x.to_bytes(modulus_bytes) + + self.pointQ.y.to_bytes(modulus_bytes)) + + middle = desc.split("-")[2] + comps = (tobytes(desc), tobytes(middle), public_key) + + blob = b"".join([struct.pack(">I", len(x)) + x for x in comps]) + return desc + " " + tostr(binascii.b2a_base64(blob)) + + def export_key(self, **kwargs): + """Export this ECC key. + + Args: + format (string): + The format to use for encoding the key: + + - ``'DER'``. The key will be encoded in ASN.1 DER format (binary). + For a public key, the ASN.1 ``subjectPublicKeyInfo`` structure + defined in `RFC5480`_ will be used. + For a private key, the ASN.1 ``ECPrivateKey`` structure defined + in `RFC5915`_ is used instead (possibly within a PKCS#8 envelope, + see the ``use_pkcs8`` flag below). + - ``'PEM'``. The key will be encoded in a PEM_ envelope (ASCII). + - ``'OpenSSH'``. The key will be encoded in the OpenSSH_ format + (ASCII, public keys only). + - ``'SEC1'``. The public key (i.e., the EC point) will be encoded + into ``bytes`` according to Section 2.3.3 of `SEC1`_ + (which is a subset of the older X9.62 ITU standard). + Only for NIST P-curves. + - ``'raw'``. The public key will be encoded as ``bytes``, + without any metadata. + + * 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. + + use_pkcs8 (boolean): + Only relevant for private keys. + + If ``True`` (default and recommended), the `PKCS#8`_ representation + will be used. It must be ``True`` for EdDSA curves. + + 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``. + + compress (boolean): + If ``True``, the method returns a more compact representation + of the public key, with the X-coordinate only. + + If ``False`` (default), the method returns the full public key. + + This parameter is ignored for EdDSA curves, as compression is + mandatory. + + .. warning:: + If you don't provide a passphrase, the private key will be + exported in the clear! + + .. note:: + When exporting a private key with password-protection and `PKCS#8`_ + (both ``DER`` and ``PEM`` formats), any extra parameters + to ``export_key()`` will be passed to :mod:`Cryptodome.IO.PKCS8`. + + .. _PEM: http://www.ietf.org/rfc/rfc1421.txt + .. _`PEM encryption`: http://www.ietf.org/rfc/rfc1423.txt + .. _OpenSSH: http://www.openssh.com/txt/rfc5656.txt + .. _RFC5480: https://tools.ietf.org/html/rfc5480 + .. _SEC1: https://www.secg.org/sec1-v2.pdf + + Returns: + A multi-line string (for ``'PEM'`` and ``'OpenSSH'``) or + ``bytes`` (for ``'DER'``, ``'SEC1'``, and ``'raw'``) with the encoded key. + """ + + args = kwargs.copy() + ext_format = args.pop("format") + if ext_format not in ("PEM", "DER", "OpenSSH", "SEC1", "raw"): + raise ValueError("Unknown format '%s'" % ext_format) + + compress = args.pop("compress", False) + + if self.has_private(): + passphrase = args.pop("passphrase", None) + if is_string(passphrase): + passphrase = tobytes(passphrase) + if not passphrase: + 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 ext_format == "PEM": + if use_pkcs8: + if passphrase: + return self._export_private_encrypted_pkcs8_in_clear_pem(passphrase, **args) + else: + return self._export_private_clear_pkcs8_in_clear_pem() + else: + return self._export_private_pem(passphrase, **args) + elif ext_format == "DER": + # DER + if passphrase and not use_pkcs8: + raise ValueError("Private keys can only be encrpyted with DER using PKCS#8") + if use_pkcs8: + return self._export_pkcs8(passphrase=passphrase, **args) + else: + return self._export_rfc5915_private_der() + else: + raise ValueError("Private keys cannot be exported " + "in the '%s' format" % ext_format) + else: # Public key + if args: + raise ValueError("Unexpected parameters: '%s'" % args) + if ext_format == "PEM": + return self._export_public_pem(compress) + elif ext_format == "DER": + return self._export_subjectPublicKeyInfo(compress) + elif ext_format == "SEC1": + return self._export_SEC1(compress) + elif ext_format == "raw": + if self._curve.name in ('ed25519', 'ed448'): + return self._export_eddsa() + else: + return self._export_SEC1(compress) + else: + return self._export_openssh(compress) + + +def generate(**kwargs): + """Generate a new private key on the given curve. + + Args: + + curve (string): + Mandatory. It must be a curve name defined in the `ECC table`_. + + randfunc (callable): + Optional. The RNG to read randomness from. + If ``None``, :func:`Cryptodome.Random.get_random_bytes` is used. + """ + + curve_name = kwargs.pop("curve") + curve = _curves[curve_name] + randfunc = kwargs.pop("randfunc", get_random_bytes) + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + if _curves[curve_name].name == "ed25519": + seed = randfunc(32) + new_key = EccKey(curve=curve_name, seed=seed) + elif _curves[curve_name].name == "ed448": + seed = randfunc(57) + new_key = EccKey(curve=curve_name, seed=seed) + else: + d = Integer.random_range(min_inclusive=1, + max_exclusive=curve.order, + randfunc=randfunc) + new_key = EccKey(curve=curve_name, d=d) + + return new_key + + +def construct(**kwargs): + """Build a new ECC key (private or public) starting + from some base components. + + In most cases, you will already have an existing key + which you can read in with :func:`import_key` instead + of this function. + + Args: + curve (string): + Mandatory. The name of the elliptic curve, as defined in the `ECC table`_. + + d (integer): + Mandatory for a private key and a NIST P-curve (e.g., P-256): + the integer in the range ``[1..order-1]`` that represents the key. + + seed (bytes): + Mandatory for a private key and an EdDSA curve. + It must be 32 bytes for Ed25519, and 57 bytes for Ed448. + + point_x (integer): + Mandatory for a public key: the X coordinate (affine) of the ECC point. + + point_y (integer): + Mandatory for a public key: the Y coordinate (affine) of the ECC point. + + Returns: + :class:`EccKey` : a new ECC key object + """ + + curve_name = kwargs["curve"] + curve = _curves[curve_name] + point_x = kwargs.pop("point_x", None) + point_y = kwargs.pop("point_y", None) + + if "point" in kwargs: + raise TypeError("Unknown keyword: point") + + if None not in (point_x, point_y): + # ValueError is raised if the point is not on the curve + kwargs["point"] = EccPoint(point_x, point_y, curve_name) + + new_key = EccKey(**kwargs) + + # Validate that the private key matches the public one + # because EccKey will not do that automatically + if new_key.has_private() and 'point' in kwargs: + pub_key = curve.G * new_key.d + if pub_key.xy != (point_x, point_y): + raise ValueError("Private and public ECC keys do not match") + + return new_key + + +def _import_public_der(ec_point, curve_oid=None, curve_name=None): + """Convert an encoded EC point into an EccKey object + + ec_point: byte string with the EC point (SEC1-encoded) + curve_oid: string with the name the curve + curve_name: string with the OID of the curve + + Either curve_id or curve_name must be specified + + """ + + for _curve_name, curve in _curves.items(): + if curve_oid and curve.oid == curve_oid: + break + if curve_name == _curve_name: + break + else: + if curve_oid: + raise UnsupportedEccFeature("Unsupported ECC curve (OID: %s)" % curve_oid) + else: + raise UnsupportedEccFeature("Unsupported ECC curve (%s)" % curve_name) + + # See 2.2 in RFC5480 and 2.3.3 in SEC1 + # The first byte is: + # - 0x02: compressed, only X-coordinate, Y-coordinate is even + # - 0x03: compressed, only X-coordinate, Y-coordinate is odd + # - 0x04: uncompressed, X-coordinate is followed by Y-coordinate + # + # PAI is in theory encoded as 0x00. + + modulus_bytes = curve.p.size_in_bytes() + point_type = bord(ec_point[0]) + + # Uncompressed point + if point_type == 0x04: + if len(ec_point) != (1 + 2 * modulus_bytes): + raise ValueError("Incorrect EC point length") + x = Integer.from_bytes(ec_point[1:modulus_bytes+1]) + y = Integer.from_bytes(ec_point[modulus_bytes+1:]) + # Compressed point + elif point_type in (0x02, 0x03): + if len(ec_point) != (1 + modulus_bytes): + raise ValueError("Incorrect EC point length") + x = Integer.from_bytes(ec_point[1:]) + # Right now, we only support Short Weierstrass curves + y = (x**3 - x*3 + curve.b).sqrt(curve.p) + if point_type == 0x02 and y.is_odd(): + y = curve.p - y + if point_type == 0x03 and y.is_even(): + y = curve.p - y + else: + raise ValueError("Incorrect EC point encoding") + + return construct(curve=_curve_name, point_x=x, point_y=y) + + +def _import_subjectPublicKeyInfo(encoded, *kwargs): + """Convert a subjectPublicKeyInfo into an EccKey object""" + + # See RFC5480 + + # Parse the generic subjectPublicKeyInfo structure + oid, ec_point, params = _expand_subject_public_key_info(encoded) + + nist_p_oids = ( + "1.2.840.10045.2.1", # id-ecPublicKey (unrestricted) + "1.3.132.1.12", # id-ecDH + "1.3.132.1.13" # id-ecMQV + ) + eddsa_oids = { + "1.3.101.112": ("Ed25519", _import_ed25519_public_key), # id-Ed25519 + "1.3.101.113": ("Ed448", _import_ed448_public_key) # id-Ed448 + } + + if oid in nist_p_oids: + # See RFC5480 + + # Parameters are mandatory and encoded as ECParameters + # ECParameters ::= CHOICE { + # namedCurve OBJECT IDENTIFIER + # -- implicitCurve NULL + # -- specifiedCurve SpecifiedECDomain + # } + # implicitCurve and specifiedCurve are not supported (as per RFC) + if not params: + raise ValueError("Missing ECC parameters for ECC OID %s" % oid) + try: + curve_oid = DerObjectId().decode(params).value + except ValueError: + raise ValueError("Error decoding namedCurve") + + # ECPoint ::= OCTET STRING + return _import_public_der(ec_point, curve_oid=curve_oid) + + elif oid in eddsa_oids: + # See RFC8410 + curve_name, import_eddsa_public_key = eddsa_oids[oid] + + # Parameters must be absent + if params: + raise ValueError("Unexpected ECC parameters for ECC OID %s" % oid) + + x, y = import_eddsa_public_key(ec_point) + return construct(point_x=x, point_y=y, curve=curve_name) + else: + raise UnsupportedEccFeature("Unsupported ECC OID: %s" % oid) + + +def _import_rfc5915_der(encoded, passphrase, curve_oid=None): + + # See RFC5915 https://tools.ietf.org/html/rfc5915 + # + # ECPrivateKey ::= SEQUENCE { + # version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), + # privateKey OCTET STRING, + # parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, + # publicKey [1] BIT STRING OPTIONAL + # } + + private_key = DerSequence().decode(encoded, nr_elements=(3, 4)) + if private_key[0] != 1: + raise ValueError("Incorrect ECC private key version") + + try: + parameters = DerObjectId(explicit=0).decode(private_key[2]).value + if curve_oid is not None and parameters != curve_oid: + raise ValueError("Curve mismatch") + curve_oid = parameters + except ValueError: + pass + + if curve_oid is None: + raise ValueError("No curve found") + + for curve_name, curve in _curves.items(): + if curve.oid == curve_oid: + break + else: + raise UnsupportedEccFeature("Unsupported ECC curve (OID: %s)" % curve_oid) + + scalar_bytes = DerOctetString().decode(private_key[1]).payload + modulus_bytes = curve.p.size_in_bytes() + if len(scalar_bytes) != modulus_bytes: + raise ValueError("Private key is too small") + d = Integer.from_bytes(scalar_bytes) + + # Decode public key (if any) + 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 + else: + point_x = point_y = None + + return construct(curve=curve_name, d=d, point_x=point_x, point_y=point_y) + + +def _import_pkcs8(encoded, passphrase): + from Cryptodome.IO import PKCS8 + + algo_oid, private_key, params = PKCS8.unwrap(encoded, passphrase) + + nist_p_oids = ( + "1.2.840.10045.2.1", # id-ecPublicKey (unrestricted) + "1.3.132.1.12", # id-ecDH + "1.3.132.1.13" # id-ecMQV + ) + eddsa_oids = { + "1.3.101.112": "Ed25519", # id-Ed25519 + "1.3.101.113": "Ed448", # id-Ed448 + } + + if algo_oid in nist_p_oids: + curve_oid = DerObjectId().decode(params).value + return _import_rfc5915_der(private_key, passphrase, curve_oid) + elif algo_oid in eddsa_oids: + if params is not None: + raise ValueError("EdDSA ECC private key must not have parameters") + curve_oid = None + seed = DerOctetString().decode(private_key).payload + return construct(curve=eddsa_oids[algo_oid], seed=seed) + else: + raise UnsupportedEccFeature("Unsupported ECC purpose (OID: %s)" % algo_oid) + + +def _import_x509_cert(encoded, *kwargs): + + sp_info = _extract_subject_public_key_info(encoded) + return _import_subjectPublicKeyInfo(sp_info) + + +def _import_der(encoded, passphrase): + + try: + return _import_subjectPublicKeyInfo(encoded, passphrase) + except UnsupportedEccFeature as err: + raise err + except (ValueError, TypeError, IndexError): + pass + + try: + return _import_x509_cert(encoded, passphrase) + except UnsupportedEccFeature as err: + raise err + except (ValueError, TypeError, IndexError): + pass + + try: + return _import_rfc5915_der(encoded, passphrase) + except UnsupportedEccFeature as err: + raise err + except (ValueError, TypeError, IndexError): + pass + + try: + return _import_pkcs8(encoded, passphrase) + except UnsupportedEccFeature as err: + raise err + except (ValueError, TypeError, IndexError): + pass + + raise ValueError("Not an ECC DER key") + + +def _import_openssh_public(encoded): + parts = encoded.split(b' ') + if len(parts) not in (2, 3): + raise ValueError("Not an openssh public key") + + try: + keystring = binascii.a2b_base64(parts[1]) + + keyparts = [] + while len(keystring) > 4: + lk = struct.unpack(">I", keystring[:4])[0] + keyparts.append(keystring[4:4 + lk]) + keystring = keystring[4 + lk:] + + if parts[0] != keyparts[0]: + raise ValueError("Mismatch in openssh public key") + + # NIST P curves + if parts[0].startswith(b"ecdsa-sha2-"): + + for curve_name, curve in _curves.items(): + if curve.openssh is None: + continue + if not curve.openssh.startswith("ecdsa-sha2"): + continue + middle = tobytes(curve.openssh.split("-")[2]) + if keyparts[1] == middle: + break + else: + raise ValueError("Unsupported ECC curve: " + middle) + + ecc_key = _import_public_der(keyparts[2], curve_oid=curve.oid) + + # EdDSA + elif parts[0] == b"ssh-ed25519": + x, y = _import_ed25519_public_key(keyparts[1]) + ecc_key = construct(curve="Ed25519", point_x=x, point_y=y) + else: + raise ValueError("Unsupported SSH key type: " + parts[0]) + + except (IndexError, TypeError, binascii.Error): + raise ValueError("Error parsing SSH key type: " + parts[0]) + + return ecc_key + + +def _import_openssh_private_ecc(data, password): + + from ._openssh import (import_openssh_private_generic, + read_bytes, read_string, check_padding) + + key_type, decrypted = import_openssh_private_generic(data, password) + + eddsa_keys = { + "ssh-ed25519": ("Ed25519", _import_ed25519_public_key, 32), + } + + # https://datatracker.ietf.org/doc/html/draft-miller-ssh-agent-04 + if key_type.startswith("ecdsa-sha2"): + + ecdsa_curve_name, decrypted = read_string(decrypted) + if ecdsa_curve_name not in _curves: + raise UnsupportedEccFeature("Unsupported ECC curve %s" % ecdsa_curve_name) + curve = _curves[ecdsa_curve_name] + modulus_bytes = (curve.modulus_bits + 7) // 8 + + public_key, decrypted = read_bytes(decrypted) + + if bord(public_key[0]) != 4: + raise ValueError("Only uncompressed OpenSSH EC keys are supported") + if len(public_key) != 2 * modulus_bytes + 1: + raise ValueError("Incorrect public key length") + + point_x = Integer.from_bytes(public_key[1:1+modulus_bytes]) + point_y = Integer.from_bytes(public_key[1+modulus_bytes:]) + + private_key, decrypted = read_bytes(decrypted) + d = Integer.from_bytes(private_key) + + params = {'d': d, 'curve': ecdsa_curve_name} + + elif key_type in eddsa_keys: + + curve_name, import_eddsa_public_key, seed_len = eddsa_keys[key_type] + + public_key, decrypted = read_bytes(decrypted) + point_x, point_y = import_eddsa_public_key(public_key) + + private_public_key, decrypted = read_bytes(decrypted) + seed = private_public_key[:seed_len] + + params = {'seed': seed, 'curve': curve_name} + else: + raise ValueError("Unsupport SSH agent key type:" + key_type) + + _, padded = read_string(decrypted) # Comment + check_padding(padded) + + return construct(point_x=point_x, point_y=point_y, **params) + + +def _import_ed25519_public_key(encoded): + """Import an Ed25519 ECC public key, encoded as raw bytes as described + in RFC8032_. + + Args: + encoded (bytes): + The Ed25519 public key to import. It must be 32 bytes long. + + Returns: + :class:`EccKey` : a new ECC key object + + Raises: + ValueError: when the given key cannot be parsed. + + .. _RFC8032: https://datatracker.ietf.org/doc/html/rfc8032 + """ + + if len(encoded) != 32: + raise ValueError("Incorrect length. Only Ed25519 public keys are supported.") + + p = Integer(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed) # 2**255 - 19 + d = 37095705934669439343138083508754565189542113879843219016388785533085940283555 + + y = bytearray(encoded) + x_lsb = y[31] >> 7 + y[31] &= 0x7F + point_y = Integer.from_bytes(y, byteorder='little') + if point_y >= p: + raise ValueError("Invalid Ed25519 key (y)") + if point_y == 1: + return 0, 1 + + u = (point_y**2 - 1) % p + v = ((point_y**2 % p) * d + 1) % p + try: + v_inv = v.inverse(p) + x2 = (u * v_inv) % p + point_x = Integer._tonelli_shanks(x2, p) + if (point_x & 1) != x_lsb: + point_x = p - point_x + except ValueError: + raise ValueError("Invalid Ed25519 public key") + return point_x, point_y + + +def _import_ed448_public_key(encoded): + """Import an Ed448 ECC public key, encoded as raw bytes as described + in RFC8032_. + + Args: + encoded (bytes): + The Ed448 public key to import. It must be 57 bytes long. + + Returns: + :class:`EccKey` : a new ECC key object + + Raises: + ValueError: when the given key cannot be parsed. + + .. _RFC8032: https://datatracker.ietf.org/doc/html/rfc8032 + """ + + if len(encoded) != 57: + raise ValueError("Incorrect length. Only Ed448 public keys are supported.") + + p = Integer(0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff) # 2**448 - 2**224 - 1 + d = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffff6756 + + y = encoded[:56] + x_lsb = bord(encoded[56]) >> 7 + point_y = Integer.from_bytes(y, byteorder='little') + if point_y >= p: + raise ValueError("Invalid Ed448 key (y)") + if point_y == 1: + return 0, 1 + + u = (point_y**2 - 1) % p + v = ((point_y**2 % p) * d - 1) % p + try: + v_inv = v.inverse(p) + x2 = (u * v_inv) % p + point_x = Integer._tonelli_shanks(x2, p) + if (point_x & 1) != x_lsb: + point_x = p - point_x + except ValueError: + raise ValueError("Invalid Ed448 public key") + return point_x, point_y + + +def import_key(encoded, passphrase=None, curve_name=None): + """Import an ECC key (public or private). + + Args: + encoded (bytes or multi-line string): + The ECC key to import. + The function will try to automatically detect the right format. + + Supported formats for an ECC **public** key: + + * X.509 certificate: binary (DER) or ASCII (PEM). + * X.509 ``subjectPublicKeyInfo``: binary (DER) or ASCII (PEM). + * SEC1_ (or X9.62), as ``bytes``. NIST P curves only. + You must also provide the ``curve_name`` (with a value from the `ECC table`_) + * OpenSSH line, defined in RFC5656_ and RFC8709_ (ASCII). + This is normally the content of files like ``~/.ssh/id_ecdsa.pub``. + + Supported formats for an ECC **private** key: + + * A binary ``ECPrivateKey`` structure, as defined in `RFC5915`_ (DER). + NIST P curves only. + * A `PKCS#8`_ structure (or the more recent Asymmetric Key Package, RFC5958_): binary (DER) or ASCII (PEM). + * `OpenSSH 6.5`_ and newer versions (ASCII). + + Private keys can be in the clear or password-protected. + + For details about the PEM encoding, see `RFC1421`_/`RFC1423`_. + + passphrase (byte string): + The passphrase to use for decrypting a private key. + Encryption may be applied protected at the PEM level (not recommended) + or at the PKCS#8 level (recommended). + This parameter is ignored if the key in input is not encrypted. + + curve_name (string): + For a SEC1 encoding only. This is the name of the curve, + as defined in the `ECC table`_. + + .. note:: + + To import EdDSA private and public keys, when encoded as raw ``bytes``, use: + + * :func:`Cryptodome.Signature.eddsa.import_public_key`, or + * :func:`Cryptodome.Signature.eddsa.import_private_key`. + + Returns: + :class:`EccKey` : a new ECC key object + + Raises: + ValueError: when the given key cannot be parsed (possibly because + the pass phrase is wrong). + + .. _RFC1421: https://datatracker.ietf.org/doc/html/rfc1421 + .. _RFC1423: https://datatracker.ietf.org/doc/html/rfc1423 + .. _RFC5915: https://datatracker.ietf.org/doc/html/rfc5915 + .. _RFC5656: https://datatracker.ietf.org/doc/html/rfc5656 + .. _RFC8709: https://datatracker.ietf.org/doc/html/rfc8709 + .. _RFC5958: https://datatracker.ietf.org/doc/html/rfc5958 + .. _`PKCS#8`: https://datatracker.ietf.org/doc/html/rfc5208 + .. _`OpenSSH 6.5`: https://flak.tedunangst.com/post/new-openssh-key-format-and-bcrypt-pbkdf + .. _SEC1: https://www.secg.org/sec1-v2.pdf + """ + + from Cryptodome.IO import PEM + + encoded = tobytes(encoded) + if passphrase is not None: + passphrase = tobytes(passphrase) + + # PEM + if encoded.startswith(b'-----BEGIN OPENSSH PRIVATE KEY'): + text_encoded = tostr(encoded) + openssh_encoded, marker, enc_flag = PEM.decode(text_encoded, passphrase) + result = _import_openssh_private_ecc(openssh_encoded, passphrase) + return result + + elif encoded.startswith(b'-----'): + + text_encoded = tostr(encoded) + + # Remove any EC PARAMETERS section + # Ignore its content because the curve type must be already given in the key + ecparams_start = "-----BEGIN EC PARAMETERS-----" + ecparams_end = "-----END EC PARAMETERS-----" + text_encoded = re.sub(ecparams_start + ".*?" + ecparams_end, "", + text_encoded, + flags=re.DOTALL) + + der_encoded, marker, enc_flag = PEM.decode(text_encoded, passphrase) + if enc_flag: + passphrase = None + try: + result = _import_der(der_encoded, passphrase) + except UnsupportedEccFeature as uef: + raise uef + except ValueError: + raise ValueError("Invalid DER encoding inside the PEM file") + return result + + # OpenSSH + if encoded.startswith((b'ecdsa-sha2-', b'ssh-ed25519')): + return _import_openssh_public(encoded) + + # DER + if len(encoded) > 0 and bord(encoded[0]) == 0x30: + return _import_der(encoded, passphrase) + + # SEC1 + if len(encoded) > 0 and bord(encoded[0]) in b'\x02\x03\x04': + if curve_name is None: + raise ValueError("No curve name was provided") + return _import_public_der(encoded, curve_name=curve_name) + + raise ValueError("ECC key format is not supported") + + +if __name__ == "__main__": + + import time + + d = 0xc51e4753afdec1e6b6c6a5b992f43f8dd0c7a8933072708b6522468b2ffb06fd + + point = _curves['p256'].G.copy() + count = 3000 + + start = time.time() + for x in range(count): + pointX = point * d + print("(P-256 G)", (time.time() - start) / count * 1000, "ms") + + start = time.time() + for x in range(count): + pointX = pointX * d + print("(P-256 arbitrary point)", (time.time() - start) / count * 1000, "ms") diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.pyi b/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.pyi new file mode 100644 index 0000000..b0bfbec --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/PublicKey/ECC.pyi @@ -0,0 +1,66 @@ +from typing import Union, Callable, Optional, NamedTuple, List, Tuple, Dict, NamedTuple, Any + +from Cryptodome.Math.Numbers import Integer + +RNG = Callable[[int], bytes] + +class UnsupportedEccFeature(ValueError): ... +class EccPoint(object): + 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: ... + def copy(self) -> EccPoint: ... + def is_point_at_infinity(self) -> bool: ... + def point_at_infinity(self) -> EccPoint: ... + @property + def x(self) -> int: ... + @property + def y(self) -> int: ... + @property + def xy(self) -> Tuple[int, int]: ... + def size_in_bytes(self) -> int: ... + def size_in_bits(self) -> int: ... + def double(self) -> EccPoint: ... + def __iadd__(self, point: EccPoint) -> EccPoint: ... + def __add__(self, point: EccPoint) -> EccPoint: ... + def __imul__(self, scalar: int) -> EccPoint: ... + def __mul__(self, scalar: int) -> EccPoint: ... + +class EccKey(object): + curve: str + def __init__(self, *, curve: str = ..., d: int = ..., point: EccPoint = ...) -> None: ... + def __eq__(self, other: object) -> bool: ... + def __repr__(self) -> str: ... + def has_private(self) -> bool: ... + @property + def d(self) -> int: ... + @property + def pointQ(self) -> EccPoint: ... + def public_key(self) -> EccKey: ... + def export_key(self, **kwargs: Union[str, bytes, bool]) -> Union[str,bytes]: ... + + +_Curve = NamedTuple("_Curve", [('p', Integer), + ('order', Integer), + ('b', Integer), + ('Gx', Integer), + ('Gy', Integer), + ('G', EccPoint), + ('modulus_bits', int), + ('oid', str), + ('context', Any), + ('desc', str), + ('openssh', Union[str, None]), + ]) + +_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: ... +def _import_ed25519_public_key(encoded: bytes) -> EccKey: ... +def _import_ed448_public_key(encoded: bytes) -> EccKey: ... diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.py b/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.py new file mode 100644 index 0000000..95c219e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.py @@ -0,0 +1,286 @@ +# +# ElGamal.py : ElGamal encryption/decryption and signatures +# +# Part of the Python Cryptography Toolkit +# +# Originally written by: A.M. Kuchling +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +__all__ = ['generate', 'construct', 'ElGamalKey'] + +from Cryptodome import Random +from Cryptodome.Math.Primality import ( generate_probable_safe_prime, + test_probable_prime, COMPOSITE ) +from Cryptodome.Math.Numbers import Integer + +# Generate an ElGamal key with N bits +def generate(bits, randfunc): + """Randomly generate a fresh, new ElGamal key. + + The key will be safe for use for both encryption and signature + (although it should be used for **only one** purpose). + + Args: + bits (int): + Key length, or size (in bits) of the modulus *p*. + The recommended value is 2048. + randfunc (callable): + Random number generation function; it should accept + a single integer *N* and return a string of random + *N* random bytes. + + Return: + an :class:`ElGamalKey` object + """ + + obj=ElGamalKey() + + # Generate a safe prime p + # See Algorithm 4.86 in Handbook of Applied Cryptography + obj.p = generate_probable_safe_prime(exact_bits=bits, randfunc=randfunc) + q = (obj.p - 1) >> 1 + + # Generate generator g + while 1: + # Choose a square residue; it will generate a cyclic group of order q. + obj.g = pow(Integer.random_range(min_inclusive=2, + max_exclusive=obj.p, + randfunc=randfunc), 2, obj.p) + + # We must avoid g=2 because of Bleichenbacher's attack described + # in "Generating ElGamal signatures without knowning the secret key", + # 1996 + if obj.g in (1, 2): + continue + + # Discard g if it divides p-1 because of the attack described + # in Note 11.67 (iii) in HAC + if (obj.p - 1) % obj.g == 0: + continue + + # g^{-1} must not divide p-1 because of Khadir's attack + # described in "Conditions of the generator for forging ElGamal + # signature", 2011 + ginv = obj.g.inverse(obj.p) + if (obj.p - 1) % ginv == 0: + continue + + # Found + break + + # Generate private key x + obj.x = Integer.random_range(min_inclusive=2, + max_exclusive=obj.p-1, + randfunc=randfunc) + # Generate public key y + obj.y = pow(obj.g, obj.x, obj.p) + return obj + +def construct(tup): + r"""Construct an ElGamal key from a tuple of valid ElGamal components. + + The modulus *p* must be a prime. + The following conditions must apply: + + .. math:: + + \begin{align} + &1 < g < p-1 \\ + &g^{p-1} = 1 \text{ mod } 1 \\ + &1 < x < p-1 \\ + &g^x = y \text{ mod } p + \end{align} + + Args: + tup (tuple): + A tuple with either 3 or 4 integers, + in the following order: + + 1. Modulus (*p*). + 2. Generator (*g*). + 3. Public key (*y*). + 4. Private key (*x*). Optional. + + Raises: + ValueError: when the key being imported fails the most basic ElGamal validity checks. + + Returns: + an :class:`ElGamalKey` object + """ + + obj=ElGamalKey() + if len(tup) not in [3,4]: + raise ValueError('argument for construct() wrong length') + for i in range(len(tup)): + field = obj._keydata[i] + setattr(obj, field, Integer(tup[i])) + + fmt_error = test_probable_prime(obj.p) == COMPOSITE + fmt_error |= obj.g<=1 or obj.g>=obj.p + fmt_error |= pow(obj.g, obj.p-1, obj.p)!=1 + fmt_error |= obj.y<1 or obj.y>=obj.p + if len(tup)==4: + fmt_error |= obj.x<=1 or obj.x>=obj.p + fmt_error |= pow(obj.g, obj.x, obj.p)!=obj.y + + if fmt_error: + raise ValueError("Invalid ElGamal key components") + + return obj + +class ElGamalKey(object): + r"""Class defining an ElGamal key. + Do not instantiate directly. + Use :func:`generate` or :func:`construct` instead. + + :ivar p: Modulus + :vartype d: integer + + :ivar g: Generator + :vartype e: integer + + :ivar y: Public key component + :vartype y: integer + + :ivar x: Private key component + :vartype x: integer + """ + + #: Dictionary of ElGamal parameters. + #: + #: A public key will only have the following entries: + #: + #: - **y**, the public key. + #: - **g**, the generator. + #: - **p**, the modulus. + #: + #: A private key will also have: + #: + #: - **x**, the private key. + _keydata=['p', 'g', 'y', 'x'] + + def __init__(self, randfunc=None): + if randfunc is None: + randfunc = Random.new().read + self._randfunc = randfunc + + def _encrypt(self, M, K): + a=pow(self.g, K, self.p) + b=( pow(self.y, K, self.p)*M ) % self.p + return [int(a), int(b)] + + def _decrypt(self, M): + if (not hasattr(self, 'x')): + raise TypeError('Private key not available in this object') + r = Integer.random_range(min_inclusive=2, + max_exclusive=self.p-1, + randfunc=self._randfunc) + a_blind = (pow(self.g, r, self.p) * M[0]) % self.p + ax=pow(a_blind, self.x, self.p) + plaintext_blind = (ax.inverse(self.p) * M[1] ) % self.p + plaintext = (plaintext_blind * pow(self.y, r, self.p)) % self.p + return int(plaintext) + + def _sign(self, M, K): + if (not hasattr(self, 'x')): + raise TypeError('Private key not available in this object') + p1=self.p-1 + K = Integer(K) + if (K.gcd(p1)!=1): + raise ValueError('Bad K value: GCD(K,p-1)!=1') + a=pow(self.g, K, self.p) + t=(Integer(M)-self.x*a) % p1 + while t<0: t=t+p1 + b=(t*K.inverse(p1)) % p1 + return [int(a), int(b)] + + def _verify(self, M, sig): + sig = [Integer(x) for x in sig] + if sig[0]<1 or sig[0]>self.p-1: + return 0 + v1=pow(self.y, sig[0], self.p) + v1=(v1*pow(sig[0], sig[1], self.p)) % self.p + v2=pow(self.g, M, self.p) + if v1==v2: + return 1 + return 0 + + def has_private(self): + """Whether this is an ElGamal private key""" + + if hasattr(self, 'x'): + return 1 + else: + return 0 + + def can_encrypt(self): + return True + + def can_sign(self): + return True + + def publickey(self): + """A matching ElGamal public key. + + Returns: + a new :class:`ElGamalKey` object + """ + return construct((self.p, self.g, self.y)) + + def __eq__(self, other): + if bool(self.has_private()) != bool(other.has_private()): + return False + + result = True + for comp in self._keydata: + result = result and (getattr(self.key, comp, None) == + getattr(other.key, comp, None)) + return result + + def __ne__(self, other): + return not self.__eq__(other) + + def __getstate__(self): + # ElGamal key is not pickable + from pickle import PicklingError + raise PicklingError + + # Methods defined in PyCryptodome that we don't support anymore + + def sign(self, M, K): + raise NotImplementedError + + def verify(self, M, signature): + raise NotImplementedError + + def encrypt(self, plaintext, K): + raise NotImplementedError + + def decrypt(self, ciphertext): + raise NotImplementedError + + def blind(self, M, B): + raise NotImplementedError + + def unblind(self, M, B): + raise NotImplementedError + + def size(self): + raise NotImplementedError diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.pyi b/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.pyi new file mode 100644 index 0000000..9048531 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.pyi @@ -0,0 +1,18 @@ +from typing import Callable, Union, Tuple, Optional + +__all__ = ['generate', 'construct', 'ElGamalKey'] + +RNG = Callable[[int], bytes] + +def generate(bits: int, randfunc: RNG) -> ElGamalKey: ... +def construct(tup: Union[Tuple[int, int, int], Tuple[int, int, int, int]]) -> ElGamalKey: ... + +class ElGamalKey(object): + def __init__(self, randfunc: Optional[RNG]=None) -> None: ... + def has_private(self) -> bool: ... + def can_encrypt(self) -> bool: ... + def can_sign(self) -> bool: ... + def publickey(self) -> ElGamalKey: ... + def __eq__(self, other: object) -> bool: ... + def __ne__(self, other: object) -> bool: ... + def __getstate__(self) -> None: ... diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.py b/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.py new file mode 100644 index 0000000..7466e3a --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.py @@ -0,0 +1,833 @@ +# -*- coding: utf-8 -*- +# =================================================================== +# +# Copyright (c) 2016, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +__all__ = ['generate', 'construct', 'import_key', + 'RsaKey', 'oid'] + +import binascii +import struct + +from Cryptodome import Random +from Cryptodome.Util.py3compat import tobytes, bord, tostr +from Cryptodome.Util.asn1 import DerSequence, DerNull + +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Math.Primality import (test_probable_prime, + generate_probable_prime, COMPOSITE) + +from Cryptodome.PublicKey import (_expand_subject_public_key_info, + _create_subject_public_key_info, + _extract_subject_public_key_info) + + +class RsaKey(object): + r"""Class defining an actual RSA key. + Do not instantiate directly. + Use :func:`generate`, :func:`construct` or :func:`import_key` instead. + + :ivar n: RSA modulus + :vartype n: integer + + :ivar e: RSA public exponent + :vartype e: integer + + :ivar d: RSA private exponent + :vartype d: integer + + :ivar p: First factor of the RSA modulus + :vartype p: integer + + :ivar q: Second factor of the RSA modulus + :vartype q: 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 + + :ivar u: Same as ``invp`` + :vartype u: integer + + :undocumented: exportKey, publickey + """ + + def __init__(self, **kwargs): + """Build an RSA key. + + :Keywords: + n : integer + The modulus. + e : integer + The public exponent. + d : integer + The private exponent. Only required for private keys. + p : integer + The first factor of the modulus. Only required for private keys. + q : integer + The second factor of the modulus. Only required for private keys. + u : integer + The CRT coefficient (inverse of p modulo q). Only required for + private keys. + """ + + input_set = set(kwargs.keys()) + public_set = set(('n', 'e')) + private_set = public_set | set(('p', 'q', 'd', 'u')) + if input_set not in (private_set, public_set): + raise ValueError("Some RSA components are missing") + for component, value in kwargs.items(): + setattr(self, "_" + component, value) + 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): + return int(self._n) + + @property + def e(self): + return int(self._e) + + @property + def d(self): + if not self.has_private(): + raise AttributeError("No private exponent available for public keys") + return int(self._d) + + @property + def p(self): + if not self.has_private(): + raise AttributeError("No CRT component 'p' available for public keys") + return int(self._p) + + @property + def q(self): + if not self.has_private(): + 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(): + raise AttributeError("No CRT component 'u' available for public keys") + return int(self._u) + + def size_in_bits(self): + """Size of the RSA modulus in bits""" + return self._n.size_in_bits() + + def size_in_bytes(self): + """The minimal amount of bytes that can hold the RSA modulus""" + return (self._n.size_in_bits() - 1) // 8 + 1 + + def _encrypt(self, plaintext): + if not 0 <= plaintext < self._n: + raise ValueError("Plaintext too large") + return int(pow(Integer(plaintext), self._e, self._n)) + + def _decrypt(self, ciphertext): + if not 0 <= ciphertext < self._n: + raise ValueError("Ciphertext too large") + if not self.has_private(): + raise TypeError("This is not a private key") + + # Blinded RSA decryption (to prevent timing attacks): + # Step 1: Generate random secret blinding factor r, + # such that 0 < r < n-1 + r = Integer.random_range(min_inclusive=1, max_exclusive=self._n) + # Step 2: Compute c' = c * r**e mod n + cp = Integer(ciphertext) * pow(r, self._e, self._n) % self._n + # Step 3: Compute m' = c'**d mod n (normal RSA decryption) + m1 = pow(cp, self._dp, self._p) + m2 = pow(cp, self._dq, self._q) + 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") + return result + + def has_private(self): + """Whether this is an RSA private key""" + + return hasattr(self, "_d") + + def can_encrypt(self): # legacy + return True + + def can_sign(self): # legacy + return True + + def public_key(self): + """A matching RSA public key. + + Returns: + a new :class:`RsaKey` object + """ + return RsaKey(n=self._n, e=self._e) + + def __eq__(self, other): + if self.has_private() != other.has_private(): + return False + if self.n != other.n or self.e != other.e: + return False + if not self.has_private(): + return True + return (self.d == other.d) + + def __ne__(self, other): + return not (self == other) + + def __getstate__(self): + # RSA key is not pickable + from pickle import PicklingError + raise PicklingError + + def __repr__(self): + if self.has_private(): + extra = ", d=%d, p=%d, q=%d, u=%d" % (int(self._d), int(self._p), + int(self._q), int(self._u)) + else: + extra = "" + return "RsaKey(n=%d, e=%d%s)" % (int(self._n), int(self._e), extra) + + def __str__(self): + if self.has_private(): + key_type = "Private" + else: + key_type = "Public" + 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): + """Export this RSA key. + + Args: + format (string): + The format to use for wrapping the key: + + - *'PEM'*. (*Default*) Text encoding, done according to `RFC1421`_/`RFC1423`_. + - *'DER'*. Binary encoding. + - *'OpenSSH'*. Textual encoding, done according to OpenSSH specification. + Only suitable for public keys (not private keys). + + passphrase (string): + (*For private keys only*) The pass phrase used for protecting the output. + + 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. + + With ``pkcs=1`` (*default*), the private key is encoded in a + simple `PKCS#1`_ structure (``RSAPrivateKey``). + + With ``pkcs=8``, the private key is encoded in a `PKCS#8`_ structure + (``PrivateKeyInfo``). + + .. note:: + This parameter is ignored for a public key. + For DER and PEM, an ASN.1 DER ``SubjectPublicKeyInfo`` + structure is always used. + + protection (string): + (*For private keys only*) + The encryption scheme to use for protecting the private key. + + If ``None`` (default), the behavior depends on :attr:`format`: + + - For *'DER'*, the *PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC* + scheme is used. The following operations are performed: + + 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. + + - For *'PEM'*, the obsolete PEM encryption scheme is used. + It is based on MD5 for key derivation, and Triple DES for encryption. + + 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. + + The supported schemes for PKCS#8 are listed in the + :mod:`Cryptodome.IO.PKCS8` module (see :attr:`wrap_algo` parameter). + + 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 + + Raises: + ValueError:when the format is unknown or when you try to encrypt a private + key with *DER* format and PKCS#1. + + .. warning:: + If you don't provide a pass phrase, the private key will be + exported in the clear! + + .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt + .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt + .. _`PKCS#1`: http://www.ietf.org/rfc/rfc3447.txt + .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt + """ + + if passphrase is not None: + passphrase = tobytes(passphrase) + + if randfunc is None: + randfunc = Random.get_random_bytes + + if format == 'OpenSSH': + e_bytes, n_bytes = [x.to_bytes() for x in (self._e, self._n)] + if bord(e_bytes[0]) & 0x80: + e_bytes = b'\x00' + e_bytes + if bord(n_bytes[0]) & 0x80: + n_bytes = b'\x00' + n_bytes + keyparts = [b'ssh-rsa', e_bytes, n_bytes] + keystring = b''.join([struct.pack(">I", len(kp)) + kp for kp in keyparts]) + return b'ssh-rsa ' + binascii.b2a_base64(keystring)[:-1] + + # DER format is always used, even in case of PEM, which simply + # encodes it into BASE64. + if self.has_private(): + binary_key = DerSequence([0, + self.n, + self.e, + self.d, + self.p, + self.q, + self.d % (self.p-1), + self.d % (self.q-1), + Integer(self.q).inverse(self.p) + ]).encode() + if pkcs == 1: + key_type = 'RSA PRIVATE KEY' + if format == 'DER' and passphrase: + raise ValueError("PKCS#1 private key cannot be encrypted") + else: # PKCS#8 + from Cryptodome.IO import PKCS8 + + if format == 'PEM' and protection is None: + key_type = 'PRIVATE KEY' + binary_key = PKCS8.wrap(binary_key, oid, None, + key_params=DerNull()) + else: + key_type = 'ENCRYPTED PRIVATE KEY' + if not protection: + protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC' + binary_key = PKCS8.wrap(binary_key, oid, + passphrase, protection, + key_params=DerNull()) + passphrase = None + else: + key_type = "PUBLIC KEY" + binary_key = _create_subject_public_key_info(oid, + DerSequence([self.n, + self.e]), + DerNull() + ) + + if format == 'DER': + return binary_key + if format == 'PEM': + from Cryptodome.IO import PEM + + pem_str = PEM.encode(binary_key, key_type, passphrase, randfunc) + return tobytes(pem_str) + + raise ValueError("Unknown key format '%s'. Cannot export the RSA key." % format) + + # Backward compatibility + exportKey = export_key + publickey = public_key + + # Methods defined in PyCryptodome that we don't support anymore + def sign(self, M, K): + raise NotImplementedError("Use module Cryptodome.Signature.pkcs1_15 instead") + + def verify(self, M, signature): + raise NotImplementedError("Use module Cryptodome.Signature.pkcs1_15 instead") + + def encrypt(self, plaintext, K): + raise NotImplementedError("Use module Cryptodome.Cipher.PKCS1_OAEP instead") + + def decrypt(self, ciphertext): + raise NotImplementedError("Use module Cryptodome.Cipher.PKCS1_OAEP instead") + + def blind(self, M, B): + raise NotImplementedError + + def unblind(self, M, B): + raise NotImplementedError + + def size(self): + raise NotImplementedError + + +def generate(bits, randfunc=None, e=65537): + """Create a new RSA key pair. + + The algorithm closely follows NIST `FIPS 186-4`_ in its + sections B.3.1 and B.3.3. The modulus is the product of + two non-strong probable primes. + Each prime passes a suitable number of Miller-Rabin tests + with random bases and a single Lucas test. + + Args: + bits (integer): + 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. + randfunc (callable): + Function that returns random bytes. + The default is :func:`Cryptodome.Random.get_random_bytes`. + e (integer): + Public RSA exponent. It must be an odd positive integer. + It is typically a small number with very few ones in its + binary representation. + The FIPS standard requires the public exponent to be + at least 65537 (the default). + + Returns: an RSA key object (:class:`RsaKey`, with private key). + + .. _FIPS 186-4: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + """ + + if bits < 1024: + raise ValueError("RSA modulus length must be >= 1024") + if e % 2 == 0 or e < 3: + raise ValueError("RSA public exponent must be a positive, odd integer larger than 2.") + + if randfunc is None: + randfunc = Random.get_random_bytes + + d = n = Integer(1) + e = Integer(e) + + while n.size_in_bits() != bits and d < (1 << (bits // 2)): + # Generate the prime factors of n: p and q. + # By construciton, their product is always + # 2^{bits-1} < p*q < 2^bits. + size_q = bits // 2 + size_p = bits - size_q + + min_p = min_q = (Integer(1) << (2 * size_q - 1)).sqrt() + if size_q != size_p: + min_p = (Integer(1) << (2 * size_p - 1)).sqrt() + + def filter_p(candidate): + return candidate > min_p and (candidate - 1).gcd(e) == 1 + + p = generate_probable_prime(exact_bits=size_p, + randfunc=randfunc, + prime_filter=filter_p) + + min_distance = Integer(1) << (bits // 2 - 100) + + def filter_q(candidate): + return (candidate > min_q and + (candidate - 1).gcd(e) == 1 and + abs(candidate - p) > min_distance) + + q = generate_probable_prime(exact_bits=size_q, + randfunc=randfunc, + prime_filter=filter_q) + + n = p * q + lcm = (p - 1).lcm(q - 1) + d = e.inverse(lcm) + + if p > q: + p, q = q, p + + u = p.inverse(q) + + return RsaKey(n=n, e=e, d=d, p=p, q=q, u=u) + + +def construct(rsa_components, consistency_check=True): + r"""Construct an RSA key from a tuple of valid RSA components. + + The modulus **n** must be the product of two primes. + The public exponent **e** must be odd and larger than 1. + + In case of a private key, the following equations must apply: + + .. math:: + + \begin{align} + p*q &= n \\ + e*d &\equiv 1 ( \text{mod lcm} [(p-1)(q-1)]) \\ + p*u &\equiv 1 ( \text{mod } q) + \end{align} + + Args: + rsa_components (tuple): + A tuple of integers, with at least 2 and no + more than 6 items. The items come in the following order: + + 1. RSA modulus *n*. + 2. Public exponent *e*. + 3. Private exponent *d*. + Only required if the key is private. + 4. First factor of *n* (*p*). + Optional, but the other factor *q* must also be present. + 5. Second factor of *n* (*q*). Optional. + 6. CRT coefficient *q*, that is :math:`p^{-1} \text{mod }q`. Optional. + + consistency_check (boolean): + If ``True``, the library will verify that the provided components + fulfil the main RSA properties. + + Raises: + ValueError: when the key being imported fails the most basic RSA validity checks. + + Returns: An RSA key object (:class:`RsaKey`). + """ + + class InputComps(object): + pass + + input_comps = InputComps() + for (comp, value) in zip(('n', 'e', 'd', 'p', 'q', 'u'), rsa_components): + setattr(input_comps, comp, Integer(value)) + + n = input_comps.n + e = input_comps.e + if not hasattr(input_comps, 'd'): + key = RsaKey(n=n, e=e) + else: + d = input_comps.d + if hasattr(input_comps, 'q'): + p = input_comps.p + q = input_comps.q + else: + # Compute factors p and q from the private exponent d. + # We assume that n has no more than two factors. + # See 8.2.2(i) in Handbook of Applied Cryptography. + ktot = d * e - 1 + # The quantity d*e-1 is a multiple of phi(n), even, + # and can be represented as t*2^s. + t = ktot + while t % 2 == 0: + t //= 2 + # Cycle through all multiplicative inverses in Zn. + # The algorithm is non-deterministic, but there is a 50% chance + # any candidate a leads to successful factoring. + # See "Digitalized Signatures and Public Key Functions as Intractable + # as Factorization", M. Rabin, 1979 + spotted = False + a = Integer(2) + while not spotted and a < 100: + k = Integer(t) + # Cycle through all values a^{t*2^i}=a^k + while k < ktot: + cand = pow(a, k, n) + # Check if a^k is a non-trivial root of unity (mod n) + if cand != 1 and cand != (n - 1) and pow(cand, 2, n) == 1: + # We have found a number such that (cand-1)(cand+1)=0 (mod n). + # Either of the terms divides n. + p = Integer(n).gcd(cand + 1) + spotted = True + break + k *= 2 + # This value was not any good... let's try another! + a += 2 + if not spotted: + raise ValueError("Unable to compute factors p and q from exponent d.") + # Found ! + assert ((n % p) == 0) + q = n // p + + if hasattr(input_comps, 'u'): + u = input_comps.u + else: + u = p.inverse(q) + + # Build key object + key = RsaKey(n=n, e=e, d=d, p=p, q=q, u=u) + + # Verify consistency of the key + if consistency_check: + + # Modulus and public exponent must be coprime + if e <= 1 or e >= n: + raise ValueError("Invalid RSA public exponent") + if Integer(n).gcd(e) != 1: + raise ValueError("RSA public exponent is not coprime to modulus") + + # For RSA, modulus must be odd + if not n & 1: + raise ValueError("RSA modulus is not odd") + + if key.has_private(): + # Modulus and private exponent must be coprime + if d <= 1 or d >= n: + raise ValueError("Invalid RSA private exponent") + if Integer(n).gcd(d) != 1: + raise ValueError("RSA private exponent is not coprime to modulus") + # Modulus must be product of 2 primes + if p * q != n: + raise ValueError("RSA factors do not match modulus") + if test_probable_prime(p) == COMPOSITE: + raise ValueError("RSA factor p is composite") + if test_probable_prime(q) == COMPOSITE: + raise ValueError("RSA factor q is composite") + # See Carmichael theorem + phi = (p - 1) * (q - 1) + lcm = phi // (p - 1).gcd(q - 1) + if (e * d % int(lcm)) != 1: + raise ValueError("Invalid RSA condition") + if hasattr(key, 'u'): + # CRT coefficient + if u <= 1 or u >= q: + raise ValueError("Invalid RSA component u") + if (p * u % q) != 1: + raise ValueError("Invalid RSA component u with p") + + return key + + +def _import_pkcs1_private(encoded, *kwargs): + # RSAPrivateKey ::= SEQUENCE { + # version Version, + # modulus INTEGER, -- n + # publicExponent INTEGER, -- e + # privateExponent INTEGER, -- d + # prime1 INTEGER, -- p + # prime2 INTEGER, -- q + # exponent1 INTEGER, -- d mod (p-1) + # exponent2 INTEGER, -- d mod (q-1) + # coefficient INTEGER -- (inverse of q) mod p + # } + # + # Version ::= INTEGER + der = DerSequence().decode(encoded, nr_elements=9, only_ints_expected=True) + if der[0] != 0: + raise ValueError("No PKCS#1 encoding of an RSA private key") + return construct(der[1:6] + [Integer(der[4]).inverse(der[5])]) + + +def _import_pkcs1_public(encoded, *kwargs): + # RSAPublicKey ::= SEQUENCE { + # modulus INTEGER, -- n + # publicExponent INTEGER -- e + # } + der = DerSequence().decode(encoded, nr_elements=2, only_ints_expected=True) + return construct(der) + + +def _import_subjectPublicKeyInfo(encoded, *kwargs): + + algoid, encoded_key, params = _expand_subject_public_key_info(encoded) + if algoid != oid or params is not None: + raise ValueError("No RSA subjectPublicKeyInfo") + return _import_pkcs1_public(encoded_key) + + +def _import_x509_cert(encoded, *kwargs): + + sp_info = _extract_subject_public_key_info(encoded) + return _import_subjectPublicKeyInfo(sp_info) + + +def _import_pkcs8(encoded, passphrase): + from Cryptodome.IO import PKCS8 + + k = PKCS8.unwrap(encoded, passphrase) + if k[0] != oid: + raise ValueError("No PKCS#8 encoded RSA key") + return _import_keyDER(k[1], passphrase) + + +def _import_keyDER(extern_key, passphrase): + """Import an RSA key (public or private half), encoded in DER form.""" + + decodings = (_import_pkcs1_private, + _import_pkcs1_public, + _import_subjectPublicKeyInfo, + _import_x509_cert, + _import_pkcs8) + + for decoding in decodings: + try: + return decoding(extern_key, passphrase) + except ValueError: + pass + + raise ValueError("RSA key format is not supported") + + +def _import_openssh_private_rsa(data, password): + + from ._openssh import (import_openssh_private_generic, + read_bytes, read_string, check_padding) + + ssh_name, decrypted = import_openssh_private_generic(data, password) + + if ssh_name != "ssh-rsa": + raise ValueError("This SSH key is not RSA") + + n, decrypted = read_bytes(decrypted) + e, decrypted = read_bytes(decrypted) + d, decrypted = read_bytes(decrypted) + iqmp, decrypted = read_bytes(decrypted) + p, decrypted = read_bytes(decrypted) + q, decrypted = read_bytes(decrypted) + + _, padded = read_string(decrypted) # Comment + check_padding(padded) + + build = [Integer.from_bytes(x) for x in (n, e, d, q, p, iqmp)] + return construct(build) + + +def import_key(extern_key, passphrase=None): + """Import an RSA key (public or private). + + Args: + extern_key (string or byte string): + The RSA key to import. + + The following formats are supported for an RSA **public key**: + + - X.509 certificate (binary or PEM format) + - X.509 ``subjectPublicKeyInfo`` DER SEQUENCE (binary or PEM + encoding) + - `PKCS#1`_ ``RSAPublicKey`` DER SEQUENCE (binary or PEM encoding) + - An OpenSSH line (e.g. the content of ``~/.ssh/id_ecdsa``, ASCII) + + The following formats are supported for an RSA **private key**: + + - PKCS#1 ``RSAPrivateKey`` DER SEQUENCE (binary or PEM encoding) + - `PKCS#8`_ ``PrivateKeyInfo`` or ``EncryptedPrivateKeyInfo`` + DER SEQUENCE (binary or PEM encoding) + - OpenSSH (text format, introduced in `OpenSSH 6.5`_) + + For details about the PEM encoding, see `RFC1421`_/`RFC1423`_. + + passphrase (string or byte string): + For private keys only, the pass phrase that encrypts the key. + + Returns: An RSA key object (:class:`RsaKey`). + + Raises: + ValueError/IndexError/TypeError: + When the given key cannot be parsed (possibly because the pass + phrase is wrong). + + .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt + .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt + .. _`PKCS#1`: http://www.ietf.org/rfc/rfc3447.txt + .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt + .. _`OpenSSH 6.5`: https://flak.tedunangst.com/post/new-openssh-key-format-and-bcrypt-pbkdf + """ + + from Cryptodome.IO import PEM + + extern_key = tobytes(extern_key) + if passphrase is not None: + passphrase = tobytes(passphrase) + + if extern_key.startswith(b'-----BEGIN OPENSSH PRIVATE KEY'): + text_encoded = tostr(extern_key) + openssh_encoded, marker, enc_flag = PEM.decode(text_encoded, passphrase) + result = _import_openssh_private_rsa(openssh_encoded, passphrase) + return result + + if extern_key.startswith(b'-----'): + # This is probably a PEM encoded key. + (der, marker, enc_flag) = PEM.decode(tostr(extern_key), passphrase) + if enc_flag: + passphrase = None + return _import_keyDER(der, passphrase) + + if extern_key.startswith(b'ssh-rsa '): + # This is probably an OpenSSH key + keystring = binascii.a2b_base64(extern_key.split(b' ')[1]) + keyparts = [] + while len(keystring) > 4: + length = struct.unpack(">I", keystring[:4])[0] + keyparts.append(keystring[4:4 + length]) + keystring = keystring[4 + length:] + e = Integer.from_bytes(keyparts[1]) + n = Integer.from_bytes(keyparts[2]) + return construct([n, e]) + + if len(extern_key) > 0 and bord(extern_key[0]) == 0x30: + # This is probably a DER encoded key + return _import_keyDER(extern_key, passphrase) + + raise ValueError("RSA key format is not supported") + + +# Backward compatibility +importKey = import_key + +#: `Object ID`_ for the RSA encryption algorithm. This OID often indicates +#: a generic RSA key, even when such key will be actually used for digital +#: signatures. +#: +#: .. _`Object ID`: http://www.alvestrand.no/objectid/1.2.840.113549.1.1.1.html +oid = "1.2.840.113549.1.1.1" diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.pyi b/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.pyi new file mode 100644 index 0000000..cef70ad --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/PublicKey/RSA.pyi @@ -0,0 +1,61 @@ +from typing import Callable, Union, Tuple, Optional + +from Cryptodome.Math.Numbers import Integer + +__all__ = ['generate', 'construct', 'import_key', + 'RsaKey', 'oid'] + +RNG = Callable[[int], bytes] + +class RsaKey(object): + def __init__(self, **kwargs: int) -> None: ... + + @property + def n(self) -> int: ... + @property + def e(self) -> int: ... + @property + def d(self) -> int: ... + @property + def p(self) -> int: ... + @property + 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: ... + def can_encrypt(self) -> bool: ... # legacy + def can_sign(self) -> bool:... # legacy + def public_key(self) -> RsaKey: ... + def __eq__(self, other: object) -> bool: ... + def __ne__(self, other: object) -> bool: ... + 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: ... + + # 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 + consistency_check: Optional[bool]=True) -> RsaKey: ... +def import_key(extern_key: Union[str, bytes], passphrase: Optional[str]=None) -> RsaKey: ... + +# Backward compatibility +importKey = import_key + +oid: str diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.py b/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.py new file mode 100644 index 0000000..99b67a4 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Util.asn1 import (DerSequence, DerInteger, DerBitString, + DerObjectId, DerNull) + + +def _expand_subject_public_key_info(encoded): + """Parse a SubjectPublicKeyInfo structure. + + It returns a triple with: + * OID (string) + * encoded public key (bytes) + * Algorithm parameters (bytes or None) + """ + + # + # SubjectPublicKeyInfo ::= SEQUENCE { + # algorithm AlgorithmIdentifier, + # subjectPublicKey BIT STRING + # } + # + # AlgorithmIdentifier ::= SEQUENCE { + # algorithm OBJECT IDENTIFIER, + # parameters ANY DEFINED BY algorithm OPTIONAL + # } + # + + spki = DerSequence().decode(encoded, nr_elements=2) + algo = DerSequence().decode(spki[0], nr_elements=(1,2)) + algo_oid = DerObjectId().decode(algo[0]) + spk = DerBitString().decode(spki[1]).value + + if len(algo) == 1: + algo_params = None + else: + try: + DerNull().decode(algo[1]) + algo_params = None + except: + algo_params = algo[1] + + return algo_oid.value, spk, algo_params + + +def _create_subject_public_key_info(algo_oid, public_key, params): + + if params is None: + algorithm = DerSequence([DerObjectId(algo_oid)]) + else: + algorithm = DerSequence([DerObjectId(algo_oid), params]) + + spki = DerSequence([algorithm, + DerBitString(public_key) + ]) + return spki.encode() + + +def _extract_subject_public_key_info(x509_certificate): + """Extract subjectPublicKeyInfo from a DER X.509 certificate.""" + + certificate = DerSequence().decode(x509_certificate, nr_elements=3) + tbs_certificate = DerSequence().decode(certificate[0], + nr_elements=range(6, 11)) + + index = 5 + try: + tbs_certificate[0] + 1 + # Version not present + version = 1 + except TypeError: + version = DerInteger(explicit=0).decode(tbs_certificate[0]).value + if version not in (2, 3): + raise ValueError("Incorrect X.509 certificate version") + index = 6 + + return tbs_certificate[index] diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.pyi b/lib/python3.11/site-packages/Cryptodome/PublicKey/__init__.pyi new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/_ec_ws.abi3.so b/lib/python3.11/site-packages/Cryptodome/PublicKey/_ec_ws.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..536cd09bac92a0f7f170eae3bdec2076a5d8b7cc GIT binary patch literal 960512 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

MN(hlv~C7PJ~CHUMX1r@j_IBAjPqhd3lm z68UYZsGnf@L@nehq&sAlHXfe9UNa2~*81z4d2iV40R`l`^g)sU%QV+)z-gRt~N5(l9!n?tUJ zz|2u2n;dL8Nz=$ij~Y3>pzI&Sd&bA?GqhI6!uSjdTu)<#DXkiDHTpJZAvP8GfKgo$ zE1N}=;*IXfX?+vPiOblKRPviBdByjWW1jNTi4j@PWOAjPE;n`Vk4PN&y&tk*BXuaP zXgA7G9`lIMB{p^iLYg`3Vs;4+EX06goS8xi@VoYW6GSMdouoG7pn9tcdr5hHN1p}(oZN#G%7j7p=5salMIPrG}nwo$Y8qhO<)4o>q(3U z#>>%S6*TgZjjl+ey{v(B#$@90sl=U=tpI~d-x=&?Na+Z++IGybJQ~8GvPYH4LgVt2^ewY9Icv*96_p%E&7Uv zZjqCPMZm_kPyox}R6K(agbsA$f}l}rnSI0$fpt`M<3Zh=4k@_^svPRUw&zo}9vOK( zWzPhorM;8Om@^PRl9o>!h7NW<@qm%<illc`bRF^ZH5vn+>R4hZ;0W;klY3res zZwA{$+R~KrTntjA&8}43kFkUec*MN`nO!Q3+UsCZehea%z__jkS{~Rr(AZADvN$s3`?_pX)sJ=WkexN7K9FJ}srbOA% z5gnmuc%#Fwtf>we$03{fyz$L)XDj8qaUeqttf&iL&N=vi8b8=eP3s>7O+209geX8~ zSNb*Irm|*Q1tObV>?4pxwitEe#xcj6reDge-Qfxq~VhoyBM&w8ojs~ zr1~pb!sm0jNap}r1dGkdFHxYcvFr%VN*7!B1)|1RER3gGlb?+yV{G|!*oEn^BCvQ7 zR%QiRA*L`Hn-WvGL>b*11~M4t(==bJvUDt9k9c|R>GgPHk zHBkEzyHfroX!6FO$7$yHO-PzRk3oPcn^mKq>T51ziH%4BylUomG6(F?7$9)Kkw_mf ziE5l=PoTY=56Z37s2uF={alL%H`%oKSDa`3KwLf$2+HP+4(|xrF)xlI;xhJxFpV%Y zj>v&i0OZJX5gmNwRLTp%$rT?e<#a71g7NFAJaz*>s(JQVAiP*pW`BgT`#%+-vRSb* z>%(GInH@(UR;;|gr+5XhmFO~8vC{ql!nMW9z4+b_?6>dXyAi3j;9I5iQx7Qp{LPxL zx@-&DmE+r^ls`@5SffU>I>5c@y8WPPN5_vpZHq3j`}UVUd`3(UV5XcAljb`)Z{!&< z>A+k=m`JQ=x2k+q^Ueh(mI7m;)WHhqvTSY1M!F=+{_;67b(6AYXUJ%yDT7@CXZ~w} zK&!8LY$Tk-=u`3MkQc=B+PCr?{>Qa73dq>WZV{}p_B82kt!u9RnWGUf^d!I-Zs z7K{njn$!REVya*d=SMK+Ue2M!n92S@qW>d*ZW8<%@L>`^g&yV%`Y70=XOcm)PJ%xJ zzV>+!fpNZv=|PyuXTqcrX2h8=>4X_X7{Q>HszArQbAa)uC;)?IV*QZ(iIa2Io0!CC z3MgxKr5N-Rz7>dmDj4*OM+Ji(#*-NI$!-k#2{!QKIe!XH1(R0nP|8an{KR=Ev~R(u zXQ4#Sr-^YuVmvNA_v-3<9tZ*OYj_j zX`7x~6U`c`<(`NfY>S+5C`*syTn1q;bcvIZ8pl|3$c1B#A=$p&bB`qU0*BSbJ>xA} zY7);Nnh$v&GOIr@8k-=sdUoGc9T;;j} zoGUGqIR4=t9=%QI9zDW-u8Gv3R%jyOxui%j-zU^V(4jmcU}MWD03m@f7HU(XKOlS^ z*3CKD&~d_>Fs~Oc!mP*ehA+~M#!z(HCL8T1hw{aJJi3sE4ThB_w)^9bj>gBW`IYh| znB*wq)IwRt?o=5(U9y}^YdOC~ISCaRJNHkL9;MtX%KIo;-m){7_cj`$`92bK-9qKH zwOh-pvh*d_6FcoCk*}eUL7`oT-qVb4RT3Ak^6)N|nD<45bz>8BTkt!FZ&k79F24W^ zT*!n%=;x*shw7_UmVOI080$FKeYqCQDnX2Dq-mJ{RKiurB^9R}(wL$+fhVh0oLzu~ z0b?Wj{pXtbsDnND5wYf@PF5lU+3Y?9NKY-oQ>`I|+t!#V=2hTr@CFo*joCrtKo^}@ z$ah|)7JbyoD}x;)&i;y0cztCnlGto+ywHtGmWlr4NTp&9MnEJmAMH$V5z&JA=O9|? zpso+d=KwU|0-~Gy10++S=@rMIlWdp_GI__4`N_dvLIPS7sB6ZfPF@110$MN;5<#() zc}uc*4O)GQ%;^&Qss-yzVMj_V@t2@Ax~Q`Sxf1(J3)Yp&dzQqGvtV;l*ux;3sJh;Q z^`x-dCH8y^HZO(!r^J4TXOb#^3j4UkerUm}DQuaUCVnfL|bVuDn9Ti91rh@3N>T-soPW|OI=l5GGe@l##}=8P@jMzD(jgLShb zd^NcNs3a=JAUzlL`67_bhEV|i1c~bqfPQ!;`KKAX_-aB+i3+iovJhb74+)pDC&LrcV+5wtjRl{v1I zh@T3CCxz%M5$6d6)Cie__<_hhO*&+Bkw1m_NFqKL2sMSMl87w=QIJBsA`$-*2pG9e z@TtmvClU0D0n#Qq$(k=Q`_Zd}>7?s!iP=OLb2#ShaC8ie{e1U59Nh|Gig~V@cXLIW zTYItL#5RvBQ53>PG`~96`5m4D>B2d6C6oEq4j{=}7g9FHP-0?nD zivDHC5i()9ifmN7EUM__MK-pZr-Q1sO$3~5lL%z9w?)9kUKfEJ_KFC2*oz{N$DR=Z zKl`l+sO&KjC}4|3ppbicg>GKdZ3wZ(Pe+(g_4y+lZU2VoNNqC^OOUj)9Dh~*Nom`?Kl{B1sBDD@ z6tHC?P{eh-HnG*^bmjU20gTbVY%U43q2mX`#(9?o)4~F>!j`;dS1963d@!) z68f^0p|4^;;q4bI6rE{6Nlr0zkDX$?_X$P-Lkk>BAQO#gTp+;E5>YP^FAD@1S|Z+* zh~EkX7+NC!C=v4n0t_t?6%ui`K!BkoVwOY%1p*8$5#uD{YJmVlOT>*5agIQMp(SE~ zM0`h`#Ti;691?LrAi&Uv1VcArcq(F8GBTBlDngoPsiuXSZ|B_nOPr-NgP{XB0?DR- zPWtCyUcMl3=Jv2Bwo7I*MZn3Hia<7dPy}48LaS_O7UyFc?eI^1qY@Y~tSc3@U zv04%Evv);6WotyBfW0aLh3q8?fEg|F9COUicW!GjGE$yb@o<%p*0-F7{OH`TF8Ml} zhLD_vxSJ5ogjdNxP0ari0-Esw-?)-Z`}^V>=b^kq1h-Ge4ThvjLgG8CUNH4Xl-H_{ zokS+$_9}q@w@a1iphUbP5a4!+sFR4_2?V%ZB34Vp0)YUxOT^O>LCylG9NaDuk4VG_ zfdIEl#B_XI~DMm|sauXJ=+hOo_yF_GUZUO6|ErVmiC?bBP%yF$JlX zZkCvV64TkCtAPm^l~iC)AOmJ^exSAvVQ$8n3|l!JsFnW|%O_kD+?<>51)7xJ$xs-D zaK;hNWXu>F`)y}|-_q2;imGA*OFAkv%*iUe6My|4&FF`*+IEG91sp4JSNJ3jM{Vrr zX3Cj{{Y`o(8tSdZ6KSG))9=(G@g6V}LUo2P%u%Da_RxHBO&K27pe;w!HxYH<2d-zc zbz4vn(z!Uxe2Tqe$}{DUgsO-U7H2orK#^9S&GDn6!#r#e5^$Guq|%HkrMy$YFcgVW{V%VB~vaa4CYwbxA#YcgXmLJdD95AepU0!wTz=qH@w&}I}M?mz|M&uWmPGv(-L@T#`ddTipRW|Km-S-8?PSG=n`whsF|@f8Y-EKa?YOJ`4mf z08=kPhI-fp6chx1@N>0Au(M{l*>GMsw51zGz{$KKkj-*Lz{M^VfgE<82zc1pB9O<@ zMZnKa))JA6RCZJZ3Rpq}3fTb)U_se~XQ<+HPC@zaFw|t+=0t1&MnjVv>nSGE~S45TdhE6;C3j(NVl2upS$2 z8=O>Vtq2V~{+yH*`s@ENAx!?4PZ z$E5PXDR^DM>d3WseD$gsP@bq(eWRSp6Y;=+ZR)ze|MiWB-+lSr7XgF6MO^ij;LQGs z>H*)V8}@d5JL7_%S5@2gFm@>C?k+Fwc={pwBWm#Mx! z>bjhN$F$_=%1ohjG2fC(qqjaU=A4=sy0zJ>r(blK#+ojQ7d~1ksx@SsVbAkogYE+EndDc^{?7tIwZcmYmo-q_w4pteWu;hhDq>WF zQvUKukP;O>OF_`-fuDsM#iE0gUFcrXC)|s{!#aFBTx8uh27#(sBweS`y^{AiUz54M zej_yr$M%?{MkV%E0rFZfhs4=qgn_7rVAc#q%%vK8xtH@1MBpB<9}n`^%L$BUcZyAs zCpdJLd)nOpR?R_f?k_}L?n#_PcXR#)4-zk~yZqRIkC#8jcEEVN=5W!eC)bx*_;3{X z(0Td2^RF&F`JmuKHN}UMKEGi7=W9oqXW+w%yO&>{-SNu`&KA|T-|%1aidJNQj}Mc4 z)8~#Sw@ny#^kdF9!?OOG{l4d`2fOjjG>l7EzB#Lndh7qpH)a)Ov+~V@fTZ|l79#&A zzIps!&NtI|v4U^N&DHEb5D3XPV1*>#423?I%CFE6-Pp0&K^%ncOf=%j%=We~fBL2F1T{k}Y0CnorR3Fsf8Wy6w`AJ$Jl%}oa}%`S@n?`u$g2`5uhb2Uh6 zFcN&pLw;IJ1un_s1;q_7%zI+Pa?az$?|f0|edLkvy7Bm8j8<13zw$VZEb+LLWFsk% z7U4(}7yuHEbP4)}5I ziBt(;c_)E6(|;N=njsWXQUXRc7?lx$mfA#u5?_B{0vkm7JD7gxB*@BFNG?OYokrdQ zAT6%dxL{m0x#V7#&nE|4yjXpSR0h3FMLbgM9XKi zd>AJ#_b7bd(r{%Y@*P~-=p3Xa4wtsEs1FWz{ovP;=U;xKzoi;3ZSw&nH!0}qAv(>z z4W)ToQv9Nt@L;QkcUvW%41=?M`6zf-HKBlqVENxp{e<9mBAA09*p#3y1W$@!HiD-_ z(23w_5p*EfuKB(xdp_|o9L$x+{zm4F_5AqkXCNXJ&4I4V@b6oORLL2|wGTc8dk&jKs|6;I znT?xE=e@%nq;d0&W@mvGIen{`t73NH`j%4B2rE4eD=6(z&yK$eIv2zCWg9=D>oLj<=C+M8uv=4ej|QT_{&;^u z19x=U9%+M1OABhC(;*LF-W^5*##}ek72Qbh>#LmGL?@P>L<5l(6)I2Q9q!*!0gz^T z)aXN~>??4^;8AASj%T)KGB!opQIm}eZir1uW`TIPPu1y^D+l13WSspZQIC}Pw?d*V@q*3qot$BT(Wvgy4O#WG2c#3V|B z)!6nfINX+~L6UVairL=9c-sy*CETg`QK!!ojB!uk(DwU2p34_G08}=WoG~dyArPQrnFC z!6pIa&4nJMS~$2p@gQ>2-K}4*PbKjp^@`MO9!@4cN%W-%WV4Sc08#w`J%uNV#qR|EcfucKB7pL$WfeqAkmk=kEN{FnriywYxuwDR zX#fO$%aIN%7##*3VlIFi-w3=-1K9X?QI4g5!oLt+JK?Fq*co_7nEiW&&q4jHYyCR- z6>cn8GuWNza@uWD1Wp8_5H%7R@$irVn_@0h%AA?SV%-fB2Mz9fjUGY z?w5#z0)fR)B5soi`soJLf&GX?Dc*%=2?JjR)nZCgtW7%HT#Ip7*i zQQ{8v?-ZgGw?Tp6Qg@MyJ)c6PauDCapPnPih`GT0N7=a|o`X1bA+C+sIb@NoqG~NI zNM*e~5se{g()+?0FF=V2_JH zA^Q~tFr}8_`F*|xdCBv)DI$l16^ek9jTM1xHbMkk>?RS&VM9c~!>$&AJT_1S{Oke| zP?=K%3RrIuC}i#b?n;9=eM`IwVI}>(1LMUE=jU!P{dI%~%A*DvRN8}MfS^DfVwG>o zNgX~H3K=dbaQ8G!ro~8z;U=3bym|~KRxaZNTZJ5?(K^^X&|%Hgd1OsBP7I7+3y!hD z4F(ssq2b)Dn!O+xRme8ogvQ*PoMWINvQK!!%23n8m{|weHW3FCJd6o-kZnNR8zUQ8 zk}h6wm8Cu?p3u^=CO}K0-voh{mT@~hZc^}Ie*mGD19iwh9Dy~{$>b?e_kn6`7N_dI zZS!u@a%;dkkt1nzI47_c=)m5akF{{Enp^A9(( zP7XyM=@Ig6SC(CX^)W27aKO@j@a)F#x#l_9)iNjG9@WH*%7qx8_y`e;TUWo2AhQ>WS+IEZq$ zpRw4f&|s70QjvVagV#1ewSn$Jg`%ga&{43tt*q7zdah~dtW|5JBEF+nJrT_foaP2W z^HdmWMBzi+slqWxXkTafaZ&!yok*b>c%b*}aoHx6?o86X8}~(3`)*D~>(p#nG$$CH zLgm|QWVyRQcN=ve=*B(@+iTe!wFJbyNi9<4(#+v)TBOny@--?Iq_WY}%7(&rN{!U? z)T0-lrtt_x$2l}#yYkq%B!lB$rHzSRd|V*1hK-F5x>&V05npu~w|t^>SAaSUoRR9_ zZUfhh^_A0Oujh|6MKzQprC^*MyajxtQR4{t4wXGe#Gq$Jw@$mbjk<*zW8Xy`XK&Qf z&O+BID=RevfgOOWk$RhEKcuA%){Mav3HiR8=N=Ws{f|*meJidp(Y#5+K}`?pJyb+} z@7r9~h*^=-#W3!-1^AuT0C(UPI_8(?vf>qb^wA!P8JIv20yD-z2%t<70vFsykDJ_h zuxI{B;<2214TrIHWoKFBM_>Y!-8)jU0M}G#O2PG*%|$K^S6sPLA3;_Ug>cu3Ui>i? zBn;&%aF5+vhyAfeSAU3UTc;gIr(mFWpl#``d^d{+IFs+&e8=X$4;sR54eslFUtNpA zO6$S*oy1${4ZgXnXes*)?17^ry5&{l(0x10R;u<7y>(u)C*rs#ib{vnh0I_b2BltW zJ&40CzG-jv?$GV67z#DcZW)8C1-j9O{qik32HIY)`6>g-)0L{d#fwpDhXDlF>TCGG zVG9eqK?U~Pt?9R@Rr9xsUWktF@OEsVrB64z+!qgSwQ0WeIxwX2bPO`A68VD4nms{p zy?qBHL@;AtgxLoi9Y7L41BN2lN)mQ8x1I`*d1H|dyRlDsDhBgeMvUx(u)VZ?(r~C4 z_lLIO{!m?bq_Km`S}bRn?_%F_ETGJ}IGz5d+i|C;p;+0!vsn2MH{lv9m44~H(EuD1 z)tBv7?KmaTu&~-UMn1EL&(kjRQiCA46L#$~td3qBc3{SCEVM{43qM8Ex%kkdqkCW~ zw-6yta1~4&(S^O+AWvditGm@IK}eDqBtl^JfgubMWFLlsD?+N0Uxnk{usdZR!kkXa zq}i+*nKjhwT(BTb*%vqhSC%@tDxYFQni^JK4ELp}$mc*}8n)M*J21Nt6#YbP1>@5_ z*647w08GK#<82ugUFc{7AO4ifbsfU;e-?#%yEddQe9?cTKQBN|N7?QGfK;8l4ZSWA#!v5c>-sYYAoUSc4!vp0|P_2YmJskT!{wLYUU zF{3y2#e)^1xa9hw8AqXF8^_f6mwC5qxNsD}J=Srm*+a9R(9L@tTC|`|ZLMrY<=BOh zv{{c|3&Jl6Jvd8)n(|KB^wN^)56mf5-^FhnJ$Uc5>0$M)$ed}jr_7x*P4!ml-mg?I z)4dS=ZO-u7>Rb5zAdUklTOiLyVdw6mukm7 z+Tcx46{`9H(_i)0sNS7wyb_o_JayICB1e@PkGUupa!_JuEIj>A%7XOTb%C}JR^zA| zz2-c0!ZQd$_2?PfDBKg_92thx{?sMIX$WV_a1Vr?GHgfK zA;Nv|P`$0-B#3%JBee+4iJh%`Yc&Ylc-*Dgq2yI+@yh;y_X~M9t6rFgL1uKAJrvD6 zho{EG_M#b;P96Ao4Kl@{vhfTM6UdA5RBt;;Pm^+;5!dhrs` zYL`yEgY19(1GqNK1X{P4xj1QWm78Y)DMwiBz0aB&5zq)6gl9aJM-o zdSkRXgi10|!{oh1Oy21u`Q*)3F?pZ+OBa7I9mG}u@mJR(1je7jkG^16++>Zu*9o`)Q!=tvg zYBl~$vWAC@f^6>&Qsl8)Zf(ss)O6b1!6z!XD_|5jx?aFRy=_!h1JVH}Jz|5$l%U9GhuQz-t@I&VlY;Gm?|QkBN*4&Y)T32pDy`IU(Dq z<*HA>x5a44S4M1s2u<%3%&j%z#>mXTP8Kxkc77Q&_O|W{3}_DK))`|R;Y(0re(v7D z&I2eb5Y-$wH%dRp7@N711u|l0Z(}6|{m zw#1H(+&D<+5!l&ge6#bQ@lETFz<_#RvvE`zQJ>q8TOYmwbYa^vFaWC{>_$63Mdf`0 ztqp+zbw)$(QF|po#)QoLj9N}Z%6~TiwMceDkQxC6^pIVg6QLE2e}^+1WhlT5UXqU) zd_QQzrsAK&`3!ys54QKuT=@|DH;cb5?Ig(A7LzcK41$YK_?2bp&{pwo6Mhl28FMRO zyx&rZcYx6SA7u?Tr|lvB7LP1BFB;g(_V9^h5&U%_2e()%rfm}5g)jzR?u zMDsiBdq}bM?r1#*dEnt&QRoxHSShH~44Aouf%$sSLGOR!zq z4aui`bTsQ{9E%K<&ONWki*?&Zxn=Spr5?r7}% zY5y`(Ysap{ULPFLro2{#&8Kc}4)7CDdM^a>9v}LA-i5kZW=r_MkSYB)Ig&`5*G&m0%QAa= z6^%j@djn5Oi(#@g?y$D!JU!}%nL9OI( zlnnq5=XOVMAZupcjO|Vy9nO)_G&@NeY!c>qhVxdGcIsA?c8b3WpX4c(p)eGsf$Kp#4z3 zu_-v=X7t?sozEiJ&hw z|Cuf;58ADpSLw#J0b}bJGkjIs7$babn;xBw{`~@7dc^(>PCoJe78E~s4W4xH*n)${ zG3KzrV~vH^+kD&R9&UUd>tN8lDrj75j_-5I7~l6)qmkrabYCAF*^Tepo|uacTLDWB z-Grn=W!%5q_D2j7-3Z%60lIeiHUif5qf?%ct7{(KtE80EQ7(EH7FLoZ#&MX_u-)z8 zcAk)V@q1vzt+sp^5~D-tG!HA`9)0Mftu~lds&!vIhM`K&g&ifmHb3JSSyZB#UJQ+H z$1Bt9=?}*(x&N#-tKxTeo8SdNVtaC-kd;qT&QeML?W_q{O5%%Hpu=9Ty-fM=^y*n_C zRG15(Q1JKfMB43TSBQNt)?QVbYwWc!#Wh)rMZbLy-?&W7I~;ouPfdfg){JlXQE?%{ zXfmmy+f(PI#!hj&S6=FMBMpDE!9@t{_OO*D3og< zui__5)aXCy9eE+VGOK(heo{q^KIl+uFznDxFz$!dnkCCAf)97}$o+0foHD>W2e04M z4L7a>e~Xu{NI$NRRld=|yHSE)!?z>zYfRhwGXm@A$5Y5wXnYdNP2jypFhFl|vcb=G zbQA>&;S1v^tJ95RA>&J&2f^}#mk^Bc>!uqAL1cPV(}w$1W4NE&`v4(R^nLK!g08i5 zR5YtMY|}cdm9RbIAct(-!&M|#g{>O}+=qQA_KD48F-HYy!wY~epwh?zjHkVSc9QCv7T zbGl0i1>#Clgyo?$IIE$Vm`X%gimC-7?YIS~(~nn5-OP`X&rbV9h-`)89o__(FdP! zB}L3<-R$d)g^bNw{Gcmj->f_t)3F)rP;+r42gY){X+1MO;7rvQJ%gjkX|U$on_$1f zF$OVFzPFB)5;biEc1YB9BfyP2dG={^nS~BXpm<+^w^D&CxsjaCYDQr5O_o+X!Lejc zh5@<~@NB+TkH}X0;pJsrFfM^{0j&0`g_oJ03ln!e?AB`99XWKGW!#Yi4EJ+_(jRuO zFgAlcvZ6$@cH-Da5ZD8nE*~s-{FTAzUyU`ot(Q{K)K1Iq!;@9mw3TIh;XZ@+2Y56y z%bgD|PO}uJ2BZDhgF?KH_P_$JL%TB~E)01H;u%BJjCN>3BjMETQ;o-SfF^$oCvyFb z(!%LX^Hu5Q!~zhG6#z6<1~ck4V>4Qyq#-}!5Kq2?k~f5g!rYAH zL;+QSbYKKufpk4#fI4b8gkU*fda|beQvF`|GY^Gv& zgfN-`qaj4x7LR6Spn{Ko+$d;F$AGvuHefT-M^4yru94A(MOba!L+2Sd?%=OR zQ|8p;umUgU+mDy@HEzaATd(vB(X#tG4IS}^AIM!IQ7Qqkz+2S+l%N0!c6T0movxyM#%x>gj$pCPKQiDn(Tm>HP}Nt*?%KhU}E4N z$PB-b8T(c9235S}6l|`wP6xMRs@JR7Qg9hN765z^CMh}+lX@hM_>qJXXIrK5Se)IE zC?1Q;K%ZikmN^@9y6P9kX2^drVTD+y2@8Fp?9%}JLFjZAUE@$H=o}g|)Q{PV`Faj| z1QXPSclO|n@8KNkWS5SmDHoz55<@%if-_LrhMBARaNq^vuyw9ebGNC+>$SjRihDxl z?KDi!@$^`Qb9bsf_%Dpk!$eViyXDl|2mTXNub%QjeqMchwvKl&T4!`B%^s?IXb8;z z^hV-0;~;qQbMIztXc_z;z>8)Vt z#HJemEuEv9v9}-u?Td}aYwrrZvAYs}o)-4X1?jyz^|G5u`{GRh5M88<{_|y&#rgh7 zPl}&$8J$5D@@2H-KWJoPe?c^nO2&0FEQ$B`4y+@i7F0CMi_~%oz3kZ)bkNKf)6L!0 zGEWz^%mZBoS1WJ~dj_@a`-)T^v>)8C;EI&<`-+qwiWFD!p#A($I+=>1xQ1uZ$t;Q# zX?LVZ6{Hj?Qp?V)NO9GUR6G;~KY^}_)MzY?G2VI$NJvrwZ^l%><@$<<>50d zxYJ|RqcW7o=!!IZW3RAN^JTbd9qD00im@AiON;P0KQ4c$n8pQ|(oi|ELyE($pMmK< z8T-W>a4iAhaV1L*c0iu0IMKpsU%V*;l>0f}$bvGy69p|$Gq7^j!G#{k*Jn^_!|F6UE%$I2iLB-%LD_)Xg>vGs{owt}R6xjAh2pSzX6S=9 zBnxKLpm}{kT27KCTGZiFM>JuG*2=QL{Iyh82zDeNP$lE-YBMUU#BU%mb_yD1gK-IRN`< zwIcSw(um)-3O22%M zdRc@hR4;p+nnmZCM!p|!L8Tx4;P)J)aJa;TaHttxf<)*E+QZ(*eL2i3e;t)c4) zSUx)JBowgTM;bb4+mg+qV2gpC9|87~ z`wunuL~8%x;XQkYhju2|dgKYgm?_u6wP+pJjM8E8f#Q)4cRjJY`~oTpS-YW-F8g~L z(apCby_E_NS8sk%g0%HTRw$iJu2q&U@#Y9)Onq(eh7Gf6C< zx}Z@FArkX$<0{sg7QBfegd1Zypa&U|sG7DBqG2oj4)yNw1p;iJv33Pu#pD)lZLf<9OuL$&Qgl?c08ZYW>ANh}Af;q(x>5ybMoyL}^hRS!~^!yzv8K1?7 zF6dLdLTfmzReTU`qn)H#1|^__Wmx-*TtcRk)8=!?l*;YL5sN%%Q>OLxQJ#(#aD8}_< z4-GnC2P90%Eq556L#rKYCXVz2Awpa`&KeZr6_9(>rLCW%6^ucw?G$pEd4=pZ-QID!%tNEBJr&p6SvA-fkirxU-<54R9z)9H%?|QrrsgW0s^4LFkVOX+J zA`XN=#}X>8hQ>*}6^c?V7gf5Flm2d`foVgH4&${FN9Dm&BFJBwl}1f9_GqwdQ6X?@ z=eMYH@UC9OG5bZHXenAje(2F)dK=uQaJWMLWYKha*<(_ATPV6Py%~B9IdeFud1?cE zZ1<3xJb#xJPEg1p9@n|yCxLWumdE9V9;ykzw)DAQn>ch)$#bnK;0!j=?#)x(@$Jo9SP}E%@yZ_?iGNPxBbO zq*)pEsl(uxztHUp_tQ+AOTayo-GbI&$KOM1z|j$;c7=;%J;|o?DS#IXNQZD5cPNV7 z5Bxo$>R?9#ZGm*7+MqWk6{F2kG5Ve#_@24s1+F|sY)!r+4(>aG7r_UiZB?A&R(0xY z{JsDQ*w#IfgSfa&)&rgV9F1!JVkFHA8%0CN-V%s>=|BYD_APubQw=X?Y-t*P2q4gL zptq^Hn-M#TApG(%sN94^Z+L?nPfm*MZg`aQuqXL0`b@4`<5%It5|Rxxy||3{@f&m% z-V7GRz4Py=*T|G*V1dKi782v=MmWrqA_ry@1 z8SIT01|{VZrJaga;)h>yxKNP7A#n(livHK4cR)_S+x1AA>ia}lb|;DfAL2y|Ly$wh zXrUQDdX!#B@}Lk^!BGwVRk+R{;lD@GQVnDMLr4s*2GBe!5VWKNDTX;^dNj^$hB}kYeXjNdKg2U`Q&K#71Ss1 zhY2T&qFMI(gXpq90|^4=5CKyJ0sRC4r|@7!D9hqJ!N;3a;72Jb+$A0|$E3p_>|wag z;7yV99)yp*(MAVA4Ts203CEl(uo1(#YRrlK7k1tCWlgjxGjKvxy4Mjo*iPFrV;9Um zkHoNiw&I4v1<|>7^{n2$ZKX=2vWI%sNQbXsUOJw*%#7vAraD0~(VK3^zbt;^2MCy> z8f%I2FF-l=@Q9c0k)+oW;kAL5m_0lIf({0hQE-49bsg@}Wi$tUm8E$7Zf1jeUFL4s ze68fekBQX7uJpen=*RX0o0=W8^N1@I&-13B&$<8ZD0DYG1pwn+jyBM*{o#1Z(gZO- zs2#nj9lb>FTiQXrKPS#RA1#4=rxt3^5O`~JdyQ_d#z0)8RA1%HP*A9`Am?J!O;0-)o{t?Fiq-+mJSIk{TU>wYerdjv6Ay0gVvy zn%dFJdI9T*u^FUe)ds=j>S3<|t-VybVBQjb0jUfPoYxI-w!Pg9rqhpLz9i_bwl`0jN5)DKUHVb8k zHF#k-H5@Rf)UF`VX8INwcyK#6dH)Uu9@4w&gI&x=bpH;Q?_e1!eUIx}&w&x~TLeO5 zDV|59p%*djdV;h7?wLVj8O!UZ!#CW~`Fgt+9t zQt0UXmBK@b0-ivZKQr98G&MiC=7--x<=uz(Us8_|Yf<;rmx}JI#S;qE1}eimSC8HX zmGMKmyGHfXy$k(jQ*- zUx2dTx_}3$%3s2>-2k7zY^48VGXiY?hHw5||LI@z^G*Nh-&-@Vz?k|+`^hT+=Wqew zMa%WuBW~cdA@~hJ3Wp2)Go$`ewz1a-)Z!oJO#~qE-soniKO+~|yXgUvfb12#!S2l) z7{dVVjTlG{#0%g82Jzdr$s5`ICi4V1jsqCa9|FLRw-7LffvuC>J(!<=$Zk#WH)@(6 z*hq5X0>o|n#fsv-6&xwN3?RwB*SEL+e!KAQ^(R+Apx2wy%md&o?GW~__34kaq_^n~ z3fymg%m2Y1=oVnq3y0qQuQC7EdMWUSqB>mtCx3xI=?_Q$asQ)tb$8DIsLQ@G&{2QN z`SVU4IMkebJCa2l0A9cV4{Cse#Xncv0V)*Wh~H$ek-y1Z1CA~MNoxm4z!@SSjt!8u zX81?Qnh($uf5fi6ErNfft%d)w0GwXz9}CdTH%T@kflB}b4p{zF^^dTbzh$lQ0kxe3XqOJEX^C?`bV_ZpVwgfg>TNcfR48)`^j%kVA%%g0Cr(O_Co-taQJ)SP|$EE zgeO3X*wcPD;Dy-aga8n-PB1U~b%0agFF{`V02K}l)4yDMpKXCbCIfi=GydN2E$|5E zPuIWQ*}i_0#WMW|^+E}Ud%yvcXph_u=+HOR@kVF9?Jar$dV&FgQ$X0CjgFo@Q6L6z z%MchJl)(64=-T@Rlp_F4SKxh<6B)yjbR-Qb5CG7L!0u(}DS+}28=WBDB6__=1Wr-l zTzCGAqPO?42JoW*E%t}M`g`N}e`^1S7^nbh z{I(ha^uU{-mJ`4!4s5j{29^Uhpnd-=M6Y{7Kt=vx>fhEa@lZ@)@%cm0|Aj*dfe8P+ zCK?7J{Eb5c{$%+#4h7a801SY90^nwvD$vkBxO6Y1<81|cTQf$j-|{%!>jl05d;h=N z@;~kSKjBaDa0mK5zPBm>iT)D7^Ye8;yX9UF*r823;AhATh;YHe8m2I~Jx z_@}(T=(D%FF#>h^3jr7bBljuh@HNJlexYXJ}*A~pC-B5Iv6?X zI@#(PxH}m;{?$rgr{d2M+8cxZc4YOhMh|fRtBC>J|7zaKGcY%`aki#41Tn|w=D~Mz z1$pzdcD8adx3hBBWn~6JoOJ&bjL*x1udi$4icf{l2x6%3;NXtW!voapPXb#Tr?;4z zjFdL6+HW~A{PA}*w=>gsGy{VEie+T%W~b}yWNzgMcp13T@EVvqIqF&&n>hVxB#=3f zB{PUM{o9uT$d8hB` z5R11;k~6T-m{Wi-;FIF(gOE6akkB)}9hQ>YIy+ez+q~6*odVy>3;$m{7+5Jl$lWOQ zfh6>9qW|^-%BJ|M=0GkWAYu)#ul#^v1`Ii1Z~%h@7;wPc)dL5TBd@PrfO;-7;6xPv z7r^HN?zeR2HZH~vj>fFaZ;pTYSp!hked`-tV;_!ldg@io0G1Qxv9C6uERfR|L$cFM|)>L zo*4+pUl}tnvj1CpfPw$lAFwa&HCOujh1 zHu71-lO7fY4B%-=S7X2ELsf|JszvS7VlzPbyFm^I?@(Br%?wAzio!QkJ30O!>OC%$ z6TN^z+AA+#gtNq`7PvNWR4ptU+LpdZq7l2AeXtKSz@VL6*;!?^vNUYgkmiuC3B1EY_0wr}RNEE4U*C~91srUxe z*9t|d42loghNsfg#8BpOYywr`z^4P>NbU zQJ+zs#YDps8Q0>58aBB~&?uJVXI`VVWQ}<U9KqawEH}y?4DpK2q7kmm!U| z8E_UTE>b`4{9Oie*e?v8(M4^!@$1Z&UUMClNw>hmwF!4iM0@nuvq}Y})5Q zlhDK}8v#SEYa22`nyoks$mMWsDxrfnlL#0l)~jI;5rpJ}VML0FUe`X*bF@;1B)^8? zr)-1FO<52=q+}`cO}DkFHzg{Ty9PS?Y#?;SP&u<~P0~8W1UQ-f(8OyeG#d9xZrU9% z5AJ%DG#RVb%oohtf=u?g6}LgwBMs

cqgH?L&TMbgX=^RMSpvqG=%OW+M#9QlaQr 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

}V& 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[aLz~8 z-wwi?_)la-?cKQLxMVh`?PWLva&eciC;z5*CYlvax9CSILjDl_3Pj{U*sOnY+R4O% zfJjR2*5f+01dxNoJ$v8exl@G3#&C z7h1G$29S*<-rmcgZy4*e1Z_JP))B$Fi!LybuYcET84vH2(22a1p$w>QUbuS0?*Ad( zQEF{cpZB0`l3`-jNoE4aDncfiId`K~Kqc-qOm+-&5(H>I6$HUSSbSH3D)ld`^LmCMlFDvs>oE zQiO(2ww`i8b@VXNCN}j5#S;NhM{%+-QHt#r+&l>yMIxz@l>_ zRV3g_P~YD)*~ibbSXX{Ev(KX)A$N71liV~&aV5HsOhMFigP)b~<^IYILgq3X>JIJ6 zXb$ivY;+!@ZulSmYocf@(!a!Fq4GtOONzYl#&}KeytzyD*yLmF=#x~ki29axeStP! zPz}>0nbCkqcqk6B6y;VX3IJynQEgM`)mb_y6k6Tp(G^;m`+@)KWOzEc(br~6Pw&;R zKZFoLeYeM_iq8Voc2o&t!Z|jIKJf=mAsL;bvgNcdfa3y|!$f>Rz@?o!!A^8cjq(mE zlqsNw6_cwp-!e=X>Ted8sCL>s`@uS1UMTUD)EiLXZTnYzm0_3oc4reT267fK57(Qc z*iCJ>`C?iTA)UumfE-p|f8USW;qj#Ps4cGL6+?#YHd7eDdOe4*rwGPD zwkZeqYC+;*ZC^oguX{uWHg+)n-M&NdETfVm!H@)VL0Cu;Pls3Yeb2WoCCV)Ly+D$+ zS6^KAHUqR#UQhwGuDo=pncMxJJw`w^hPn-kOxj}LRdW1lPGQOO^#Hh3>K?B8Yap`i zSB+;nAg&(@9Ec?1GlGv;zmn7Gi6T0D+9?P#wT=-n)N;%wcCj7J=@m86!;Pc4_uQW+ zJ!9>MXkDt!c0Ge3ES_*Ho0p{l916A08n&s5%jBFg!ZM%@8u8io!d+=T`iddY-{Q#Y zua2BBsdUYn!(Pv5i8;Th$ON$<&6jr5{-EM-r(5fRn2rGQMQ3SQrcVcadU{#9E~TFg z+T{~WmT|XxJvqo{I0aHJ?Na1Ox>ka-EWX;nS3py(6d=NG5(C}4X5J@2gXK{RktqalqSj{Ix7 zU*IS3{_2y>HJ38x=8^@AvZ1PlZENk*70!)_io%fz4 z_3dh7z0v@j5}gwUg{){@`ed=&l>sB;e{uSRk8bECb%b4D!~c4bHOR@|^zNaG4M(z} zAqB);C%+;S*oqh?=R?=)qZ5_W)B*m0wzdpYdxT`ssx{5zCBI?r6m6U&j~e)7H&T0L z#~7isAB}REjV4TSVfZvbv=Cfk)evONSFTnq=5)Fjhjy1!1N4j?Y$Cl`xu#kN@8lL6 zAK}JjLl{k~qIi>`)QLk%1+EHFQ~nhAku*42;~tZLu3+1n^Rp|$o3uI0z)^?bQ5%gP zz`5nc=a7+VzZWsau5PBqh>M2`Ho!KC`C#(0-$uCd0y@HDgp+nx>3o1<+2YTX5JWaU2v!E>&^{*YJfI>ft8riCqv(7MKj=OF0Es40Y0Cpq#?L# zy_EZd5y_y^hzX`f4v7XgN~qyN8eo(=;ZGG=UeHkH-f#Bem6EqL7K=?``Bg&Sz-C+GySMMnVv^C(ZKA zVCmKY7=s(0v5UPHYcN>w99;*l#Fl=5Na>kMBRcHtwXPimm$-VbuSRS}J`bVu*K{L; zFX z7k|id+8r)+b<=RnI*1VKi4+^v73_OSB3THXXYBsvwz%xe)oRGY0!N2vWX_`d&j zTPbU|v~A708-uMtP=8>?U3v}~SoV*B}O!&A^VPI^bWyoVR z)5GhNGK6WQ_z1;i1DJ<=q7CDeqEZloo*&k$^VGvn&ByO0e;;G^kEzQV=ar1e+V)W+ z8!Mp-t8Lj|j((+n4Y(^dPypvH(Ff8|wo)-D0Q`B7`V02=SlG!u=VisQj5E;#xZK%0 z=->%sssbtfskamYW^V3wSy)w7U{Zg`+dggAfszT6a|Wb}pL1$XeN&eXz+2%uN=G`R!{CssPu5?0lux06xljmHg`S;7p>tRn% zQn21It2iIPc@nJ~4;)yb{7I^(^a*xej3@)#fwd;A(~nEM{nn&d4^muA%pE<^EWOV$ znY!L*jOzI-hu|$!rpn8GOx@T#757avhCnk0kpu+jU2U?%0< z`Gln~l4-b&PhugyDQlMWNKm8m%tcSf|N7`W(d7|3oQ0+5d%w4d_>~}L!7=?sjUUMM zZ4T(e8{rq}Gd>&~*t?4ova*PyCeERGqyd%IZZDs2OV#w}JZ1rg>oL6aV(VS`-#oHs zfF4P(>!4t(r+!x}inoZMxuF4e%0tA_+fPEloIV-EFm{OEA=qn4=8Gsu;31sibiRrw*K64OD}rXmj*4B1vm+q7Ys=%R9ZiTU1mOL zGeRJFiBpm9bI)GOSA|!~F=}W>QyY?BO|?^}ud*l#&84&+0-ZAW6p@yE$-REHubu~G z8A_}~H_cY38Ej&#tk)3Mf$r7Xd!dMc-vwk?8M|0ueO@qf2Epx|)`esDFMg=G1W z|9iPMU%#-Mn`yfhmeHU3OiSl1^EOjYe7=qMrp2X6kIwH+Qq6QzXOHk(@luQiu6^-lrf6aPQN8$t^Z^O7Q=6wIHX z_TT*mAv)L0#C@E&Ygd?1&ozZe>Ix~e!Qv7)MZ+hgER~l{2`y6 zlclH9Y-c4!da7;HSfs@U8g+Fr^EWtdTv*EfAFyghN9BjTml}&GZ4L+MlXb!^fIqW9 z=>ocoq(n$Wg)MlW%A`O~H=$+{G&hgvE~yuy@_m{g;Hipbw3^m47EDr9*Gi*cw_v7{ zZsTHW4n=o=wvE2)y63>`YnSDbJm*`AfFIQ_c9}+mI?z=e27cvc`pOWtxf>a%_kI2~ zFemdGa4C+Q@&P{8WLQ=I@6#aKPbZk9iT2;m=bN4l$}estBsvqcWaeS(s#386VR_PU z{5?YWOzGHL#*4pbG|ry=QQG0!9a3ca{XWwn=!6gqO==RbjuUZ+sP_^%D~Gs<4KV$gLSDe&0i8vH!?K(F|;d9|g~ zwnE>{asj{}a(SV^7g+cNIL$~Y;d|XCi`P!sy;IV~z1s^s$T*QBBW&dsR6Z|rTVBVxB8}B2pK?#IE$N`+mv%|lsf5g0Nga`=@8p^?-2cVI9!uSN1w*se(-(pT72CzyiGD=S6d$ZLD^5bUh|3hwto{xXm8Nd4=<$_`L3VKtT#Vm! zO){;c<<8^gZQd_@d>fTDQz<<-jt%B9#B(<`oV6 znk5xBT!lTl}h^DaXafTb>azF$*?gw((5v2~PIuODAN2Zbo9I@0mivM%(B35XZms z)d>FscZY2vIPcZo&*LqX$x8d*2JIOxTc)3127N8$@(N@mA7uT9 zbQ4MvMj7%ER4L%ElHc=(9!bi(NcLzM?&Bf)-^+c=P`9gdG;Z|)a9*b|v^lH80=1vu zPdnCzK&N?`#!*XFd10O+zw=0>-%^WOEkDV=*U#}HAlplUrD;ro);0CY$3>*+@!yjaB)N3{X7W)s*pYDJAdvHhtTl@-MztT4?hI7A8f~3HiN)cJlbw@bBN>$vIZ;@D z(k#-iaN_~^d~~eS`GZoUx-``u0`UvvM$lx`C}sjmWdMzSR*k6{$(4op8r|zsagXQ( zpW|6F+NYh#YX*@KhVjCf5Or3z4HCdP-)$kyD=r166D)1Ulw*J9WIKNu9?78*(uoHj zTQ|9D$%-ot_E4v;=6NNqw&&F86$ry`S2Z)0EsSn+u6|7S0C4!NrLcywJjmnH1llj; zC2;q~5&qoYQie1Ju@A|1ZjA|OHQsp~@$Yv+i94m^))eNfCR9chp+(BDjt+&bNTHno zI2KWDiz%Kgulz=0F#ahCb@0LS_!SQ1=@st*!GZdmsaUc>y;0y}GbHHQWlO{*iv*Lv z`5UK+6#__we1Z5GM&EU4@934f>dWCPJ~_rDIj4K0$Qbfa3ykrA1JcN zhjCgD7B}@m^?ci9ade%GF#n|68}Ab$L>^Az0m+8#W;Z=Krsjs^A(E)+d;f>e(tY-C zk9$dX&oYq+6s*FLhWjQy@Tf|QmMlpEFuZ;lN+JH-$obcYbX!-*^<>#FMG(p$fK_2K3u@7b zybo{6F1!eXLl{?1D&3Qb`j=LZ_5RO|q9G#@16H?-41(I+|1LOO_<90tNBAZ;mk?yW zC=QT!Yijd`VjSoCHG`pZB(<`1KD|l)whzw3h{k%WkY}cu9Lar{F>jXNzdx&rR=ak1 z|MjQtq(@j4Wpv6P+r+Bh2mm-S#qLvBYUxYfM!@|ijxth~+%=nc;^h_py23(JPi%FT z>Qu+W8555U&J^=|pRX^W{c};=cJ6WW!3C$Rq2Pr+0i2SeVQruBs2@$2yc;nE6n54Q zor&;4F|aq(_7anQ%=bqzY$zrRu5<^(h+jVvG+Iqh!IV<+r5;F?eA*Qne^FflIE}f9 zyY~vP_a8E<$(d+p&e>@DVl+S>kz8)3k**%LI#?N8`+pjN+og>-3V4ZotUTHpLup~T z<$ZwW+4zAB7c&7I)$BYtlPBxNaRVl#Giuj+3$md8jCcCifSda}+OhnqD=VoyH`927 z=gZ_yjCCybN=v_-zP`aCW*)p=cEPBz20*?ZAr--*{&=VoGFl!)u+&1z-9~JLt1DI_ zxII0BCz`{#_6BgnKBhmcVd7gY4z5ZD^ICiSxr^8b8_qqkImhks!vfTn+ zo*SyO4Gq{lv5Nel?{*xITS!0_F5wD%nGp5cPw|GcyPkKsbeQb|wp60w9`Q=eNQhkR zcYEFMzSiJJ`){#Q0o6CyQO%xhQt*s^;!jJBaoYIm&Z{ctpDk<_V#Y*eybHn;4^tRV z#>TmznRIT*pRKI%wSp0$?tIsPxGop!5Q-0jG?u8ZjO0-D7QNepEO5O!+2(BjR%5Px z1}VPjeH8uEhajZqW5GoIOEVN~s9cA3F%0G`obt%Di~0Ti6p%awQX!d4FIB~~AF zotf7)NN7w~N3vqqEn*j^oYqgrG~tCeQ=yt>*G%RU@6P`9aDWvpLtP_#a2VVy>u>XR zH!w{9Mjas%-8z|d@cloi27O;y? zo3k&ssbm@jPpUDIHqA9(YRveqE4T)Z*7uhf ztecbQoY@mN&mqgd-3UJ%D>dWq0CC7QSSKMO30_A`g(Y*&>Afq(V}d?WkUQ-V)rb(3 zM`EoZgMR?z3t-d#%n)Gz#Z<8nBBpbc(a%;z6v7(x^kNOmpZ2d#Ps9ruWyrs!TM34Z z4#9w2Z#iD&jG!VQ#_LH9#=rbbYKdEl_-+~yNu^%SXGMVbPROwlCihE-nyho@9(-nxD!9GF8b1S zm%rU8`rAkPSc;h?o*zW9FL+oH(bKWoMhXVbcH&&qF=LwZL>j=mBUSai#g7HVHTvYK z>o=czrU0L-VI_V^2BeB#t?wt;ZX0W}=bOZ1^-U!A_*efk#D18ggyOs%X$4w%wj-^- zx0n{d9I_WjLAkJYm^LvCng2=-0K}!T*g`+#i@1Q?_*e*2lFF&yZC}uS5UE$rZy@@L z&;M*(Gkm&ydpCvTFa7B+Z7iZk!fK8nZWS*t?#6%=MPnKY&{LEmIyzNP>cwafYe3ti z|3i9~R!ZtO1S-XC@vXY#ufK~i%+=ersP^5jnDPCV+#@o^>VC*g$pvIe;9+z43;p;2 zJ*X>)R{PGFq!2eLGtJpkJI6}g6R#BX3j<1dLucdq#bClo&lzs2@1V_`FCRJC>IVO0 zhS4g2g_8zW!d_a1XMC@Js1I@3dy};Y+;{Pt)r(cuL8Z+nmfv+;PV6K(^#o(&0*4^W zyiCTg=7bQ}mj;18vMF9*sMjsR+2#~i@n&vw>vE<}`Ho6;rLQ{|Iu&$V0NOf&+StG}7gWmpgkIu2AM zFqX1o??oa5(1VdagL5_VL`d!16^)SOi~DaoVJQbCf8ggY+eB$o8<_LErb?||bey!N zHgvDgM09$!-fEqhK$(DcSihb-c;oML5cCWOhS)F&BTtHdw)~6(XcT^a{xjesm;&2n zX@B$m#&Xn1(K?BWWy zj-Jn=RrLVBWss^vSkS2si)ha~u;LFQt{O~1!2;`>O)U^B2EFR|1`>=1vf>{E#EH*Y z-{*|9F`UrUurdfHVKDdC(Tr_G#wA7pV#cJ&724=0UO!s~GCiRrV7iiM<&dDlWJ#i~ zmqvTk&GztF=g{u-!1sy2*WoJqoZaef{P%Idx?zDSvAqNfI%-#NYx@_6JNBw(wLErl z@F|$Lc6@9Qd|?x8=H5;!^V^A1MQKf>G1Y2rQSmE)e0fue^y7{ds zpHcv+S1ekO)tQKe`c8ZO^QLvQ((v}7TEb7%x`KpF=%o{b9VbjPRQ-;wW^EzwB9NTB zRZ1~VtPG?gcO8)TyIrXST8r{&574%R6*$o4pTdkyE#*uYs~03&rC2VG&Q*RW3%9AR zQ+~s_sQO|bEu>-y9q#kkrv}>JlLElEdAP$X5?WypS<_7(0r! zrY)&5N-A~rtSbgQ7ePvTLC-8K-Uo``7`-Y&j=u?XT?DA7x-4P={uD>*Cc=?65ad-9$b*AV06KTdGNs3@OEtj|Ba!Kcvx8CYF2e1OI-Z6Rv^=VYq~QCHmG#- zm+^Z&_7r~QLhO&mpVApDBF+ebTS>}*e2W{EJUwWq_U&*@ml#GHEYaek!&u>3EkQ%-yUJ{EC^_lIYteo`7t+SM6fIk=d zZf!Sb*O4E_iJswI^S#*;tn%qyg9X4UJCaC2WQr1AfBS$Y5*9iJ@(zkehDKKuMw9n4 zwV9+*Cj{}xdXRkqoDk4%^8Pxh6yYt8Dz$X89fu@51B6OirRngKHrqZkmdt8UL3XbC zC3Y_ldf}(7c8s%vf5!#CR-YhJnSCY5#%aGf?WhElqVb4t7oVW7DOd~&L z7l$bVubR$G&ThO8`>iUhR7}jJNY*q|_-9`}5)mGd{O-+4Im(+t*-lsIJG9 zYi9m?U-Yl*9G%k?EfeufdLX;;j==KXBI6 zUCf<%T7&uUft{(DL6Ixkp58iuo|hUA`{i~k#&&^rdhjaYSrDKgWZ_S?pf}W(-6L@( zszdG#yJHLzGmgBsPj=_~3vZZn%^mD!Qnoi&$(<)?rSE)&sNxxfSAl$eLPDt2@})<* z5ESu@aWRdQA>E55F-Rxc)M$^v5JM3=QBav={cuVt^q|(+2dVET(bp@S@WU9D1?U0T z{Xa8Qhb_zyHC=6xEH&vseL~GYU6NjI{38BJXo47haZqE_=xtu&wRJjfXcRyb;r0t2 zhQ{RLeJeW^HP%X?Ds58k1H^?~v!*4_nt8C^LN=Dqtgk(iuljF}6YpfD#oz|^^FTU< z`Je8T-Mu{=<2tf?yLj)G|0~;x0LR;}+Aia(Lr;Y7{SAH*^`E4yjJXnCjD~9nubq7S z8%zt)e~1VSsDI#^a+E!Ex2eCyuuxLK8U9N$Yw7DMY}aKK;>f)d_wvim^jPMZo8ud_{Y z_S0{5l`&~%*{|lK>G`n5Q^uMogV_%|;RirZFrDp1=5cHHuUqsDF)p9ug*_ah5Xvcg z6}ZJFEiupuj_dJ}=3NV9CA#_|Lw559V3lWqfRm4T(Vib7s8eW6feUV%FA=uB@G@r=BX1Q|N;2 zlX8|A1mJY=m)hIZ9+bHRlJ?LYJ_}T_@(FbB6;WRz^R6S^HIR6!4dm5~nhBtP9IBp!-Xk8fLL zf`^BPfZxQAR>RTdGUC(_8L%0vfns9&IH8b-M0D2bYKThEdzYM zMiL23I$nNbpqM1LNms%s{8}s0*ey7^5BJSbPJBl+bJ61p&{G9rmb2XqzG_vER8cF! zFWeryTcT~lVWQVm0&wj5dm4%URpT3S9%msgLa_dn{qGxVJs}o38Hc-rAJvvd4=9zq z)%YkJMu}unu(U8YEo=x~F-*2(Cs@xE(LF!(0G#%Oe=$E8#aJ4!^H>O=NI9XkbPm;dRJG5P zVk5MulJo%iavk`@;<{}VowP66cS{?^yK6cNfgZ8n-_ryOUhYESh>UEbSx7&d1UVu4 z=vZ7hkJ5a1p!5*|?SbNH2UIpl}(q}{0Evj7`t^y&`iETLbT}Q%bPsh3@1g((I zzt#}vJK5+MSf_%t@0w{}tEv-|v7_p2IYZ4eUZ^v<>v^OC25@GEgD2?pC z{23tc^`6qme2bb0e)K{8aRM*iaY;RX*y5f6zJ=hL`tpB2&(ipbINsf|rG?ztjs}Ju&sLBLb0UNlG;c1(17p+jJ*dGz z;bJa|@(2ls)4n2j+kW?J>Qk;K-nR#4-29Y5>Xq4cl0^W)K(>L{Mapatl;IN&lD`4wy*0WEh0+J2VvCJ(b^ z`ql^oZ52CxpA7}+M)2h4FA{7yxs7}3&@lvz3ctJ?2ii=%9URO>0N{LxU5iLf zd2}3hRiXyz)#wvum3oU3U-Fp-r(#wkCgwf5Ra|H)WXNrmo=+S9A9Lr_URl$v;Upc~ z=-9UHbZpzUZQHhOqhq6E+eQZ+XTJw4`!{??b+qp58JKgfsv4u}j{yl6b9L6p^;|8V z1FszqcGbvt{c7glFHz#^y!%f)122KNus>7WJqJ9S10~Jj2)Y{c_D~fM=V46PMgsFT z2})?G3{{7(u90LHwTN0&hz5OSiyia;J&6KDnn;o}7kxj^oX5SxKUXo#4DW8ZujWr) z()x4~mSugnOEE7rtqVa8%!!hs_YU8S58z{NWor!#ite6BTyOw+c>5UmX~b#^g!5=#x;aDUAn~?7>vz9<6#zF{R#WHY>p@~Cv-4a$u#Ki2|kZL~7?4W{S1V$ZZyQz6v;x&~2Ksw1EiD=)+ZH^`S7$wh-FXuns-$4NGe`a{LEtyx%{%_clV`&9B6 zii0IY?f7w=T6yF?PMjZ**Lnp4w!7U1@Cej0Gy#%CJVn$v7^_ihqg|(D4MxlH6L$UC z>V}*NyiMy{_+!6gTTHHaVxgTAwf1-!NQdO^$aziOM&n6vHpzG2A2{(gW&DqB8a2zo z-jX@s>XfMIPL2G#h|KXsK20b*I@hyih~-YlI~4hF*2Bi#%`of&KUEdj%mvRX-{qZK z+-QIvJ!M}@?SCq));(yRv7SYE$fJ*@MG%3Qc=2QsYg$7Hz<5#%(X=|l=8kf!b$c%F z2ePBT&1L7eJHaX11JMl-_5mCLmgGB4aAjp*Qta6;Y|3yD(%O-r!fM;oN$1Gj?7!ju zx-&Ir|NR#aLrUmL65UCHpldDtG0=maQhk1kxeCqo{XVqp@|vbN2S^i~ixOqVf#9wo!kDOhqxmR5xD1l@UR&}YS2ptaEY0bZmcPfk> zymu;f*GJf?YcyAq3XZqr)ZGbWJYn3g+VC=^;usfy_cP@-IM-f4T3O#yX=A zDjAt*7^t+)^?5BDyD=vFq-kXrZVnMf8scJ!Mjb7S!mYnN@YI0bZ*mj(LNITWOSar( zv_S(tNB}2~v1FBX6FYS-+TOWcCQeIQpX`?^1#UbLX#W(_yygLdBv3LKa+YRKWvq5@ z(!<8Q-B)K+;FL94!I>K(KTy#3e!-12m9+kO0&fk+DR1`EY0L_Hv=XtJW9DVExCg{5 zG3Tur-#oES;hcQ89p_5NN@4U18}1=!NL)GwmWG0QZsjk4e^MPc4hC*FV*l$%4M?T* zG^;!&Z;SET2b1MS`eBi&DThJ0$ahNeD@UXK-La&-4?GM8v}W~T^Rhm7JsLi<>-f80 zrvEn^@8gtJo+ES1aoxg z`5$V#1?%CDU7?Hq#&Q5X2TJ6hP0;_?pL_T~#3boext=B>d}3JB-f*R=%7~mf2w9?O zQk9qer%_@zq@tL85`i_Ua}-%i7(iW14Z;dJM*)5oGqPHV$y!5%Mo9ecg9R(@X$0Oz z$dw{!k?eV+zg5!$su$cF=WkjsZ;x*vN)tm9fJW-!bN**s284HhNdg3j9Kbmx+ZB?# zEzL$H&ytq%%Dg3($zG}NKPaV{Xy`_KCRM{^)F8pg)#oM4>~StK8FG4U<)5g#&V99E zn{rCAP22lE@9O{+Z7#B(OWgL>3oDajPz@9YYNpJE9GVYC!r~Q*C@Z&My`_2fwoqk6 zj06{N(J*-`z#t$~yraMFvw#0r9C#(bKN0QuVG1-A!3qY%jFI~D0{9RWg~cCyjdN+; zoMZ^u^tad5k{AfZ?@<7h2 zz6bb6Bja>jTUau%)5WjSGpBgF)2T6{9tc(Xt)EIu^?nzX=IA~r3lUK|2IPhBFegSn z>=@j)I4j`?!Ca)}v+k(g_y3&8$EcjibV|$PQ z9@osjKKSDzc(dm8C>m=*h>COP%Cq2ABdH5<{6?jUtAVEy?T(m74#PS#52=0U+s`!3 z`@1jIrm$71I}nS*(2H66R4m9a=<)Yaz!EDu7*aebH|-vVmHA#>shlU_&gx*?TD)e_ zBu?XP-Edq%($4@6)B}x-Il_Qf@#n#fm%YW#W{ias$(L(a#?3UV%$@AHZb&(lCn6p; zM4(<@GJ<#2v1j%nTlI=ybJkn_=9_>2_d2#tR~EaJNOk;iiAsK#Qz_M}oNAO6Zd(W_dKB}DX z{^s_bhd*o`xdfaio98ta%k7T}AGIHX3iMPaI_;j;p$5&3OXXceONo@+U=RB0i0wdo zr`zfm^?7iy?fWv!g^fe{1isf3Hu5lT!^s`aF-A`ZTT12d9!=1%Z}p54Y+}CDlvBza z(4<_)t3yR@9CJJclrzcy{gvd0{M7ZMTw54Sfe)jF{Qh15((!+0@OZ?FOR^-wo4<-f z8UKA9xj$5lx;!{)+*l~6j?vB^(u53IY%evji>oj< ziBhR^_(3)o7t}*pyG!g+HvrDHLQ0yKs&add1V4XOwAah-DZl;%7YmHL+E~qR-+bPSkVQM%k3p_QkMbv0bwht0z_S=T&B9%E-N;$frj8_(kUe1T zSei}ncsY~D6RybPk`EpM%M8cyvOanGYgG9a5Xyy9c!@YOlOQI`Vuel}kznHhPSJ%^ z=C~5(J&Kquyh_9>fAwM!Q-_v0!Yk`U^eSvst@$G6&A&dAIPsTTDAFy_9!}DB|Ic6Vk|e<^BxbvItEKK)Y9m+>YV>rEdB-&TUv52pA=Y{6wP2 z-M~JU2vgb<3Nx1xB#yO8O7Fi~5f(V|iv;Ld@xPX;$8IsO*iLlCx5S6<8NA51KJ*B> z6#-8w`+~u7tB2zZ^BPGz!&!gbW7dX3Zc(n@f|ln|4MkeeUtk=l2XN@Cx;fJmDZrtL zwv7GF`ug$*cwK|_>A?>MIk248&%!%w4;5+Sep`I(>R8goXdjWm(`*=h6y2+RN#W($ zWJgE>>>}{83WtUbxfv18=pvOjimN3&ck+?OZNDyE$jAeao2G%d%NM&-s#lO;Z_&y5aA?@Jrxz&APwpMQVXzadQW)~!b+4qV?yDWj38{H zeC>y&qsy#m?Ia^Eap&1FiWfpTFuWsmiM5^q`SVI^T|ILAa&+7?HBzkS_7aKwcRnj8 zIhRA)oRhR8gH!5;2qXEnUG1lK{4sX5EqYVPEAV~+CEU^DlHlE!K+y3{HdY$bdd&z0u2za2I;md8F}V7 zb`q+bRGqE=InRW3;bSXm5@-8RmNvrVw->FHUA8k zm>+l%`v>4mlM}zWB*V$vzP8`aBoL{%^Wd4LOY-wcs8sZT(TmdbAT>wX+mI{W6D29Z zi|l^fVW$#kEv+s*}>X-gDh1ie|?8krieC4WB z9^%9Drb?z`MOXWmkt&1ZDi)RKmW%ep-vi*x16?5P2x_wTppzZf|&h9JcX!#cn6UfEuPL32kS|k6{zC zveOcS!BT+8Y*4)q`Fp>TWvXIdpAqk_eaFTMD>)~KPxFVrSU6p+*3kVN_Q+7wa^?qS zoqq&!NMH7mZX=?QRM|b=t}aPc?viVrQnelF8X)fLGfyS&nevP{8i?{+;LfNsYl2A@ z!>rxVkF1?%)o0#aEQ#mCk%?FjoV$MM3v9bbCK5o!?+A&=zCXc06=LTE0Gt9-;=+4a zqsPFiQf<($1I7P3Fu+_@I?@Y5J0P(o{bIXyxOPE#-!VzS@X$Pg3?68oD7_%<9lUF!OBK1#T2t#Bwira z>Zud;2bq216(8WAyXuJ1fj6?zhn1%!b*RTGP3D9!evK^cV3E@!A3nvP>MQU(&Z;RL z-4&Ydwjh-KQMQuFaY@g*KoNWiph0PjwbZ~ zZ)4?L)jI}~{L^S3$dR1kcm^vmq~<7k9+-u)^FqI4fz96VJfHUElW8}K0bq$uOkIu> zU5lr6o;$y^&dM@g(ReSsYTMwF=f+CVU0WC_3t{#~p*})D#IRzr_wj%*j1BhbJq{4R z7O{I)(GBBw9nq9`M|a-lDQKr1WVmmzqL?YNpa~Yl<&p5%o<%{kW1Yg8K>(xniMW+N zXJn$9aTT&lMIi@F0Y8@o*ZT=wZs!+3kKUX;_uxq?H_g$RC4YK4qdLn;5;QevDNrYo}No z7BfHgAd`t!XP9^&>IkFI(=6MK1Y8}UQsz|Sl=b58doTx4y_9a8_skAc5#XR z6E0q=Un*Y^?t1gHdZ9ENoBb<+)7syR8KckW(6rp00?+g071;>oy;6{S zvyC<<%hq%X%t-~{I8YWH-A0F-hH_+kcJ&_?sL%%*2Xp+xdRru2^E_kpMw9}*nyth} zIdYCyZz^>okpkUY{i@UMP7soAfU=oyUj@YdGQ?910X#W0Q(QCwc`qgdqLmQeO{ejC zXFgGPVP54E!6W%=^@Z|u_BLyEB;d?7;njrC8&7hmwAfCQ;xE7(Z-nUq^KCXu_KyJ!fVPh+kZ zpTiqufF9o>t;@bIFQ9iKIkakptjOWRXVS+Fxh3K7;EhkYt@zCbMn(wvqEBAtC~_Vg_FBdz57J_SM&+Gf&Mi>`EtMhZRHs=pBy86Z@yJ9yWRW58ZR zf96pSQ7p84e1s-p6Ojd`8<0h5RrL7zML=7Onr-8j>YKCxdR)rFkD9s{9!7&S*s##i zjjZY2O>0=3IyL8m!Zx;1@%Q{jcxMhxt>A2tP?Rum&wLqZ9ZUakDiteKh zdsQ%D(VyNeFWO3-8u}wYMA%N@s*Ag(M}7+M0QAfh+<3Tp=^p9cBgS7)-v1T1jy%iT zAo}WO>F;M>AYfC&&)|Rq0zb^+VAg*x-ip+4IDxS64g z?s$CxMiO0pw2KWzFOIENu>7?XhotSp*1+#=@rih0hsdHmi3HD8%#Ihg+?kOztH)ux zBqgj>_&tvUx440s;6x@6|HL-fgr0;-+%x7xtk@{PacCyABp>8s1s&Aslt}vTe2%(* za<8KEXi>uaD4uZ|B}LaY4=13B-{+yBZi3K)(CBeB%-jJ{s-}ymgp{2qTv{>Fb*_OX zKuVQC2{QU;2eym2Ji!DC!c!gpldAfZgWTgLltv#nQ8FnA1o-FLm&vx|EaO-MVNuSr zn^;O!VTP`<)>5a)K-+!;&uRzE)}p__HPkW0?MOiY(2|JMO3?87tH9 z`ei!AnC;!}NBsDcYQy(BEpthrH2Jf|(!izJNdG4cwwS(j4Jg@ zVB&v`tT^3pz6iYKJn3ZIv;Jz4Y#Q_9rm`mX!v9|n$w;;7|8v=ViV?=$@^R_eOUg=| zGmQJV0A$ynvnP<6*7U8IU!a2knDJbTRbJs#Gbd@DB+MH8^Cf*9L4a3h4e-22Bx^^B zS-R5op1rE#Fu}+v&?mFdcCq^ls365;ALSG&u7{;4SMSGPfz2pOdRmYcWyP4FxBdBrr#njN0BTJ7t3G_sW)Z!!~q@ z8*01Lt{2h$?0@$21gkUIS^qP`o9$&!-gxhcmo<}_)%*grtbw$~m*6cifk@V+ zS+tv`NbxyCltGJ2vAj)fV%PrjZR<8Z%!s?=l=4X0mP4=>Cm`d1ldizZa z0FNNA6))(gp&yhM6nSX_nX4?doUF)%TQnP9UPeQ~o>=j+Ef3Qd0U5cow#pouehgfA z)v^+vGZxU>{akokp)dbFU%jb$8z^DfANe=*d9j*8sAE<>ON3c~`sid;fUxfKy$J?r;_#HlUPBZub%6n6NI3DLrU4K7!HVq!jeiGmUQ zBpCeWc!H_KGJt=a%{1z-LYOHT-=H>cv7V+=ZT`hu=GG0pr-n?mIW#N3&~=%BTz_Ha zCgl9#ZxNC}zgIe{n15L=Iajxw660L`?gxo0kKDOjpD)OntA%Cqnl?;qY++UFhV)hl zMN$@lF5T0Xi>=J%T5TBggfIF4^BM}OjN#xrFiSYrG4I%iDIot|mtcK9!oTADd=yNR zMQ^h6+&l9}LXd>aykL~WC{WdTOc{j^`7u|-KM1}BXIq_Bh?e{JFPl3Ibi3#AwAsVf z>e2T-@{4fS!_uQ>7#lr@D_N8VxJYl#uk@L#5Akp8K$1MAr;?XI?w}j*4BR{Mi|P9X z5+@Uy>xGD{yiDmc?v=rUv?KukfVE-ZCR{&zs>DGNI%~+r{+XCrN-h!tQ@c-==WLIa zkuO*>gpCi4K2bWZ!-ib+?AG!$^NsZ8m z`fE9X`)@80yF@>f2S2I@|7PQd3Qy^;c3B_tpAu2ePi+%}dWO&#tj!bC)TLc7-*xY@ zMuHIIys7KB2ZokYO|1hM>6VH0A9jwvl=90)^2ex4{>`mF{T66$>$Np)@~%xS=u)vL z!fU>dPY7-Ja$BM!1=w}e65c>QtTWA*Y&+ww_F9DhyiQb}$t^}E(Y$jb0!9^N{WyGd z>+bz$B0r2;r6lOHF5zKATQhPYJqSCvJWH?_zyTdNCf5BkDv9NP5mT%o;^nn}co9VU zK~GhC4A%CER;A4fG9IS`P5y!P@QV7t8w1Q+%hD2$jg{M@*)l~TjA%!^@8-b^fz)!)?NAoKco*fFuRO}n?SH2L>P_? zN+$e*Wt3ikdo4|6TNyDgDl|C=xCL;8f&_Z}2w;MDF=jpkk;xd^@r!x$yh#Oq4*ulU zKba_&wwKe;`|8%q5Mm7ZoKZNKap^$TZll>ptJbbuQ+j9s1^7pa&_-}JBnG4DDUq={ zU01rT*Ww{VvbT_YtifZ(<^}fXrk4yA2Npjf=L!$^0;%ck>NMX)AHg}5o0MR>TC+|P zz-jCr-rrT?;aL3rycL(aOkGoAZ#=*4$A2q|0l6}0D73KiG|jvqvks;+3kJ5E&N!|H ztdWWXJ3a)e?ysfOO7;C6Bi&1FkR4)QNODK9;0AtGeM8 zMms;ui-o}wE z*D>~sr1X$&fOx$NW_aB82f-jaE2V^Q-Eg8usNYD!2sb)@{c3Pq#UqLFPB)-sF^1` z?67Um*xs$RqXj%g3bSKIgOw88RstJIvB)a|!ua;@dk~=RPWc~gs2dkI;rmYHYY(MC z!;B7aB6>rb;%2iR&>=*nl9c;T-{5mh=+j*djv;fYQWMxtXh11M(+Z=VA@OYidR87Y zt+uMl;-)~O(mZD)jW7tm1r3wgq&FW0{m02di;5E3~wqYz@YR-GcU+$NHOGR?XhF3I_{m{q;M*i z&`lb_hu-o@sOq$MLkpsLP48t$w#fN{^Wuc)nel|mLS9n6VkcV?OnP#?q@r-{mUV@O3bNN)zYVv{^g3D_M}Z^DOgpr=e(avvmf9X(Diw-vwEgXQL? zE3K~El8ga*hy;(N@X_mFXzQHCh;suXWv0LV?2GC+8l=ECa?TcRL;Q_`;wvm z3Y7`^b>V;hyWRP~-u$@RXKK{vm;gMd4YZtyt0PA_`|HRa>O4`8bRQbS7=O)*s97z= zx+?#=>!XvO7R{-DvFgu8X}yBOX+{)&HnLcNd=>1qb!SFogaJ60OkFBXlQ18vjyira z`Ki_5%baTmWU6pclJcNWzqL@wX;2Pjt&(Lf{`B*`g}KWf?=J6YOf;l=v?#Fu3C1YY?JrHln)mq?QIAukguoau=Y2|iSVq*>Q_`A`| znFqddLD&E0Z;pxjLoDU@x^YZi87pVR)`1mGT0u4XYHzV?0kYImb}hhCS0ZhY5|9p3TJ za85d`(POCkO;XIEL7v!3bxH0NoOk8&Sa%nLFQ&gXU5J>tM#u~m8su`i<2vXRN)z6c zVnZo!42rWE_W<;u&c*vuEwibQV3nlYGvWQW@6~BB7KoT#(+hj2-X*08b%yN?4s#6} z>00*R#r9;QzHZoBqvC|Cp=<|%y##qMj(~X4)E`dPGt|>aj0OhfUEOq+Zq?z=&b`El zXo7zB(@5pPcHCq`ks)rvbdksJq}!`~L6fznT=EtyRwK!yL~AbE060bh76^7EgEFLy zJ+(YbyjQL|>F|DM+*zkna?FZKJ@q;F# z4|w7G!S-roBPH-Mp766O+*Y9CLtBLjF2YC)r`FbV7cBL&GVzi~|CE&pF@$RS`+Qm( z71c(TRT9l-T%M*olml0)L-fwRV~t;mYO${DY=>@>y7G&zM=Rn)bs2J{QT8YBYlD zrs}Rm6*5}d+cH=vj9q*{o}lHfVb*fh;KF+>-U9>PsIKCl#GFGrwbOU~VarE-{A2@o zp;kPEg=x=D&Ew+k=#tZyYt0zZ8PW>+t3NgJeLro{tI>n=4Ea;7ErNKKk5Ir)&=n~j zOb6}L?@WLmXxw0vG@A0|0!0_NdT_-mBeVnJeEX~oC)nXGzN}N)y^eF8YeH3k8tJh7dS0dJNIa~ZEk_P{c^ahDZj1EVzpzpc@ojgGZ?5IV_S!Nx!Xih^S6_VWb z6{78XTM&;;ECVZ7I8V*N!HHbY*}QD?jPQiii?Ft)kVVDp1or{lR1GEpAAnt2)(l>I zWBJqD;u8o~{4lz0tNFLZ(TlUbX7AEJMmg~#2p3B?>>kEk8L_-xDz*5zvezOJPxs9P zT_JysF?61PpVtIt`-vY-N_^e9c>{GtK=)W<=R7z(5M@m|`)hfNWhU?$e2xovcRokNJ$ zqSyia1Hk>y47FImYoV?+)Ud=-Vz&X{*xZ)SLp%FiRar@uP)A%%12{q(a zly%K?y+XpgF>hI1ed1AXGQzi<#;5@-saTN(D;I1oJ25< zv*jM$vMWKkP&xVqk86wweNF)xm8&Hgztwh0GTa} zxVdM|Vh@3)fMFjERx#epqM-D^h!FBYLu#mrwsW*C20u!!XbI~ zTEfiuZ_1J0<=BBO-6~zazLrGyBJI*UkBUH3;mXwae5bG{FP!h>Bqz#(s&B2&{6cB~ z@xPKa<{>-tx_w!zJf@||Wu7MO7jDI@L(V3W44Q<)pL|_J!d!Ifa`GYEZ+!BA{3#0V zV8epO&rhv6qH;>85wkBr-r*JW?x{sQdg~J}BXKa55f*3vBCpI^-eb0_NsULT^N}o% zkeVhx3UpH=rK1FJ7=LIR%ri8&quubllGax|Qc@Ru9_4hH%}l7`??Y(m*)+D-(qG?E zHF+4apc0>g(!if&Vua%&M3?hP8}QtQyaPD@Eem@IvyK_XQO+g3yirm*3@nr$m9G+= zBaB+7<{JnbK!C#}rlU(|HUxQjl{5(l{=n0@LYIwg2zmqVPZhv``jhR^9y*^j||o$U47nv&%AVnOI%xiq01l1bqYP}_u7m1 zEcW)=#rFJ?f3B2i;yoxijSakN0d`GiaZr$78~LD?U9|t`;*8?RIV-K?()_IRsz9xF z)~^e=`dddns9A6`FZanD;MnQh!F#qYQ=bDA6T(GFhOmSM;8;q_9t?@Vor4k9pYoE( z+tCnOdssK@UyX$23;nfl;NPTiEw&GSWhUtVLTS}`0{b`AAjhBgH;aW)Sk$Rl`sRDz zv)detnW8l3D7970V#unOzwR&H^Gbu|WkoX#nH-%a;|{jTYO%=rsk&HsIW0f;|qoaEDG?`^9`g0AFiMfe{Pt;w-MM3u5+OON&sdt#DP)70Z8$Di>IeO&oH@KXNV&rm z+FYw$z{M4;-X^UPPM|zORn@gmdC0OfbGu6n^n-{-eoC}Mj&8_PXe_XrYXUf%m+i&9 zn6GcV-rld6_~;wf_=O}j+{1W`Gfxkd!b*JVX{OlIcBhfQ*KWL|Ql&UUO7yiKG#i6o z9drh;a5{U`Q zGUHlF+_hXVWFioLpWv&;mz+V*k+|P=dT2_xt?E$BX}bx$0pwTsS;QRVprgP0+)Sa@^`yNb1YbE>B2o46qab+4BdBfnB*dP@^3cV|}M*n^TWC=|(M zJVOgzZPnx<4i6V&&ELud9xF#^Mn^bqerq4vA;voNxf;1rnr8$n;9en-I5%hj&fP#F z6~z!Eaao}6J#o3p9u^dcE9JX)^X_T-Cw>8=!I9PPKIBc!)Sf9GG@2Esf8+*Ns~WP) zh-O2&QKb4luSNilS%2Fd$ddGDf?xCcNKKv@)IK|dLf2nxkVv|~M4R(9@s25mB{wQh zo8mG`f5UCN@t%2Xr%8vX)QP?#9F3U&U#~OnS6sCiemA;ZhLCdwahwQ1+dRSBJ1(2@ zhY}&=)L|-CjYQ>Iih=^$9ll_PJ(tzya_i`q6pm0kn{X-r(Ua!;{XW!u*s^)25=~S9&j5&})v_Wo{V%G*Q~D7uYx+sWj~>HhraI&6dh6r=OaE z>LcV8V}e1oU1kR6U}`yhdI#W0Ru1TZufrDnwyps?c3zD@UN@Ls>Q(Sr6f|JBHt`X4 z(suX>y)?tdMMRDZ0z*xTx4XP=cf$onuJ6EfFr4bo58!OGvQ0DO8)E{iO=*D-d&mG#O3GDJkrShZ(#GL6@o zuK^gzAjq!dUl6cL!Qy+VKTj6H@2_+2^NJiA_?dresCEUT2n{xPo~XK!7ry|WrD;Oo zCXFsr8DC^5R&>u4`L8-zFtR)dCFWlyllp4PDTLVX+A)-X3i#N+fEdKzq_ zP$lv%ys5>f$9MhV-*jJD@3aa3gG|rq)dd*nPK$%sb!Hmm49)!=!(eC@(D98)OzkfZ zk*I(>Ypp&QU$iqf6P~otMi3b@Ct=s%blu7d!5J-sLPDnJT^KvAb)aCyyfW={GIU& z@wf_cN&mj6jlXSFl6D}+DnEEwlzMztoY_b@040hn7+!ZJrnybw$g2g-E?kR`Kf^~| zUMhUoiwfb9gGm`lI)!iW7>7ph+h3QFz;2D^1s8*ZHIjjj%%EzUu+Hf1+RCpv_MK8s zc-%l~BmQ9eW!*^L%Zn0av4#ln^V({e&PA0`)$TKIJ_bIx2&k57@n0 zYd9D*u(QtuZJ+Q*nrY0XH%A1$i;O`Ar2`iVL52~B+jB3WlhdF4>2+3KNGoS)ln>z8 zp89a*WI>=A*2%GgdhezI9rz2~i|c`+<^-NCOBgJTsbmPCROGgVw;`0rQAA$L_3 z5`56}%JLHaF6YX8m)8B`_^3*L0v2#E#YMfEuxUw5X=)@kGx6cbC2#<{M5#rY46%Bb zf0ZBDh!?Nq`3^1VLheZO;f)y+11FVIZb|V~pB~UAZx_4jZ$5vm1Lp*~Au&Bu?Wi;3 zTL|;&e1CVs23L(qmUz(PlRzfXlRsg_#&UD3bgX6)MLW+pL(5XbgfQY#g<{K0d0p9E zGiQ%t*yLKCs(YY?Pixg+WDm%ZTx3j1 zTF*?Ptr$BqLDz!^1{KOAT`hgt=%GgDKt*!XcRx{fT6D85rX1bie%T*xDrzfxt``(VRnv~pfuvD8lg8``skI@eD+_d}iJv6RS*OCu@ObU9 zsXLL)RP%if!`p!;DecWnyIIGwLDk^3U>A^)%acZB2uY<1urY{ol>8!-7IQ`w7> zXjLC$>cIk?Uxzz)URo-hEn`byri2VwrARS?zLh z3&_K42iFF@sVVIJPxtH^V^sC9yM9X6=<9&>a@U?3NL-hR(>qKTm9_%BZz61(Rw>nYx!au7yq_ECv{nN1kj-%A*;haq=`6ws$aDI(YMvp1u zPq8tjN>cyDj<%by@!517wjN;ojJ+2qZe5T!Eh&3c(U#a>Rfbz5yD>lI+!+CO9qllT z(D=Cs5u5Sxi@YtL2Swrh{2hgSYKm%JMW3U2kV0zBYJQy6%iO-7f$+csF9lr?3+Z?C zIS!(ZKJD zA87NIbq1d(%T0plIiRljP&OT_+y&&84WP$sc`UxH;U7Re^*f&}LR7}rWN%4_4O4DNlo+8C-)6EYsPau9RguCMbA%eLjB$;Vq#gPtQM<$w z*kn5GxL$K}XfMSNxGL`6il6kZ0P&Ko3vP*ZGzc}`C*^W!mrBV&`i%w^$~k7*o|o>H!r;FaoK~akm9~^h{pwM^`@6&QpEt-k z*wZlW7dCfF#1XP>=rD-nyYFSY%^*Qm@>7{@i{~i7QOHWRsG}|MtvitobY*4u`N>s4 z1ODK#+>ZwX5_v$CJuXn**=+pX3tH#ouBvXKvwefn1Js>}Q#WMXzo>he9mMA_MZsI> zHVOMN~DLQZxb5l`wOQ1-iSIg16xKyg!f{V%gvys)ivs#v8w4Rc({{9vA6 zI=IaFmlB%dlqMONO3)7aV7?D^-6S2`c>|PO+2g}r;UIM0A9sMB9amL|)?Lq;-(bHf zD~r}i=qc&F=9siRK8)XQp2P8MK$=&{ZM6kE-umS!P3H8LF{E^+m_L#dDLwyd_ z>-!#!>UGc@#u(>vYDdzf>W>2ooOiNZ(&}Jg;@M{c=IEJ8da0|tu1LH>ix-#tcUoLM zE&Etqzu^VpqVD?bxa9GPVt}4Hz7B2!XhaO40qE6xtx4}ef~NCU3?22DIMS258>N`Y ze}w#dcxE}uHAB4iRVS{aUrksfbG85u=BVr1Hz^gURafpH9&?9c*ZJ=M5}y3AZXG@%fqwbZ2%03Iju&A*wc_Ol zt=EJ2b-v`bGUdyoF?%~{K$b^yozTIs9u1NzV@e*wQ`wUzZpghJ<;)McWK_d~1TbPDX6F8me-cB0iQR<~40 zXtcxCG<=Pqu$A)wX!n2#NHlW`Anu0*ErrYUOF*U)0oICzqh!CWAW?Gmb>zc4LbonZ ziX6{BW*hEBCr{VtQCNpsfnziYZkgU`J427i*^JuRm82j594q<49Xb>9#XRSZNG><` zB+7^rS39Y2PgLjC5JFDxzdg#Vhk>)>7N(9nK_p)&()z(%&8;DtHCcv#3>F#BsRv$ zCS`z~9dlh8hidX7*#zkEay<&5QPs*E#O0OvqgWU?iyXv~?Nl}Oo1$~#j+eXpX#>js7{o@L2-eBC&;QUP&Ju!Mr$wj-SsDU|xcq$C*mre=FL% ztBtk}bM4|R3A5L0?5)kj_LXjs^&kRpG-6L!aA{a$OKKyXGc7Y;VA0hAy@Nk$|1}!% zP{p|b2dc(LtCZ?zWULSjjt~`3{O$WpCmR z`b7KhV@A;?pXZJa^Yw8Hz%dcHp^S2cvhoWY9cBMxv=YCyma@I~O#V3BJIUSSQ07Mq zHZ$W;{V>=RgC&|>ZcrR?`S%(txB^UrqA8DYQ~$f)0pOgV)-=&fY#S5X6Wg|J+Y{S1C$^nTY)x$2w)wpmC;#EQ>Z`M!RjYRI)4RHm zs2n3aGQ5R0OVt!SoF(*MbBZ@iAGB=4g~U+C{=fw5-VLU>^B4CJ`L9XecDM^&RFhB$ zbJ5qop$!FPNJ(wK0Xm0*?I6wsr!f{PrRis+meM}N)Q0c*#(l1@q+%Dd7ZfDC?JZ?s zR~7BC{_yDOE^y75wJi@5F-mU^6}##ZzY+M}r=4k!XURxrExWR*yCxP~zknh7g6xNo zP%nC=+H5&sf{I_JE=h~jmj47S&fd?zLep$pccU3y1u-=YjjJ8U_TvETdbxzK+bj7) zYe;Nyb|`%%`fnnip6t@1)Qy!QiJ}J7*Pd)Q z=Hg~ugXPi|M3}I*gLcjqEu%fft`nI@sC>g0>%Rdz;{ug~0G;`cX1s?zy(nnBqwp*1 zsUfsgA2{ET;y6%zsC0vpJl!&@4b-;!)zw#BC~T@3pRaEMGOKC39~Nv2#OmKfaIn7j z1tEd!XRRbH-hvV$sIvUgqWLnI8XcVYS~zd993T40ou1Guv>_7{q)? zOEIIx8V`u%3_qn?W)&zcvHB1!!S$_Y`xg#s=EoM2H?Qqy`7_$ zD{XlZLjPuacirf;YfArl_s0Z$r=apo@Orw`Cl0?2txsND@2Zd{ynV>tyycVYZ&yF^ zGqFG?|6foqfL+hW==xJRunQUVy)D0JZpgWJwjrrMQ0T5S4#OvLBK8+0s2+d#cHyM% zW6aBqZih~t$g+z6HzTuz#q{xX`0c(Jzz2q^ju%OVw`-!4PE@Muy(VDh{^#8* zEKg#jkIgiU98Dr#Z*(+4Y1sp@N>u~z+N zRe>wmDOm-1^B+reHa~k{~kx{R^Bb&oq{wf!>5D?)eF zByyCEmORbAuN?;9oIRepEplIb?>+E(yuYW&3cYfDsD-ID8gN+05hg>_V7`+hpW1Af zwv%*0n%iDq=kZCkps3wIS9&1KiL|v^Apz|2>R=|&#}0viXC^8ad61d6Vv_{T8(?^rf+$8x2J zb9)36baZVV`D{qs$6UDdJAcn7;-bx$ICu)te?ob{FL^bYQePV~*pa+F_-`Z)r0cpi zq%{03UPUl*jN}BkpFecGy7Zneyxq1v0ydnV|i_~`l?Xp`%Jw6C^I;lM(IjEKt{AO5>W|L&uh zNVhnC6N9NoHV|9VL*mGiynu9*?hw0(pvaKjd2 zeVRT?jz4L$LdaPV5AfIS!`MZcS`$<9&jvZ)VZmr0%^1>28z4Too1Uy+sud8V6hFe| zZrm+T%zV@Fp8mDN%81v>U2-~wvDAatka@#>|DQ@xdkY(hsaG?BbwS7Z_3xe86pKP- ztYd{^vOJ}r?GDx&#?d)7T$z#cTt$;}46++M^x7(aQpL6b$DtX*B9wXnoj6Ptubfa1GBON*A$AX0nZ# zZ{*Jjqcg++yIKvt>XE(@&P5ivHb{-J@(4->z8Z4tPO&IV3R(YuY(6Y=Xh zb>|QZDIvZ7^tg1BjzLnmti)wCZ~p_}^Z&MNAGruX+-!Hqh?-z68C5Erm6a>zSmg*V ziDFW54bIs{lug)#E`+{9+t3dG7*S7CKs7hJ>nKVJ2Hu>TupRjOozIrJyfyn9hvB35 zkR1VzIAu#|R+Giz#)B<^e-Wi7o-<1o8zuv=EFi2hHK-$mzOT6E6~%k?`(eTypV z3|x~8KxfODY#gcSv^;iDW(7kfVWQG=Jkt0W2-lbsv#uRaPrP}uVVW*+Q$!S>&b1( z%-)KZ$H(eEVPFNPjaqyAOb2#j2+SsRc(7$O7(cq4j&lH?jO^Szm#0tTaGA< z>sA=|@>O9t58O^{c1aFum=iq&NRrdz;ypoKl_MuFBc-vAEB z3h87P=!XyL52*lx=&j|?$s7t+CvdxGW?Mw0TRA4$;w~a^Hj2?w%pLhe<$*m;rZ~Ki z4eV*vc%j>DfUmAE2k=2Hn#L4(Gn2ZbsQwkRmIGaT#{OSzyp>z7Pdo0663>&VP(+$) zP{Q8XyCELc0c757P!gWlEpaO(zFQ6Kdvqo(07rm!7>&L^*qHM62e!J;)swmJNcb$; zD6P4L^)dlve*Bae#HV>Kn*Lb6@RE#7reI0SoY3hB#1io=JSb=ZXYTj^j@f>s16pG| zxM??$nuNnwyR)=dSdzYQ)9w&(mw%i-gWr;(JdnMev$3AvWm(+A*wKRL1}vm!#&D_M zMkmH!)k}ar@!-srY69fOGsjYXu^9}1Znm+JZwQnpp^8RyOI7cy1oP>7sN8?+GCV~b z5I2Mc!nm{%;1TfDV7PeA8EO$CGn50xi=lHcSFGY6*-hF9^ zn^u3PpCRI=59Bh@!niD#YIq#C?8#%A0({h)MY!ZIc&+4&&OlCx5Vf`*x_^=0LJdUU zaS0qt;fp*C_zjmU2&I4)y0Y9G-W^IBol=(?m5<6^^#d3#6y8bA0sZL$Zv@^#NV$#V zAYh%YG+>gmPjxO**>ErbAMOqBf;p1p*QK}pEbSI`|K}u9{`^fhiu

}ZIYWQyQEg{E`Y#?VCq(w};Rt{x&vMp?ZJ;A2$|CC$F6 zyY>6Y$fT70{{l|*@l_oLQJdZ`5h6+50XRIqoAVgHOzQ$+B~hAHmkX!IGBt?L)VneL z4s5Tb#`Xuc?PMd+H@*?_p#OSBL*jPZZG1)6t2??IY>oq%D4CW4IErwm5&gp-DuMjg z{u|5ggdf;2holsom%VVt<@k$*o9M`DY}zi?W46h1{Wa34vKrOh9cN^yBc8srae4)I?au zdhqafF^s&ZX$k#Pq;mE~`9A=T{GW9iQ3(*F2ibK)_3lHn+}ORx$gQkw9SrnBi^wx& zN)P6k(g!+-y6|PsV$VdU2$12CMWiUx`hvTjzf#)Xf&hQD z#xC-Jj@hLKD{eO*b3p#A&o2E(MOu>gd@RuBT!4 zK`B&@=3rij3A@_eW)dqvUgo3RRodEbsAk!`|>dE>1~6=ME#pR4?^Bn_8GiU$vh<})Lq+09B4vrYWatJV1i@<8i#aO zaon(?nHKzMajJBQ5^_bv7*r?(Gc8ynN+e27BT}rtJ7^LWENCtMLkFAHW{wI*ioH3va zIj>43SJBLAN>)6KGt&?JNWu}4MRBUtzs0Sw+2AL)cbKMiZBgUxJeQlp+q)g)wKzaYC-t=dwYY60lHnw!+4L+l?S64}Pv&8$B0M<7>#&qEVouLP!=s4?IPi#$jVGs63{UnrvMf&KrtT%cfH!7hzVq-2&h_5BQz$VW zAPqelEJ@H)pEdQQWaAJe__@g2T?WlVRhd#Fk@-^RqsA70vZpkA=Dp22o!{~{Rx>GX z(hu#o1Ndx5Fl>-N1~-pBL28bX&$&e+I$zG{90aa^{fK6PG>$8IAw@q<`fbxO60jsh z)hcdvnbz&l^khJ~g>)cPQV+}pz_I#s$_WMq1H6J7pJp>HK9s=o^V|tLWa+>k4BD|4 zo~AQ#gKu@HB&a$p4-ZJx&$>QPB}hUs!U2 z@gk7bSMv7|l1-;(u(tuPfBJj3v#Iq4L`We8Pn_$QEc!SrvgRMZRfyNRouIPZyYIXd zg3`7RU@w(kfk|iymAV_Eluw3snB$G|j(0G>pIl?S3~PDjE8th%bGj|XdBxkMfz<)j z|2>MuV2Kv5ixobqt^mKkaqpbUEr(=n#Y?2?X%gE=cGIw=^J>AsUxwylBO)imEg;18 zezsCQ#D9z&y;9pqOcmf>_1@bEG0B~q45$L0PauEwxckZaXOIV8BboJt5 zJcJoGE9Yui)Df1;TMb$tLzL?myU$z7w*OF2ia>#O7A2=Z1)kDk_RD>r$7pQ6BHOPW zveotL%}}hh?=U9nbF%T=TmA|wnY_8m1zI5vg(W#VJ|@6)2WHGG;Ppjm)ccQyQQWV) z29g3viy#2})oTNKa@I^`2!FT0&wG%>(&b2OWH={R!>mtUu8gG*d1V2ehnB^fkHgSS z`tY8UxrbP@wt&9i<)x>4*IOys_X4m>FQ_yC9=4@vOz2e*0eZtO=!V-5Lg@7jDW63` zOKTaAY3$OF93&y5(-*mpPRAx13vm( zdL*YO(FJRrQUd6P{OZ3c4-03Ckv;5Kj}F<4hFA_@*YFyGJi|3~aNO0nWrZ?^E0Mop z0XSGCBXK{gtR1%5$ik*9@r=S|`RmM$KLm9V>cWy5w~n)d79E5+=JXN_fO}9gMHIBW zwP)p89i=@lO8WPnywJYCPfymCttzmLLFe`_*+y=Tq&O?mDzQr+$gdsjyMY{`1NpT& zWwrCy3Uw-^UN$&uN*zz;|B3RWU|ZR&clo=MK{={ikvq@?w3d$UB^!%TGKH!x(0|4CV7_^yXtW0^G* z3eVzQM?WPOrmi^bs!^7fhi+cD6&dOQPP!APTH(z-L46aB^_Yr@>NAZHw#|udl5TsL zTY9<(OJ0Z`0q|kKqfR|?iGYL21CzVFQB6ktMf?d3UskJ7(SOW$k*+RBgeQQd|IpA- z$BjC9n9ps1oJEvo{eOyjs+s@};h$5q}T zqr)`STds~v#N%)0Ij&Rck=k@pSYuN#E%!ZicMb}r%t z#j`-B$70NKCVTa|h!dLTMcYevjHBo4m@eWgzu(xyKN_ccvu_fIhb37f>XKSHU9|cJ zzO=q^;z#F+RgC>=?vkGelY)J8%9;?t{NZ$4RfXQ5d?7RJ&3cpA*n?ap57^YNK&|!a zY|!sgIs9@%ip;GJSe)El0Qx*vDooK^wudlh7m5X`y+yswH1AoxGnSR2W=S4S=&yt$ z)r%M+4eaaw?P|xauil3==~^ME)!9E@$#83|`H@Qvz*+2Z=u;4J(PL>80`qMllj!0? zZiv8CV|?G>^i-aArP_zyhlc?gs&mYJbfg&HwP_;TxOqzbFy_c0itRUJo)-Y%sQ!p8 z3;MuNb7c+4h-V8-F}2anb>%re8>GO~ez7>@AWeFP!S_@{aPof3qPgj7$PxBU+u8d% zk@WE?TFHAx^#y^uINl06y45R7RKfAgDiM zFeAVc`~NFjJ$+oE$R`BFo#it?vx~@Q)#xV-6)^Tg-@c=;x_;4`JpC|m`t-3RVz4bU zcC^F*@cDmR>OVf;t9!3^G++~j=a@R0wufeoCG>bm@!Qb%E;g=6nK@zi@as9xvZ#ut z7O_3t8B1|WxAVCzAvTbAq)pq&zvFf2tTdKo+P z;(MicPKIJM_;a2dGZISAn+5CY@t0!6hbTo$UKKm1I^1)<`xTHhY3`La*l13)Vkj^w zThKLl5n>qI;V&yQA;g;*Q#NMp1!}&nOE|jbhep}G*mz23)lTJ1M0G^Vo9XTC3pYCh z{IzsqMUosvgnccXWvb=(cg1X`9jVPRZ~4l+WEe66FM3_Fa~P%^0x*2T~q0+fq?1tRBk6+dvvWcdqIV zuJDdi(QfWt9Mu1cL4x5g4cnp$2(3>qI4RMq-qHaMzc8HUOJpj$?C0OxVCrEGDs$+Z zO8aQj`(>JGw|synNft)7c5$PZs(wYsgB@8hh5hLVzPBrHS-^(?f1^yeodU26hrs?= z;j<|tYdl&Ibr%Qoy;+k9o0Z{o(&w3z%3dfol=r`}@*!4*TD!pQeCza5yz~3!F&%r3 zh^8+zBuA3L-|vkFocd3gmvdFB1(gHzz&RJlsj(oSpwm}5j&>e|bGNVpARzJ}1`AsQ<2(ip*EO7Hq@b!`pKAcLvlWaYrNh{e? z6A&sTX}ykgh644A_PqjLTpDtGcixMezh{oCmeqUx&Wp5}cFuVKcC`qBwcF_+VJwZZj+}EKsoI&|eeITZJCedP{qKr@nCXdk!#|GyWq_Fbh2^!jsuHp5@I8kQ)s-7vSBBGWEfs@KT1T6Fp0{E0y zgr_LU7LrM%TDq!$+(sQ6n936GyA|7YFw81E<-9T#EAmM>xG!l52ImD zB#S|V_)86$PFf}SKK`SM#LkzV@%VlHX1WJ}&cQjE4x0ByC^2)~h42kqzs_b{U@~|U zS;#u7T|$TPYX1Kb_Qj{g1K&BuA%svxCQ z4?8dZJNX5I+eipT-F7EU+&V=Y&CF`7sI|+-ubch7Aq*yFu~#_QeM{VfhZVgXSdB2K zJ);@iJ`SJ{Z7P@9U$j>*qK#Wr4R=uKxuZI0xPJ(;yvWt7{XTR# zk(toNvdvJH<|%x{64n7Q#~phq-}6DdV%(gXpkMx*3OY=DA@}=^Isq~;&5$qWWbfFV zEHwqVJ2(-GsYITool|Tx_oP0rOo|fb4MIeL{fu1`l!{hM1fb9I^Xw}EUS#2-Kln%a z)-MKia|8uTHPd3WM^k9@z`tPzf0S_uMPdlq@E}Q$4?VB@JIg;?>d1umx%& z>qKME9HXq}tdW~V@2=l@7av$NZrPM>ma1Vf#iMb0TjWB;4mZw(NWb4GczJj*rLo>M zJh<}kP(4fsOp0y4cqHt1Abp<)Rs+Y07K1n#D{KLLT>L2ch7I;v*jMbts82dpVd7DE z1!5AgCl=`-2(EU>Z|wE4VW81wyzO9sxKom@1mn zSf+=J><3)lz8n>QKf+??*|`zn6%q-A1gnbL0Q`Oi>28^;$lvqNz=Q9Nd7~$in>`AChPvdi9^Hi|RMKNrNPTzQ9_%_0 z%{c-b!LNB~Z)dib9j|lrP@yy5hReDB`+j&qfBWS!;_HOvrM*RmoQ4OF?=4@ZXv zAbW{Vq#P$6gvCHgzgqEaN&$A+l8gS?1tkHEaSRp^vL!fLx(Cs34i{w6$)S$*zI`ZR z?%h(eQqdjvCn5Yujy5_fMG&XS_~5S_y7qU7n_Ia>0N^;8^F4skDt!LzFKrk(V)d)o z$3N0nu;>_v>BTtfTV--YuBFu5P>ztjLx!po>&EzX^xv$pA~xWAk|8mC4RE9H?=OH% z|2K<=?FQkeKp;ZzLE>qQ9inyz>W`|EWvZC?S&eJrXCHF65Bc>23dsw&+lg?66o*_I z^i6!@`ouk(x*`UfmcTgyfF(6uHdR_kEueoCQp#Fke7)nnI5J1(l`HlNie0^1NjA~`96q9}gk#^Y1)xr8h>unT?HgWyxYNSCeVr8BVnnA-G=sKq(> zjn*-IIF`fPdzjJ}mV@hVZ=~|?1H}o8x)84Ns_LD747m_9>2Q1h)G&1ttVRpK2RY-| z#Kg9tY6%BLN&V7yv$yQ4Vr-Db$-q7-pltY1IoVVzw9mop5d8uK5jF zM32Xki7fvAzV}09bhqO&!L_B9oSE1G#?ui0M18h&)?mHQ+pGy z@vb2gSPROcmM)sfpvOTn3fI>~tvA0AI4(wQVB{*GtFhr%g4lk`Av=+7#1?=5(BXz1 z{jxj&juIE*Bi3P2a8n`bJMpdbxN($6D!x{lxtH*Na|vtU1q9}lKqdS^b~n`%9I7Cv zcaoP8nO*C8$%0PWL{{fU6X^jsjp9dHrfYmH>Nf(gK>l_E&Ueo(^ohq+pGXzM<;N6i zGc0KOCPG~W4%CD4^Vg<#>A%;4fI@(54dOa~Nhc0+fB^i(Cz+Dj$f+k?0#jnq4}8g> z)s&9zcyzxXAc}Yk_2HAeEEY~#+qvVp$~IXXb`Xh-HH)awUU7{`!6IZWwQ2NO1i-<% z?&#P~ioA5uq)H}NNGUjMN$>oyW6%lkeR_JYBumY=;AM&(C{>I?U_9_?G$5^#Z`(+4 zx7P+v%$e`~+A~ty-YU9yB1^3K7DD9JQffdxquT?uHr|wQ(ngS-*n*`tp+Fhl)dXmWd z8%mV@Som+y(Me3ubZmHEi7q0S*cQ4*BGr3=`GV2EFN>cgVVyd1(28jn1T9;2?hx%- z*|vBu@Bn{J0yC^Z@=sb_nSFx5ra|rSqb=eRxL&i|!gD(ozE#y~WsK@WBI5WDApv)Va)*QdlUW8qP?!rBvil+%)7rnfr7R;_%@NC&QB{R{ZL zC%bfMW0A_tVqv0Gae{2CZLoXS2?NE?c_Ni&FJzPgj@0rUr^0YB2bg_JuI3Iq7-q0(F)QTsz~T!{y~+2_NqiJO_- zeJ1_5>xl;%Emt9l0!=EP6iq!sgeBJuXKm}iSiXETlv>B3jWiE_GD)QR``o*-kIurM z23cN_l>3%}*1px9-DtI&+_G-WJ*7&n=IMdgG0e`56Qbxz!$NM2!R*Ce&E$>I$E{@~ zDG_B6NFe#0e^@1_pl3)%IY-b)pl_dksS^@Z{Sg%P6(I__(?eUe4Sg0))T*VT0hx@?AI|c z!Fr&+M{4TtNPD~wCl%Xm68EhVgpce$^UunTuLvxL&smF9&UFBsI|xZeOV(XCWP9=Q z&g%1N9H|co(o&Q+$za%XPVs$PTc8g|9|LcAOnw|nt@AC|U!&HKVEH-Jn*>>?k7oE} z-`{cY)-DM)WQ(Fm=(-H0kH(BWKwJhqr&}gP6qstQ8K*8~j>nNG>p==c-pmOCy&6$& zqUBQYj14I`9y?T;N#HcrLDy5d*{`u%EtxpfsERZ zq=z3j#~fEHy9=KxZgFS(+A)@w7~5|Uym~t{Wk*4<zXD?`SuS|L z8lHJHCj~Ltm8V4UpiLGTJr0(YXI?pz&)tXTbhjKc@cEn!<*v&d0XY9}i@Hcn;&Hr9OCOghd<=hY^`q+3!j02P6_f+aUKU%nh-^Wpjg-HIC6+w}6 zp-lV0TulSsKV!U`%DKw}`;$#kdVLYkyZK0G=5U9F7#RlcTyJ3THdijI3xA!(i+U}6 zha2kpF#B0k12*iaG`WI=Cy3||Gc^FhJPj<>%#t4TyChLptIgy0E}V+%{MLQ2PCiSF z-M3SIDV0LjEkS1E_2>1Nsu^_{%QEDl$IvHG!2Mmkh!-%r$!Pj527iht^%d zC0wB=IoTqJu}3z(+$BC1rrf!G6B4^dfN`sG6fq7QNrN7~WCK>dp^y4DRf| zPaf5dk)NQEYXlcQ#LSX4o);FmcEIgZ=;t7(bz$G%P63HwQbDuMWuN5u0|0ZU3$qPh(rU{B(w30l?B;Rm6W-S2#3x;*j} zFCOQdh%6{ZAG$B52oeaYnV@X$rv_F7P5zF|gB_SupdQ9LD?0Qb81&53vZn$qi%(@- z`V^dn_1Lln9e_S{J*UDQR%W;a)~9xe;>XDxn*lo@jWyS;RjZFyO9+_cD&m#20<<{> z>Z&c!;2INMqhN9_>g?&H+mtQ#Ubyw&^?J-pk}5iI%_sRGa0STKFh|9oG{ShiNX$Xm zSW~}R?bHXNW}Oe0EQeO3^gd?ECukmj`3;YKh~X;}X+__dN<|9*`0y##kk8vneoKYhn(KNu5*s41eKj@w_!dMct}YthG%D0Y zQlA9ymw-|*s=K$(wvoCSbTfXKIfAWIE9-0^f8od~Fyp@UIX_Bx*o~K1tsMRYGT3;J z8NZUJ9VIT}9UElYPn)cJeRKey9TUN|h0XoQ7y%&i+X|B$(*Q)3-FXj@$taX!vxs@2 zii!6Kv7w4}8#>lw{k7P@Xy-cP*(qpb%zP5Z;mJt8XmQw}3$rB1?DC(wn`v0iBwag6 z>ozG~yt;CGtWcEzeWbF;vdZ)7?j(*tkRZOG>#NfUj0%T^GA_&H@5hjFiI6#6eZ68N zuaDrX>c^uz1Vc*dd$KN{5~F+D!-3ipOg_H%DLavI6m_+k0#LFQ{P|a3dvJ?Pfjvpg zoc1iTIP4gWQ#`O(w~&H!%=AH#><1~(!Q~>zksLFUrCqXjfb(j4Bml?9rs%lt<<+B* zt~q0Ft%J?xa_vV(t;9+rXtd9-m;@*yBy&cs-fme#>N(H=wf_cx+TD(skJSr8N`h#N zc+aSP*R}0U9G5-0;>M<{eHbQtfSvW?T&@L|QUsY$Ohoj9MAdv28^nS1^exO;{g@qH zDVIq)ft|5_PJ1-@AZVu0&DZ(PdoM{N{EDSP-&3gxio@5b)u-(rcjo>&H;&kSq{JrL ztWrX!(rbxcSu8{K(12+-XfC9CglU;BY@0g$JW^S0(Z>Y%EBh%Bi?LG;x(gnCFCcYX zUyO{cd^}@rc@D*50oV1JT4q7{Cs%Xz^VG6=<0S1s`%&u~q>$H=u)X(c^{q{@=64?K zG{Z^b2i|E@HMS%%FSzktJqSZ>W^$z8$B(?;?QF3gAvhHqnVl@zYyS|A#jLZDir@dt zuJ;)?#AT3|z;ZF$zv}{2@UG7&p7oy=*||~cxpr1a+X=`5ODs0J?Ta*w5z%c*dP_9S zmSk5A4ruaoXCbumi>(Z5QPF9e{-O{-{rT7T2=JHE8MvudAia`#(ff4N**+2%ZYO6; z2Qp84`Pt=P1y)L4l2w-Ahs^x}mmO4LAGYiFsCP6We1LZ)b!X^^ zB`G#;XNAI@0Ue)@#bq*!MQ`TAFgH66r&O4eSD*RuD=YnCO-CAdv*Go3^AtUymhg>K(wH1KS74s;OwPF`0^BDM5^YMSb`!d``)KJ#600%Nw0AJR=kLr zvA!3*`@jrKbc?jRPU-lexf?e6GC#OnXS4rWn&TYMuf8F3!Q;d?GiO#Bdn4%y#^&3B z1Nd~eQzw3v%i?6riple;aN7uMa&8_m9sZr~^c&a@_&d<<>=^mVqo~20#k2(p;yqpQ z+8wfe5?+t{H67GN7kzF8z!@Blbx|vO4f7no2^eQMMZ4v~mX*y~LS)M$6q>BY8}pvhOKXQ|`Z*OjyD9_IV!+T{aGi_Qno`TuPh(Cu!9QtJ4L-j={wqBTm1 zni*)n-%;0Tor1qu-6 zp2YNEM1C!BtxEED+_;bp9zBvbqqdoKjU2pkC8q0rEIlId<{ap3A+aA*4>PLG~9h^Gq3%8$JwfF z%%EORHxT~ONoRu+Jbdwt_p;;-%r+N1+=UoTopYJkgJ<^Ug!YdV0u;be#TBitABUVQ z>Wq9pYOpHW%02#gN~=zzI^E~cTDHa?KpEUSweb1;5=7py`ia$JU^69R)OnMV0s}5> z?&Pw}qYl8?w9%x<{nNPGo2LuWziaCKvJ*us?}X*31nX37+Hb6T-~u{lBZGz!xh%ls z!H0$_%fMpT{EFxB&Lq;A3i$*6JHO@RMI*(CpxFg;y?KD#PqoN1TLS;9TLS^k^)9G~d??8621yn03Me=Un$AtZ3*EU>v>eI&ST+{&c@ z*cZLMu7p&ClI4L^5z;#NvDf6%I|xaowU;pXuzaz&lB&8*sR>b_PF7m*{vHq~>pZ^h z$2{-ZFUxB2Y;1I|4J)+(oL!fMPonh_lel7ii?_tcu2Z&qqp+>O;j0@WP0^bUImX-d zsRqlIyy3Vp`6(zA816~#_e~hzlGGvSe(tZ$5PJa59|YJmw$h+vgfHgXMnW3t-Ai*s z5==>TSKPmYAbvd!G$>%CY}rL=giHz~W=dzD0k0V}io}nBU6HfIRnTIZ`T(3VLfOfW zA7xaWYN*!sB5yr4CB1~YI1by1`C?SBZ(NtbyKr9yz=6o<-pl5fcg%AgEkh<^OD%lt zs#JLuH~hHv0G;#q{F)ZAWU$BO0tx!W4kx#jljyuG!IKXC8tW1zV2B`zj~Mp)!=X)% zlMH!((cj9jY8yMxt&-Dtcr?z#|3#kw;AEV*kE{Ad5cojGV|iZ)w?w|5`1JH**)fF> zw8EekB8zEY(~w%F#`X_)=WPhHKq|c05J>6&nr}!P^=Sg(MnD7DHO#cuIr3jaYJB=s z|8~lC^N(qt%RlS7o;925JFr55myl{+TjEj)5ulnww_rttjR83n+PZ|RO%c@7tuK1C zF5hv;FxM*KY2QWbP-(z zYHwuBeibHDZ*Ak9k(pt!vjO-}u5}`&wN8RM)6fg=(^cebdzfMg7_bQ0HTl0IGe0jd zSO;gHEZge-IxcCPO8Ms&D86O)CMXqc&nzJPU)dk+cl>aw&W6j7Ng{#eBFw>#&md-j ztmO_=)cJaTSmKMeVyFTs)H3PbGL{H6faWs4XoJIS9$(J+S!x~(Y3j0^v2|tuzz0OM z?7vAhHU3!z1B`3*Vm@NQAr;JZyO>Kj%q%i0PQf#n1c*{5@HtfkHm0uNkxddl1NSKf zAB7b)K2L9_gRS5DofB=ah~xg>&nteP;jiT-sqzWD*TWke@35^shW1?{dEYx}Z#BWe z@w98G>-Lyf=u_!Cj&L<#oFLLiO+k5W(Q$y^iQH_`+P&a#PsE$8yjHmgd(E?VrFfkc zAY*5xFE?hKqxra_GSk?EcbVR*5sE?PgDe|O7)lIe$i|awmPqEL7Xfztd$I<}VN6VM zjQ~bg@fCR>|De)vQd!@utjwXbK&*Is45J-)@vRxK;|b-?nk!FY50dUOD|xA%JO5hB z5(pN>1Mpcz$81LU(aPhMyV{*5-t_~E8vF)Z{lB~&vW0RI@I7;Cp|#qJ&-C4h9~NO* zp7@8sW-2L}QN*eK4r4Sff|i>=06wV~MaE}Ct?>wUc2v2)JtQGpZ~f-?i}A(Mks8gp zGDU?mv58R-NsP`P>v!h43eUZtty?it;I*`I-j4r@_t=2~aA=)+A1Aqst)e|T}d_p{-@6w)QDw-5!GD(8DBsTmr~Tomzt0;YT|493w(CFcAUMq@Ah4FESAD4k(%C3~EW69*?SQ`F4g8iO zxYZlT&?oU}le6Eb$YShMH)TX;$g1$%pbmiiu5$_F;=HQsE0p9p&`0Ep`!iX!;~fF7 z*X!!gHL8F)WBX8^hd>NjxKgNhnCug+JL^cR$Ms@2EG56;A3Qpgn!5a*kNx7C!Htf; zr7WA-o;=pku1um%v39v=Qx<4<)D4%*$d)jtjjkrP{vKy^-CLrq-Mx8qjL- zbrGeLbO#2|IqQj@J~+_>mX0?3ATEQw@8XmdKLN(Q*CkAN>gcC^`Tq1G)=nYaviG4* zE?4mV9xbl_F}tPLQKdWAG2`t5$SD8^@EHByEch6mYss~X#r_7@!fLH^*ZvK!ZYFN6 zqLj8Q)go?X-cZ~)(?Gnil3fenJFX!!)n;p7*uOIwmik(5NtHv2n>`= znb5R%`Hriz#yL%c@b0{)prIGuIz2##Z*0Q2NUzj|6h z)9p`Wq`>=5u0C!l58vNIvQ^lFSo1L;7Jc?rHF8#JXKDS` z&>xg*rOHMeTMWM{Iegbo{B5mi5zf`D@C=U=9*0+LW9zZd zWv*Gh_Wg`#mmZNWd&gb3AfcDIm5sG)OgJ1~On^R>zHhfrfr_^K(}^rInRLWa*Z!B8 z(E_PG(RBC^{K-tmx_=B{>MKw6!M7zdAV#j5fYpEFzL}T3%7fnqhC=FppI7C(yr@t= z>3%85Ki7L}3fAP4QTxYdd5sI(f}2ZB=PcjU2cGMNx49cbpCC5U!m6pK42B%N3hdDb^Q>uQ8g+H5ND&c?=96bew?6 z6#+O>a1&r(W!*%r+jisV-uEUo{3s532c%e~8IEqw_0wPKPmi4R`apKUi0fCE>!&q{Z_Kc)M#>DJrhnKR(= zEs(6-ipyPt7n~!}BjcZ6vp}~jp{qmA0k+0vCq6W+(hl8>Oh&EpXM9Q^%FcH_KWaMB z`b^~v|Trjtrb)URSG9Q6F&tx3EX{aalUOS zoU+K6H=|L*#R7m2Hh8g&gXbvA2o^8UHCA`o4IB4=a{|(kd64lF65fTb+9x8Wnlg34 z_0UP7w-Qil2Ki)|PbZxTNr`4D2mL?KzWrYC=cW7hV;Mm^T7trRHrzE>L&>p)acMC6 zd|Mdpccn~9u%VJfLn;aKWReIakc#* zhU**$;Fnlf8wYjOkXz8UoeP=|rQcty=Xy5-WvF+cP!TD@im71xWK zT*(a|lmSh)J$H_fe=pRdQTGMSKgnn#B?3R3c^F^!zVA~^H|%-YjYDA8A12Yb8uct; z@k5`ZK63++(_(`TbKP4oO11CYPPkuesJzY1`HY?QBDRKr+KyV$78X7&0RGZN zdd6^{;;896*sUA%k5)QdG$5;|z`~7GsYz|Oikm8)-g$BWeTw^)yReVqqBN9npH30~2+J1c1bldx zUdF+f(p>YhEQ=)(&A=KulvhhL&)@0_*E;XxiqxJZkVCk}^<8ZGvwZi-DZHvm0=_!q zD8cRFq-m8K80}Xb*cG^u;qJy0`?FY0uwEEz^>KE)x;Vkxn`oRXN+EaG=M(WtfS?VVrFE92xl!*ZH)y-ST1S~)PMCkFE*r- zl~T-&?&&Ke(M>_9h5Ch2vCvdK7lFuKFZc=McVDJPB5EH;0DQ8~8aHUMk6Sn!#W-Sn zUcw91k7}uzh=tC-Eh9u+722Yebk;8MqOrxVpST22!LJH99L4*!>nG3(a zcj9<7P?(+dl=;TmRe<8Por8s$+ez3DMXYXm*f*H1`yA+!ws zV@8KkyQ*)QR+=6?ei)bZyZ@>4M{X2e&Eja0{3;EN5uh`F80}w!xDGGYwxST31f;`+ zS<~&(OuB7T(1>D1dZ@K$Oc+=l-<1dL)^u%Ahn=P=OP(y}t{NP@PW!u05Ci@1e4CoA zL(!B$I&!g$TK5T$XlBM2@MRbX#?VneydUXkSUX}XQ8?3+Kc;0(irvzn_OaJXt=cGaN@0p1s4VL<~d-Kf5SwG?HqT9d(VSPQ~ zy1vm?%*+p@5(=q+84JPf8=)SlUjVz1cO-OV(*z5+Cj4ZT2eH#+ZbWE)ZDxy;3_E}q zae20ePVBZR^kcG%VJR9UWIEhA(vp_0*dnzm+wo^!7?7ub-#3+ZeB$rFlK)xI7#Um! ze>vHNK4ASK|672nX1?_3#gIH9N?wP*)w6+wyuzLkge=8OUIM-A8C?wP!yd6rr@$cx+nHQwcJxhG;u4hrYE(Tff6L-66b%T=4F1ziq14Rq% zE1M(ZSeOf;>lrWIQ_E(6T^c1l=W2K+5o;bCuw|c3d<$ZR70~XWIe31=BPbbUby6Vr zvuMbRSaj^}O~hxYVMqG~mvzJhuth(0sa-(qbdmvlEIV>K?rbs0wwa8KbgXN_+<+82 z{>R)oc31LzZ$Gwe+qP{R6Wf{CnAkQZP9~Vxwr!geoB!{+*U9}Fe&bnURo$n% z_O9J3r8n_Af~~5-oBlaHQDgTgIIn8w!H*tOGZ`%&6Vx|yzzl7UO+*~az0njk06h~= z+*Uu_zL;LQQ})C^#cjT}PWZ1uF0+vS(u(NHzv*ef4w^eyD};*pwDMiGanSxU=X_+^ zX4GL4foSn!>^8s!=)sZ9LgTJ)|9%JwcI=jhzp4KMmk07WzMJDg1(d zt!zjcm@LcD4OWqdG;Y@2{RN)A2cFU&%dBWijhHD1aU13<9EY<>$9$183C<-Vzy_A2 zoM%Fu2;lfD2p)-WjCW)>=7lEnu;r~ET#Cqb)VCBor@w@T;K!2xaHh}@Lg&cvz+Wk) zGot{XYqgk2*!VE`h@P7Ht4;LX@BOwx2u-ru8_C~r*>oo&kW(88MzT6#>}Q0bxcs?m zlQp=5+0J#T9g~Cv4_*bYVgREV%#13MasUmqd>-yE3q^`=J%P`04W1z7-i;!q6D)xh z5WnZMDCFsk>tO11yf6Gw-{wHIvizgj$*;ob(n34+;0Ii7fPl7ReIm9$SZZ`XzyB`= z(8MH-cDSF+8&#XoT7Fja|Rd^a_CK~^a%ca3|J@bwti&Fhl-5r&{B-!VX6lc@IDj)}LZ>1hziK zv)Okv)i7mO(@_I#Rs1bdM4f-E^9$AbTkBihGa|S0pxs3OU>RznILn_q6s%qP12!Ck z!~IO_Rsrkzb@qzZw(j=KDAxefOgN`V;9zZT>)@S|#mGF=95!$&QYin;)$k~kvv&_i zhe=RALq-7VKc1Vp@>m7Q1aFrNz5>?m^jRT`S%C}r8I$EBr_hi%8}|;mMh4Mq9jOr^vU48NQ_!Q zT*dd*>4Wm)*;}jKZ_=)0Kpe^oHM|>1GI=azcewdRdq6qZYMPuj;C|*1jq%EEvweG! zAIIQVW@-cxatOiOys?0|kVhR5$#9 zVMDVx;>!zyQE7p4xja^bO3se>$o=6 zlJtF|TD3*9t^Llrq``U6V#3^@H0E}IiL^L?`c1Xs_p2s>QcX>__S|UG8G(O>+3MZ0 zR3;K5f)javpX&$U{$~bxwU7ipxGXyZx7!$m2;!;&rk(M9`(Vj`IA%|*2{wi-&^=C} z=!LbC20PPMg%IgLoc<4}L+5=y*JjsqOC(6pfO-EXE~gwkm{|AQ(l7Z|w=x3FN2vx# zl+OePq{z3}n?Knl=wFW)-0AEQMe<>EC|l~*s7>GPR|(l91{t~~F)$7sz!AqrkOV`1 z@jg-kIy60mUyiGsK>ath$<9qW-S{YoN(J_pBcm4Q7ohDhK}<=^*}sWeN_XudYpcr3&?G6D*e%{JGGgctr5c>A8*z(lg)9_Sk@AR_l#HBSQmQ!E-1%w9_N>* zxP7tugZ-XyS5M@V!2upp9oWN?xsDy6Cl$dw^jx)Th2QNsiqE3Y`C7Meh(ThoR2E4_ z)0_1wCloa^x7zWu>;?|F6Y18`&^x|5nQKize?0sQ*E2Nd`WXMh1`a7ov}K{zKVmZ`b)U@UcRcwC9q-Jz_L>dn8;6*8d|~4 z?|m)z*B;!WMh$}pjt|pDn@wAPAKl1C%gULT+yv{ zi3cNhpe_F?^aM#V=H3i$KwR{dPJO%a&*YVk^~v)Ss;J09@-B~6jl-0IoLymVli8E| z0}y&yQe`jT>P#?N;@Gsc^)f^-*pTvPZ0NND4~W`;c?WgGs9n8uIc^oFO4<$Gx`6*( zmgX@V2>R63QcWSPld;nVMjDvCE0E@w_PH;OrlwVoS!^SDwLC7lveUt&dWZthvy@*#cQ$|{%VBN%1^vS#sefPfQwe5<^o;}FUM{r?t-R{|Q<#nY&AF}E&ly9Z z$YaBMX9!Js>R0d`Wh~EFq9c?0glXJC1c1X`gv0JZiC!OV%V3R=)&U!{F^v+u1zLTS zk?p>|M1tX%d!-!(xfEnAW%+aFi<=$CTM&v?0OzPrK1{ax8m&$p;7?%V#quSn&+(b= z%@o#F!{4t$f>$!#Smuuu1Sf`g{12wrF?EQw>KI_8S=w&uwz1BTfEC=(-s;TRghOMq zlGjH7huS5&=_z#oG7XYW>B2e;rraT5=-F3m-1%6(Y@^9XF=;~L36aoCNKYWerv22| zLo-PZrotA<@s`(&i>LsuD27#US_G2KE$4nK6CKk=#y2mu5SY-<{Rs z7F*i9g8vCrv3v8R^LLx)GM2Jggn&i-;GC*>M`;E1yRMrDjSbsU&e;ZfMYHKcCYcfH zwcyV-@FADwp?TNtMMxqg>-NhN@vYZ;wab=6SqqReQAQ?~>k@WT`{rsmo?So|z~}K5 z_D+k!YMM9%km_aGl3Qo>jU`i%=VgaM4nkv6gosU%qmVSPnsP7hpa>zO1yxiZ*40GXp>dwANe5sHgoI~vVMy|y8tX1n>BSCwPWG-uV-vbgS>?pscZp0pNG zIw9_4J<}oT(>Q&}i2Z!a?C8<}j`xUp@j2VHg01Om<72am-5w)!=u7nz#Mo zUvSNHso~a(Qm?d>p*I5yo-uqSiwU5)sa;V%dh~{%bYT>|1@AU|~JEKJ@W)5z1I-HwH8zo(d!mAuS&Q;R5kXN&e0&v3g<+!O4HgaGyApY|7m zTb1YG&cnEiVP5Iq@0IMVXHcVe4xuU+bKyRmT5s7wWoSFA=$h24Dd17=Zb^+xv000Y z6TSW%vp^d`@T*dI3vw$59q4|o1!BTsV#xl0xOS2&3_sZg5RwiPq*67|DsZb9gb=ka z{`*jt_)oix9?~PR0y-QWfz{{bkZlLVo&W?l-%xV!VmxooU(j`V)6}T|&Zu}10f(we ztJW@jFWF~)*=YhHaqwEvA9FD7+c7RzCSxFe^c_@C0#KT_ypg>haUYTg&u)~$RUS5C8GF^UUC<1u zm6oBwePm)k-97y|W{Xv+&fd47aMr+9TkeJ1>`y*pcz@5`C_oQ(Ef($bvQg?xf8)S~ zc)mjc=QMBlmexqf3K`2=JpRg|d$8A2x$>>k@JgW)Ps``AB6nlQD_=;-`KU#=Hh2mE z^FKFKC7M#<95Y`ISU;PIZQVgN@Hwq50HvLPIoXt*KFoL-^*WO)GL)=l;7yQUks+>V}RMsY@T!?d79G>rl+65ok-aPG>pbOhZ9ArTpe zKXZ=jPIV$RhZ<4$aQH3tNzp%?x4R(LZ5d}D((&=#SL6^mt@%Skg``=utb~{dW@WWwGaG;+hf<9+tAIcl6Vxhj@(2brnu)4w0S!^Zqq4 z8Y|1UO-T#mP2-G8y}nf=eoc~Ch9{XgYQ^VfUgFLSno;|>x)PLs5&xLlgrtOs1#ga@ zA>8q}6qMzE>9Y;seDJ&1syOHy6^Z~U!1|IQ6Zq7Y&zkY8I(6^Tz2q7covcebeA`JiT zWPE`CJ`V!1B?%TrExb{JxN1AA4+}N8c`-0-V?8dkick^=>^%ZSn$a<qYlb%MuyU*m~UvpYzO3?+j>GP^U-`H(1N8DTyE4ooN*Q{xv|)V(dz~we#@Er!zMUI-;fWaSvpBf6uKVn+i)Az{~I(ho|E|n!l5HJDrE^T!$EI2Vh zpsn;cD+`oq`HP0v=+Y+^`=DcN3Ck&;ohhj6+D4YKv)e<#g@JCtPAE_wq(SZ`78aO- znK;GG5Cg#3cioY?*1F`fh?>Xp^9;F-VI%r&;&TeZchikodL=)k!JqC=+PsK}=swF- zHc;s(go!S_+=qa;-eXB^1e16A-CtrpvciJLQeTEMcSvJ`gXfhOI&vEUHL=jAUTB2U z75*fZx7j+eA+|t{X<--zdg{`1vy}-MCLUH@AFg0ub6GSJ;Ez?|O-tf5R+Qtrk0-otj=W=YmZh{3IoTEj4-&JmfTp@1?`v~a6k2I?t;#qjGggIRR zhbsF-YtZ1Tua-O~Ci*8KBOA-bb7e-m4hpE%r0ELoHXKP^r-*j9h4v5f7OkEt-87=$asq&}f~R4!q>DZbs^?eciHZW>z>LN6br4`CD12a`g#7h%hVozv zQfm;REJxzPV|gcpbyPh= z^Q+dFji66uR(Ybd`?AaFMTrmaXWJ)BixOCxYY&|~P|ITxCx!$r5Q45#`kJKScHW8mzZ6$ZxbhpN-~EWFI;uc?MAboN(uMpN z{eh}{pT}c`e1dc@*s{9yS}I$c`a)!&tHtfAoH|pyPm(Wd2;f9;AFoU25>Vpw2L4Os z0OF!l{Yf5nB6$SQYgY+q8YFMDvINMfVF_^zVAe3qw2V z_}wwa$+s=I`5(v6!(vyvCXk0#wgx^W3>YNdzjT_P`UsJ;p2)RuuTE}a(owcBALT2{ z4?l0S@{Aibzx)5FpX&Tg@G%Y&#kCGPLd5j__s$|%AYTg4d>H(Q#9iRz#*0Jc_GJ;i z+SXTf=*pP(l3L;9Ud^Tv$)aQn6}8EL4DgwlpFQMk<60i5rpe}E+}fPVvsN?zYqHIy zsJMi~lz5i#gC}#tU}gX}iqHfc7qr!i{$2Y6-x)ag`16b;JEQ3uuzmoz|Cxbua&GUPvvaayqz)*6x`QIsL=h;rt1t!?+EUbJWI}iPh3wl z?F@jk)%E_*M6kw%@>v75mI=xx(m@qOrxqSUOBMPlBi;c6IF)y&;YxeiLQ%>xZLbL2 z3&&)GMJh|8skROl9YW2g4!{A!lS0{X0oMKngS9;Ts1UR1!oeik$Ts`eqaTRkY2DCP zXeG%S1YyWWg$^o6rbg4>Fq7?*Yi9p2h+RiAYrJ#_;E$%!$jzc3uvO8-AD(l}<;b)? zufu><`CV@&f+X3s>ptK5fOyYE|E&XgR5VkEZt=Tp;7Ur!Exp{I0-?u!hYjD)Q5*)l zR2onU(D8p%|1z%T1hGXz7A z^8JyVCRlolp9x@?K0n#ae}&qM(Ua;Q@8bn1Ad;sav~k=@Fpmi;b0?`p)d~Nt|0@4+0(3AaS$Mi-Q1qGZ~nq88r+m) z+!hQ3cjkG5X7?_d1p3#HVf$Op1yJFMD*llGX6WS3F!iAsFOxUqU%sA}xtNhfj`DNx zng-g1G_k{8&3LW9HC~c`G+>@iMm8(egMddAqnbUd6ThRXa7? zXTX|l8Tcn%#pN6J;vy9gV{&6xD}zLIdlc&;n+3r<>JVOlD-|9HWJf}b=G7R=8ZjaZ5 zw;KgK=l`;y@aHMtd53Vh>qGaIf%rUo%x)Y>sNJ`dX9QP~kJ#Wg3f|cF+Nz4C4(xeE zaCXIjOageUQlJs!M#HAGYSO?fJ|W|-8OVA-Tnh*N4l+XSD~8!AqQWBg@kQ2iRogwd zwOgG(!#-I@#A6gG#-P*oDQFa#CCIeHCNl3gRnu>_R)J_-QcSlDC%?}D<%=wbxe(Rr ziGS*tF;{E~(@iN97wfuNwP?!11`_LQ+9X|k$ZiRR{Br6=ZJYQ>pY$nScuUc?1&94E zriEPg@_k(p774|iQ3P!6s6fW)dG7u7BeeSw1B2oaNLuqpIJq3={v935)E%N^&ywQP z8$|TA)MF`3(M#Qh%n*7AH3mXY72q@3<4iXT`Ys%ewWMFkyzx|Xodw3tsh321k%EH% zGS-0I7mIQbt8Hs=^16ZTtm{~qL)^@*{4|+()7=$j5SQb3J+0LcY>Y{Q#C7=t_i4CT zi*cjLXMn1-AUrx;xYlp4%zgY@)FT3_ZI?uI;MWbdi1@!?(CHJ8*}6QNm^}CSJc!@` zpLezK&9LWe*t$7!htotrl(7&^ubF4qhLTx;z6{qiOQ<_5(BD1Zv-3h_yqA3gH26SQ zwIe3eCb{`Y3qgVZ%WVMSy679dX$x!f1Z}P`S5a3*(1y*Rb6TBc&aE3lLC}XK_&dg{ z@ueycJOeHIcpIuMVw)4iyf|tgnYge0rIh^>~`V6t(15&Ztgis?^rIJ1g2K<0&j=9lyxy@47fUv!W4( zmHf|NGOM7Cfxi*&2O6K}y3IMVxpRzA4apSt@$h;_wrK%0RG54FI3&9=Ok%}&YYt2GsxvQ&kky4t3YvhXhXYqn@bx~*55~`w1UoX zq*yngIy1x4~+UDx@e_oPbO0&Mt+jAv0ZJocI#FYJg z`IEE>2Yhvd77?7Up)z+SW+uDXGfp!_IhE{_Ipxu@3gG;&4I9^!Q=7f02(}fimrYEI zm1XnKFe8Y3T~XCyQvr7tmsE{vTpSu3nQ3B(sPX>(DpTxmC#afGm!#E**aEU0)TV%d zB7^JK8y(ItBWlPS62};@wI#|!rn~12CK`&?9_n3V6wxlTTCgVCq%RD=TrjmYMJr86 zQ`)kbZTA@@b0OhvzrW{Oc***63S*M$U0vfBaubf>v+O_3RnNeiJ_}+@u)koXcklZ_ zpu-G%;*xSl@SUr2$DC;w+gj(dm62vgC)99iWPtUf)s7|WyTGp4LEN=qU9usbc_LI~Krhwg}3v?Vs+w`vNLOA7LbJgJ7;WUIKeAt0{R;`!qA z5d`a$vt6)ME0E8MfI;6qQ~U=_@7Am zna76}AlRHw0h|tY4j#kChWjk~fK?{1kx!yvVF4O)`D|9lT85;i;So_<7Y04fiXOIP zx*nF*tR_X?-%TwD2|4xU14o$B>bgt-jz0-pebt|C@Y~h=Y!qM~jMq3Z8Ca7zv1>8< zhYdw0uVW3+2at?&IU7;lfm$7-V|r}CB^Q&$JdC9%;W#)+u2}$wdQmM!yjMha)ccb* zYFa}*JN`U5!Xaw!&zP^tr4(e(vkm0?G$O$h=2AdoBBQA$+-(9r!?uB|LaokbXf|JV z7{F(*+kw$Z^gRwkavU@09ePT}k#m zZJ^mJCo2Y?8!!(z^6VQafSw9fHe`LP$kdR_A-Kk3u+|{)jX$4CjFfpgHtN|kXx@qX zpTjO!iwuLs3-7z-EPSTdU)$ce29?z+Z5Bp_aRnLx4hnEe*iW(7n2O%T6PRR{8GLt7 zR*T&D^SdIBLimM%V+dl9DJz^<=8=7nFqhgUj(>1R&kg?_k@g!62!{2<$^Jgim?@(= zRKa%#XzW3JHrRjD(c|J+7S+GvVN}`%dlxIUgHee{#Lbw#`y&y*kCb)`y)fF? zmX%y~@nseKM91{CUDZQn8b>*SYL`x+Z)FpZZre=VWxpzxb|~&I*`ULd6Zd*2m$$6u z>S=8T%=_iAL=F9L6?#H?&5t^Gabg(SLe*VNb!4YNyFKHTRoxTLSix>i%nZ9=9Mu5! z`tc;wG=AdinpEQ^t1(Nny{zwit^r#KgwUPC?doig}b(5v}e3DXolquU!>%E%d zVG^@}y@pw(+l(B{!Dd{uKiz8&j(f$B>8}lIrTVZ>cHebGAEDD230apblAyf8HidP6 zDQZGE4Jj~YdBU#_7)g~?*6}L;6wl-p3$6D5@IJv`B}pQ0`v_p+px$VCkev4@_XDh- zqqNtHe-Se*eF4|4sdUd-)h{+RtI?h}reRqVCY{K?nWc588_scZdg#SiDn}nVS!iwS z{CYz;tBTtu3ad@3zprg`2&ybb6 zxj;~v=lwRAOEXy5^}M}pl__e;?eW_ut?6rvDs^XD09LCJu)k`&_D#yd8cDzyqKKzoo;3e!2bR)IotUdbU< zVVDQ{KG}m-$aV}Jcr^5!iaRE82Z6zX>KcHExw}We!Fi`C1Js_tS_qlfQiU0{H`$6tacVcFoRqoj=fiYnOWDCa+V_ZpUn z1L87Ub9Mi-`x0U?sS$)G>a`;gZvH&0WaU;Q-;+oWYe#L25roO43!Pi|BT3v>+@W0W1KP+oR5K6o4O52o(;deMl2VN%I3EIaGR z&3?N?K9-G)x!LZjC3`MO^WTR4m)OhQP4k#0&(iPr3t>%(ddSkW3^L@$_*WWiDqV)D z%$5;|Gxq7`%2}K^qJk@{Lz&zGoR$mAV8quN->k3$Awena!C+WkS1yU;m_vXb5Kc#I zpL|Xg)tMO{y~sWZ!B}OS<;yO@ED?Sh4lR?75PFdm&&m$&8t_BBpUgDPKt@WL*22=l z!cQ%gp9RA?TL4a*cba-SP7i5wDcI|>b?;yv(p%!?Z#-8yRl6(B_r2trFD%%;?$Vcz zncu>h9Zl?n)N8kSL2mS%-Z_S`Lsl=}`=S8c|IA?KL?by*P{zMX9h> zfK93gScmpCr!dW% z?oqb${+mjFi4m}~qc$!qSJ@S-$Vx&W1s(iGMer>n-P7pUiVCiIkwV!!+IT)Vu3$_- zcNvM_MkICt9Airc38cs!#wmp{_PD=xWy7t8+WA)3G6(Jca=@WLd5Vi2+J7n%J|jDR zTbM4{ws%wNR8UumQ`A5TnK z)a`3)uuVKiwE?m%8@@UK##mgG#q?3ET~h=NL5XtBq!(KcuLz)r_3-=#;is%&LV_$T z1BX4U^9gb@j-EYPnxOrCZy&uG)qXlEI)ik7_ne-j6@|e{yYpxv*{`|=h01bi45!6A zDFElwY@b}s;0KM4aHsXxCP<>rJ=r)-m;&?ca7Xj%#_UwwlshQdG&ek&8pP~q>bYy? zk0Y3c5oZt~fYbCt^k?wCBxyw6nU;ruhHEQb$(35m1QCSo2;PO)=vu=p z%e`iQM%N=K1D?iO#H3|SMCpf&h@UQuC2JpljE3NSmO}T{JLfZ76--Fh@e^t2b_NcFAh|@2=LYUcoz1qhC9DJVwDi~6 z1Y#*xVT}dM!(|#Q2x}Bn*5m}gVaF@`-Tq2%A-A2>Qu{%@HGcA&9076=H;JH6Qq$zd zyllI(h$SwU6AHjlk(mfnI1^4dznyk|Y15-}?@GLvkBgwx4(B5=0L@t#H#2nZGv{)P z%ssDLJPC#J?sg=shdB3T703y1?l_7z1jO~o)b7#tX$Hg5eWrx7$_^r*L_b+H5DUvT z^&SIzL-L!$j3LX!W~85+JoQ&4BT!3`&HUpVUqlI^|M-Ss4g!@kfYYR$LYZsWFpgCU zDjS}3GPE}=?_zRoyp41wAuMo~fjQ+qnR`36@{=%!qz<7sjMinld(1U(=5)XiUa$-U z|KA0GqjHSq>iuCpV7x>aTa!Q9^B&CP&t3g@!AWzRjIi$}lVCDOB8P=28a~6*Z0-ZS zR=U}cnTCILg5&c!wblE#i~@jjbB-kpGm>(~s~UA&vhPE2cff$&?1!N?+OW8!f~&PQ z1eL5Lko{y(c1^&Fo{6%UN@;gmZL`45ddyzf)ekp{ZBy$yp8-M!%$Ivp zye-#7wNkI;9lz^<*>Di6h(33z8Q1)^y5Ba>FN35s^dmFazOvTaK5#`Z{*EYma4%|p z^QOSFQZt^GNhNOp$HnE9oml_*s^D)!VO&v^BuGmE0`j&Gl=2sH+kD!yl>gNxRA`fc zF<$ZUbzWmdK1ts+8UKyGmhI)PS#c>}KxK*mvF`LOxOg+v^dE ze~(GgQ`I5QF8D#+UFOy@x~t0Vx=J~##rE>NGq~&)N01jRu2_wCj2-2wgutFk%*W)0o93&6aO4er&3@}MreP~X}*l>kds-sk(WZ6X^HciK*LHwapy;Dx73 zqMI=Md%Bw-5st&2;5W~^1?o>qALP7JNqHe50QeIh8HP7AP&_a@&Te@K#5Qs`1M0kr zxRFqDq4Lri&LeYDn;Yjn<(okxQ~$@eAK3*X2p9LsyvkcxtfZnwOLYA^9~VAuqx!;@ z-OksUucroyKX+Y$@79%MMnkJTL`XWOAU+&zi7EJA$9<=-(>-jq?rg*sM{dCC={fs& zBg+bscG3#alPa!UYADH(7(`n8KNyg}vM)E9(p?o7x9xR96JayITpB0>BBWO2?dg883nS05tnj)Q7InAMo;h zuFaH<4KgdO3tBD(8lzM4mybU0LYcRsIR^i!h;a)K&~kIxP*xXeVDx6?u(W6wBy3S9q3o(?=fP zivROZGRMc@P?QxKLU@~ICM6}^YM_6O=ys0!oVDL|u>OPugz+@)UPcvGL(LoUr6D&5 zgVo@xYg0?s$kceNyrnDD{b#8@&w=8#joFFW+&!v6JbdYM4%|`cYerGlMuC9qLZ1ww z`k%c$d`8$K1>y;(UU=gr4H|`pX78V%Ewpi?M6}k+^9PBBqEY1lh_~Agxo=> z0u9q6=&EuX;~@Y}Ed^+q?|kLSY392F;!1%Ga4y6;p~;$r&CZ|W7&jBNJom2t7!`&j z_*q5it$rI<$8Vq@5YQXvdAC^_oLV)CnW1o2gRul>qbJB3}uoDlL z=&qBK?x;v`PTH&exX%fCc!47&nsUDxqvrPl9a9k6hD0LGG|aO5_9scayEd2O&c9Sz z=!c^5S8}f`Hkj=(^~?rD|6@gl{Ls}c>x zM`=d^WW;#5Xf>I~CM-SkSv4K*>uPX1TT!YSw@p_d2 zS{UCBZ_!ESOfA5PL zmLRc8KhHCBtdD;Dion_gtux}ItI3aWk`j;2u8vbu%nq~i;_qa5-aiWFA05z9mdhJt z5p{9GmL;l^ej)+=t{aTEuB1;r5nqTVvWq0$1he{S1+38hRu$|r|Eo|H+9bhmV2quO z{l_HFkB)F8`hh9>En($~lNnSQVf?PykWSw3d_iU5pAk?CyOYKB^=rLKg(dJ zJxlK|rHEs>!smU^H=e&{LB+F?gEofdD>EUzpsa1QYA><^+!K<=HK^bHDpQ`D)OSmq zESV_%as(3CTZ@P*%WKaGKDn%VsguM0e6$juZ)JXFp4+MUd)6^}rH->rxAKDQF?w4` z@A#!TCyoJp#wcu1x}u6;Q_Q5>ztH-D{Ka0de-IU7*DTuV47P0Q0t;$Ze7M7PRx4GWNgUmuVzTo)Wr&m-eYZ~rOk=~=q!>oR3q`H<@WG-2&t7y0gc;OfG3Y=(2|FJGRazeJv4Q zIqzlk0U2X24}j0Vn^JGc`%gj0L^=QN;`dAwl@J4Wk!Mj6s%2fjL}Fd2Shu_n%BEDd zYLM8B8l@ z%O@yn8fzs9Go6oifFnJNW@wULsd=}J&JNqooGGPEn{rsVr%!&@Kht%2tX?rh9-9J3 zaq%f>VLzU+^S><>n}D&ttuHFsf2orbB<)9J%g$jJ?VS!SB?aK#q$XO|)zu3M%MBQn z;C}CCX0X4LVFWRqx$y+;X2Jsnk5tU1a7dvwx!Txf^ax>?3*0r7=9QwT9CtD5Y;_L_ zaqvuq#-1ESmuogp{D8}nfd$+T`7;m>JkaY$1j+Ehw3CH5ho0IPr4JsG$OUls#vqiTUdX12Wh<9#f+W%0C`_ z5Rrlirs?`AwVOTzz`V;5WoRCis||PQp z5hqMRy0T)j~m39StBCC}dRCZb00LDUJ}Porf;uKvnCSINmK_yeKSB zLpx62^{XR&Uk8g$HWb?qf~Dc(Mt|=GTU{qD^E=RJoYHs~RK!bhlXc}#*^$t#aPR(* zO7z0hq*V+gY;MnIdhhNWpQyzE^hAj@lk7L(shrt3%Y~2OHeRCibDwo4B*A1x(LKeY zynx{!mU-mGrTdYOq{jW%k`0K_pPuY3oI`Gt5clgak#Qfud614i)m95_o6q^oah(=t z58(-#`g#&LFDu~A;tA~FM#1}?$S$GUOgei+u%v5U8*uX(w0V@sJP_ta)e!i0{+*XG zloX08L(DC2(+#Go@Ut&F`8u)>$v}O_piIzct*P6a2Sy~DLM>eFfkIl+|N0gdmxiy zQ+u|UL#GeB18ib9f)X?J&3}S!kAZQtm7`Y{a9z0f|J&$}4)L{ZDBjfzyX(J4s`8XI zACQI=*FcX(t(#qa#t0$E5rF3mKwnm|U@?RG>AMO$ro|jlkuxAkw+^tMl zACh)M4@bm(^#k`UftDFEk;EIhTG;>&pE-p?s*o&t3WPC^J4hFBVk0egQvU~7(W@w_ zlm2jXs@MsP-EoLg^Q$>#Pour9pTLnKrIO1DRA_BjKLI0!D1dW?BL4GTU~bkc{I!jx zKO~%nO|m!-W2oClDsaRidUK)r=gMueyS#`{(AF6BLK}AQyjz6TgemW%Yz9mA@199GQ zD+ua`=7Sr#1@o=nYMwz&*@I;JRRTM_&TQM zU@$mJxsRhOctBf zUd{~e&J@kJE2x@nf((F2@tp;;#I~*FKxDXml{_ak865VBx=4l`omsN-n}T$F&yfGXXQNf zW0!mVo)t~4@5iMTATEiJS<%iTJ$v(CZsU;19+)*+s}qraQ0&K-Q#T=J9Y{EhG6MR6 zS!jdq_r7?J+c_^+ot%nTg&`w-205Q^TDt{+xX!{2)U@C&ZjVW=>vAl>Tbkc^$tJ!^ zc=^Dsdfc=wxywJM2YWb^`_mrb?Z4t&8hK$gegCX0&ibhN?tE4$rF_44lf6Ls)WU#+ z0&RtM#%0a+ppCx;WUUPR@tA0AoSi`&$Z`Clnm-ZH9_&wAKT)>5667iQS&M6T=d}=mI-~PbXk?zfSU_5tsK!#Z@&`+o%46ARPz0hZ&7>oeB zu(NJw1`QGW$kMo%PL>)`*;e+9c4--#B6YXYt$~bwDD%gE&wIa>cUEtPXxU7Mw?l ztv)1;m}`m2InbKbTk&s+ssEZ^{J)>7@xME^2&3o*)?|Az5zw8%IztiSjI4A?$?a9J zbSq>Ne;zl&BLfs2?u#Ki59jismgeT;JVtYSbqzHm8Pm5&0B1$4{qI*F^}j!xK(EDp zE>J&YbRY^&(vvV-D-tMDc1yO>J!QveenBBb5IRsFN!TjAX{k_)`BTL^qZ6%-X%cK0J@UgTG{Mp8kW6^huGp(!bZER z(BlBig%L!;l$?7Hc`3zhWXual^hrIZp|x=LdS#k?#E51zgcd5hgm_h6UQc zGMubH+S1~35|`#6?jFXZ6l)4#tT1AL^;~}rFbg?kPqepHn9W4$@vK(28`Y zU%vZQ{)~eTSNHTKz{gJVv%4={-2Jb}P z$}rL@O-JXa6~3xEeROp@x+x&8EP9*h>p$tFsh5Mf2pdu4e&OBadZm>Cb2`$q(HlGh zP7ia&QZGz6NNYLiCfDod)mQT_TU(u>mLt-`73t(f_W;geDaR;#>$UYCse%Qv<>akq zRRwL<;RLX7$4NZ4hgi~n6(vOiPlOtL;eMpRvvJ1`E?-TT5FZ<|@)Ct=$z7ljfIs}6 z-qJLFjbqx5_y5ePO$F0!ni%X@+zN`T=}O3qu|Ip*Bv;;i(I^Tl0E8ph9^o0K*- z6ZQF6xuIqzp1TqN9Fcg`)P5p0l5x~&UA>sX_`eye8P%eht|k(=>WVF%NS8*G}J!TmW`!T!5=Fsh;kW!Dx98>o;8~Y!hCWT z8AHPGT_-d0lnn%Jr_sQphr|^;_Sdk>Y^^LZUorFY?n(;5KzrDqd zWLO=MlCb_$l-;!vx?mOrY+G9z06jZh!Cd`S{n1h_=z@<>HcT;(LZt7hQr&D-!i~vW zwb;-wEOdqgqIb)G10M_u4G3^B*6W9Xme^LCo=+)4Ce;i8oHd&Isilb$8O)9}7r!5L zbf~zV9-+eos+QK;fg{Gxr4Uue&Q_#g=Qnd}ep8KhOw8?*zZo#RekdduXxueiLs$dm zYqHX^JW2(_VA=$UqF4W8gKI>*D!z0mW8sA`aHBC;w&jeU@7AKHf3h!?t!%ib;DUK_~mE2E4;v4SHkqtzu!=w6|@@2AwZ!E46 zG53w#m32+mv2EM7ZQHhO+qP}nNyoN2c6Xc(J5D<9HO71L{D%8{S>NWEHLLbMYuBo( zCGsj*Ykqy`(aNIc{fT*g4qwMM?T@d57LijA`TCv5w$rema>bv)1(A2e^(j$?9ZKYv zi2cp$smO}$Xk!%c-+(QdZKj+uOCk$N$6i*ZU+CH(DYlTmOBzG&q<$NOHGj`V&+~s? z4pI2K)%Dcq=Nu^LE||7C7DK)j$VLpD%lRV7c$rHhf4WQY=vOea28vNiFDwDdJ>DYi*E(y55n z5u=hPcMDUIZ5vvc1Iq5#k;%LBSFwz1Bb0+A;;^D>!{VbC<6;L&fZx&3dFW*j#s3=( zja)*XT#UE#;4f8pUWR2T&2BERl;0qB9oj?aIf9^C_(xl``$51?$h4TyzX7(f6TPd5 z*qQ5_Pt>O3s}sr<{fR0sKLWfJv1;Zx)ij^^>>OR$_xlWv7qXA`ik4by&U+m#2ieLJ|cvbVX^&R7net z1G-!!LxVw*<{4UPIp(zCH=7M!pxCF|$!X0S6(@=bE(1EE4uE6q+vYo9`ML*`H2rabLVE>=0o;yX`ScqiNmcU-vWh6h|0hWm0w(A3E)Ft(Qt_* zE{LxZi)=SM6+vvcTQl9*G#H%Ku4}<(OJ2l9_~%LkL*fd}yT)AQWWck*N05~o#Atap z`1bI}JH{pwz)|zVQAzW&&-NX`iCz6tK{kSx&&R)R+sdNGC;I(;FDd4o2ap7sF>4ZM z?OVBwr1TB`ngTV>YJfCxFH9DTc!*>HmYw@grLjV2PiKj zm;L!BXEj=EI~jiS<`Skv+U8dOj(J2y`tdc&#uN|hTG~STs5uDW1J>XtSZyrY(RX9k z=&`UsdaRSN%9p3wMvrwTA0^;$xAf0_clG+2mbDYTL_-@Vba#~{6Gu>B*xSnz3_C-N z!wP_d_uzA2WnhW6hA~&$vosQ7!hPtNz=d1eP=OId+@8e7`+AC39M+ENaXC|7rcWW3 znXzwb>GB&hmXdZMQVtF2J71T0GbZEs>NF~hkMkFr&#_5+0v2m07nq-RtIpb~?n{-( z?q=Sfps1zJc(~JnQ4Z}-U%f*dG%YY^6jz zC3eI4n+BgYfp351!f>7!4C!EqDwxx0O=t2X@UADj$zw|M-({F2~>b&rX`#vbNgY*4?>hhA<7^`8wJl?CV#dv$Hqi zMY$E*Qr1_Gl^$(6Nz|wq8Kx=^p1fg0S#8S=OniB=^ggafBQ!V~{ea7H3od21dvB9I z(;aSr-#cnZ!|k zS#8ZD-ZPN89rH)S+Tt5fY`*uIjoJa{s^PK<4r^Hn@PxEBwo|#QCw0I{Zj|u?F?cOb zB`(~OW&UzKdoj_zu@~BR!PS3eiy{$xFd?ZJ{c9usD;fCzzk<^47#EPZ@ys`Tx|O_4 zZB`ELc$BgJFaqKUp0>#VwxU!a>J~VsR{Kl_>u%Ii(h%_AP zBKS|;g!*evDZ*2(2Y|mIZ7c@{Pt1qg`C3|3u|2i1@8|W=iei*oQ*|eKP!X!6lei{h z*@uiS!G+;9Q!p_8`x7TfvZ8f8D=UKr;t7KM&PQcTQrkJBF8KQ$E-PKNDhr}8t<3m7Pf3h|uX^|u zeAN1jNLRlY&WO3ICIRj%ta3i!2;#9bnBqn&FR}o2%*Ei7JRXs)P0G&rxe7r&n*Rkd_U6idoa zA$87s0dwcKxGY!Fy?1Za;IjHwBQgM-v69eZ-u#l?98fr1A{K}~Pa|3*$G9Er3b!?o1Ef39`KTL;M?jxeKsa+6wj;M*@Rr))m=Kp?|pAg!fS1nvezX@#z=ms z&N_liv59)Ts|xIY2$laz}Rbvw!DkE`CFFrrdDr<*IuoMP;Gq%;1a8$J7xwlIb$ z)+Lp!tpGpA3VCe6u0^xzq|j#># z7(GYn>Q!~OUlvCcWsx|Ht7IbYeMix5C=j?JTYMFjXw#4yEM|996UKp@^IPYtYKGsv zFkO%oZuLBYujP*AA1l$11XWig<(I%yXr1!n=tlz}$VJ)+h8r?k954l>11jjIoows9 zg5Yqm)Y#wO?^jRAoa~1pP)6{`?BZ|7d~nY0YF;HMp}68WgCspSc&6;?-dXMISC$E+ z2^_tAcq!Jjil*aUhbO*n`QII>ER$#}=@CES9BBL@_+$~CM|%Ly|Jrht5iO=06LJ7A z=AfJ_FSrYRh*TS?$V-Apb}GlUXX{ZJ)wn}6f(QFkNNwF8L9*$r)1yaNA^KNAuSq31 zDqE2tz+WWK^$07$>WaD98%hVv3JzARw;)o@vP12r|JD9y+zBH{8S=_8m<4l2dbobq|CGmde4H)V>&<~OB>l3;lAfr)TVRhcr7~aOGS?p< zTXr%WTOS^K(}pRU%chVl%Q zoPr%!`GCp{1UMh&Jo8!(5{?vM{HM1kFz-OU9{MpH+Np(%9lu?g4>|Wo0xw5M<-UKR zis6^8%(M1XS~Bp{_dMZW$CXR7(g&H6Jvu!oP@P2ome;OP&v9xx+F~u{Y2A3d34fZE z4^fKO52U9|mYz8cGEU-wnnIKs84G?UgZR;X=h+xeB}FJnWiNM!^)Qc%jVuU-a0#AB4KcZKlCF}3im+kZ z*TXCnWAJ@0Q;Wmi{Ce5Z9h_Js{p%^4xmxl;AG7n5Z;n8}S=h^@o;fjjwPZ>rJK!Ls ztT>EUu=pN-5zF~+i1{H3gzE4q9ws1uB)lq`mo!((c$uHdIZam(_?yT~#_F`6r+Gp} zVbr|~n|gwD<6}sjm(MF7m%Q{D;TF6bk>tYICO{J+iK6+ zd<^28NK+|-&B80GY!HJ(Eex-?ab$KKJ2o}IIU3p?$?Q`(-sbt*>!WpTpo_+N1fu;7 z062OQ+u8Or^I4s!$aJUz+ZK9w_)*jEZ~4{&O2k&}YhKMmI=3XA*iG?92BWk;Ny$@h zy07_$JQLEu%Qa39#>c+v6TI(MFM^-|SynCe~EXmURxDHeA6s}>5MB=b_BBvV)lkD^Uch*XG$)^xoUf*;18l)U_ zHHUJXE?q9u5q<9in0`fWa#!^=Q|osjHNP%m+-o0~w`{IK)!4&k(HnK{$aTElmqR7C zwxlc^g$&nke&@$1UOAbQm2GD2@Is=(7UT+!YGdWRleuAUv4^O+udPLRmZ8~sp4?Ea znK~mx`7}CvV*?>22!GPRF|TY$4up<)1MEu2dT*Z<%<2k`s~)!u;yeB*x_AQn(r?BsXHW>kN35lzrRzQBBs#x4WUU@?+5bUS zzDN;dMIiebM&cbNV{GY(kQ3_D57&Ox;7@!Vo)Ivzuf>}6Lvb4cji8)^OQC*!>l4ku zvPwSsfk^WgI`PjV^kfMX`3;f~^3YHd-Wc!>q+Xjt8h)|T+Cyv0iSmE>p3TL3@u{ev zQ9rqB-jNV-ciFI{jzJagg!IC;Yp8TaFo8n{)kku-;xHtyGht_%qK zB2w4pkjes^Rn>&8XPYjGH{ok{?IP4k94jx2;P z3B{PvbFrSK?JbkY)7|7dS9v*5D4y^h%}vp`3(PP@natiV0`+B)Z`rV#&&4NwKVk z0i*N4XwApHm^Izk++A3pJ*II<1Nao}*UMR}=|L;F@NxNfxBH)YOsC`|ShrniH2@RU znQi)alXRiJh_2V+ViJYJ?`?<)VO$)?6sQr~iM$YPPJw>UbEvfrNU}ec_0B5n=Skxn zTv=y14AW~c$Z^Td90+>%$-%Cgk)1-4HW`KNtbg3P{bw;Sc@+ea@0Y@fZ`HlQ$o9P- zlXRrN$WYslqpu1>op(1|!Z_IR?ziO=JEa~*z6b?Zk-T1F(a#VcVbcCmAl9=3(@R*z zHh@IR+D)6tOCm=ThydtAAi3bp0VGcj!KefOXRIo6{~bd;?GvL9y1K;i9@me-sM?oQ z!;6~g0}>sYqqSopKealvg`gJBbY`kyV>0)56F{H;wPlmoC77R5O#4GEK{2*E|0U4VM*;Ia)t4-ZI+z5W;_hAtmyy zBJ)d%;c-6f4!`G6nc`0Uk}n|^vU7}v#aWzr9un0=3pfIAk_MyWXJ&%O?29yT4$kCg zQPMbDJJ@&(upeh>nW!+t+4v&bZqO4SBm@W?H97&llDoju`Y2D`l1y9ppz3t=4f1fP6@K1qu26?UYbO4;??5d{qqw=Y^ zdf+QR7y}YeDRx|bJb5g?p7!oYD-bFJksXRa?n`YMmko92^L%IEu=2XkNz$x1^{557Zt9tN(a?VWcJSMv7XWS7F8s?(*pF4&65N-0TPIHFhWXJ_Y9RpZlDau#&-1>TKaRP2y?pbV3lCfKA)yVq zd3U&I3k9Lcv_EHI0^%qyz$XVHrAU-{-e>x!lY#c!6zuHTmQmI| z1zv1aaMw*7`(KS(77LH5-G5cPPF*gJL{O1W!Lwx!&l12yPSdS+x)Htr9L&b-re7sy zgA4j5_?#{MQByI^&pJoGN@0IqJdH*sC6qy4>kYB7n}jY$HRgXhaFu|8N9F~JNMPSC zayariptAyS_?);I88&E$kc@Dt43q_PCi*;ni8NW#92?zaRVggaU)38#f^dBBxBlk6 zY^(apc5l(3tDP35h?BhOxL@t#|9)@G)r9AGxHc3H4LR)1{de69oWm3JA|IijOjz#9 z`4m=nM)U06MmsW&lA{p~)HEk;c4CK!&$N>IV;&yoT3XHj&8NL!2M1zcJ%CW}?*%nG z)6y$y??!62&ym;PCbRj-yAAM?&kz0!zGPhDwi>c4dNigD?+`_~DiV2`oeG(tJqy(c zuq%cAcyh_Tv3YkOe>%`7+^z6AZ*>DXka5{n$PYelB4p4_u9ndVwSV1bWl;euMC725 ziYl`u*ZF`lt?AtRA5;p!@9XZSxxWL>2CB@$31A+83}3Um1-nqfnEMoSgBs@FQ6TQZ zZ{>PG;1GOK*fo2RwPuAAjmMf#)=$D5o~(yc+o%D2Dsp-r63nnviT$K#f@8y;@osgS zy!%$P2I$iETUiVa#d~@6mgUG&g3BI6IkE@A<--lRWghUjAX2l8nbNa%{Q-Qak!uWq zowDEA%jM6Q%BT7XK5X>UkvLKRShXUtw`w>SFeb^F(k(~e3cg%$xL%kkb1|-TE$5v zT53M8pi8~*;qbUSuh2|{5pQ~7p0eNv;4|ZDeAX{Otl{cR|7ZIPR!pYDlWv;sT*?wW z4gb9vs-Gkpe{Bn67sW{MuDACGUp4~w9GB+$%O(w5XAR_Ia}7H{A1rqu$PmJ5I?!R0 zz-gQU#+kxkQZZgFqPd*pb+Rt|sDJ0U+C_YK_yvw3t;Vxqn!2eL{KZB>?V0+@@=~A` zviSf$Jf3FpNIezF7KC-tgD>Y;c?nOBQE|7@B5cXb$?qMS#ytI-qOWH=DL&DDsEZY# zl=$M-t6>YJ+FDv(-Jol)-{;+%*eAUQ1m?NOX~g>k>FMUQ2dV;{UoE3|m_J@BbZAFN zm2Wd;61`6OEyz0hc~+P=Ke{(iEL;oFYXshqBhzfl0et#i%I?4lWyh#YkWK9+=Oat~ zrv@H1Owt8*r_TylCLZAT-yUcuH6JH881`)H`eD14T>n9U&|~jwNQVX&`qq4(TfOy; zaTI3#KxFHlEkWdp$uZG{FtA@3xzx#uK6u%<)727`Pfo`jg+~E{O%R?vqmwE>km3$; z9^2O&+-Ufho^A}_^IRIMm7Y!%=xTPMnd2vPq?kM@B{6i7%Wod+vL#_zDc@M&i@KlC z9emQ2(#?4M>aW43zulxr++4e3jjXB{S8Wr20sTS zpg!5xz#LFEUanBAnErFlz4>`p6=Gi zM8qe6SSAtkJLp1T;&uk|>7R3QtT%YU&*Sq=^(n*V%P83_iZk{DEb$_PWsxrz!c zyZ_@*mt4>6;nRb=^FIIgr}vCCg)aH+q|~cfKC!FTb`5pybiL~ut|eY0B=6(KeW#_L z!^so?r(AD{HjF~x*3ANY02&q*)-aG*BT|);FM2wMZ57kL#c9AAL>sG7(8e{YMX_^_ zFXMtM0O+aeGCOWdc~V7a`TP5Q8}G5Dj#jID;<<8hrk%VL6Ezk3mQn}e%4=t?1M>&Y zDP0DqwaDkj@B#I`y9Xfb?|z3I9H*4(0gfL$0l z7=GZ_X}bmitUA~f1tlFA8#$K{hfFZRm^jZC1lG-MQ^&y~cJR(^@*4%obCfPRr3F8uz#=&o}D4Z98t_ZJqrupZO+lQYw%>8>Se zW~jH4TwzG(?s&Oa3mUo5tG&%Sj84A}|Eq@9y0*CUzJI^Qmy_+p;kyqyVUx?7|KDDw z^%d;rMWXmo@2*H}`|^vwTr&5UP%TZ>2_)hQaITtHfI2g(M4TY`e4H8frV^$nN1ynj zhh=@nJwTtA(AWdEUkoyP5ljr7a(MzxJsjDx4FbtFD}2k!>@R#W{>%F^8_IsW4nXpV z)#>D?zO%+*<3C$oky^{Ne}MGH0QAuWeoug)ten;ZO}ym{Vs-~biZ#h%1vLODu-tQsJsL!XbOexv_&T5`W z87ZewU154pQF%IQ?F>OqQFvHqk4#NH8F!mBiW-40OJ7QiLKKCCvpje2I^x{3QFac% zhxi7Gd4rBva*Mgve_8{Tosr4MbG@EfZ@k!Ir%fSD3{r}Vs!gy^{bbMU%dLAW-8Y=* zJ%!S#2!h3L_KYJ>Tyu-85*c?4y$U zOrgG$w}>500T)_8_%C?(3>I7Y%EN89H_6H5F>#cKNK^DkeaFwF8AF<&>yjRy;^0QO zXAG#1syklcA-Ag6?1f-NyS2*78wb4miD%Xh`_U7l%g@Sj*cV6J(j?%D_Fw1ta7E%o zfOtMJnp(OAU7^1+OY-M_X2rm960L=}-Gja;67c0{SDm~(_#utLkc&?NbH#)}x1R$g zs89W(P$`PS$@VXM6NVrcfa7|O2^p>f3+Jlhsh0n0o?1s*o4Og1>~AwKNfAVU=8qx# z<#5)S>eF@#(JiBaJu<16GwI8;&DMB*B03bIz4u**Po7VJ1an0Vu_X~otsh*AfL83| zj(FRQmi(?j#<|A4?0lhSXV?07*>Sz+$~PJ*$0@bCRWMGb1bB${)mbCP`2)a*YK+dT zN1bx;`JP=)2k|;8zGWh8+ZZHF)3r^`z~M4{I6P#xa7w6?SkWFv_!0yy*@P~13jyrB zAh0WBv6ngYyH9gF>w5OJ0Q)3;`OFK|BJ;*`u^^6YHW_zn&n1#l6qeW$u?(1~U_o+f zOo1}f*I?GwZzvbJqd=*Syge4i(qH5UAfEHRcFa%k*+iiK(ZJ{3OM648AVEULdhsr! zH-$Tc;*ec7477SQ;ySX?;cY*nYEMubhfVcq@xnp3*MM#P78g7R*ae{$U;T9`I7L^B zeG7ePrY!-#mXgF=qkDzNM7)J+ZVZD{_K+Gd4$ZQUEKgz3IU~Wv9}}8hE-CHDWB_x8 z>h_IO_*9sL7H378UMF1AWdXlX_$bC!HhgO(z@brNJ@wcQq+uqkOczn7U))|t$0>+c zhz(ll`KHL&&2Z0q<0vHjE$qdO#; zg=t7(!?3epW}^q1Pg0s1XZ{5*ZMb>a2%K&eJmZk;S{}IhZA&CXKqzH208tHq6LP*a z(t=ePof>my8q+U?kgnstvBwXrJ>KN#a!eV87TW5Xts|&VZVJ)WA3sVhgy8|YJ_pP? zcOSVjR+-rKi~+#;Ut65Sw=Fr^6WDvo4Xv_YR~n`XHD{EjQpNRmkip_8pZApm{_&cL z(X8p*K1rAOb*b(wkKAW_vA7s){mrjQEAE*97z7~z)4ovWD)4!)2KlQ$0e(qPP&U0` zk#D;tcJSc3Y*e3M9ov*z-Fu3iA+i&P;I$EC=;{usMURAr`J(OpO$ zLC`eWS^;_9EhRo}d*+@jF>;~D0yF?VJ~~N32w}J)eQ|ARD|Zu_Mi1V+VWc=B4+W1G z8zscZE9URo+4=pu5G$L`r2We_Y>zo!oL0rxjG)-*Zlmz2Zx=EQi~~!yn|h zcf+E1K}t}JSLHkXDOrWX8Od;+o${COS@4D6Xc+j*a{T5tYTkrp3GE<%inlI#jAI;P15Ekrlm_oVizj>toh|?^BWR*MIZnIF1$wzwl5yu{tev zpkg^!_MBO$9HLups78E5T>tCR?ocl4sa{?)FmP6ekTj)mX-7o%W?+L_Rfd1Qa~I53PxaD958J^Ae)eBpKQ$#J(g&mrk1 z30CAds&^AazaER*lh?zNs_(vIy>k~_x>d4yGuh6IT&l9b;~_zn0@ogqNkzF}UyRfg zq;1lO&vz`b4whmM!Eo;;NonqZn0nnS^NOZZDb0ilYd{>%S6{BD*K-*;b1-U7%@K%v z@bwve+;oluFD90G`pVLsrF;IILZAw=v=8K&LWg3H;4Svw?PHqXNSh>WuC)I(1<+?K z`@+mi4~hBQ-GLjrQBb+uUABlhyOQlzZE6+47DV9uS(o&(VcDrIL}Q;9+in*u6F>L< z?8$Gq#sP%I_CuHjz$c>yRqX~ld+}sSkef#ZVtXVn$ZaOpF|JlAphZHL#-GqniN<^J zcJz$UT}C!-gevSjYQT6|eXfak3j-p4RU;0-N3D9m*z@g~t{O`@p}JqTg|ao@iqd;x z%!G5)+Fczbo;sD?F01#iaAqUjV!xsDt#*)VCYc2`D-T7HLF{qNhXDWw(Uj-_4^`Zy zu!r=TSTj$Ypp2vLJlF7EI8RGjsdTA-=8$8&MV-77wFP2OI+&Y1%tp*6cF@?<2Jg3P z1U|?gd;pH5y?~^!^X7}eJvqTjHpi){c@~gS6;JP(6|Z?zBKijJazwj8nm=B$@^zHe zwHs2#gb{3PkdY&k}J1Jgb~J+TPFRY8^H8+NAl?C0U|wlVmZ8C;LAbs?%>> zI$C0SLNVojc0jjP9bctHWu$VF9+n_s|0B@mCk6}rhZ+XZdG~a5Ur{$x+o`HVkmqER z-Ru@P+fCKN-)%Y{A-X2-?Bz6tKiTxsp=m}ghP`nU`&BO?Wtd%0=!>;uR}gm`di z0Yb@=Knsc*hG^g2cOQq9hEvX2i)4}he|2%4#Vw3S_GoOKus2Br0!VSv?`c#4{aJBthoSAtH{F3!u=Mc9H20G)#uWJlfaH~8OUe3a|L7)!gtOz&xX z%m=f@masFn-bR3QDuv`jKQkUnv|KWzEC#Snk};nUZ%L;ApGr{j3MQZ}x- zi9@{#Hjf10>}*^i`g>?#6xT)J3f(*WPmbu!6pAOzs>K(Zn?& zX7U`M_}%khl2PhWpr~`tvK29AeD4oq9zs*{Yl;oa7bK)oZgvjXK!$&x2J2tM!CLQ6 zZ)&je~b5p}eL5cW`erP8<+?e`jI81UAMvWz!Z$ERq5-He`Yy#VGnP|5lSH{+WS*M=b!HQqfpR%SIu945u5?qAFiH>7YnTRUBg1x-We8C ziB~OST{A0RESQWWv-FoeFJ^>3z!H3Ag45|mCg&7(3--;|1PsUEfqIA3YEzlA=T*&X z(?*qIggF+Zdu>PX;3^3sb;d{A9^#7XKNPRiMT-;3+Na<9RoXv%2DB$he^67Bb$Zc2 zFz7$p;vnm~_M7CnE>0_SE|A|bUY8l9r@VfEqt0K!{WVah5(IvX={E5fwrUA0R8Rou ze01+$cR}dgZ`31xnkO=au0$V$4US3IBxd7~J3nU$LkzO0Lk$6L<{`vPTZLfaenrz1 zSzj<|c7;k@js9qeFb%*Fy|@A{gRf9ww;B*et33pY>B`)l7FYLDh`wK@K@ zL;u*0sove$ZB;CS56Q%q%v^8Rc{|K5Rg^)70VcIwL%Z4&X59r<2=Z4E0FFD=EUF8- z^B@z}paW_sxd@f|Ik51}0!tf4aAOgkTNTCIoz}y1Ix{Vr7&4Xh`TgHqOj|SWbjZBbYTD-={bh=xKCZptXoHL zCy6u5x&&SFW3D$~2~N`Uoe*DGc0uT_O+|ljQ2aN=Ol9{xOm$V+WSo{86tp4Oy@a*? zE&$FxXZn&FU;ZBH%kzQCVe_0V-7@-MaCZbkFaNU$hjP8Sb2(L;du%rY$C&P*&(o=o zYh-|h$mB`HZ=m#vc093efZsuhe>}@AF{91;K$oAY6ltx0)GBJxB8bbxa2K$zuHE&l>^>$UVi5+ z4TbSAw+w+-waYcsqKu)Byxd#8r!{{BA=MdiP8K$%}kXa<*p$qIy1AjJKMP)ai|f@6Sg0L82uJT{1Z^^^;3 zf5*1hWONZ&g7tioNsDO!cJ`xDLRvap2j~pM#5BEJ2x2nF&|Wv?V#iUk5kFfq6ulsy zg{wcnKAf%sU$q3k#KyL(bMBc4BM)uFL9|2(6b;&n<4x^)|Hk4Dz!9w)+u~wqy7_#i zec=Nmt_*K0xVI~fV2ilCm0wQTdT3V$PD$M9OkobFQ?~A>7UDK%n$H*kf7!m*5C7GP zPOSyNK`z!uT9;8kV`G6n>(DAFS-ZM8!5k={+KBM@t%zaagIE9OAyAJ3jYm!}4#0^p zl`UNcA}YP9NVm(IGt1--E;X=-h7iwq(sO*DmOhA&5R>=ApS}ZcR8C5VotqJATl{Ay zW96{#*>7M(Kpv9_z=7i*gN{Igm5sRO`=^R$Ul8fuKtp3Fz-Nl!fD|r3PlW(3J`ii& zz%L;osR9Yl=k+rnTZ596VO#?Kr?E#uMCm0?e6WmS-Q8OILpFb%i`S4`Nl`+mkrWj{2N;35~g9nFa2N)?C z6>4AnD!?uVIsav2kXOBZ)eV;OG9J6vbJ-GpFu8y9(b+d=zJ~G46tPe&MB!m|$Zzp0 zHVo``6vo+irLrn^j$|7(9c_KT*-Sl>754 z4MX-Ga_JH53F6UeAP2#<4s8gJdh=Uj5sJFma%gz1ac`TUU2n}4h3sx{q} z3}2On*bu>p&S2oK{_;Q*rm?EcIUhFM@zi5${1Y-7loD@K^h3RGZg`oJJT#SYJ^|y~ z@0YtFEPT;4DIW_m?-I+U=2EMNb1GQf)}JzCH-wPjyNp}v27;vB5{3D(F2DXdj7s(Y z?Y-mTcB1tkCya_IYX#^W)GqQN*DT6wWQ)tfEVtK9YOk%n%14ldpX&wPDc||WTK}gS zOXj@AVya^^5M2QW+&rO5e(WN_I31Htc@C9$tQ`APlM9|Uhg$PrPriBx}EpU#n2H%^~zCws~zkq3*&M0fyKYbEus$@fFA_6 zv!Ty*2#A~0KT$-T{taweNMrK*``l{RlpFG;x!-W3CjGccs$zC^2%X#mR;C}J( zf7hA&AMD2!K*vHQIDvQH;hE{!bQ70gGzJe3Jd!*O#=pg4fXo=Ux=@Mw#@5=)2V9^+ zw4;y!zk8LbR}U3g9LmnD0OE&u2xEc2ri2UfPeNeKh0~mhT+y#}I#o5kW3L{tSMKO! z9*tNEI@Cd()6~I_A|}gU((gbR8TJI)PFhrjmG>|n0Gu7*h`4rIw;wf$YrV?;n(#qK z9a*e=J2XvmDc9W%&__CW zM}x_d46BgwMRAJDDlF$6M%+qeij<1$9j!)rR)}@|7CF;+iK;}CN!fG$1EIhl=1)K7 zc7e2e^TgYdgZ##KJPQlQ**b8etLwWzE0j(Ou(lOGr0@TzUhA~}bAfy6y+;C^KSMI1 z4A*gbAUX3p-YcMa#=gqdMc4yWZ(szSiUokf4FfL8{=DhQY2$rCZjD{ey>-rJ8&d~i@2{b%KUm{Z=p1n#SAbCb@GeFlp3ZPFAg%3S?JzT2p z0``O&n2$X~SXZxto0r?jNT^oSXcjq7t)U_?xwQm=WXx{z zs53EG(($2F$_hlO^)JfG3U-#~V=MRVTN==Bo6dij@A#`(ZjCM2TN?by{a)*rmm0m6 z6R4=B_}hDY$f^^$cmV*1GiBXsbOsjpzxSMC5d2K+Tb@z&Z5z~*seixoS9AOUDE$x0 zEzflyrb%f{&xXKxPfd-{=ae-Z%Fx&^ni%iY?>bMp(zz}4H-s@Hlk<-4v;y>g?9?C3 zAkAq{#$`w9ipk{@7QK?SEry*lzdJN6-#!#k$YDlru(H)xA?-ShB}MCh1N^Qi*l>y4 zAD&fN4I+A774{?S#C3$iu(BVMj#2XIvkG4G-+p^<3J%wtk??YlM8>%8;xvPImnS$f zWk=v}M%vhS{e1EfeI9JgEEtBcC+=#};SW>w8#sgHPmfyk`cg2EET{kyNub*SmT){$ zt9?*b=hUpdre@Qw)iS7+>4OwwD@%WXK8ykjE);W8mZaz`m+NC9r6jAwN_c1%U>nO$ zHe~m<$RAJO^JS&f&QHc10;{@0du((KyqT}eZg zI>Cfh^Q_P&GB-29b2JcJy*1{%Bs+?_Kyl@=EBo~FGrcMVviOAHmd&zJ6$@8;6`#&z zVI0&LfI$pu8!YL}QdN$OF2;sNJ_BrW&mv7+I4QMOND>Cxhx$f7lmnzNE{$u|o!3@BW z@PggW0NOZ~Xz)$SNSPpjOr_<3&u_8|?un*TscZLuO$qg1_FF*-!3B-8O)MsHq6|re zUc`;_!K8Ah$bNbp0@&5g(Of674TX2d{gd*Luy18Mzed{?DR6^TASU27P--I@Ps`}8 zv{;Y{F{?a0jq~6v(!(xba^=|g-qBG1Ai_i)fCJPJnW(J%Pm)t&ttE7z;J-$yv*NbO zE9CV5u9$dL?bR~%Xap26g(_s_a zo}x&rrR)O00nhSa7<^*FJHWtpg9+{VyPg@CqmV3SKTD)S^Y4f^GH34AGa`x2&PRn@ zvnHRgm@crlFSj%K2|3G-IaVVdE)Sq{XoEYVI6G@mD5kHHwzfi&+1mE%4|wDhkTE=n z+D|_ZAW)hbj0xwx5hU&1E&-}So;r)5zMuRAL}w9O#j z&uIn>fe2?^&5;+=#5MxgZ!Q=i=Wz~=4a#lCS!RrJWSmJ@rFfYl_*U0|cpBvl`wv81 zDb)=6?KEYlpzw^wUa{{wB4_Ax zRh#8WMm$e|LPaSxY#Rn82>~1syH((AaBJ zaw}>@r1WOYQad`Ep)M?dW|8b8So{1hDw2j!wb<$H@#inhWXsxSLUbXAzxQKr&ETe) zc+YOJUMDruV&m?dfz>5&V$-7`LBSqCr`O<|Q%zV^xr~ z$Lr4eUqJ+&-_YpoBaj%N!K0r zmy0r@$HFwG2AOAC$P;u;=E{#-l1f%*Q@P)DcKpu*C&e^nlle@DIXF@sqmnLs*AQcQ z7)Jn{;h0EG{#q8vz}QBgBC%1Rw*2-uyhcgliC=Qwb}0ffuL@fZgRkt|8m9ieW&$*j zCl7;B>XXn}|J}LWIhu-gc?7VF?|@q1@5>Y)=2gj4s#$%W3){t4sAoknMw*xH(Zt16 z=pyO;fpR1=kXbF$+gwph(XZS)Q&-|Vzl}O!hu{WjKLDQuB+$J}mnaI5Ax+WMI`fM_ zof{Co?F&UOseb6OC35E0T5W^ZaCNLX7@mk@7*+h3-`DTMNV85Q&!DDXh_m?L^Zk?- zf-@W&r(&mx$RF~s_JWh`sHw=W*SsEB6Vfl)uDlDNg^3T_e$DoNESNOlg@;wR(}8_la+Z97oTu?5n;E?_ zou`jw3h-A%G)&G_W6&e1a<s zVxPgNV75j=76wPC1U58?x5IH-fL)eile6dPxi!jYcx(XzEkvBl0jv-c8Y#swxp%Q( zk_;LWD8$LU(+PQ&61qwUTEFMQm4dc~{6tR6gc?t(S)7Ccd^oLN#s0f+3+!JdHYLF( zHycxt1BeYpAY7stNs@yJ5cup2)+Mt|GS@-lY=2z_nXo|Mma*bKqU+>ZdI4n~mE-|{ z4-G?fI7d+z=Exk4rHJ$*wISz%l5eC%B5$K%R+`D#@E$JXUKPXpR7WB{N4wPooeU!!)OQv>9`WPI{19(+e6 zk}IJOGBmAj+mC)lO`F6~(IVml7*z8f zqEjCE_M!XN8r?1@Cac_rU;jy3>qN>{47@OMv2-cuug3zOrntA^Cjx2dW*v)hdc&vz z!h`sI>c#(K?i;%+eV%Azb7I@JXJXr#*tTs5iGqESOZQHhWe|N2O?)?h?SN(3U z-Mi{Jr@N}UY8py~wFH2p?PmX`nC7d${XRZDx^`GCZ11~rQe>7L@8{1&O(Td`jyu%l zwOk|mXtqayvGB$J(4Sc6;;S2ieH`)Qg)wLw3xH!uEQhkx^Yn$ihJ4QO?fU_GlejvM zh}ZR_se8k;5ZRCW&3byhjl&Ow*;FqN^0{#Jy5@E_RWhpSA@JYpX+LU!@0T&k^(!Fd zmU@&KQ2z9@=Go05{6d^8tei9Y5tMi>=~Rw}8cxQ{WkU|FAe`2c+kPf=WW-2+W(d+S z5U)22j#t46@MnvvD?jNTN$AP^=Rgi^<)9toV4hULVivyoCJivZhp|H}r+^U1AIiuM zEdfVY(2MaFS{zB^)t-K3p_ccHNazLtoZ4+1M(siy)ZSq@XS}$qLhf%~XJM}3t9U%@ z#|!0qr%7jiRJ6mcVNhAM>`*;FQ;qY2t;;NHt=`F9Qs4?#z60y0`u~l2edKBCwLU!ZDBPP*~7NZPrG5vz0yo{^WTE}?QjfpS4 z1;%M(;D%zcbcU(}oKd~I>?~L%qIXGF5g;*xYgmp{)w>;LA7>n05Av%QnbLY#b8is; zJcbd9*B*7thV87k58fdH>sxB4Ye0&TU&Z5#5-{t8;fQ{rMpqo~7e7dq=Q?|)jprvn zVNJ#7<2!lN-JSQnPzq`|OyG1AceIX=G3!Lfa;47#>>jhSIBv5|LwbqcP8SX0Q5jvz zzN+v_#QC0nZ*%`nW}xt-NJ~Wo=|r1RbTVu>u0E9r-j!E##ZZbCKl>}{q9_J{lfkw$ zM`Od2HDd%ey46C0h&%(5yKO0hDdUU2^X}`<#DK)&ksja6Px7;hvx2B(eSYdbH$!81 z8;3*_;+LvUH}Ln_1bMyLAr%kP&EYZRCwHZAq7=?-am6#ubb{6(BOv~3jjM%oLoCzwD(- zO%+-cr&w9s0SRV12}1L_T_#5rfTP7|9lQxyI}A*URoGMRgeI5DlsDR+YzEjw@tgqaySu` zpeo}uUQf)jZXL7KC=jPwDqjnXqbIS^ZL|)0AQfXaF&X?$DV!#Opyar)9)3Xa_y#fr zl2=ahR@$w=!G2~EgY*Y^q@pfXZAQe!YCHXJfIfsQJV~^>E3rbLGAu%N_j6ig+!l}; zwH@WWx=mf18R)&k4GI){&Iv5IzX$ z|GPuVzh6g;qURmUuV3P->e_6`tYSAq)XtAX0LmPSIJ0qeEbTY4@^AP@V4TTr){Sko zu8^5NJTEX#auL-#k?q>xuG(adq7<4$AF;fLmx)x6dg>A>hqe=o_mzstM{i7fE>5*n ziVR+1V2sd2e0ddgnN=}}oeSY~>(+9zTZKY;IFivJJ(PYT)*8^GQsN;&2EC8nk7X*tTeo*+Svv02k zZNfUbq_My-kl-*`?;oVRJ7~U$*uhe{AZ(^Tj~Pk{&(QL5cuJv`Aq*`h4QV0;-cP#~ zfXs?gK3wTk zL;|4r1e)krjP1*oO?fE*KBjK=fkDrV4W42!EksS#^*?#UB#KU`ShyD`L5U2DiN;ew zpp}c_JQpz)9Ps0X>|dnJJB(|nA1uCdWIPNC`GIvZv1h8jsb?u5n-vPX)s}}@ynzVP_Tu<8QIlL%WCNk`IqX(1)ZOCU{P|~fa>y$ zlB4!WtReXx7|(RfY>x6X{_9;=5{L;2o662hGkxKl!0}BsIzm45EUSaghF{&`$F&IY z0rG7f%Z#ug!`(XlaX?MjDHcq$^{5xHA1r{@|IBi~57KQ~fF~FCm)^THk9~@V|GUS6 zrZm#Z7!mzs<2OTU7CCW*a&y?62y^v59v9b#z{N}pe(0&<#H5+Zl`Wm2`$b8`K#rP2m>T`xVBuOG z#lMCGNOps@02~Y+T%T_X${jH4D_V?lO%ZmOt9d3W4Cvf`SHq~&v1q4IwsP^mcH-@R z_@jfOz|>@1=AouOpOmtAMejQJ8yo@8nfhMIYy15ICAKLgOxe(A-u&5Qp0gAQS3R%@WqIT$-{g7C>i0s=kwXC%`qyt2snwxIXvq4< zU+9rZP8G?t%DGj;`R0_p$k4~*eYK62CT!^6TBh&;PWypB)?!As&UJcgtapgRFU#NU z)Lnpm;qcLd4jwR_G6utaQ`u;oaa%)GBT8FpVp`t{d)ZrM{i7)L(J10*f_|@`%OPY=oI&&!8Itq=m{z0DWex z@;xlVpu!Wb4GKxK7#KE=w<$QWhh&#kD8b9`!hv~^S+KXEJ;(#) z=3`Yy`f>e>%GBUkd-kpF)Jfro!;TDmJ>vXbn3ZS@>;s5{ zHrfT}od7-s9qUd_D59GGwalUsc07%O!zrplQN_S@qsO8AfLvMcLHfZe62>zDt7CHa zign>iJPJEp&T_p(t~e+5o1jS13!rly6gxXT$z@4i2Y6GY z#z|qz_?^HpA4i27wW+Z0Q0EavZ}uD3nAD#3dze^KRT#$Y06xj9fwC^@?Xb4We77R~ z>Zu`@C+tgSejXo*b2V2I=HOV_kIn+~ zg9)17Dy_sz!tQgVgzYx4Bsbu!eE4D|9?V2|Xmw*5TC|h5+V{AXb!r!XLEPwvzB2eL zpnc3@v~gQ>h;rS$E&$_ES0TOi<`ePA+gaL3S0ebyDzDs%ajPAfk7P^|@!#)6NpO{( zw_~G*zhk{#PffnrzsJB4_nIN*ttk8VN*Y(l0?*G2Gv*AEWe&zeQ3B}E7^`DCt#SMc zPsS*P!N)o$ztgQ%ctFOTuVgMc(#02W5(x2IO%^J|#9V5N(!g&Xuh@ys0Xm=F*M!It z_8_B6ll#t7>4=Q}J{#0cOySwzd4kQ!w1lU&Y9aIsSV+t`LC@5NrFB<-8OB>+;#_S8 zk<5bU_roX!;835h#K-Zy=}FQszUuc5M|sbWp8ZW zHa{^53EL;m)6RM@+3gDjKmMzTX{HIVm-=`y>@I?4`>DsED~%hBBevn06_P)7gb>N~ z^KCk4-6pz(#TN*@1p@;-p0c3?dUa@h76=F-2}p;{CkzY4K`#JDR6uUd&unk59d;2H z>nA0%Y>G{Dz8+>*rK=<1#B_YF97616tNl=9gt0tRqk9>gHuFd1+ucL&?fQ7(4L>5! z55T@^FK@ofKGnT)`hg^-|EzYT;iAgLwvyvUtJW(obKe55S%*h@+6g7er|k3Cs$rGv&5_)2 zf)EyDp(Z0i8Nu@W4`#i3vyXeIegw6fIPS3Yvq=$n?$w}IoM-yI82_UcI}d^)m#rzu z-WWpi=^>7#rDc*fWHLb3Q#QZNr#Q5U$5e*As3mRtTf`v=ng%RXZ5m_-Yh)CF4=iQU zKas(6w(72{6@=O#hc>GQu(-!Voxe1m_e_?;kI65iTMp7~G?2un?Sd(T$L>5ciFiAo zR&FQ+NZ|_eceVhXi=ulAiOlQV$QU1|@#b?AQf?(1o$26Q`u*SNSB z9Q$K74$)$NBuk#5Hz!L>B5H-FkqV^yGy(YVwtVI)-^UxoJ?&%lo-lyx%y8wie|^zl z7*t+`Dia4zeMc`xpNgN-Ch0&dADvN06_=rgsFtL}FCuPt#Cx&j1@JkWTZ=@>c%))` zfMuYCI5Xao2EoOief&H7eF5=UYW~k_463;_wY+|612|CT@2D* zHZDci_|%;$d@5J6Ee;KH&}j3XZPGNRJyGcB_w`PzUPl?d%5-V@8^liVlH&4hhvfrp zeJem87<3NF*%9RhP16S?N#5n+UI{*ypUHZao#5+_Pu2WeF_Pm-IA2BrFYHz+sdrLq zM`e%jXii8wv&x$78LUX^G5}?xeL(Lrz$!m*6LD>!NZIQ9w2hc#H%qQx;CFK6pD^_5o7`jdTbHp?!X2>A=4&|X!|bUUvn z^ce@N`WBEA;aZ_uJCwgkV?p08*yR^mb9DjxYKZ@a)Jr2)l(&}LJc=`PBq;F*rKoSz zLOM3Kn687h#+OYKlXV4ra%&}doDn6fJ}sKOGbJY2Qxtw{35H4?4A?h=V1)s5SURf! z)a#J+w;O~8wSlNly8pq}a6Ze7`<4`Phv(B%klF3g=Hi`oNFauo#*{y!l-0W>Bw-!!cgRgMF9$7-lWdQ3LD#@ZJ@*b zEgX?Ob_Hl)?2(2fzn<@ADq^j560}RT`0p}#h#|d>-aud-tap;FWx+)+gh=TX=v~B1 zp9|$}qPr%~@lXoeaK4iz7gOb}C`*R<-|D7sEbVrMh6<$hgWL4E9q!(;8ztqm4F&*v zA#gefcpH00grnR$#ZmD?W`p=&6Y2dLk2hPhFp2&nJFuFHm*%Y6!2M-fJv^EY-d#LR zgbu4m^SX%_KA~?=J`KPL;#mBdD$MXhkk@y;E&qc$o59@FTm;>J_?U|ZrkwOQ%`cbg z94e(dUHdHb2l8TL3YDC+uX`o7m1W;{Z)|l4;Qiu24_n^(wdr+UL+j?ECG`9VqSdLR z(xVLhEzHvoWpAiK(0xw;DisMkeV3wF$^Mq<_VAmEXp30}60AklCYD(NfDhZp>MVh_ zR@f_h@16fd@%T9G(BBIQ$yv^1i}&X&n9j>KZ_f3ebp^#Myj&hCtzHvrfg&$qxvyW< zD-!L!8*_*N97K|4W!`>wtaJRSh<;nC#lP09vt2UU zylR*hWrd(nX+nIf`eD!N;bb>@r6EezTO`-{cP?VJGjoFBCj0EcamOBhrU)H2Ic;3P zJS@_l?QX~9Dk!mq*~wqeEY}BDbMi6j_pg@?!C;x#G07f*aTTA8x)RfW4mjSc6N7Aj z=rV2bAeEYqF^#t9NdE8uzKaOC;+=2)qWnxYj_akfKBTA{%j*-*E^RP~5~4Sk76JbM zuDgsbDXY7F%-m26?k)Z8P-u%Og;q;>j@RMFqa$qr;B0($y*m)hR#mw?Cb?m-9L65DVn_g;)c0Zl>K2 zOX*HDll-rdl)ZzkP0XN?2lrjxy68Zkx%i`s6TeEZxQJeFfT2yR!qdaOFoBS9qi+7=p` z37Lu$_sU8xVW?5;FPR~aeBBZW(|;Nm-qqam3L%nmW3|iHkPV*W062_hI3qCi6e(3&`(e%RJUti# zk4iR|LwXylUZ+klL*R=h^gK36_akRf<`bI;E7--`z&UgdpkSiLp|ba7_8Y$V+WYaU zMuWonJlr<~3Y|;pDW~b`lhx%=+(Bi!^*aPtVC@Z<*ddnDXquMUTgOxCeEDA_0RNd7 zZ0N~K{lnZv)t-)4>QWP_f>ND>RN(+(L>GiR)F&@^v@?C>r@nlG6svT7w!B#eap$b6 z3|eh$lXL_g^Z5;U&jrZ+KeIU3WR}=%KU5wD+(eaCh>wxR>Ia{#Tx(a}p}7-JBrdx6 zFJJp-eJ?O70DDxlq|5PnD%^q}Dx`vgQRm-CA54b?=u;ZUmaJA+yCvtEy};XAS^n-| zCqgI2P1Z!>wO!XZ#hzb8_#D!-K{2e)`nTKoK8>-aDk-3yFXgpGTEy)nt_)c3XO|*P z%r@emaUPI@h@pk=tZP82B*$#{HLVjg%uMjtF0QJ&1-4aShV-H@Kw zto?C9zlqMl!$T^2QCw_Zb%R5nR#QhS18~S771cv_iW%RGXRb2 zOAi#Xg3J}f9SjJN@1M_Xk^^uyn&-a?5+{=u-eP~|9SxsGnyi=opbtR+HKaxqXTrjP zb06&tAha0f)AcNE!2SDbA(><>u4{CBrpl`D0>QikjJMRz-!;=se%8DR*GT-eFpScO zGzCTe<4f$=cCB-Jwy9hSGt4x!?lG92Uf>FwbsAMNAnZV=Ykg}@xwF#e~@SoE@ zl4VQyDU{HYkU`p80Nd&UmR`!`y_C&xH1QL`yi zC0;Z5(xWn-5r%;ICh**B#Cp60M)fxDjl~~|iU^MU_Y}|`WRYN;v%NB*cbE~^p$-!@ z@F-Gy9u~QD)#Xu9YA`6}HEU{8yAFot+ravt2gk;6T+Eu?$`x26_Ifu=7~|*Nb5at) zpzFnOQBI@|R7V$+{wF`pk}$To^UsUp#wQKGfFZ zpD|*9xj-bog-HG0cDp*dbXM09Nb$>QJ{>5b*F`%tIGcp1n7e*ygeKs8XIneq6}^EJ zz2chY>$9t}cih)_TvW(ov*QKc-@hVuAPjp!?ZX(qhBU7KAQ~I)4KFfGyc`>0oWm0j zc7Z9qMK*A1Ixi9GfhT6?HW`vZ*J>deQx_|`mH^}7KC{>^SA8xBc#5yt&w3nt2zg2s+xNvKPsM{5%IxXjeU=kb23Ur9xp<8550Wg|)h^b#k@C zWHlSnxr=R6(v2~4uiCq0UjYUi2g$+HZL_eAn=eN%wJ-Vj|D&(mK~ zpCpKkQe(m3+ev8oY^Ypm57oR9ppaP{`^FO_Dg z^E5+3OWb7N*^W}BH2qF~rlVSj54X+z6-N%DNdNWYXJuL{K<8YXFVY_AK;c+*pSs~c z>YKF$t5&3WFa!evN_LE!KX|q6Ly7nTyJ@zXZQw)N=g`dC1?gMiTFW1z9V5ptnuweL z`tYiMtItQU3UGkuPLQ;LY$Nx_fRo{jM~HdcTj|4$esIbBv(HZR<3D4Zq zPP~u-YblD<$5X?%=x)J*g?`srztGFg3RU(gDFMJ~?TU+iETwh-DiYJY8CE`CIDszv zZ_LHb9(l1gQfoIhoCAF`MQs7A9_@$Ke$LLmsMZPe%75Kj69j2+uF*=-fqlBLXi(CN z#nV3^TAca0thS64%=&2*pwiNj&ms#PeQk`;4%V_5S{u%EoSX=lJ-pwXe)sGLin8?h zLc?B|oe#tVzYD_AxGD|?32E~lr?i*H{8TSox9b0JgkWF){bZODwF zrv8u_?Ne6n>B^1|?ROz~o+cr`@?0!>T@s7*ub`r@9^FnIS7+n7mJE4CW#T1*<@0fx zP6O!tzqWKReFkcEd(RL!zE2G0N(5cHOd2zle^0$>Ob}YPhNHsL@;6p`!`=0^VO1P( zlrNp)K)7SQn?%?16>R>ckM#fQn%rueo^^}Jyg3Iv2h9-7+Hp7ie@UYURer11R`mrB zQp|yr6ve8&m0=h-zQNP!)v`nakByPR?e0-ZCk6L_77GFBi~~A=8W*N!)kc>vB-R$$ zY!Ie(yKZ+5vVq9P*OgK)h9?d$qFcLjQ|UBtOi;PB^ev>1(4da9_bD?XowLBA2^N6E zcl8J_)0D9X!Q}m~%33P8@g8C$3#4phYq>KH?0ewEr*PW5pP*Sd1tjf~05i-5V}xJB zk}v871>>aXlg7DG831Sg$Ux?w{ZZ_G`j**m>Zu8sD3btBn9^(8P2MWVL@9phw0Urj z>1AhrGTdE!`UwU6QKhb5ggWpuiSA@MAYORDI+<(26j6t=^;s)#ud=bX;)Rhkg`cTK zwt7vRMeULUB;kF*{nkt-W*)ZEE&Z!BW~K9YsHl6r_t zmq%XqUy!NOgd2e%)L7$}==hk-PM(*GqfT!6~Ml-%>Ol3vv*iJbu63~ z1Pv1D7OJTKZg<;O2;4bryH2;ZWLlMI?+v-8lFw6U4_8JFSaR6n{Bs>eRvMIEcx}=rGf}h3d zn>ORsOE5ZQjwe-Fst?8m*jHDL9s;MD?izHy+d8xo$dBw|IN1?_B8nnyysle3F|Myu z`07W?e8;l)fnK6d#TpIboj6h9KAwxgHIEMV8YTk(PS7sD#j)LnrC77*BEPNZ@n?%v ze908IdwYgx?B6x{;h30K;xuhu5Omj+1`22?X*b%VfvFTmtJDuM@-b%lhkt;5iSL5w zW^y(U&@vcZa0N|g8fg_>MD0r#`{P7);_zsq^_Ap&^G{r_w8rq`ks-oSoy1>@ttmmW zf2!ZeAQlePAp`KqoE++bQ?FHz9=OoI-^ekPdCh1X(w#f5jL5qf{;7|k7ATI3M>vBX zLrsG*vZ$ZIE3|qtM^gLjqs+2v>dZW`55S=~54-M;CSS!xv}T?!K?;CdaIyY}3tF^) z^~a@py43=CvJDRwsGgWgPD_zU=aIUnvs!MNPal*<5`Fcu&)?_ozX5d3OUYc zv)g0wD{5?VH+>Io$Ba_d)Naq(?v$M9Q_8}5_uPITwGD&wxuAkHwJBvqjL;KxCBmFDB zC@)LI7qFM%u;_RhBJkq7@dr(A9Pl^>f!4 z-(J7Rk79Xdk)~byII}VQYDW0(A$4}YCQRkYY%ddIU>)OfawL=y#_5-z#D+ki91VE$ zw9F%^TT`9mA4=9(>9rx2Gnl|f_n!hfW^a8DfZB3V+yLKk+l>&9O3>&ppc_HWqBt5VH~f)04?l-K@eI6(yY> z7r5L=1b?AW3t+ef;Am}Q?ukB>1YsqB#%>8v4Zad<_>(0miwr5|f%71wZey^6k>r+| zUW_?i85X8;ELrS-HBs#S<+wd|whCF5mH@`pv95oJq~N+E_Q{y;SZ02Crt)46pA@Pq zRLUskO$Nu55Ey!mF4*{+pgu zgt|yKb9?WOi1TI`X&O<0WfzzQ_;Xmvfm`v>_|e_O##{-{;A5y+0DTy(?%KxUq_NsU z&mi*y$1;Bm+_<6BZ2lKl=M!S~DhG=z@y@l?X(us})R+wbhnV=k;Px;f1I3n=Xu>RS z&g9DgSolaN*PV1NE6J;UcBp?8S)|$#iGz0LrHh7V2uy3i`CH^x@V)Pdb`8AdVG2MW zn5PcyBqa_Iq{V+S;?l}jkM{qT*v|dZnbqdVSxF|83HCeL8uypw&o~4HWHl34$yED9 zmpf#*^IKU;NU%$$t^j=QHpfglS5leUAT`0sWkJ^kI*1O3<8#&&SA&dYu_N7aQ5beVPYgoCHAYe`X2V zvGu&n(#RMv|9C8c^RVYKR=2T5WQ;|ZU^!?EU0jB_OAp{3gKtMU)X^leq;ibB!1z>B z*r*+v^Cp2}R4oq%*lTu;MnCx1jyam+qDu}v>@~-TZ-|e}-ygL*+Wxl?VV+jKZqXTQ zW={n=#5&huF$I;TcG2#s-Jgkk))+P%boes>MY;sTxzLYy1-(0F$3lLU7>8HHM6RJR za`lG5K7zc!R`>qe@Qn2u)35b0`${bNNAqOzx6=7vOb)5qxb8Cz$$$-j&(wWCNS8`? z$yCE_I+?Z=*_&>hue7K9Uq#m{BT`ydVI=IoO~28dyYBVF5n`J@Wr@%SwwKnK5pK0s z-N22e1egFg9)ILg!4#Ud=8ngO@XB6TM0V1p_L|n&FH;ko3w#zp;jUXeqET+UAyl2E z=`9B=N$jxY1K{(i`IGkZ@Uk9Z1y5gc z@bwsv?oBfl!!4SO3q|O>WI+=fGN7zMn~iOo@`A!(elwr-*9nb>U3%$^;M+u0-2b0* z#2XOXaxq=|uV9i`oRZ~(CUgHRyI~#W6jf^>BfY7a<{*6ZdX3F@$WT4u^V}@2MJ#&i zyav3ox8jQz(v}_5I|yJet?aIZhALYUrT*izsn!^J<;-`mRbFCLVj+eO_(f` z6BLP$)_UD)!V;`XS+^|^;8chT{3wP`VS+eA2fnjwP;v?Fcg~1rOy8kFd@M3#u>8XH zUbM09tLFHJ%H+V;JvY+TTIL|!?SnAN`eV={Ikvzq=oUXDa@GK``p;nKB|snCajIp0 zUR@ZW`uv)j<4UuL_n0PGgg_ZLII;sIp-*=L-VE;84a$(a_9S0l!BqxVH$5R!bTb_= z${$qDYmA~m|9P!&scB#E+#aAo&xCllZjlse`x{ZXLm6EhDaxSw)jN zIoZ~kd6S15?=6{XftOU_iLt5NQ0M%a#rlTb5%J>ukJv8*$2mIzQV8)hpO5CrhLrHJ<_vlgtCwJM~~HJ z`~mvtbsG>}B}8|&{v%N_ykjI#J; zOR5=?Sy!AG9aU^?bav(;G>4?74!7_)?o~Gzv8F;AuI7vSJ?$|kQ!B)5s$>u4~;7T&N9)T z@_CiaVgETEobGQB-+WCYv0TcZD_(ZpjTj%9uH#H@H&-LMZAbiKW|C$|;6iWUj9Q4w zsAanR#`;fWGJx^AICkmPGwkuEh^U~v&4hE;!}u&0(D-S#{6$e!Gk*+NA8L@1@4M*& z_Zbv+4<&xu8a9sp0zOk@No|gw$R=lZRRBIW>zQ^T@1jAnYhc@^XWCkdzNJDqPt`hq zpU3wa{x*3koy|#wn`+>%mpZ19f5SNr9w9RAA?!ENxC!>03kb^r=9}zxcS(-^>0l?a z(?55unPHbxeWLxM)%&T`?$Sz;pGvFdAm>WQo}OZ_o=k>YJBC^?y_puni0c(7-snkY zmxcw*=Prmwuciyyo1C5!irJ=dH&cZ1d0E%3!FF))tXcRAYaigEl_2(tuORBUL?(O3oR$99zZHVugi5tT_d0s8k+;7qieBa%! z4-NrlZb8QLk&`>^Eh8mfFf$j7xlDe6s-6et?6~aEsZXXDIB)*@yK|y;gu26!aW;C) zMudYwQ+`f#9#PhBfIkcE372b+j6)hXg~Vu8Z9GHjA~}9_w4RszSU$Rfxwi&qG8`{^ zI{_u)u#m|>$EzLq5bCd`uVuXT#QFhU@)I98&yJf>^Ul);mTOv}rNW8njWzpZS=&(Z z_Joi!XW4xY4=lz~j-z$Tr*~$0+SnK*zQZm06WR2R370Y9CtSrY6eF;H{@J;L#QAxF zRm<%F-+#-|AcAT7?r4hAd(uay!Z9a8%3Qoe+RioBs<+c=>@e2Sg6yQ2b*CHoMh9YV zBb0lA0(h=dA48VHy)iU;FEJx&IoJufDMb)!K2j$U5rCP>O3Js^EPe__qK>w=r{x>~ z$4v}7*CH-8prI#utL0F8jIx{f4$x_%g`!RIGJ*T)mY;wwf>A;5RH(2a zvPx}w=`J;8nF&|a0-5~Z*?MK(F|Lo*e_c+~dx!oRr+R_50dW4;mK#J84$fN!LbHR4 z40RoEZZb5%%Msb{0RM4J^(?fqhzL`;L zBVayvlx)mPTBClaH;B(t!w!W-hVc)pLT*7$8g+MaAG3L><$QuYbhSa+DA*CCr7~B2CFfZKb}PGQ1k* zOTpT0U;p)+>o#cAwp2}Y-y;2bD_nkG7qMetzMu$`2H;2}SKvRQ1Y9Vz4kbGOH*3=) zi2(AVO0wEBq{I@%3+gH8Z(iE5j8E;(Qj!<#JPDl?U+i352%h*+IIsF5UbWjX0OtuC zx$4*S#t@cF3d3^KY4RPUX~R-z4hU{fURkb~XOr_l8y?uVua#9=&gS0nS?g5f4Nw@r zN!c3uK1mPv={j|P|6emV7`15WdR=vs z&#t6&Oo?r}86(0M5ryZzxv(ZsN@vC@f*s~dhR%0rT1qL`3^Ahv3KzidkKo)s{he9} zH6j+tUd`cs9#jH&d|xYP2I$35np{l~rry=riG>X&l|aBK==J`Uke)1@ctx7UQ{luI zZlAx06*vHA?b^e#BF{qqC{z=q=nrds=;(zm!J^shIQ0xC{OG$O#3|7Z+}K; z3HP-gsF^5W0$l%yYX6(ll=7fNW0uACzU z;OO`mD~@JrY91gy!+ssx3G?6~r<_5~B$yP<7(?9iG22eQYUI3iw%0SB*4lIyQ4izE zRZ`vk4yc6+zX_ANYXH`-#xX>td~|qQD2k`Tz<5v-jD7Rgv0LP5@1#8mtgXmHAo=%M zsf!i{V)@jGq`kAfJzkj~X5P)6eKtLwKO<2Z1MH{Q2l4>Tj*)!BI$IQwEX3`+wAlC9 zV{zz6G^)#Tgu)T+JLu7VY=69~9CDJDy@g;|FGd!VB6|`S4Wis5r;}d+%%8>@gq>~A zSFM|udB<3ge0*@S+l2|Uc+Nvm?Y>00{GpIc2CqnwObF|}99lx`=Oq0eKAcyjV!8A^ zaynDx<>U^S&mB_KQAy!4W$3^0V0X2O8k1axo1%Ry&$o^3_U}So%oGW~mkRHL;@S&@ z{!V~f_TA(TdYUg4CmQbNfV9!aRvqX+_3f}A$_DNADl}+vOG4Cf1kk;Ipo43L5Z|w| z4QcmmokA%d!w{@z6x({T3fxW=MVd#?(zn>YcfgQjSkpN#0Ka!KfiMJxc>Ge^vDD53 zRV(|K(q|6R;d@IX`;vowINUgxYo{$so%aR=tfQFg)GxU8KLLwZ?w~K z0J}Gujeb+qa7MDHW2rV9qWk*YQ4)q`Y!*+!XJ+Jea zXo@dsJ?JR2i@Zd_`ucd_JA(_(H9_+mH(JhBJl zZ*nG4lnL48>=H1g3peO!58krur-IuD^;OmK1_#l|pL2AwQtvwXKtGVoH828j4yIo@ z@JqKpA3#>=-LnHUQYy@JKRt}YP0O5~hzG1R;LaG1w?1e!1H-YRi{IbZ9t-FCrV519 zk-ROrAu+OQfPScy`$}yL4)L{ZLysk-GIB*;tl}#j4Yuz<_;>HUj!3efc4hYN)lr-+ zb$*l@R};~kd$&jzr+liCuw&Rr&g0Pmpik9T5~jI830*VVqJ*vOO=}Q|^e)qzq(-<} zR#YXYFB{YId-NWC3pB)7{(Fd6O}ZY(S`n7&=dq=VCt+%EM*brJ=ZA>(ck)T9yWCON z7aHY>sriI{>w*TbdS&oLb-64Izu`4^;HGyOii4JyEHF!v3y^nX zl+c8TNr1R5xSk2+LW_dZ)&g}NpfT}~{k6mC-rU)l?%?u7L!@x=XQ+ozZTX#RTQ83B z5(lGX!gZBZjzxBa7-9&o>dzrz#>{umeu5(7iyW$0z`iDIKO59~oy&qvqM*RmB>JNM zy(6r@!;i8o(-~D*oDrg3F6qE)$(-Q$WrF&!ky4@N?*uV!Ley4Ely0Hm{o4WN(Sr1S zIEV}xFNE=k&!JPdWs`s4zZw=TT`Ca4<;5`^=P>Y;R7%)8r1f^22ka*^pwWu& zojt_N^J-+!8A9;H($lgF4&NO2jV^5Bhzhw4&gw%U9OaY=#@mZl)6oM%8d_7V7G?|bYwX=Ba4|HBc{^R}K08~rbmxmo@Cn6X(q#AuU zE`AsRC3z$UdWf@x(?D%`|7wsrd{Qr9d_GI(h~>Xtj^5v52JdFv_p_%TiEEj5m3Me61(Ce0X6r4}&r;REMV$t|e^=4tIuJvSA@dQf zH5eUqYg9KSF)DT{C|DSg3X`_6FBt1pEa!kf2FV{#r$ACZK-~iSJ9o3FS+Vtz97XzU zy^sX3^Z>sSEiRkWOl$F@Uh3f`NAh|_jejkef@VMyA)(PZw5-6;stvo@?W%A2d1P#A zXA@&|%CRWe>I&h>q*!phq6|PEaKpf7(g1AGWi{?K^uZmI+3pgW-g%jckV!qcU&7~0 z;6qGK>rq}wUlnIvVF}%Z;>~yKgry%(@9c^qcPAm76v*li&~^O$6!?D5Tx6ZxLj3ufPF>S z*%Q!tKhhdusAj&zoX z&FLUbXcD!5t9Bh2*LvfTFX0VUlU=M-`_A4{xjCsEFGptW-&X1Uoe4ZXxla>1z0%Xj z*aN<$oju#!t)KSC=gWF)U54qEC0;kHv``O#kKf}h)sc!Q>d)p2aj=wh$MaisXw!Fm zNs?a44%BQ8ul2WpuEuLKsshR|HIm7N^-J1+>S4TsDc5fS(_=6|ZK%E-MX_G+Mz7H~DL}6`r*UhXt5J9bu zIEdUE__l?X!l*+Ru71J3^0Cq3{oiS>!uk)x{>&1|^CKg`e?GJjHz{y5F~WbD5#DwZ zgq2i%1ajsgfV_BvG+rEtUA_&3CMgDlt+arY?g|w}FPL@hKyHaF=H~lOb#&1;3g829 zU>&Q&MOp~pqR}`$3}ju|Xwz`sv2V8MEXV0*#hPLn=Xt&l&GLtrV1GdneCH&eUMn9& zSOlk#B5nSOjcu}135=_|;nPZd_z7n=vDeexcHy=q4k!kQqxzhG`3@;*mM3%lR4<+8 zFZ&_LTx<|JT9@Z1bjP&PB`9OkI(AF(J&OMy@Lh>Ht}X{|yv_c&qc1d8c_cz%_zeV` z283_m6+?&0rW7|G1be;rMsv;Kqb@lCpMFjB5gU6MCZ0Mfs7`v`^$rEFKKzNC>;I0u zPnsW^&?od@fTj5!v|haa**7BHRmGCs(+gvEdHQGYls2;{)P_r$k^U)~po}ar2?iY} z@EW!LC7TamcSSf`kIH@6_6jdyzK;<)$(9$!EcHzp!=@!;=m7EM6`Rmdx6F`{9keJ~ z70yjV4H=bxk)Ty4Rk38BQxi|AMq&V*Nl%V19$z_*b!R6FHXGc<61zwE)@RRH*;3<2FOy#{$Mf;Wj|S|r105{*7XX~zAxJq>__%%?Q_XOw z;A@nNrkWbCd}>}@UDKkL#-Hf1m2nkiM2PoBa z01lDn_(dAXtySpNa_tWTd6#|%S>9c>Jof{fqX3%0PoIo6Tz5>18LK8x$ArTSx^f$X zf24VF_^%lQObJaVm4iSWVbS)ei~?cJOA3$Q-4)|c8(C&<)u1nt*p{P5o{Z13%Whkw zise~c9qz;Lw9F0;_`_|8)}>lyT!XzHV<98l!1^fI*nl9gg`e9^*ZZIbJ-Xicm&I&2 zqca|(^_hwy0XG?t%*kH|HlBpHY}Wae_&uW(2O++THCb=29`#Xhzs&F|0sFcNSaKyR zT=&-Wu$_U&y@flh5}tZ;G;ZAUYDXtkokj9H(Tz@8uC8{~gKATyhhv|`!4FFoT9Yv7XQLmHKi{4<$?ZHGfl^`bdkbs#FBG{fp%BU2#Z!Urequ|{ zWQK#7IrKMFSi$)d?N3a=_$mPIe`awNWIUxGJ=PRkaJ=Peg;s&CJo2*R+eEMb%*GsC zy|eDOO22M0J@hUjEHyBL?%)?S2(Jmr;{5$BNiuTXVuB4=e+c%kXdROwLA2*zOn}%u zGrx{6om_lk_5w(8Dy22tZjVzq7%x9q=i7f%wFld#og*r#VIW7Wj`VBb%DcmQX{Ug3 zHqSmc5VX)?{TXAzJDtbFPyv}B=QtqdOrC3OY z+|M3_3suI6&w(pEx*~x8BovKH{*nnZM$=-WG1SH3-v66E)E+Sy)4<{^q{TDaWE%U! z<+cGv0G9e(p$@}n{$V>60tCyqzF6{-vfHQD8d`TZo%SoDtDyOOPJFUMZxL-W7+ zsF8oA;EN?g(c|H?zFW!km2Ro5I!^p1oA^Vy7#7M~`*QhHf}^CIAswHb=&)$1$z+7dsp>*AZwKcZ%Z<;;Um3#z;N#-Dy8qGQE2ei4 zs+md+=Vgl7Sf)2opAqXLu>!+H$g1go_x#>_B&3__TT1D|a7UDpJgL#xdEf8-UtN%G zWGL{St8~|U%&(53Kk&NCY3xgfn%MyJ*90q>m2k<%4)ZV1chp`9??>qaTt#;QR6s8vNjLY?&30o72}#w){WLePes2O%rWw+nCr+CYXtB+t$PrPi)(^ZQC{{ z$;7sCp6i^w&u@75m;Sb{s#V?h?yg={4Nrc8wOW-Tuzi{;)vJ8O&QqQfAVE7ytAvZC zj`wT6A!DTLBu`D+$2bCj!%J8rTHLPYa8v%=g8BW+QB*!Nuj1gSoZHeVbG}G?6R|Ph zRcLVlZ`Xo{tCH{R-{5NXV*pb4JjYbNVlCH_Y$YJ>Vmc%!4v6;|x(|d{!EU!GbtA^& zMlD5K*g4(EsH)S_-f#=j5-MdeX-8Cq4Q!0e^Iu9S$cJ09goYPW%5__*mH?b;FTbB1 zo#|WsRKrRi{MLN$KO*-Uj$m24Lh3IZ1njs_Dv)b5%Ga~x8Z@70oMV$;e*GEMIJer} zX-1#3UmO_%*3}m7t90CE5w%QY(^~zB$aZ+AacCNHPD}jJsD08v=q`Za5D?i%i~Z!H z7*bnY&yiVNXHzNr7Au%6;;}~?snrS%u*c@<-%ncF2Y3We{INIX(?+T-e{R;dwk-%h zS+!eX3Uf|^eN&g5BIABjE4b$&j| z%d&kCJ|*dMeOuK!2M=LsB#~BX()poP~(`B{&8w}85xFA)iW14@}m+af$>S-f6ljU=AD!pEzp)OUxLPGzAqKBu+1W3mM8 z%Hb9QI;9Jm5=xPuJRn>LExfm!Hje>aHGp+dY~XVtSkZ_!!FE*JWWVFD=R;f^rG^=7 z@SE>WYW*@nOIEZ@Zbh?C)PUsp0DF#{&z3^6{tx;@^UMB!)jXe{>HxoNpTS6eK}9XA zS%R+!f2A5Rp!xNWlB{5F92dF{YeYZ!&hfp{&FiO3Pay{61iFYc`_T-Y?3ua((F)2Dww(t9y6 zHCg_xsjW<;jnX^UZ~vBj#gza!pHusxUnOM zAIqrdr`v%ZceU>%Fi1IYsH^^26x_^PaqK7j4D&!-ng;6YdfWCSC{3t~-NfXM2`p81 zeGa`t&IIhA!)m=>es=nyh9AnLT-%{Hz*Se`p0ECTXxmSg=Ktd-!H}pLR?de#06f2w zlYs1g(6x#iMq*vb%feKq8@L1wWWN%A8wublALF~R6wl6FX?+=-^2*SI%W@hZU>CE0 zuEbjz*%E%3jVT7t2Ji!*`+sIgJUD;$u&vG#tlgQEV4Cx=m*hGcxk|}m)FWoGz>4q` zz;fka;=booIO2(mgdon7&|tr#sl>2>gPU1vz$ZS z9%iCVdx3(ZR#mf=`*;p-;YRbz?%h~=hG78CqKO|!Zfe=-wLHJz6vGl`+3&A?Tm&56 z`w650_RX9S*2NgbDffXtf>>CGtR0Hs$2yc_@fZO^r69;%J@j5k>f+#LcG~qZZ?ufQLmDRz2j#H+T&{zA1!7_Hqora_lvQj znxjst0XTmG#-MD3U&K0!K4F&HJ_{8dnaWwN*hYkr^+-PXV~RrE)q0RI=Tsu-AhF^r zd)@HUAM!ml7%wa}tr>KFAwC0jXyW%iBrd}=3Nluk+o3dptK7?OGyAc;I*BRKzXYpc za+i6*XpWeoV1qq=f=H=%-V?pb|41XxEm^`>ih>nXTRH~tW9RO6R;tey@ku(C%0WbH z?9_UOzWL8DJb#Rqdps}q*FR!Z5AT>tG^SK%e2Hw(W3*X1t_lH|l=fz3Usti1YhXVa z_!671ps)2CiHNa57MOy7*lQ7KCV{yI;rF30rBb0&u5TM!NLp_uC`)lyI^Hh@kc-RL zlpx{dQnQ<%-GUosh5&w;&T~pGt?tzrp-aaPNt~+{(_?pVs8>s)VtJSH_dc4#sin)Y z&}iuG2ees^Bj}aJ_9rARgchhSio5*3dHB&+terfVPmn5RN3o5; zYOVQ^hmt3ZDc)QxK)%v-CD$!s+MvYC>gAVG&!vjz5U%|p79(yQzmS0SGM0?LDeW}2 zrB0MobXH=Q3XMJI3RaSBgJHS3R5EBtBs6nE9j@&qGl!C#3JbFZy7Q6XlCh=x@>-~z zm~%(jq`&|?4;QP@d40wnAY43+YFFenQjIBs(4^nQfsj{5LoYw9S*y-mKU(x>=$D`g z3b^w54~lboOIrBh!Rj_PNFqInDFFDPua|#%oQ?jio{9BG?a_R!Pc!M@o9xKrl%b`n zXsjTdz{9ZN?a$+sj7GAD6>3@GQ`kyuhur{VIbv!lIu5Wm1AslXECyyG_Udl3?x2e* z`X#hr^A_737|#`ifiWNM5p#WAl7W$Wo6*gfx}~ADrk(*MIppYa1NkhP`rRtg>?Dj5 z0G!;<2XV<8i>Z3|YBP^@KXB6QQ5*{NQB6E6=3HAU;YB{kWyV6ImkR|h8EnZlznwi1 z*cg!tCTj$|BnQ_a!agMcjwBwVuM;*o&Mxr|;^x_*wB)OV2j554scQzId2t__+XK?r#W$q`!q%Lw6u1|d7r zGy6EO81rG3vx_%CzM(^?GMzG#q30{$jr7R@$XBqhL|$XvnvRXv0%VFlGv)B z8tekTc2mfFbn*qRkG4%p!ndpC!Tsa|>-g65b{*UMwH}ZMVO1uO7euwYD%8B&t%nmfU zH0!j30PF$4{m%@B=>~Dx90G*4hOrhfa(~kqi!mZN%(lWv&Z;EgWC~udGqg~i!o;vu zPNI ze40jmS@UvB>Z`a?Q$p0(_(?r{+CQ;nLRiY`=NkLv)`li;>0hXV=3i3IQ z0&oekS=uag+8b_OCg4M?>doUjmb|sfQmn!Y6oz#K!2WfS80`}z{RoH$enwE3JiDZl zwbs>#5R%O6CJ-7oG7H(&Q^kQ|w!?MBLPRcT1`Af*8`-0qiR~G zbC|c*vvPij!&b{12w^+)ovksA_hQukC~hgg|9h7#;0j{>dupKxQ8Fv=+>J}9x|*yv zl>+%uSMSUQX>nWnGWpI2`me8;I5lVfWBQHX0<2J)=L&7`LRCXQk@1FYv4{>EcE-`i9u63uf!Q1CBr?IvYat%S_o=l8?vgk?PqO{#YN;=r z!gkKcBMMmqflh&0AyvRVrxT(>zMjC6JRU~XC)!9z{hN!>A z$+O1DoBAuyd`i=ly)_IJT+){Fhpi;oGK2i|hrH)}KmZ&D1;8H0QE?b{%2F(}v~+zH zA&{0YS@=^gC@5A7xwCtw*2P!(AZ#2`Uu^Q*ko^_20YD&AdL5#asc%%~7s zq_N^_(7wU z%;-x7rp`+QvH|v-wU}Sm3jYE9Ll>IM#0^pf^q~9_$mO$a?h*Fk&P6m}8mfA4PA)4M? zaV^zr#C@TEL4N2taq~V4j(FL^RCi*ChT&T;$BFvN>DhsWw>>UUzacGS|5stT03oc) zCz}ZtmFI76g6GY6Wg^2XpU3+lqh2Fk=3Y>p$!90|GUDVnDAB7O{m}oOE5wb(M$<&S zEbgQP`1PaOwLP3rZQ!-+Bv3-dB6)jQ%5eCybygX-cZ z)^X*9_CutI2UZh4+l*a;GZY%YuWa2o$QY|FyH4hQYqfT`x$U|nlkR$$A9t~f6hFPq z@zUiwDtg8_R9?+yvvy)y>k!DRl6}^M1r7Tk{qX4L1A%ehR)bf6=o?XB5jqq_VmKe9 z_Z!U_5nf^Dvan){El}%&K3A*QdxpH=jyWApm|)4t_A>sYTs&-a_l3%H220Fm0oX%U zw1cP%g>vavfNn1mWCrE8$>FJ1L0xf-CZNz*{ZvNdDC zM;@GcQ_;B;yCA`9bKSYitf+qH`M;+@9-hz?XQtbFzhb3uHQmM6S z`3AOdM4SQkkSC9O3C0~8l!_t{iiOI>D`7u_XX~mP&zLr`q_ur{D>_a7CgS{T3&sogGs zb$1Vog!zNbw0 z=$p05FXP9QK00@p+eCHnz4AZ->ooPho0Jx2Wl(r(_G9Y|)ohUI_NYz3g>7qUi$3@I zqaKXxsttnUExCvv;WP}>xMv1lG;rUPkk!;nA;-~Kp@R2p2? z#-YM^MWuwF+#p|LldBOhqQ0y@S!gk%ZL|cV1@$mVv2%V{x^80DIo(WkX9%1+qp<_x zF$r2HW}-6OdM9|TGrAW|H*UwA9b73v@B=l$*6 zkK=;U@M`AKC$_%4kPd+JlRxBYkStP{t=eV*bq7|_aP5`vo$)1O#v0s+ z?UjKll(VkiMzKSy0%l@sQl_d07MfB%K|2vr7!YZn=OP$h*iZAiT|1j_@@W11kk$ft z2l)rblc(5_=3TVmUbk#8YW_XmS`id(+|i7|6<1N{?zyjFtrQbJ_|9= zo`D1`eBw}|zKtnjHA z2yE!+X@*Ck&schaA~DKE#=dpc_`o_%w|SJL#qWgoLHT&}iFEX@zsS*+becT>%Fba< zSV6$2E{4}^EZ*<)S3WH+AWiq!WOjCJiy?pcRaD{GC3Y%M0PkgT0z;j_{rc!FLbv)F za<<%V;oP|{TG<-kaE-zS!#KYdMifDbSj*x3=l@L^HgXdWXYXtCxHX_ajvA>ffVQ^s z0OD1Xr%Vy3buQKgnUf)5Ot6TcfLMncbQ@C- z0;%-%kr(kPS_JsT+M}iP>LaN7?hWOJg>+ABb(%!A3x_A1GNf`vV7WceG5?Z;Ka^{L z$K>i?h7ias0)CbZAy%^$u!0$U|5ygj0l+DoxnQf0)O6mS%-SBa4(_PuHK)a5kw7Sc z`u7>Su=TU832788HzQFmkWIsDf&`TzcGV4Ivbs6B3_+^PCh4)ej^yD|rSr**1&rMmv^ z?92Lxb8z-`rUj$FeR{;|vYm008L1aaewVU)bIdU{aon*2>iM0$zD+*aZ42*ntY1cH zmtwExUc56LB~tZ4Y@0LMB6NLizafA}#rRl_j&?_EXJ4}x#=V=%JjyyLH_wzcFKq$O zgCN&YpH#du4It{9nNG=Uf9KODP#tpW@sk!xJS!-z_#OKt-LSSyh1hMteeL#Ls{X1^ zl`~IRc#g9O+)*pMyr=_s=5FUGg2@jc=a@y{_8Bgn55$DEafO(*lkbF9!aLJn5iyNp z$WH(}{i%x*`g#@Zm3rcrR%S*?b920pS&2lyKnuXhRK4otdm|)ly<;UgDQz)BLe`bW zt1uclH_I|I+*gsPL2rVEt2cQeXb>J`*l+Z90l)cDOwP$H(p;pLZp@uhV z!lEv9JfHpo&pS%ZCR^!0nQVJC_?$#ultdWn?Qc@uhFUw zmCI8a_r;(*c%AL9Sm7~zq2UDtWGe3i?D_oUEoRa#00YHt=kA>~vX?dPEk+b$w~?dH zYjx*=g92-*(Pu{|fYe%}k|+QHwK;X_#sAL+ZhN9Yrv1=uqhu(t_b2z0`=6p%YvNgx}lUxaF`swNT=ECX!}Mrwung#; zAcJn!AQhJkYJaKA#XbD{EqQzLkKXDu03@bo3Aj#E5}?6&WU+)}5)mcc7x-zl5cG^O zLaN+@W||yQsmrt%Ppy;khAQw0?QOqQ3t&|KA*)*!tdOtOsA30*;Vl{<0PN|fWI8Y0 zo$<=(KMU$+O;_=Z__fIK6|gI3K)Pu59))zcjo3iX)`*uo&0)i0EnTG%Zx{3=n@PCu zha413A8M)uz)84vi_i6L!*GUvD6eO1c0CJK*E|rH8JqA3Kf>;@jZXqUJf_k`C0xVaGv~1ZFrpC%@`Z{S7g^Y`I!5@!2XIy_B`S zMYbsFPreuh`@Sc2sNSeG(si_|idwaf{+N){--)>G<|oUiNv)|U&_!xVYgUo^X3-d|>tDXR%H7C)y^*nIYUP*Z&9LE&0A ztn##Ds7+PuJL6le_v%LGjKjxx0*cjcj&!vWdG&t-aLfu85Ysfm&hCoClQ^2Gu5iyQ z2=)KoM6Y!zBS)MQhgczeW_P1EzAaW^l{Y*7gCg4(EwdYj**asYyMt=&GcyC=AnyEl zzdQlSSER~cm?Nj%xlP5XVjN2t(ThWF;dQPM8^9`AJ(lzeS{8PAVid6Wno2D?=fSH9wb8cI($U;Eh@cXov@moyM zZ>_EYOr$V#hMyjm&W2>7G1#lNS@Ydb3`k?puEfjSuHA84!Tl`2`_rO_wSQjKWq*dq z*0X+MP)-Uy5q&U%vGi}|5pNn3pO~G1%W@LAu^fXxr5n+ClHc;W(pCGPJ;Bt%UTA$-}EFi*N$V?j`;aN%k1QfBiKD$-qA zjJcosguhzQyfFrH*aUvFhj>_Nif0oE@bUPhct*jyamNoN6Njwz30ZO-BlklzS8Gw_F$>v%aCFGNnsM@dZlhU&j zu{OBmn)gH6OR2P_q0!5FoYglr01CpP52AzIsP1(FMJ>|<*TC$(evYyH7I7z1|k0sZHgoB))f7@T_lU}cLR+8Vp0_dlEsN}nSCVl zhY@eVk`xB-iJUILdXJzY#xWrr0O5XS(JNIX)2R3>R|4g$?ca;b94$PN@q<)EUod%8 zCl}h(i}87w^;JKCZO(tHqC-7hY}~lkw7LagPaJw~#tB1+&5TZv17ry#%^Zpl1Fq40 zrgBZON5=C}*7X2)cm1tQgf^+HT++Mo5IK#^zs_8rB*TnHDUWQ!*B=0!Cpq7bc5dTi z{)dj=@to$Mrsp`^jCN##^O}Nv4b8$RsT~j%ViR;uSVpVNG81#5v2$BN_*COR#x;&K zJllQZ{Q)@CNWbn4ydcJ%#hT;a6LjKqg=F1_+2&)2&kIDFSpC4>vlXyP!*x=Q11XHC z9*H3SrbQ;i7l+}Z4tMm7tU$QN18`VJ)4sc%q5HPGwI7OQ@`w%7T8!a|^Vt5R>56K~ zN!R3!OTh`B?|Eh6&2LlvJRuxO&|ONuh~28tgQI~(*MJ7Tn^VsjlhVd3qB3l1lQX8$ z-`^3~_5`btQM2}y0)PHXa7fv$L$Bin8ui^rB1>lM9+@}aQy~ae-qV4&O>gUQ5>5mV zuTjb|ID!snJXzFjucQA&7S2U?ecFDm%SR7?si6)v)S)pHO5%)0k{;(8H+=-=brLAV z+Xks^&qC(x;H^vJLEZp3I_HG$6UxNND{GPIXa)aV)!(08pd=l5Ey7?9o}3MOCt)zAccMyAOVM19l#>b&HoQCaj*jl- zw50aG`)Io=56M)xq&fb2$kSGDw|xWNSJKTwHd0~;kzfg4kmS%l8R;rTG4GJ`wVjLh zZ^)^Isib+?^2Ss^lqJtTq{$NW?N=ivghGA`!b;4zdOgTd>j&o50cQQr49LYF`J$!n zAUw@c>tHt@wwgr}paz;$-drit7GeWoI|Li>{`IEMuzwEl!XB#;K``YX3orHLzh@qm z{D|GR*aDurH-@AXy+vC{K1jur-l&;#u_s)0aF$5yv?QIYQYc@jN4;6C)j*Mq%jg44 zm(3My!Zsck-XIe)|9keY)n-uA>%s#^wM#7e?6_;Tf zIuMZgO%f%!mf&gzP1SmE{%y+95wWK8V3766BBrnq`|cj2xO<{(IOJ*l00%A) zBQAb!`AT%sp%tvJrn}z6Zdzl815yj0qaskFNah#At~dx?hlG2=!+La++S_Bd!v6-G zKZg>5ECSsq9?aB&(=XUnE)%Fed&^F*bp5w@5QCIjxvR@oA0+UHt%uv&U80~K)|t!DsD}X@DR8}CM$rfK zvyWP^zJOsFKFd#bEdCPpR({=rZj4A6VMIM6 zAxGHU2ROgBzsU5(r#wn?$FJ< zDidR4P+gis{Y7j92^@@#?_dn@wFleU=IKdo-yu!FuS1r7#8XYzk6?E2_ed}npx*em?jkj=cnz5lv=P7Q-#6AX zo7Yh#(o6`*x2_%u_;sEGyKF~g;@sBZ0MvIQ5t80iq53VA#B_bpKJWEkI_Xouyn6o< zqmi5g-EL5v{|)(BroB? zPEhe7*QC+bvXfDkH#LGts5+xlO!I_&TwZdk7`g)yf$WLjN7ixv4Zt4Lt4W*tDP22d z%}K#n{RA^A&&SNHc!qPQg`}*1TH!Nm7EtRSuyok)4$ZoY{Kzs|$n(gBl_V$>&~SPv zwrI3KolH7cP8Ubfim!*L{XiOAba$Ki10o6!IFI425FwqQS-S3Dx3Hl1Xq@_eWuXJWv34iBGe09Wcyl|UJ=)`- zvPt11Kb?fDnC7^(T}H&>?bCx@wd_dJc?COM1QK3l4eY0p4Fo zho9XnlMQV4~y(vwY^2K2mR1Y8Nz7BqlslRtz*!O)zn{v9Hd~~K`da`ki={O zWsT;BMo~(}{hdvl53pxXR$=7Zw;AI3WUq$cAP5hA3J}UK=Q5X;Z|DKVy?9WyBMy zVNg*?aAdwEbApS!xeep4bgwtj_#A-4tCPtf$))~dt3$~b2jE5kUsRf;5zQS)5jP}k1eM!keHaHEa zm)N>vw`MHk+9r4<{C6u%l!SP-r^Je>p^=Jn=97yCVkAF#Z|-e`t;GYr3LV43N(wfj z2hYJRc`aYq{#*%rw^jn+Ii`;?$X824G|boN8x?8Ii7G4n{i>2Wbao7KWvfRo*n`^& z4e|F2$5IJAUQf^Ay$;;T-aNjasU$U+&eamW;6VK$fTsVMfz-O^O5tl9hp_!t@!a$b zDMHkShQDx?zG7NDr9No|LfwXWv$(TXi8}Kfdnx>rTYVze@9ke%;luLx;xabNEpGrn zq`m123TFwa)-+w*PB2frkmn5UB?1t6F>@ZpM=9OOw))lB)h?tn;E;CkJ*{u{RjMUV zRr+cjTpyDOxi1i5!1{t54o5oj#i5ZGoRn3$*Nb!=wum74pRUf?h+s|3<};H!-KFK8 zYIHsmBa3q!KQiJQ!ORFXRS9}*ll{dplRy6dJ1i2tN%pH{9?xu>L*_m&S{RvJFdEVY zf|&1CH;$qt-AmcBNO`$Z;UH9ewN+P~nop3-YsD6UMN^acGqddn*f?&02oXDf(Q6D^ zKHkluP0S|yt9pFvwqG&HmAQQhn;Bnf1w+>&iZL+TX*6wt$<$h9&OL@;j9+#=`|FVm zp6rN_V5$q?N9p8N{_AwgzKqp4q7=Wh{ev^qy>ZFuU{X)Vz^&Cn`;4noyvquXU*Nvv z@2(1uKNqZmjz@VfQwCoWN2G>lTLl288Mg!<;y7z{kJ~{TV>vKgTK?Bu2*FGLsf%BS zc1kYV*? z(6BBf5zIK&vGfBfm4v-{_Mq}trA1haz*sAPO7H9m4SI8PT6vvtUTr5-HR`tnmeyoo z-NZ7_8k4SUG55_87bU}uj~Tv*q9P*}%SFeYt3TFDS9*dz-1#;0Z+vDN5ba6o(y-TV zvHB`%^0?g|-QOY5bjDEtdtTcU%u1#2&jLHp!db)@c|PXBbUSEwdt-$L(?L2nC-IBz zPf=b5-hG!lym8eo#*I@j8Q`OG&o_p%Y-`FC<&yyM;_>|=*Ccl|J^?lHN)|Sksd9LW zE+wI6O*8q9^QWUsQh662v=KeW*AS_k;DYy*l$|epqAi*h%D>TJA=hhR9jL?a;!+n% z`}0S!gwfPF6K&~wE0#?%;^jchA$F>gDJe5_OYECdfCynPtq(r#xIg!=tXKK-R2c57 zGK3jf2sMOCLV#Zj^YgO*F50dy31lO=-3@AE{-Q#upBEA=W3(x!%(41N{w@6L|Jj8@ z5ynfUZbs?nKb8QHFD;U3LI%Vn7iUnqa(3S06*!Ud6dEJ9P$MnMQLRtcppa8f-ukeu1x&n*A2(yEuBvZqHFw^n_H9-| zD)GR&zra6<$K3`l>XGU9wUKG?!}!89saFwmennLh`rluRPHPM|&?sBz+qgsa|Qi%0~$J{0vr(q zhcNJa>r;^&hA2@+D*;{WB7Gv?Bxv$?c5#g-9UL`qFaSUD-bJo+F^L}jAstNZHUD&- zhrc?Z#P{)>b@!R=d5lhN@&{hH6;Kj!Rk6p``7-_b`s|Bb0Q@*^ zz8OZ_|DlP^o{)Vr$$Z%RF7GGtY$(NVByq7>K?t)uQ>#1{U*yF(C)o==ZG_=4>)Gf= zXVPRLKOfRj^)GD`U{A}PNVK8*cM}wfLY_#ZxW1vk94Y-OeuO zv#vwqLdWkqpg;Z3ty2eovQD^W&i@(6 z(Ss6~$_AW2p7^1v4oj|-_$XrH>BfR-seB}EqZd$G=c^LQgq8b*kaY|$Fy~%n2BYe? zl{qz8i$7i`(W?^4HQD8GoLGZS064=$EP?b@YH9f}^*!#Ql0S-OCs&a=49Zjd1aTf@ zf7sU1ONVk8d{;X^lM@4xMDf_HI&+Np?|s8CQw|u|gsKN%-30bR;nS*8bkVto-DZ3b zS&c7@5`jMfnthXhpXXg#;3NA_x>`HAO(a=0iv7)YH{s4&z5j}ioq0uNvox!v$+YkR z@p@xakL&%H$jlb6V8>);KR{H|+|6|*II`Svr)_FPs7I(tgEA})!F@-L?PU$}1u57O zU-({Xw9Q(2zi>9@pR5VM`5kR-aU)LB@VR=5oID!eA6bF_ga1?M;VGG4qDCTr9ga1% zb%A7^)|}{aM~8LiKVjN~Bjcu}xF;lTk9FJx+ZTWzGGE&8pSytlNsJFJ^ys!XwKi9VU)i0|6*guaQu`4>1fB4m( z3MEDLz)+kTnl?KWbrs(p*dGouEFppWIsn}N%n-^u1JB&UC_?w4y{Y~^Si0W;c1R6{ z)|f1rtik%_PQT8AjIM?nX zqZSmx6M?$HUuUMO54Y#TKj0|o3=)qavBZX0AtH%8&C(Db1E<`fZ%+7CLe|AQCkB!+poEMat}&klX0o zGztD+?7~3mS8A}f*SFLT01j7a4*v}{(ycH02DF5v8M4s8bqLGwly(Luf7hhku$r0K z2&%;zgWfr~@FtmCf$I!Ry>p(EUuiPYJzkQ95drX=%k3#j6VIA8jto%-5=*QQkI^aG}~KM15@ly?7#av zYq~a?G4dffBLO&zWISx>7JF@s1Rq(#0x*r4j}n^Y8kY4Z5Y_?Hf=F_i$V^q(m~O}a z6^!4V5eSO>$Q<`llIGsIMU%i0>WJqo0`P-6y5qZV+apzdz&7)}9`Q{p#@G}G-IQNC z5?YXP`5+-fwy`nx$GLLb-KMvJ$w3ZeM4-FEcMNe|7K7}vB=#;~pRTJ5cyq%HfmjR_ z;^yo2x@-LyDa<-+EzCth1Lvfm$?lB;T-ZEPJAg+8d>l6 zg2#?BP)lyuxAho%WgoUrDJOEGkBcz(XuKi`f6LRR1N%c(!=LWxmdU2Jqqp+B&RDuy zL`(*jn0$aOA(iRfss^JEqBIJ4$v`_e-9So#;HTWl%3Ci8`Tsyg!rziX7VG-|?*gZN zw%PjC^iVqT@WBlV^h`a$Q3=jFLvl|nJ{%h*;!qE(FTO7%>(B4;CS zE8kD)dZm~?_TdOEYY?@!t|0)y!3gKtJop7Lf9MiAJ~3wY#c@!j$dL6?C&?8#r#h|Hk<^7&gG(ii)1DDThV>P_&Fq_E;2kZ zCju^AyvWPAwu@CA!Sepb@xp zm}J{_WB%zn5NHQUL0P75uh$HT-g09GVRp3)OiXJRBp%orsLO+sq8Sgpfi95n;3uGd z>;Xi%|DVH!RaS?GXLW zr|A@Ye~B%tcnZWeiUM&ym^nLiJQ*9Y>3g{Dcv$Ff_TukV zPh`+eCBFm>*8%o`x_@EXD@gicF&jdrW4mD_V0M?vSjwbGEs))C|t2l%` z7M;yI|E4jfqi92%y2R;R-`#^R@9z}_>|ZBERmOv61?IgJunJ%F4j-`6dGp4unQse8n6w$ zi!zzTQ+hZ4N>hL>TB3e|l>3uQOO35M8ZO3VQ-JmD$8`W)Q0+r>gKwEnN|f6_zRoyWpi6lF9bifwrv$%sTM!LI2-O77c6OqXL2 zh_XZyTFE>A9T$WBy8bV@&iH_|0t(FAVPDey>;r|NAO(V{Qg5376ggz-O^;sJ)SfBmg3)f<-4&PX-S3Vrk-+>0 z@3pPmk#(G-ohKaZg`iNKu$|t_8!P1bZ~(Z4_8NkVaMIL>FKd|C83^+IbILz z6xI=gdQ+5+9X;*PWI1P9Ew^s@@N9zmMS-iF^TuhGk51n1ygr^st%rd@VTEo{+RnpG4r2G zLR4%^MJvP!MdA0}H^BWNBKWVA-frIFD=Otfm}x%`39zveAMRneyo?x$5b7%o@+}WZ zCXdGYJy|LN_3u`tFcMs7ksFm1b*1X`VORIbz&x#48g9^=bres6%H12MPLG>)$f|Zk z3t>#|RCj%|_-X5R@-%eY)pOlGi%o_3!-`(jyvm;?y0t;@*0P}}@9VE)= zRRO;<77|XOawJs@7sbXWhi|~UMh;;>;=8FDW!R>BWP`^v7Pydd^$xx95}G|s?n{<> zm!hrd5(0V)fS;>_FE@p;eA4guX`ZlfY@OO%QVjS+m_r_qy}l?}`SyYJ;@|X(To`Xy z?=*akwZ_H>K1+p^JP@Z#(MoKv>w1B@Ww`LPk9{X_PcHXA1HP48@KlrM(c>TPZCZ(R z$AT;fm};m!)6AuzGch_>9e7@uCZ`afH$%H=EVDilVcZ}4EWo^0&{T%Vwy{7z_my4S zF4kmiJ7Q_Pw%LM1_f6^Y#OvhY}Hl{&UsDN$nSCh!c&w8mj zW8imVu47E%Z-)8Vsv<34VExATAo<&GO$+!nu2Q%=*K%t@#hWtxaEYMt!N);8VqJyJ z?LWO#wQo2E-!L=QWXE5C{d*ObUEF}(BuXz!bnKP4%v`eskx>! z;E&a|kpFRpp3Bb_OMQ34605HJlu#Ld3?GUE@P>; zS$0@|tXI?rIiLs7-|3utV^>-T`NOX4Rp%s&ufdCZhtX4xK>BT{qH>ZdNCEfZeeh*= zBhRUV*{Yv*lF2vXlvF<~7He)Ht;{xNL_|=2@c2+m{GEg}te~iRvc$zYyfF!p?@YtJ!VTrr9tp=ugZQCFM$Q!A%CKEV$ekGG-p$X&WN#g~^| z*J5AGqhy~Gx{MFjHQy;1NH`rJSHQM`ezlL>{QH;1qc&rj87vPo>EAy@-G@LgG{}yF z8F3qd>smQ2@@BTwSq;%5A=NKCx5ORsn2hwo6+2hKO{zw+Oza7WSI0D@a;e7PK1+n@ zd-I<;62Xvh@Ezss`rY?RviFl@WrcHpVq^zRIY^D% zt`snyd62yV_09*l(V(EoEWN~k1f<6X4ve|VyVpW&Vl1POJ+CJxDd6tWfF{6YK0R|P zuLQGk-(8zffMSt#iydBsexK_Ff>69OM-L-USG7%8V%eP39}mQceqig;5ALFkk^U+Z zendNZSRnW1OB?we_?r9}`*n!L(&~R?hIg7i@iWsV|O@eh<*os_Sh=cA>7w zbX7l;Z|f4w0*?_4GdyOIqw`t0H02kHxB<+$rld&$m8$e-zA(RO+;N;3F8W943ekGJ z48btO_kB-5xc_e&l0B#b(+6X%!XmC#V@b|$AJW1&g z=tSwMVV-C5ycH17$~Zk{F^HAc|%LUF-`AA{h0 z5U6k!a4XPCW9x24P@dCWW5&bM?+nVHhKAc_X|{o=xg98-%XHn)0TBtjWTlz}D*=z% z%1(O=cQBzFK89Q5s^9(6(?Tky50?S6zFgAh!Y)c$$yNY$u<;)}ggXvNqYo>41pdl{ zb5;lgaDJ;yZeT=|#3@LNendf5^pPDxPbdXS*ssuM?kNkHZDl=p73aa%VZgX|uqRvl zHBQrbxl{h$w0>4bSL3S&nZg8c;!qg=^|7@>9M6F+3P7`7=s{{0$6mJf5yqYNtWqYE52fnqp2bC@XfPLBGni|ZlZqXzV+j$hE_1`y{o zv`zdu)^&E(!9^_I{~j^;XpnRIN}9^(fBUiE`J+V_jW}Zw*@4Z32(B820IAvkdQLfw zaQO2|`>pUY>5}rL6Tpc<+Ss2QVgfQhM^Y?rFeV>TpyQFJ{n`88n8a6s(s~FQ9e8>$ zK>$i83FR4g5e>$*tZ;T&NazxN`_FB*YY|o-z_~DE+sTY^Jl6AFnG=HiPN;oJ`K#xwhIf~1bb(C7YH<3ayyyEK8LO=SUfxBu zwS-=|gUv>YCB3(LTM+ghDYFI(Sl){n7j;&c!q$X}+8O)~vma*2zZtugXFSa;U!#Hc zt)9efbz(q&8Jg0S>0~%~#B};Y-OM$yM?l`fbWZ!fG?ibXNu}sX6ED;l2S1T72|Ddr z3@?^FkSn}nQz8h%p=64JLaR`)eCOfob}SE)GykkMH9bT10_W1(gR1eYp>jXJH75gJ zL69lw&Nyjy6Kyt450ShL)dR7<>80xD%}wYWF(*Le$(0?#1L%oypNH(wS32iMGaX|! zTa%d}pm(A3KdWEl?R1s7xXFKR*F)L6@i;yYfHgfh02;w1_?=ahxMVi=n<`ozvrsk< zz_H6)RQFlQwyRFT_#yMsdR5#%5kZTWa!ativ`5D_7MrEsS~90$=n+vl@nON-z)g4= zw8YZLajOpBcksJ!lYa`p3I1;<5WR3LhIGQ%_o`2COg0x{=&9R1Lcn?!25C`NPWXdz z^T6o5zXB0VC5fco8$wspBty8sWsUrU{FN^aToKUkO+~m=eQlL$Nt#2*`V!{pRBOET zu;(%Fb+Id4)*B~?NW#}*Cjm};FMBz<{#m!j`Am^dzLEL#`gEVN|F~o|LjigQ&oaHU z%pc6nn;4B)Jhaj{#pNKjR~7OR988)Px_VlDs?g|9Uc8`c{FriKh+kxc2DEGKs?p5! zk%Y3B97Z=`F*OeA?%5|?3$DYb zv4d}?_SBcd_r|iI=#{e|KLACz{I3A`p+|g(97c(Fd728hm4PsH5G=g20?BvXCn#wo zyj)XkJv2mqj;(b{-)UauO8bEp_ijv(-4rCcs6O4+U;GH`SE&QHZ2ATQb)IWMw z2(Ou?OV%NxZQuJyDlUYdr$}sQ*P_oIq-h_u**HBXznJ^DP>U}R^TJ#m3f?EnKP--9X#l<;W@bbifho(j9Auxe{8rv%O$3dju*LC- zt7WYTVB5cT(pyJ5+M*7mB5_ClUR>vQ^J7vUp{MDtL!=`N;nua`05~2l)Su)Wm8$6v zi2F>0@~5^oiAY`8$zptk=-@*H(V_ORcK+x;{jf^EoG3a*`F110t))aF8krL>Ocd{k zHO_JY{dHvE=&a^psB;E9Lb50`Jl5v>(-pX>`VB`SecP2@IDLpi^;aSZG2%#X9*HD$ z{?q9e{u9X|nw}EI#R%#f&u%(^6A?CB+et~L>3rBVE<4`BY~ds?XoRbm|AfnlK_{|a zFfwJOTXQyUBroOWyCCy8HuWGOR~qU@RR%(*$9jw2fCAujR#y^&_r}W~^h9m&T1*>G zv;I?Ex+*00H&8SgUs!pD1gfFP4V~q@M%do1-^tx_Lmj)n28Qr;FzTX5vYR6j0>lS^ z`@d;u`jxf3rdM&TL@KB)x^A*&L7hRm7C4i?hmDszn$4mMEh=_`FwbbkYUu3OOtkm@5M3yi2 zhyf6o(~chL>dBaiaZm;LVfln|7x>v;nM+-%eQPt~Wq%e{Od}e# zzNp=1Y6ff(agwxO@Z+|R3Z1h*y@HnO=E62~HLjyG`g{(W`mM(Ei#|rDt+9+c*LCIo=OxSAefkNr)4-x?iZw zbssIGba3VKU#!Si3XB49_9cs9e-|m^{W7PXz{iOXv%TzgyItZNez01z4R7@#te5=* z_nH0ieb40{ue`&0fL|EjMdr9_bdm*Ps!7sFELwAdC@=PKq-V8#usgmjq?=YyK=efD zgrKJ>fs9M{S-+qjQX^~U?lk%x;0rYi&N9cbHC|;q-d4Gc85?19Vm#EiwJ_GCCUUF9 z#-TkjE1(I)yqo{X8mJWXa5e7VE1lI=sdo$IV04saCptHPgR7?(;(L2RaFW}lCSrX{ z__ecOKA>kbjYUpD$l>;&jlm z%6^jbc?-0rTW|IN8+V)}l%1DaWk&Dlqph3Gm8Hv0$EaNaPe9u9dwd$RBerL;s4=Z` z5kVi8}4`DL(}7NVDS4h2!{~h%N5CX5QaZCX-2>Iu#azw_rIrXP3p;7kxicW ziBvN@X*BaHY#km*sqvfnx253Y6s_Hgi&NtMd!L?X^Yo>{m+gCho|~ejn7oq)m6uFP zJhabnCQ9;^65%a)32)K54{74MjlfYIcc>Apk$!{)H?=DAGk%?9pfF8A4eA2IXel*(DZAYn_o%si8 zv<%32c6Zq1(tJpA(Y~nPRinKu<5tk+e;b)OcKk;WISz&=m>JV`HK`M=`LpE!i(pvCy%t+olp?_ebM4+_~e`70tk3=&DB$w;y;TmF?NG{LSMR;x}WS-f{eY znoRzyHCdL1l?ML(``mwQ?lOG_n>H&1nkpYvJug7?Tk&+uAIf>gm=(^kE9ulhdyjHK zQr5tg?fiVbJ!aS-%C~o!+pPqW;#OP$?$sNh2keE_fgQP|v^b+Ar*H{oiMo|Z5-1^& z-3}_NFr99V_xc3Kk6zMal>`w_NoKrzOl4S$LEAabWSAIS-uxMZ^t&Fu#Tl+fR!M<8 z#{3UIZ{t_Z*W&?=`-cK*L-7An8E^|KC)C2S=cLk6004Xxjdv%6^B}$wA`cZ-Zv*pp4K4i$2TCG5o8t0A2^ngKE0om{9Vk`@f!lcu z_BgL_O_BnYd}YE6yr%;-s{SQsLE`!3niRxP;|K%IU+2UY(C;!MOYq`%QVQy4h$O0w zNm?9Z&Q#k;#;rmz9_lHaU1Q16>J9s_xg&nvjDF9j_2<18NPjU>js4&~3V|F@ z;*w~v3KojbNSf-Ihdh_XbImXz4A>#TQP^_e1u*@gws!X0x)2STi#kgoMW2WCn!iL z^xpIxo?nIv4i4<*FJpde(hGpv-agnb;=U(1t}>aZO-9JLAwwLDfL2&ihp{5Gp8t-{ zHT-Gm=lOk)gTt{!W4G|$qDPzI#$2vowI3S-ACWWwvx_oF(pgzjM94>51?TZJO#+VE z0Jzb|Z5!Cw|KyN!FT9*cnkTHl^t+B?(kBU+2auNuk}<`HfP}m-sB!M{8*zRmCT-Ez z1T}{Er}^JMz(c#9ql}(r9b?hy6eAKf2{%z`0^IpKAI?M@Je4QxdrJN-9)wcG@k=qI^P)4dpjnPfP9)Yi_16G( zBM#!IR5X`AM_xAb1yVVHGZ})Hb*1=Tv`{Vpo7P%pc1b!%M8-RkGEEKvz9C4;MV(iu zP+8Xlvb80Q>B0yzf*0^9UcCNtGkL`OR#)7A=~6iGWt#t0NWa?obW4RE!#X_2LnAhIncRDd>6TaK72<-8kJp zB7p!!)y$j^0LR9HFK-k)_H27@gU4;d_x8TlR7ddRuwFi;%LX_rSuZcKZv(ht5`-?5 z2YAhQoRvXf+m~`G-Vsi&Cr$kx67T!GGKA`e@Geb`a;Y@ig|r8SNj5%^VlaP1za~U{ zjjI2t-ain1q`DJRS}X(W$ask>&pCcFXz0`_tF&3IJGXdA=leWG(O-)M`)z12 zbc_!jqQoL?p$(@#ZT;WQ`K2 z)(46O8xD2UV4*Z9yRn-rU z`Ah_-*#wl9YG=(BLJbO<1Clp8`0;9@P_?ZI#KVYn#M3BKX-Bg^!iT#oEDPprm}$i$l5nyUPJ z7S7M&VJb^Wx6L>CsPSv)I$^)QPS1O39042$AC&6)jei!fy49(w5_eT_n~!s)um>Q6 zB%b`S(lcUHL*!~88raB3F-|}1%$Tla@Xfj$A7q1k(17Z0hLjS!N>6+59Q~0@q8(x_SFZU?r43elbEp3b%XqmG01uVJ zX{J*E`u(`))PEaKGg3@2lZ>hyUU7b7Mu=eezSyYM^#&oI)l!jb%0iITnHt6!drq^6 zcjooneJ72$yfuD0=1FWSI8q0oXQsh^H{%jprHJ1l=51J|QIcGyGNi^KC6u!f{{E*P zdn4fhP%Pg%&f5N0`QZc*UZXHFkxyDWen>}a)>A-G+xPx+Jr-spM;OT#OF5mgZ}LQG z5DplRxqcC$f)XSy3M6x?qV!dZX}N=z-;*h)p&DZW=+B6*aGb7`-qgO2U+z8%5&&O+ zQ}3KtSIaRX(>eqfq1U5qrvggprWE&uK8nZ6wiwzx$(gyTuF{CfI?{8=%v9VQVM#P3 z3M4kQp)Q9f$79wY0lwxQk~a_Oy7tXTXz2;o<63)dZU^(ojl7L)*noQ63Ep3hd{>{4 zW8m@%Utr2DCV#t~0Z&Ugo;wV7P1#xUW^aC<$B_#CTw<`g9Z>}1#2{OyauW#%h9pTu z4bIJ_5bF}bd$mr7X(R8RJBO5e;Yhe|S8p)?w}dfsTA`dZtq(ELpw$cTmAhLl;HaF( z2}g&Px6_;U&W;A8Y^+L{sBOq!?9)-{EL|omlsEPZp z;~}d${=JTSyIGR>lkfp7vMS|dgjT1YJ?-h>OeR7#xAC;y8P~!Y{=<94=Ze39SFrB+ zRE#+JGdudY*S7+hmAoHh9PgjDpikbB*_eF4rjX@Ivg??Nwb5jfhwI ztqqjU%-~h@0xVlZN-F7hUsOLV=aw$UHhzO zWIm_1|6=V9>}0ZP3tBfC4WFcqM&$udUONBhnSa0jr!kTneTS-DwMaqi;)~8-_X05* zDSh-ie+&_4Jxue6b+lBx`yW($Pn$Chw^t&|pNE6{i)h`6kuSObGKH6X#GTGfDu3ed zX~I+#BTd-kMXY-dXmUhdI39`vBBCMjDS%cv*qDM+(Jq0T#pkgfuMVRhSwGIKOMN0+ zzL zH~enR+dZ}PUmbP~-Uq6nBxgc?8}2Sl$*XGco;#{K(F1R-4L#t0thdaxVgFMx^(O;x znxGd5?htHfB*5sdat)rcvd65Oy)<;Q@xQXI;|roRB?42GyON{{&dFiU@MO%e)!+lR=mz?oe3t1j+-4Q_03rR?qp|aQo(^K+)2JoS zHYajQ;TGedmKf~)JP9}+HjO|#cy2mYhceuO>hc75a z0uf4C4t?i&{xUbR13rB%@2mU`WOJFh?fMSU0^S~6WZl!~X~5JgAPl=_BtjljQY2B5 zY`1PQfB%yGhF8AIoTli)Bw_h-4$bheOHuhvpL!X!2S# zYH?=0cfnUUeT34H#6M1_fWnCJnw$WvByX{7M8Hjuf4_xl z!9;*MJepjh+jN`(bi8W@(6en7ser_6vu60PeYCZD{{~6`{+bL$BZ>>>#+PoqS6YNq^w3M`boGbh+nonHNk7obL?k-xfEN?D$BT-qlT)KB z-lDpve~FGbSOa{8ZLmT8GOj4Oc3^QOSGA?yl%to1`Q?i)E=Uj$L#zf1{nop}Q@Fmp z{+CH>pX_V6v@xQj=NQ3S6nd6Dtfgkc6yVEtZ2ZpbEotJXdwNXUe~(?<+QZGL{~Xmx zD^vxoCh6*f=7Wy?^OU7=_W>6q{Cn;y5Kar|F$LHcThH-Fg!N5NkN!Z-nXa?wZ5HuMrm!(gBzPSfrD-D+I^k!OM*WV+?pLDTuv<)(9{c)q>6a1p-Wnjdc2 zif^cf;qHF?(4>mY1oW5vfnAKczL&CN!vi4`G1#q!IeJ?$5p;Q_)xKw3p=S)|h(fXM zSkJ~SXV!V(0IjJLDZKt3n>?|_k$Di?poM!eVEpLwUaikGtn5lz4COi)RmmbjvY+O@ z*OLxjfh1nSZI6R(*Mi7DE zFB|1e^eX5F8r`}^$uuV5XL&X$B*I_;5|Kld4-}N0`47+0nLJb`B6(CbA?P1taR~9o zQ9g$u3KRfe&U`zd0b(yd_AcKbkIN{He%1>Z&JY!FJb0aICv*5112cnElvTN&e*Hzz zuqU>j%ZOQFrEyIce9&!S1B07g{mxfM|G6+3{iAw=gU{J#Lk}Ht91pu9o@fSq5SLHi zh+EmPi_qCkEy@*Q)2gHySKpDj13A4unTmgl05Ybz5(;qy8sJMSUoG)6&uO(oJ*U4& zHQ5C3srC}~A#>NyT{HUi{uw87mx_l9bAhhnV0g2y{DIs~j$2Gn8qsN}po-z+!r@rx>Bp+|m-kVielaK3D10>$Tfvfk zet{7x4n|u7!(dX!xx_pmJ_dTkn};dT1|PIQkrg?dS{!2K$a4fHdM!oQOd@Sn3^_OB zqp;(lg(QluZ_}zM=25H5YG2oDV-h`B@biBz<5&?$X-{AbwTr&z*p1mabC?H5bc!>9_ZA|2T)$d@} zk2Ae!EFc(I8Sn4B0v;xQ?YHg4L%Jbq3R+8|(sNh7VEBy_E4$%xow$<4QG%B zG8Q3T-141(VA+(0W2Vlh*>~~R(G;$ydN#Q-tOI>K>HESQyR-#w-|zXJA)rS}QtQ<8 zu?;245k7hkGeynL=2S7=4x(F%aq4{}#gwvjT2Y_v;xZW~Yi6CQr&-jEd9R7XdZole z?{~}#=x|%@^8Jo!b%N9>;P7H%@KA2O8TGYen*>&^J*LFrSUMM@OrR>Yl7Uin%I7<)-9W3a=8){gL0y9)AM?977c_vHRmS5Bz0D7ye&Aew(S0ZnYYFJ^2O6|6c0i zl76^$s0gk1njW5LamlxmzS7wtNb`6hO8Zd&aad~3-%JnirLx{f0G2|G*VQ~Y>wMBu z)It&e;MMAM-lEc(6MR=2txPRunA9Vu3_IWE@0tyric(S@X05Re6`4GFo#u~OYF=E<%jRR9acBDQof6jTH;aeqaai5yIbo|~BG>2*t9C*Qy^ zmcEtmXY=^Q`HMLHd;Rq+c=02qFZ5p?ow6x>7=l~)Vs^JB;;e^a_gGXC8uH^`$B*&~ z^3`8CQ(QUV1Gqt1Mri%Mou6OFAo;yhMQ9a4fcUVxZi79Qw)BauI|To<%$DwgaAfK4 zC3S~nkOp5cN3|ydAp|2tSXl8^a}NHRCtj%r#dBebz~RYwiVek;6Bqjaj(W>~ejf`u z<;|WG{I!ffvLEs!`!lje+?m>K77DLCH17ptQUY%@)=<|Efk)kF^7ByK=aW2}V4?_% zYuXHbW#CdPGW)YZ#lOFQ;vCQJpAB1}2eAE&6SI-DSHhMq*$QC}sv8Re zJenRAA>F2;)`%&x}BT6{2u9zJwvY`;G#+~mk#RCUIsvlK7u7x(iAV$H+C zAb{h%;m;^^ql8>h($$#Hq`-H*em&dS{{pWS4h(;nCsi}$iAuv55cpYg>2&?|x$(Z^ zv4qUU#2*_&YnGrry~Ys&;26Mr%~EAcVQ^f^NOh7W`Y@dl!w89`aaN;bnf4Lz53F%d zdZ>v*ySYf*$Z&%)@+SU%Afa3HwSj0A%2*o~1R4c!$p1VSn$ek_7O$(}SC>?#iW;=E zq9dB-1t+7wH*k_L_|5#hWemU1kUZo|;NxZ4!b=Zg)CbiPTK#p?`p~Hk^1W_4cg|HU zwPF0Ut{bPL~-2|FJ26)3LU)orvU7%tWZmL91^qphyx?AZ?v_ z9j_G|9CmCU2AE%o(5&U#49SRXfvB8`3os$PEXc(Xp*Pp|H&mZ5d&+-K!RK=I+Z_j1 zV^PSTtL`sHknPwe0KT+cn!73VPz37 z1w7*`s((0gQTeglQFmBz?7MC%jhof35!`TH(k#(j67ga(?nVBrZbT~vORMMY?Q{Df zBb`f06Mb5Ml2o*w=8y;oPvUisF+6?sCV@%s&%Uwo9e^IWSb6V8_zAPe2cmaZ+v=V-2$ z=6{@1L5Hq;XS$n)H7%K87k)-CIeUGKOBiTZ!oX?r`n2N_-nnnd13~la<`%&Q6jWj2 z;yU8no)`ae%YpsQ4^K|RT)@So6xe-pFxkqyh%czcDJNxgT;}BD3IjcA>r(tg#B^I5 zrjpYeC8V83Z`AV3C>O597!|4A6xvaDLj2BG_deY)Mw0=<*r&_gJQ1=Q@IREaa05;9 z<^k`Sn{#S#x1!d;{6m_p%8!%`E~|H8qC4 z6e|8y;RcBF0ky&*X6e2hUI|wuomjmmjmhVGg`M;Af3Gf)RcDI3_x?qru1R=HrbX`3 z5Eo;aioERAE@(4lQhLc;bz?$Ivj=eg->ii_p4j=1% zjJV{%IyY%v^CT2s-8?_`_32xDXO2Yq{vq3t1gUIX4kq~0%7%9|%@p|(dFS_A z{rk>K!QS9yNEFt?=aC}{HD@ABF9=>u{Cx9o2cpobue`X^aGHCtTtJhey>7P)SVRpH z=X4hsV~PeA0x_tBz(;M-{l4ehdD)umWU)}>oTQzEgq0{RsZU$_DWH9p*%^NiCBLdC zo6eKTdYFJlhGMf$#}OtDK?fp;rd0R=$~XQdIRpDv1n8*yLPhlgyDv_OK?KA)S|0db zkfOwb_91OUM*3m)yyZ|5Hbm50_*C3vbjy!TFOP82J6}Zym>4(}!GzSujS8Ocb)_II zfu#Ex*`gXJnGTICQC65r^9FjR)YIBhHzr;-duVJy_#qm|r1|ktUQZhiniWf5;#@vA zS%FWyu`goY_0IQs3Xu>RS@pA21i1pyMT>dTYW^GQuHQs6H-795nA^PXl z(C=#W#Bi?bAR|(|JuR0Xo4fsOu{X|7P8RAeScxCnMn{eE7j!|`ZUS&-Wjqz3x(Q6e zl;Oj{m{J`vyN(;0@?p4?kwXX;BO6{E%zg=Dc^c05*>=Bm%klaw3Zr7=@kI-%-}aD| zZb37K1L7>cZfPtV5e9as(D@RspNbT@hVEjyj{DJ#_qu&b5TnK1*M+awz)t^NM;a8(of~q!O5JZo8tA`}YyufMy9V(|zRxPua>R9-XB+G0@WJR4Fp_Oh!fxqRxm({vrQB>A&*| z=(N6;C5{Q8)L*&VihtKBwc+fEnGN>_36&}+6Wq&EAp8@Mf`uZvl7Ca)8{eCO$-rDQFLCBGw&{7JV1rO z6f*HS&(vb0%om7+yhvmKb5fEp(EAXr1Hmy_4L7fjjhzlwh8bPiR z*go^h(ky&MpByBr!>ealRV3Jp=%^bRqdQnBaWRg&kVj!LQgA`!pa{h8`yddj+006; zjB0Dd@}^27{&*L6hB;1q1oy(9OK|urQa-t|7+Y0I>t8`b*nT@SFy!l0M!KZVAu%VO zqYOH;sCexFJ)m>Vl#Jau8{QA>Y3xIzAsxSdrAh12-tM8jqxC~5;+3E!L)LOkszNLci@*iE?$)x<9KZR zcn{jaW97D9*gvFipSO3=L1*cI<5mIPB5Q>CORVhMs0dUV>tv)boME z;)pW;)cU(L7cjr}y5dZm#mft)j`;&$V!4UFx?=A@St8u(6b(@HC8WLQK<0eZS$x|MGQhW+2o;u|6ssY=q?R@yA)4c?!T zDzvw=IK7YN&jl%Sqeyx+T`;S|bn%ee5v(3A*<@EiFdw?c_aaXK9C38TitKkz`k?=E zN`tj~bZ#0UymHNuow)IZDivuwR znsO@tdVd932{)R1{>+%WFamHayO+j|8IZwe4+j-)N>Vc+7ylkdoQi~|_*GyCs%a+D z6p(K4UT=o(!aP@WU?ed7CBktCq1oiz8kIX@)6O%{0dS7D?uYPnDFxV)R)Ex|2zdQr z)gRxUyMb3?mKckHj#y~IPKnmKWnO>(Sy(AK%f@}1t6%An9na}1mzu;z=h^%I9h+ZC z+^be8F_XuPLJ$rd-KSJG+M05lq_m4V&Xn*+6%Hm+u#PN;)j1)~ggB%5%QZ!%66Uhl zYp3V%!-ADj{MZT5?*Lit%fFv@IWZ8*%pglS>y9zYv)Aoy6h)F^ zXiT*A*wZ$JudtEsnd73!`!*%vM`lFpbF1)TKQF(}zbxX-`kqKoNwuWger-3frb86I ztmXGHFH~k19uRf&cVF&Dn#Y&`Nil6ef1R;DjA^cZ=s~y~(-n<80Ifz5(JBGr6Ed^( z-%CcgpIX{Uz2xI>BY6~_VY`1Bt=G~fk0T3$pdL7h-n0kAih=sCU3M(ho$(OrsbL1UveP-_G}k*k5SfiS}4!&D!G_WAlV!UVpc`5Z)Jw zEm21Eprx*t7v1|`ku{ddTwAD_Hxils4*(ntwm=v^Tz=*!6=rj#c)8fDOiiIUM_s+i z2<$x4_MQ~lmG=(qzz{oopl*e=!0uD$4~c07r7AC9@3W57ZjV zyF6JBf4JmVYMcS>iXGnCUgN*L_=G@@T&KXp9{3A(h;Drdp~@v`lKV*cm7iB1lrX`y zJ-|(X5i`%(kKfS_|Hs$&h~rMmM&NXK+a#&B_-T@qf>z-}nEkyuXG}NPv-Lv6b`qX&D8E zGzcrf4!uNPJxXo`gtvjly7lw~k(3|XYjM~{p-MWr`#V2Muefl|v_VBslR-L{T9511 zbI!O&h{xu~Z28{`@;9zxU9}82gMe5dLwtz%qq3_9KY}p3r+y~)@?41h2G zP!1&Ngmyx?g_(*eF`}iPa03wM>)G0BPcgeQ z)Dyk)HOAbW=M5c2=d{yIt2yve;|-`I>BqlWTdGESOdVJ*!f#=8JqDG>pDx~LafmeL zj=(#tvH(4w_c!j2GAQT`1aDgCK@l zGVj?j!{4a83Zoex67HPWS2n1JSF_PL%_a{+7oex(?T-M?(xbXdV#9+9jK^@hxtDEK z=5ZVSXGM;P`bdcu`3+y-62}rY(+7Jcz=@^?`KKd4R7((BB^ZcVR{1AMUmD zq|R2BJ7*c=yUrRQDaypbFJZEL-WCIfTL3^>fpMQ3OCu=c@Bg$N;VGGcr% z06he`=;2zk$19oingYB3)v_h5WcY_XGay=^{`H~NK96AgM=5w){UxB%-Gdq!z7pYhNRp*+*Pyn_?pn<{mTMa#Te{^V`cA8{H?-hY3x zZ0(wtGyZauZp2VTWG-%r^RytPl2_T&=~@?e_V`}MaU;4?3C5^T>~M#s%kcZ1WUc*o z2@INe8EMw)k>&I{%rv=kDr?ez0UgJC`GxDrG)xd`&iRRlVP`r#60;*r!v&y6BKKrY z9&B7qYP+#*IQA@BdZGG}MEBAiWU%rf<(>^ot&N25Mraw(*(`>-0rd?RcdBJUgF#hR;)-phEmnKoh=@HQV{ zS+UO)e7C5kYfPOBT>VNyFIKKjjc=4c^28UZLs{7D7b-)V1 z<2p3SW|pc)=ui7r(BK*9@jo*;bY9@>!{!fI-ZAmyDrb+;7#sl+>0Jt>9pgHp5cwmG z)JmZW3f_$wF?v@rD^|}N5TB{U3nhKnTJK^&#p^I0t&Rn37Hwr9w0+9>Dz!G35!I_i zZU^AhlhZ90OFKcgjQ=B}r_JpRdOH@Czyzz6V*?d6fIT6#Ra9Mn5oMI8AorSNGhRtW zyzy_yT0`wzcNb}i#n`VAFm3OUr3fUmgq@KEfS$c()#lxLpM7WJC^h#45Ex7A z2w{7rSy*vSdA>}qE)~RO>j{SOapB?~BwGSRFVkp}E5tu9FR7);9FwxRn2CP?oHCj% zcx{T;pnqLk?RqK%{D_KCP37T46L45xY2KtGbRzlFJX~bk_C>nSDkxaCeGz}zzXS~45zrTY`;tK;`E`Z6x z*NN~G9`0#NjSMO3nNv$!);GhXwF0L0lATxJzBTc=_B zVdoNfiUQFL37)nLNhesMxu@~-xOya#1ymzC^-oSRjl8^me$jh`-(6LYzV08LVNC^m z8VS@w0B7eb@1wdP*^cK@>#S1_co0LP+2|QtJ^ryiZrd>;mwty`0+&&@aUKQaHxZDA zxEhY{_}3#+JjMs#{X^LaeM1L;lQ3e0y|P*8MYq1CUs;i(+}}Jh!@(CXk;AhFU5iLx zj-T^ntSw4b36l>+W;%^E?Bd&jWvcozY z!%;+3UKGirX+cNo6rHwK4l2Bj=vk@-;-bFu$AaIRncuw-XECPs)cPOJS=2@9g+EB^ z;j*wUa@mRCKXi$wZJg_{#ObnScONO)1o2Lej(}*GMx3Y#K@9BC`04<9^1E4)>{JPH z9`FunFxN0we3&XjP@wfs_vIM-x&;#MES?1aQn9-Uq}23}cCx%o+?fxfJa&5{SnACu zCujoOGXOX>U24*PMnW&*mxKQ_dHz8F;U>${hxOJ^Z779!%P>ArD3TWcrp$gQ6cLf@ zQ%YrcSlxd1d|irXR^!%5JM23A{(jEtp36nnI$T4-{ULMv$|F;>8A#uyH8CX zax>|FivAcDfgbF{p%Hg}_!42axaiBPIrk@cQiZc?_5JeJ_Sd%jJ4$$^SB`}=jC_aWj>mf?{5jvLlo|9i$}T%r!SfT`fjaI*VB*n@9Fje?Gwlk#IYTdCH}+6 z%wZXY)}CW2^kZZClqR*ap-B;u-y*lKUVK1-^cbM01U-yEkXc;95H}l}JPboD)z2TY zQz@h42OCrS8Y!n2?|QyLqsEju=&xj=<>hqv^h{B&1%DRrFxOgT5(AhmH~^;=mAIle zbMSmz$53O)9#Lh+q;pm6pYusm@a~sC+(Nak$@VN-!U8Cb+@ofj$i*;|@7+k~Rn3<} zRsnu~@UJUP04JkG)o;LbV~W2aSXY0L+-@93ylxsB8yV7|_h>gM-xE3+i1)~ckj-gu zc1t1&dB#=+oHy$hxA)W@MMXpGxk?2P9}3pz&p*qkw3Ial(ChtNhv~zUsew`)-SK{W zN~H6I{wjvJ%F9nJ>$o+q-YAOI9Azh#_Mm_Fn=~RFq(y7vg--#T?gal5BSk0~R){r! zLqh)O-ALNN|~Z7B@lL2XI!Wv695YSk8aU+bJ+>KUjRwU9c^{ZcOSa>NlUb)*6$l z#yviJ&Mq*;Ys|r5YE|)4YZ%%NeWf1E_p@efY2EAsd>P@cJs_~m{_=0KJIH!Gxl4ET zg(xl5!_`z}v1a+LAlxNX)kx1968zDMSB^2|l+30MR4>Nj{X2X_y06rfg47iE;)# zw`vRM9)Blp`#4mJkrKPPh*TtfUGW1NB>ppGIF5p!}q? z_(Tf^xxGmKJS_vAw8QuBjP1pcwGBR8AE=E3`YTZEp=n-zbYQt)fLV?-j5Y7?V_){4 zQK;=F-{i`wh>VkhNyyhH6&Uu8)b?bj|1tNC-IX?7x3O(>Y}@GAwr#W1v2EM7)v;~c zPRB;)++&=b_cuKIOMRPT&RMnVs;aeWRkhHsGn`PB8rs!Wu^uodwswRpfWde!HKO{( z+|=PstZ}UtM42WiuSC%H!)D1$4i4{iBo^)H`zh7e!g|0|MKW6ONqfgrGE~N!wC?p6 zVj>Z>N7~={65cLKR#+;FBg-y)N^>nTpqarm2yz14kk0F(iL1w)83+G8dbH#yE<=K* z0|M83S_8*VxZ)%?hLlAqF501ydkzEOQ>xU?^oR!s>T@8Dw^!okkHBlcT}MougQ%8{ z8mhB`e|nn{pd00%neVqDitRe$Y9+$EBFftLmLL>lgz8cd|9y|cZNT5kI*WvlL3PHH z9$L2NbbP)N`jwiG1^xO$W><@ET5Wk`bxS>q-%@Evq)N0<=nJd`Db#Mb$zlSFrAb)* zdtW)?=OZ-6d_XO}T(h}IH8dbB@Zijfg@fmP=g70HswgkxbLA`o$t9F}3@z8j!rIWU z4p*{nB9w8FU@7s!@Lbvo(6zcvR1|VD62(+xaQaG?U+lt`CV{e2*2<&ZcV^DGFY;en%EX^h>^FAp{4B>s4Lva{<7INqR6Eu`bP z@6zwbPMw*oKx_2(yYrI;ipPWe73IlH^PM<}#y`N&%4 z11r1yp^O3?!@X}$qzc)YFBnivK)R#zE9bpq>x0@&$pU0Ef|AXqLU`!8Vd!`GbmWGk zDJ+1GUru0wNvjenaU?iKDtxhF^sZHQ=rBl^y`sBWq*472Ujdy;!8ecu}H(G!Q7Jr4tME0-9R@94+fE z<(D;hk}ZkA+qLk2qDr!hp5b2wwwH`cX;v)v>^>oc@XxSCMO|_M{TsKA?TpvH%=fDrA+=kQw9v=|iGrautn9!ak^_e#q`O z$3K5{fwn-$27xD9JtA6rP;%;(NVX+N2$S{w%4f1BDLq9XkCa=!^SZ-0pz$w?Kn3T_ zZCqJ(NMFktHpx6(Q!F-puao!|`A&pOQsFpfPh*R*o|x>}?dn>1Lpta%wVOR;9Bw2D zuD8GA_~F_`{49-!L+uLRp_I?q=4)a0*lA_j7azLv8aX;fG|6Zm?+@qgLIcb{Z~ugP1Tje4}fzd z>tgTAr13Hu&s<~1p|Dq@9JD(kx>q~b#by>mO7rvBGPoy}duieyOXK0&;jO*K3HjD4 zsdmhjD^0Sg`?_Nn07rTW0r_pz)-V0OQ4~egt@_e40+Xx$?e%0u#R$jXMDVM*n@Kl$D@_Pd=CWOZ0>keQSSTy#cpnfz`YMf^5S!fR~TquxB$Q>FC{ZtGpH%E zPER%y#jlB<4DLv+%)J4e@YIIB4NJb|(Ckuf=ZmSQrrwzO4(Yf^Xca}LptGu^w6mUO z{TQ{T7Vv);I07+gb*zB66G&Hc|6I2S7AX!DzZWS`k++hlIDZVb_1m)0Tn9c}&;w$) zA4&+k4Wnw36yNzW4I+}P)Nvss0q}_?kY=|E4vQROqI?#Jp^X<^Oei`*qj_?_!xH(( zmh09n=7OIc>H;V6?hhnbC^gquEsAz&S0Q`d27Y$QC%C@=@cEx>L_)oX#O@U|&~5S>iP}E*RDGVi>MB9*!dHqB$`Yv>iQ& z9IoJsoBk>@7#Q$!v9VeF?so}--?#DzR2R?7W_Y}d-WbaL7aofL$`@=a>)nJ-(eodqd9nuS` z8c^kUO0a0r%R^7Y!H`K%ox*yaAl=#TxOvHypVmStk5tiW466QMWo?6AGL&^8P;hO3 z3Fa`pHJ|PAl7=RtI7t=4PQI#Xn{MZrOFAY7J@@hcP7^-71k@@(S5WchKzzhycz1ur z9rhxG&6tKyG4HvT5DG4=rzK8}3eB`Bm(NJEK$`0=@6iYe^HXe+7*qI8{|)t=YKT|* zrz!xaQtAnJ4OPofLJ#FCPYtdbs|AMveur3%U0=+neT>ODmc&wzB=`9Y9g>iEI|A=S z5fizO%as;U&y%t}35y@*J1$HD@q=mp_>Ay|bo9qsIX#^-t{f{@FqXXP5p7{pV7S=8 zb#T20qM=si)9ViUoLU>tJC$^B^RO1w9Xv}2<>^7PV% z3fArjnZR^zBu(&7G+76y2}Ej(X;X$F>rE4%0QtBi0zpiYw0Ri&>ObeOFpz{^V`?IPp?JrulFk?4RAC~BhodT@{XmI>&&j35PN8 zXEuW>jC{V;K2!kw5jxELn2p+A$v@s2Lp)T1>6CQ*Ve(Z3Ud+v)4{w_?IYmZihix^j z=Y}Kl6oLdZN03V;8O=UEX4V;|ctxz@OL+?{Vulcb(@<32#O%j=3g|t7_4_bOoLv$&UAXycX$^>O)Y-JGjx89pixp(J zCK~@$y0fgv%6ucT|1p2R+mQ3sB^TUVI1a>i@5>?V68HUm_mNCa;C+X+@P0kj?*Ab( zrA81x!E@#P&u!JulIXLmGAI|xZ0VY{FKl{)yBC%)5awZGJDcqQhw{H$o88sM^4~tQ zZ%%SDLm~fcGXMF6@1`-DzGfvgc{L;q&dmp5 z4+CIWVhSNk-Rm%m-|x`_<+ri4zugP(R&>?3CddYhZ%V7V%Qri=7ii<);1r1d0(oe# zGTvuJ!RI{$aV}?Ey&^Ul5R3ew#BLOrU=saX72xxmKxrCB#3bs`B{TWo!i+JRk-hfi z%bIf+X9+b)olEXiadWgu(4z25OE|lXe1vhfhqagz%I1(Jp17= z8k-)kzr5|lD*Wf=jvA=PP(>m?F-Kw?GGdIUi1wI&sJ?Xz>fhcJhDw*X+Jg)Bkc9}E zb&CLX8>&43A0ei@@-F_xoqs~pI8T9&4h}@}$t>c{bOn5c2f-&uI8$>HZG;L;*Al%` zdebUNn5Q*+s56$zLGbD9&3SL6?ceqE>Pv~euk&6nRqm4!_JuY_%}bMR8E_iuu1Vcn zg!mzt@;#L$Y{myJFxc74F2quY0!QXSL7qfyd_Fbt#VH1^zvn~uih+d*Z*DHN6y5>> zV(y5mYyO#+;(-li0zct9-53;qe4bqME_5oTupcg9j!aqgK1k-2z4Pl;2#iUR{X>{r z09{#LP;rc$EHSjyKb8Gl#d#<`+Va43xmw~Cs>qi^?Dvef98jGsEIA_cy5N01C@}l= z0)S4{dc8d5oVbXSy$ZkQ4MLWer+n?DvRQ+x!4y`>lhY>aJ;c2{Rb)(z+A51u@8-gk z?q25nt8u(0->)xdskojeRPkQRF1AdC0IA>$DK)^nVbFi$01uHhf%o50*(W+St5VRdt*duF{s9*x>ipYGyae$ zEr|sF%oNYeh}iLt{Sjw5+$fiVGte+O9y?WJPf&dV!7=$}s&!Wy*Yuuyr>78c9Jh$W zcYL@U_O_s-^_{0TS`OO$USE`T9~@Hs5}BC9HSqgZ>V5PqHepF`9;mnHA(HCE4l&Zx z5&Vy@74(Q$nc6a+>Za*-Hcp`+iIMfycb!{+-TyO*JKEwa4AC|T=Y`KuWnf}jvuOQg02mOlq z-!!EE0u306Q8aj4T6$+v`i=)ac}eE|0URt-%#WcK+cg}uOHjw=?f^d6Y=kNk8+(MN zZz>ig4@}}PpO()+oGb3rHl!g+=CP#ivtYJd<9sc|+ee6PcJO09lm?IocB`;7gj%4J z&!HIK_4(m}uyk3gKUhbPpwi~oC}Qjb167XFnY2#Fhm5=~LrylJ9|NwKSBPt4!dqzd zbhags8Y4Mzz!AaQnOj*5l`TO5x|qV=E~WTcsuJyNBd(vIvaQ}z&)HV5?(W3kATdQA zwhHAeIeIji@WHLTBeR$W>)z4s4V_#&VSKl|67A-r}UK3aL)4rU5NE(Q<3lYmc~U zoD1>Qx>luX7+xsf8i3P5_Y%S2_Go|O_N|XaOGCmgYOn0mx&u3S>V$c}}M;hKMRyfSzR})7j>$es#%u z-y@eDD-wX?Kqp-{@CS(e_4QunXJc|PUTDr5KfD)@w5v2V4XvOVE4CHFhiS>d&)Z* zfb(0s8|4x%6h>eV0&R$hHa?$sZ|M`$C6y9?zdfR6BggWl0rgyTI`?kkJ_z<#7a8zp zIO+7jE|poS(PbZ#?Vce3r@TOo88+gmk~#ib!)0&rI-6t`w_24Zm^VBm&9Rz)Z~e&| zL`sd1fIMe8d(jPqlaM!m9iIY;A^Z4I{f?s={3ig1D=cvEtcOF{y+i!7D zN(Pv@PDvrptTQ7QRaJecFzFf4%2%FP4LGucsiiNcsqwK0&`B3~3{mCHAk9B+{z`Ju zIxQD78rA0VfPUx4aN1=le|=wG@ZcDHQ7$K*4(`-{%hvbh4|E_fc{6ycOB)v3Es^pD znX)Xf}sp9ScE+-@O7Lw7$usRE%ocT1+=$C(jTDjx|$cK)sum0(GM&Kvlt9FSDLc{n%SWwNrG} zvaPV zHoHX~Nur?DZfVUd8DPSV0pM`R+trENhv2|x8F=KI?{>VK5TFxsK?c@K7I$0`C52<) z-No-{p%u7z4Jbhi>31o9czDSWVf8STWwwZ$`o!}CaG-yLPs5lHUS#Z|>;LXfJXZ!) z$m{KMoDxM9%Fcc$wxrt%N$#C)rGQ5K%XVIfLACNa8#1p(vO%X0igB`ReDXbUJU)`E zfjPkZl@8jKjUb9BLu|-8^Uy|;#N`VcrwU7IRdpP=|M?y`L4-Xb4&%K!y8}=Dcbd$P zW{-%SB^>*Qf;(UwcDX3g(wIGYKIpH(O9(r0tP6rM?d8vb-OHZ2$=~h}zmc~Jc3YKT zU{!#UO)9Q)`&>`b(O$%a5?I5T2%6V5F9391A(Tr&*(i5#0NL&>y>FSk5WTj5IfpHx zewMs)BhaFS=s5oVaM(MUFNkAEXfjli%3cl9czK4<08&+K_;+Q(4dC-}wI-Yx9H&FB z-{z4pqv|im6U52DhKj8#G93b@As930G-9GW!|f>ZB`g)14J+SkTLhQvEdo`)?19NR z=g*u8!1;0(ROn4hF2-ym18;3zWSIi?eyKrSy(qHUas-C+oM2rkKXAR_*5lTcbZlHe z9Z7p*<&si`;!Tga%%ciiqLTsW0>J&xG++D7SIZs2mautjyu^sP$GE)P2sKTW^~|Pg ziQAVeg_XRP@|yeSmanGl|4btfl!86p?h@t9Fd?BCi+lbR?0pN7a^oz9yJqWnKc=La zF3hOf!1sfJpxad^bq-1rR&lfBf!U(M?jUd0_qP}X;##Xgd%+`aXs_q5r4wKC*e5z{ z2LR~~^=>9Iat8!-nTOCm97;%9f^Jo{1)7|3N~0^;{e*|vNSRPD;dWGTimOWf#COjc zV}tvJbE$PWGH$mb{I^0kO>^^BN;BBAU;DrLKd6BpI_ zgIZAEV%w*8bheeOeV|>7{kxLn#)3e^!8}}YQ6Uu2Ux^XCy=B(4pCyV~WHo<6jWjG+ zKJ=isZKB?rt5ocx%)-?p)B;pn$p5td`?wCmSo$>n7tM#a*4!QjtadVPwlEC9@nIK9 zn}qPz7|+Po(1-L;+L#QJ&#m@f(i~UghCEGYO^Ie+maT775GiHX44Q_>WM5A_PP-SY zOnXr6%z)RE*#+QOOU|4IJMGv6f{5+aTzVFOA+eMl9L0ltX!s5xIAfAAX!lgf8^u~%cuEoms-F(_1o*>@zhMN0l=6%piP#U6ryt6HM09N0Cfy}8 z!{#(JB9`b7HI<+iaT>AM5;4q8-v;4mZRMO%zCFu^Vii?%E>rwn*YP>2CEOBe8%=J7 zUo@VY@U6~hur*PD6`RFPKO6nFeQV;{(QfJ%$uK$B`@hZq#+g}1Aue!E!`g$Fc{zJ9 zk>_uKF362qgrLx4Uj`HSAEH_;+Z;;Kgc0pc$asEr>>&Mj%6m}TI*Ek7H_?!+h}^me zdc@Y0eyqM9w-^aAgOOT{G7kVob085L(CQf(mmuR-UVSP{$4E3+lZM0oSXdQQ zH3)MA&(uoY&*7>xq|MU2!?CIy}{2q;N$zexrql@FB_}VTf0>19bi9 zl=5%?$GH3X5$Y`T>{F3AeI#BcCx=@1B}vuHn>#&}kIY}D#9Ssqj`)WvfRQGl!1cV< zz7^jeZN}MpArqbmz=wwzVJLdJOY~QFZwVWF*)Y=UUhmIy!-{u`&(mbT1&@C*Htr3D z=XC3x>9fC!XEXBolc}wOu{G%U`7{&VJZZl7x$Hjh;*vw}VGO_Acd1F@Z`?#YKzycy zVn`prT6Y|dh`{^p7xJ@C74Lh&CerXkl~Aq8GSmuLgdlB=iAj0yg+c(jv{*&KmLHbG z94i>$p4vepSDyY1U^i$LEw^;H=UVS!IBHi;OVvJ`gSB##6?%I6|)j~Dth!%0ZT_V*3q zy{}A9gN{trufsJ5wY`$>Io9%S%&RGlU0Ybdz5dOPYIEc3s~y($ zTDkZ3qe_M?xdlo&n0i+sS1@dA8|lq|LGHtdbXmk%@b!oTbb)(-(qyuD{1A57+F zIBWv#hNNFH0Gw!_GBu`+SP_E4nh9)Su+OqQB@j-!)`i0n1u7Hn@a~u|-z=G(?XX8>uhC@MC z0FsZafX<98(M+Yl!vVm_9L(Ls%_3)3@a@mF+a<3q50bO?E}s{Oe@2L3OtW^zqH_3M zrx`rxYT0cF6%yH)g;2*<)f_T8L#NBqOki{42GA8I8exjQ+d~>*&Rj`Rd*9hMRB5o+ zaI9(&=oQaH^sdV2CB(3VpOz!j{x%q_VJ3W7S=;+&64s+ycreXH)iwSB;KOvT=rBh8 zFYx|XQez*tb?ILgQvTg}(JR=DbojzHTZ4w7q4YmV-6#YQ+Lof2B>OVg37}}9UofqL z?7PQwqh0@Z-n$`-Ut*p&wkP>-=-5mop$s}g(oC;k4SJ5xK$7K^K^fy8-1VWeVUikt zNE?)mgyXn@h#Z}^IgbGNR>O~xj2nQi3CNMWKa?L=^+l)6kFYR?dh^Pe_nM+Bk$N%; zw&9`e?ImQMs9UBrf$63*|I&V?c-GM}e!RftBi)LNjNM}NWdLxl;+kE4@&=A?fI^ld zRi_&y<@H93Ux4FAJ{o@J;uyvlTXVGV#vl?y^#3xN6}Vo2BklI1{hQJhyKE$LC67OO z_Kh>(H89O`@P`uBiT&B3{~nv_7ypl(aiPIH{=zP(fTIHT(lGFxEYl^1>ARk{iozL`RSil^|8u)aiaAKc| z>+aL$mjvjX!PyKb9`aX&73KsKl%+J>dPJP&NC?^j4ybnUY>(>F`{%4w7CSRFGvDZ9!e`%o0R2r0qES$i(UoUAi30*ZXpmAm>V7LWy zYy~K>gsHn={(p5^7#1Y|vSfl?gw}@|t%T8kpNG%qRn*Ag`9Z-1_S?hIfb;YTT-(Po zfyi}4+(Sf&lWN^B{ z&BppVc60!og>>lxGo{;hcd5)%8}#EhIg4@53xXS*0Xlav;)8q;(-KN?Bq&R5Q$P~1(FhrK}ZnGRAaCxVtp|v z*W-vN`5Ke=-7Xk^r9AZ257R7qL1*_7!v=|=F>gj>ff+VkyOePsW$ZRtLEx6?=qKU5H5?7swy~k?FW-y`=tK zUt;yTG>M!W!BoDPYlII93jyN5JdvK{UTz~M@CI(>fNmZ=bX@q<1a-8Y><9a}Y_Nj^ za%U%Uuk%?53b_3O&uJ#$fBKpE*o$mNd<&-(D%A3b)DF@y^#$t=Rir!wiz9olmR)L| zF-<`2Oh89pfL@yHDo(9xhV}JV+a_t80n$%PF>2358CLN z*zrH-5lCcTa+B$huoEu@z&^*P2f;570{m%+VK83CtJBRilPK@ewjAumx%O2%;YPdn zl_2^#rNO0nS>Vl*I|9^I_6mtFsxqB-^=$NxiSz+>cVpC~)?f_<@JB4BSHI(w8_6I; zO(=u{za0N2;;t~KAGThwk&u$ia2*~$mXnEhJSZ<_PWGX9Yx%f1MF`cetH)GeAnf4& zKE52l$2%YGU(xpRO4_EJy7qhF*9)REDl-XiLaacg5OeEkHGD6FtoFw+?rDL$BkTT* zL)IJxN509NTV8LALG{U0Ix~RJ9G!<-MoI>MVMNZm=#`p2+jf9cBZ~#(T-LC? z8M-SnSWQ6PN7B`_8g?OcGi?MqkrB7;wNmKs6RWHSZ~z|?Rg|ub&?}MVxNy0=^V9$V z4yTpDldJ6Cw~-l`90t4u*pMjJjEZH3O`YAW2Un;v2a|1jmVABMt`CUCNsss6=iyg= zud+8IEL$=h7cq~vx$wP7(54gyD!+beQ5BXF&Z}wI{K`JJFX53~+K`QAq>3eg|60PK zjQ_8EFV!A*ejVoby-|z2yj)AjE<1hWP%QnfAL7@{a3{I6-Eq?wou>~|5;-3>m?4?A zN!-AGF;py;T>l;B{Y{$sV@!O(CvHKbiXkZh@MmigSqy#LVd3&nAoeJwU~?DMr9-~B zw?D}cag0<9BE1SU#(m$5?ajW_ItzLw;Q9GaE{bcgN+0-t=i~gyJAp2-)DA$$f^e{qGml`k>^;5^k)fO(Agxm=FqWtV>Q!k znPYQyk#zw$ge=fN>te_3aTcE<_OR723kB|vNg9Z&u^P%_naMX7)laQu5e`k)TMBD4 z<`N-Yy4@QR^<5N1#g*r8)*T-c-|;V6v4l16DU^T1E+}W{#QKf&^m~rn{PMbeg|v0| z_JQN*?rAs$AwN7!7gc?0+~r8-2xZ3{z@CA6cska0V+U^naEKmL1bVg;+e(k=i>zhCzs#?aKucVTf&i zDv3OSzfkHYLdQ_TT;Fj|a`A>z{&Y{sun#4IVQF;kwdGk*+8|w4PFRqBX3B2v5Vc9a zwX7C5`&<8YX!N8dnSFUQ4iz0t7MtFJu1CZKFo4hIGWFhIF8bmyg3U`1ChDn>9j@6I zsw}=5;hd;~InmuouH;mB0YlIaQJcQ3bcG-WlAsSZ+Z=O;44|e zk6vp>_Cb+;&nM?m*jAyepcFBaOo=w983yE^D4!?)jlvXm>-}7`JD8?6m%=Ie+m;Bca|(Ai_FGXs03f~hFk+B zB&pRf#H1K&^ny>F8kGs2XNz>-IH23_nMVim4N|JjV|f|@0pRo2s!WyyudM_u#_99R z@)hmSfPJYh6X(0;pz-gH5gaAH-}dTEBxIQ5(zg6}6(2Xj2QSATGxgCIIfK6+p6Tgv z0DLNz;+_Nt1`0_ucLnRdWcr91dJ86`eQ5Vq%_YvF;<0@9hPMqtnFD=GLm6$HXLqtle#x*Hok1}a>7 zRBmBzV=`-NlooRa@;&Gt9FFa1rdYX)IXO(!Cqe;ye(w6&r(>XL9sCXvsQ2)IFUz3t zUKQD3Nn|Qyj-x##12!u6bry~t9vnsg5z);c2U0)DEajm@v}1a{w#_nikTM-!!3 zmmmOnDQQ8h0s1M2NT)GsF(}7*$!LnpeI{Y7%BZbo2EMj;Yv0)fP zx#}^r(b-t|z3+A-Us>v{(DU4^A|GY=EE*2d2@FgozlCrC8!^MG_n|alXtY}-^xBrxxUtQK;4PsLXPCTABbHbpys6-kK~#kfHN?|onl!Eo5(RDGQg-rr0J5F>>xP?>jB$W!ed z{O|Lqo5KF0s_NaJECe|Tzmv>Q(E_v`0^8ihzuMFybDcghAt_n8_!Cy0L&uO1}_T$27#2GSO ziFw0)ESsm7C+87Kh(zM=A48VtM0I6p2-#U&BkilPB97(jq5wWYmwlpBt$S%` z_=Bm4ke|^NL8{ZscZu?+6}Rhfy_10sehb=P)-Rx&X`I9VEi&{nLx;c*^|sPE+cXXCP;?`+knRBbq#@fuFQpKlL#7^oZ#>>H%CV>#c$~;LA!xtr9x$o2$a7J2#{uzSO3;SE zw)Sk%v<24-2mE5F97#Vgqs6m(H`7NPT6n4J`L%9ajI$=Ci`NGw?gKNP;-FM+zsL*l z=Wvkc?S;xc)JysLZN>ubMHT7yfPosim@2r>!j@uaN`NrjzI}FcE7RZuQCK4ZDT&M)uF{*`H%NzJ zw2hh1XVyB%-baIrcNSB$BrK)NbWHC3X(-wW-U+2jE411(g&OD^j#vMkf4GE4_Ugr| z`)a7~g^|3|{4>lAPMP}J32GpDaIr!j@^f>k*TI4ttQC~WI1}DtOVG9Dij+Mcp{lRh zct)m@{4W*2AE6i^G?e!lsUAw~S2Dscb)?QkHj!O^G^W`wUBf@=_e~7i>)}24K&4O( z?rCsuq3HjGC~igw_t9d~^|$Ix^1tt`Bh)_+leQd}wuM*%SL9eQ9>K+lR}GEIFlz&w zJ%?>~g(LYY2ZoBgt+_Mpw ztTEUQJ-Yq%HBkZm(xg-|fRB$JCZ>Lg z6EqXo+lR26x}csN9s|5z5VLM$U)Ak~-HTs&G0XQkThDIW@-(zGKCwcG>=Ec%%px3+ z^kuhO^{nUpvDpcogZYjl%3B6*(j%pU#`)`}L&%>17A(P5MCWOh)aa2oOnLwxfV}^i zCI`|ocJQx{Ekiq~yg&^7jeq^G2@GV{9Wrbg650#Z{)Shnay{?#T0tp}xf?!T_jQ{z z64-fPwzg^k^!3T{TW^4pa&U}ZUUo2Q6?|{+)m|@nn$OofhYNJ@(;>Nzaui*sj5<5+ z!nWo)Pj8UWdiK#4(5cr7Vivat@nIk`IkrXye*lgPtgB$A(t6-y% zdOhM!%fXYswD`%)aC1INF#9{rT}3 zZD0`R3B zHUjvtZp#PM=BssnC`3Rv_VlngzhzabB0AX>>>NV1gYDfiXot9UMOe4b378jpkX={` zBNmg}Ch@GC#7{Y(NyTV*0B}SjH&OEi*XN=$jUz~H|4RiOdflG>A$-puMHuDH1X;t) zxqP25*)@TG+(E^xxgcDYFPs7m@n%g>3QpLNj>h#}FBjKs*4;{Qj_pc})JGuehmiM8~j4sAUUjiZwWf2%@yRc6e-}gpsSoL`z<5JQB zk26|dFY|!x&EH=(;O%kQN7LLL7uc7kMx?V;);IRJi1!=|X_v z@_t$Zu{@eUzbu(Ko^p<~UC}@Rx^Q?nNgC%$X7R^`YIqJt6i~X1$yCLp)$nUQ{}I8P zNRa(@eAbhMwd&2?8L3&5%E{T|+$|}&lGzT00)F8^IRC!4#flbOlqXsyt7GbQSz?9h zx;~P4bM|U7VHedSatsFkQaFeMWD=H)+Wt<>6`-KJ`>;;k8!*(VwLqgs*;(lLZ!|oeG$NdGpF%?PAJqy2NHkKZ4kA-j z^)H$WA3hmlpPU z1f|~(S0?lg*Dxa5hmu$@N6b0x6^@EKK(q&aU#UG|FpS97(zYNh?YTyM#RLAH2P@+(J?!}`4JTr-exEOv$q zTn$eve_lt`2eGwug{=dzP^gz2Oj8TMXYKRRw_(XMWPPIn@%9;e<4?)kbs&ZK^@rPP5=%dP=N7LEjsEa13F#`T6 zz`t+``3gP~rvm;@8sc0?>pgo?cd zrx`Da5iso$Bkzk9t?UbYMjxUSiqXBA*JL!->4%bAYa3yBiLGG|aSP)xJckH?5B$5L z_Anjf0gw44bN`xkUcJwcbp9=ugJ03!VOJeWNV8&Y;akhXnewnhHh)vy-a)Z$X`o;h z0)M{#_I|ZpAiW0QfDE4*g*a&db8-5Ol;hkVxW%8t`Pzdb0 z)wb5TfA-Z@U56srwmAkuTHA%D?<$^3uRv}_DrDtA6_r%VsBN)BJzBS(0lI`NKr$4`v0Qdu-^*_@jX5`rw zUiYpv_5;5|=R76vD=;k*Vd8=)cDifqLVj@_z&+Y9^RB=nhH9u&FIZ-;#UuQPntaf$ zRM|lfQ(yrK0O)!|*}Mz4GVOTy5Yy>kma^L{Kl)YbTgEpT z@_|jLC!BE*U6~{D)4N@oF(Ee1%Vwwy;7DK#K4^M(8qkIxHGq#xj(Y9mx(ru|8boej6K!}h zS`0sdz!XAnYORbCu)e7US-ii-97?Lv#zweDy4_r=KopLuN8c4w2Mx37DRw6x07oU| z-K&KF%NiKPl#XrullwQbsNsXvJho45H@_uc>BYewGZsGPGneLLITM0SQ_w(T_Ucqh zUX5X@fXzufFZL(E=W@GG;h>Va-5)fl(!oZ*c}bYD_7o!FPBere%*BqpYN=x037u8s zZb{r4YnD^(<|$G<*#5rR;5yT)d)vHCgiru*v`n=OD|kW#n@8Jvu?!CL1NSActQ213 z*AVVWQ8Af95){9j^`WT{_-j=1ZKW{1zpx(E3O)jCw~sZ*Sdw$V>u`yRa-vc>%2*L5osJxUYB7uI(Nzq9(qOH9M{ zd;E&(JHO>EGOoHI{|RZ}m_z8FpQ^(PkOgYazmI~PO;6bQiw!9UP8?e$_($0=`}Om8 zwARI-Ew!D%#7C~r%*q&FYCkW1fG+<(L`k1;;klqg;TH!&V3w*wm5>iUrnc@Kc z997s1H4TxzKb7V?@`$T);(a~Aaky&{ADvY-vqEg}%5%1mN4sx}fnoMtu}4 z<&Z--?YWXP-uOlD|9vk&O_Gg=Ik%-wmm2=#GGK%P@nt9P`l5lR-y@8cTqCB2v!@Ua zGem+O^Jt8Jb{9B0+Ck>W0O>@T;F@iu^dZ zi8)bQn7ydsgk>kbD@hUT^4xn%*~SHh(*{Q_e(9*St_W}e&PMh`K8OY;09}fN?Sx|d zYK|r&ns}V!E$MRBp?M5}ov(zx1--;8R9p_$&1j)ZK;neZ)1p1wg#uu4bfn=zLzZF5*`yPMTkpr%*)2o{@jDrU$;P#z+RoHYsD7WByr zK5uV4x7O-UQ^=b#HpBD2&KC3tC5;5|xoIf=Z903wMAGSbKfewfYxGW4NFuV1B~)?w zs7qO>LQ0g%?^*-lGL`WWrN$vA)5u+~tq3aSR0<;Wz69>SlnNL>WMRrSP^nkzA({F$ z?|aH=l`^POB6)*_h?MT>&Sfs$w~zgpQG?oYQi^i*CbzL9(p&elRgztFSS{*(wKhg5()_N_K!h55HCa za+W3k8mr0rIf{N6J_Nho^GEXU^nxC5<`xEuG?_@2zwZIbu55tNXQwz+%|G+CVjlAJ zrUlHIH8oa#r49fNuCcT|ZCe;pG7(nl$^>cAb)O*>Y$yr)ywrrg``P@kSzrSCKM`PMP2u#qQQag9p6F2Ut*6Rl@mtebAJTJUQnWte0t}(ddd}FR9+?7PQKAnrg?G(O4`iMV zq?m~7=$Z3;?NzK5g1fctFHlu$l$2PqVQIVEoCNGKW*K znF~8L@b$I#f~lY-$BJ|vzwbNTjsg8rrqJXc=QcfzDA7f31pQI4&C6F7=Oyl^u1KUo z^vXA=0Bjd}2Mi^+Y;KPEm$RjAtYt5GI4CC-_^@mWAKjiIsbB`WB+8)gb=?Mn zFiR-cI&Hg;#MMh8xNow?uT|H5jl)O2Zsf$>eo+-fQAK=h73MeECCRHk?fd@e_;u{o zHch5u-%4CeauGIwKUiuoyFc~@F$K>e|J6U*dn^pa(MJ6^b4uHp@pFd~&3!kThM1dO zsta>`Q%7&zUV~irn_025!r&ZqY#7(e*7XywbZ!}>7P&3-Yz zQ|HQLC%&p{E7t#4MqXI|&zTXL@W&Ev3UboIW-jnLfl>F)WDMnF>=wYED#`m8ri=&S z*cx0$@{-3xaV(2@BP+e6ZfLJyMeC;+U19W}E+${=x^iuNQ;F(C{Vlka(z0L;)2dJ! zK)oI^Z2&%hTl4!j%Da{JLsoW!r$m0!YpKb4L}Oq!eQBZ7jG&^#Fj^US2N#iJ0ckfc z8-UwSwePu{N(OuJU0!7y<$8fs>)QnI zNAYJ-HA{EFuFc+)s3luiry_IcPz>pOBSFjSfms0Z9Lm<*6YK%SU_NRfymrEkaQ5S0 zF6w{TPKi#^Uqz4Mj`aYXHYBFl8IbeCvwVeZCXnTSIJ>bhr^Q`HT&M@tsLBjs9F(`@ z?X*aYBKX05hX2(PKceP=q|yCh_y3r?rvE&jrybk2ZQHhO+qR81ZqnFJ8Z}ND+qP{d zO_RLegXekwhTqYiU7u@aXYYGwN2W`DoC<7Wn12B{pm>1;7K7&%U~5-(hEn?9wB71I zo^1SsX*N2VpBds-(dbbQW4Cv9r3oUdTh~|f{_DZhY}hT)X=lY8ykzT$AP>M1I-~QO zFZh)&N49`byfYS?a^6RD!;5_4^TAk40TPe^8=x;ha245)>e)y<$7M0??Kyi;OZ{l6 ztVwM%&r(MQjPLwl_Woq2tLC((Zup%m?AZ9PAlKpBu_he7)x70vMQHQSVd5)@370a2 zgt5DFnXD}y`Ba-}#rzH6-<~@?og&Lc z3=Ycu2Km}21G1bzqVOUOsTN(-1Tu}#D7(cd_oBmT8=#+z3zW@r8oi~^QMcAx6~x-f zqT~liaqYclcY*qBUnmH}D8x2Sy0+TJEf1k#l&ZnzSb}2rvV3Hn3&?6&T6uI}99I1W zWNJL#bzyiaR8t|CpnzQND2`tIgi=>Ls^U*+bKl7)L-PVhs`?A75ybuxZrCiC$~JdrVu|wS?m2x+!Z!DOl)F<@m|I%p7H=V zp8}9P!s$9|PGw>LWp{4Qu4LR_eVv}nrK5~UQ3{L12JQbKrIXltqp^uBgiZbf@y``v zKo#b0_hajQh#*EX6X+NC;yG@6lGxL-KXg!r!n?4dv$_%CF4hFyH?An6wP)%99*n$AVcj~bJ zZpTr> z?#7e_@P0UQ0HL~&1Hld{_&qM}&w!JYlK8$`*|qryb)X@pjqXTA3-UGRVa5iZRY^ZB zj>>qlN!2(RKd7E2X2Z*AO1$ipEn;dEVSUU5seHf-0klNl*{ z_*-J*6T_619b0h*Ydzz?>Boe&tH8XS z_%`46_}M||&Q4w|j65vHkwwZrd%fwYgN!!*pn~pIncx+M=GU!n&R6z*`1j8)VU9&H z4w!LLXv)~rmocqB&H#MamtqZYLmtuvhM)T<=2}9F@sh~5Py>8%C>+pa!a;l`HcS(3 zl=SHj6+?=mC!eWrqda#kupP}oz7gkQgIJ0b0&oTi|82%kiVL|rEt)u+QTi<~!lE!V z;8n>h26@0c1qr-@fu`}LDY^YzL;%&pi(!TeO57h45&UMDLopksD^j-%upg?q{kuE^ z2eV)eJzDYh@x~GfkkFpy2i69kaK(nNjq>yR7;0s#!Hq#^QzgMuD*rMLCP_7ali_IcB*)&ake> zR@(1N^pvJ8zOPq%oK02AG}p#Y9oVk`@2}nfjl7okl(KA760fR;pBBL}iW}Kbzyj@N z-a!^gv~s*ji+Yx&ZeUlm#;j2Eqo>ZV$~^<*;x&G?l7k0RVBDeFri^+>y9jeMmm1(0K*++BB^}c&P+>B+PhAE@AJ&W(YUmB776A4 z;*Tb%w9b!o|2F30vsaYKItkb^{Ayd1J{i5-_xr@%)=iQxVsj2Tsp>>bCJzpPKb4Vv zv)j#Wn;Lil*iVu6-`>9{e-rJ)4bk@1HMfJUR?E$Ke<4;Pb!UX3G!>$MGHZOvJTz4A z?C@?>D|xCfa7E<4Wfs_)W|hwA2K0jfaCV!6uV67(@pYj+zW@8l`-dzbc~4@>`=jmn zjAs4y!SHfnFzpZb#mzIKubV(QB^X_1$V2Df?c%ZJL;7Y^*L^PlPF8c%zb9>swD5kW zCQX4zbisXom<)%B{C}QNnAlCWOJyT&-);pZ2FksB9L~*_qQr-#8vn>gw+xF5T`(g= zj-vwhYtz*$!Jz9X#n|46lmu@bDew$}HN`9f6JfU3Mn_O}*3LJkduolBL(qR9FL`9P zNjY~ABz6?;8w@d#L^Hyf5U@`C+A8SN#BqS46E4e`q7LqB5EmZ;@f(W|Qoz*+B!1PU z8=Au^fzjd|$5tTz*@4Fw`+|&Y=Gt#;zu9xNI(i1eegGfvOwOw(PgaEPC9LyE+;(N! zB=UASzn?xv>m%U-&8Q^S=pXQ|qmq~7p7U(rRgN-0K}1(DrW`+7q}w`ZC73RNey+Sy z1v?xzl8D+-?F`m4;~Qz#Rt?SK{x^BM{BYC9f(}>3Yv%^|whOUtLIqiivVC^X6{*{K zIoY?KFeImdsZwBn5&=DO*iOo7p85-V^`Dk?IfMg4WM5WjlwWevW1mZvq@4{@%8+|~ zjHRZ0N%%wC%*VL3-tx?v-=h7yPoO9SPv!t};gb$Gc*eIck2=~_7|am&d$Y*7nyB_p zNFH;%vd(drH8(ubM^pU$sX%GA0KP@|^1F-2Y58~Z+x=0DSUHlR7O=ixL%%awN3+>D z_;B3COp7fJ@)w-*afYVS5+{HWIEL5Fr@8RE1m}Pcm7SWUL z;D+D+z&YSMSq}ZQmtCkJB(b}iH5lqOT2`pC+?Ry?p-t3pe~e5{rPeUVVeM@~Z$0nc zN-(tD=dS0~<9@{KnYzZ0Q}ee>0_6H%TfQe7Pm#qk?%@l+$eLpZTnb)Dj9~ETO%`@D z`iMPb&>wEuR71+rM8{c?oV07WTcnETxTlo`?!HO(G4y5~b^zn%za0C#OU|!7Ql`l+ zPAR--lM`SiyCisX5r!2177#x;qxOqTuKx}eAed^-xHMez5RK(2+aOO1YawU-CmBdz z1?=BjmL0*qfh8s)94h7yR_*IsMID4n+dKZtu@z45caDURg)O|4cgGC}{Oo^KA-n3H zw*nbhu92g0b8CK}Jr1s*zSRmkL9n z)IlHTq)QWKJ2@KWys_CA9|jA{ufZj!R%@k$)|Z%e6tZv4OUyBM+K}t(M%RGvPmDk% zmFdr97Y{sH)VmH^YF;LMjTRS;Sl%1sQE9FO?4aGanl`6()Y2sP-@-{PGM%Ff;VZH4$Wo=%Ex9paaFI4YoJGXHX3>nr;8T&CV-EOVa*arNgbxQ zUII2tFRIh=wkj1O&K>A;#fk1BlgY}q6!$jhn2;d^xX6A8rXp*M=AC5<tH>->9{vqK64>=;u@TO4V;5j(m$y5%qHRKof{ys)gM+&A_v~LC)?N$~V z+thQ{D#?ai>l*}y6)P9p%*`=CE@YmFTa>hl^TYNyNu-zLw20wvgph95_E%>wMCl{> zcsHU3ziuLe24R&zhkb&%uP?dPiCR$QcIh9vB zODKN9V?PTwC#XnNpg@GUheS&au|*Z7_Ep@_9ho_d{r4^u2tN%{D#wz~bx)n%0*srN zGBHA);kVg1{nwPi+xk=yK_ z(;J4-*Jg&(&fflHNC2OsO-O6K8OW7@GBXJ!lAeFTW{Bbg@wi6BS(YberGk5}Lu@WI z<1@eGSi-TZ*KA-C5Fkf~X?_oFSETawF$q!d0&sj}k(1Fd38ZK)=gqfn%M*qU0!-$A zq^x%`c7_TU((AGgh`fx*1!A8391J@_RVPgQdCBi8#bS_HO%A7DM7#>L=PwMbr@u}K zj$O*}QR)jbB>h#OWSAYf*()HpiC2l;_LR11fALO=9rWA>3iJ*`-LI7e+lyLrr);OY zB~?*H>VRH{b)@y> z(PHe<@9Wh(jdW}6<5^Pa1@TW2vjB3XEWtBd<-}T;{m6LmG&2?D^W_*^&;6J1Aagsl zSafkcv>Q#|0Lkd=kNS#_Ce@1vSIF|a>{8Jhal6J>dz=8u31C0n+awq*mQT3epUG-Y z)wn-B>S&tpzi3x_w89(}vbgs%g#_0GG?ZJv#hE+~A77nbcC8*8Q=SfOi= z0es*;IkCwfxG;n>D>7h`(U~+h5K#WfBs7#H9E3W^dap1QbZSd5cI8Ga^pO_I>cS^3 zAGg)X(u!vQ^m7=IO%cyWcJWE_O! zyI^`q+xnu45P*~I@(32W_f&!K@k-+e+b^)uRo%I##N(*5$-HS4f>i~>F;}94Rkmb` zZ$RlPl2ga-C|*WW5rbJi=b<#;0gW^SkV_L&r42j!58pu#bEq`CLJTYymp8NyN2Si* z6<)-#;)dQ5n)$g3kE4@bK#7MZ#bWQb0EkA`sg~oL1j5Lx(n$&cpQ&4&M-(sSy_W<<}qsBtWj#L;*r-B8R)waj9w)@$^BE&jd_+C_TK-y_CDktY$O! zmh7K0Mn4hyU_i{@o1tm>VCrxS7{ha3Ol|uM*L6*w0CFw4{W@EK&FR&ypT>)}2r|3& zOb!zXOC_b6AJo4uCi0;+aVx7~v&#xnoiod}jtaSLP zH$=J56*Z6JZ_xq(9{}9{%t9RDSDj}3K#%x-;KNhgy_so@Ti}<5-cESrBAx?xFnX$0>x zFSVLS?NvrAQj76>&@&aaFl%UVr^ff^H0~ME%VmshH6)STj)pvi!VjrGaR7}(NO?qm zX$xyHOq*Fs-`%ge$oo%2^RxAGU1cWWp*C9Uy4k?@MaChh5G_fr*p`xOyR5}z--%nz zhN?#MQCAZI`(nNK7UHCBvv-@+fc$tx-1@IMO}OdBhBkLVr7m9ePrQYTq?f-%^rOW%QZ=wc9(Eyy06wxMN?)DW=i`MKcgc9w7h*pDf-hXtWzN?1 z9owMK&>Vz}TZq-h!xxt}Rf&YgF+U+iYY`RfacYO>K(KwZr~QEMnPPF#s46neq9<9@ z)48OBie@FJ^-rmPBuJSjaNeXcs3CWCTq>E|mfM}w!4TjA!+)gS>0v6=J3f_;>hl_I z4$1-a98j>2$imfljMSm#l!7~NVRJHPv+m?`^aNoy@l6=3cApmoB`yh8FYmDw)r$=# z8m~-BV8Ldd;{lIiA$qvuj{;|{QG~4f0M0-)(-z%44+$>umpL`yXlxT zXJ=b$#n+W_G0+9hJxLiSE$I5)&x4#q!1zLM>`DbQZTMYm(O2*7mnJxll?Q@-KBP&< znr<{yEy0C$Ve#So%(2?x8E~IA>k)EMnvYn`#<2uV43&u@)@g;b{ z4X~T`k-9eNu==6EY%uLBV zhJ|#1>v;e@e`8S4;L&PO`4}3j0_^+0AQAovVS7K;D*>qD*=NWH{@aI;QD3=H9t^)P zVw|*DCloDNrN7d|BrksrIe%2)_Pv1RL0O==H$wearw;ZK4Z!Ku*+21{NaXU@Jv=?P zh%=tCEKIhYd9QhVUoZhRq0M5L~9SmY!qmI+u(gYgg78E|fn#%F}#mSo573 zpy!*sXvBNJ1{^7r#*o1j`Av$y2kz0~`VT?Bz**8bQ=Q2N;Lwe}TTyz{5%Xw$PP%I< z-NBWz7=-ZrH*KLGMOXkR7w>0c=o#&SJ3_^Zi@L#?V_UyjX6l zuut^y=yiaWYyT&Pe1eH1`-0_47Gy>WU(m6OePQX^F(MR2OSm(^+rR!=;5lu$tb&~X znb_KQwcUjwn)%J1JuOuwWD%a>9FC7lSp8ifeyGi>3dUTSPw_cc5iLYEhkl$ikAPuC28;pX( z1M?V3K1an!`r|Tv{;~PM7ieu`I!^6&m=}L5pH`hAy&nJYa=M;TSe8fGn%ea&<*ZyY z*u-Cd>NfEH5#nh&fSCdc>?dQJnq}h5xVottwb3lvAz$sV$ zO$m`vOEq;KUf%O_$ujj#)A^KmvVwgc;R$bANFnt8@Ssj=jAFn9RBN(C06NeF3T+qoHxI~JN zIkuiY{=oG599bB%Nj56*%p+uzD`A=?pAuOd!Cq;V}Er}A1d#L$g7I}9K zD9hRFIY2G|t^b+jyu;7_pCA~>?Nx}Z&E+KlbBXyaJ0jV+eTvBIP)d92+Qkg6+aK8voa7>|DCaCRW zAf#;OLGzaT0{jW1$==4BW~JlM34i@52k~gHQ@2WGrYb6=bM@ODw=Yo~)oFo=uImcK zSCa(bM63!VigR^?a~7KsUUQd|s2eCJ8GG+>eF;AkYarz?nj!xma(34aNixBo8;|7Lx~ zop~$S_RO(DtM|S8<<=xRG6fQi^frL0enI0B^b|g^41gm-@m~WflMYohNjcLx&Ybg5 zWKqJ>E_;wbOczw~8dgDmx1fKNJ-=*Yt*LoB)CwJ8Xk=3%9b|ekOY1|{aOZ>*066Wx zhL&S!a$x!6K8bnu3=UA!Qa#2w1<()t?wQ%})zF;^OkOCtPP$fK?R4Zt7YJ z)+JTb5bozgg<9r9?)xn?t%JN-Q$MfOd>gDZI2)pI^Xiyo$fDU9oCJUm(iQ1aDc7#x zRs1O#NY<{wv3;;wAg2pyf0?xY*V$M=+J(#y{s-a^5gbPDWmDdXAAF_V{O}tCAj&J* zJ_UDQzvML*S~*SNjO{l;>L=Su_@ z%(LWV8Poh|u@Z={{C%toO90zy$ zHO~@_-s^Eel(=D+XB}UomN!QDnAIlaKlS6g39NSLP-y0VzM>+8e`aH4XYB2A{w@RX zq3v&2svc9dA2-|2>p`O>baG4x-+F*Clfc|tKB{aVILn~2W6%252E~?pKHAk6}yaby&zn)V7C^q*@(bN z?|mA9xV-dcg1Nx1c$!vd$i}>sS+l*~G(|LL0q}XrE$eG;Lqwdx>zk2+*QE*6%Wcqa z<5uMh^(t13wl$FrZKQ*xLXFOuJ+=i&>f7pk!vGzT;PfY=6+0z{VXQ*|;Ec^J_4{n= z)RtbFQ;BBTo;X^U1}Ev(p|_LsaiTP?nd)m69KX+0=0nHsvU%JSej_r9+3Dh(1@k+E zwg2$^`>hXfE@YW3Z-jKDsGqv|#;lk-!X7fW|8eiQ_`y3cVt_rl8`dg?vtl4}n{t^V zbHQW;`gDh>VOz%dQuY2JF0#4~1O=Yc=hBosK8C-3Z3;fI)(lgg0lT_zK6{{B%`~1! zOO~5aZsM8>bmtTe2e8I(^GA2XLCpNn%3=qB?L>`&AQCm3z&M&5SVCPQ-kicH+PHbq zlB)S{mM-_Zp&iDme^}c0yzQIU&ZFTsd_{#}K}?@&A=+GyzH)v-&WH)7xcq-<^DUh5 z0CF|(4Iv_7Ap996!g0dtGS!t)9JbkSh=0C}N}3mp_82!d_s=D)zzT^cIf-f%G$9u6 zyUbQ*nq@suSE*qVE)E0c+n}6Z8jRSfsTnwWIYShO&kiNftB@1WZ&Vwr{3elXt#l2_ z_0){mT+Mt6*~8Q~Myx-rYCX9K_3v5Jwg(&Da|#CVN%Kr;qQyGts{7O$cFSr! zVIur?Bn#2858z{r8nD~`FQ|25T<+fZ>i1FyFC!S07D+!0iEcH`chXk4b~7F7Rr@R* zFmGLL0ZlHJuGs4EXm*l#u*95eH%D7w9eptV@J#uewlm1T15NVX8yLQ^(PpE$xJ^~|TRk!5!@5xYO0 z==d%UK%`?rY31+W1u&l5+HXC%f90pnsZ;Uk8Me zR59`ohB5xG7pOVWuSJm8m($N#ORPfgV-?**rL#FpVn1UeKj!6!mOr0Dt7Mo!?Gg=z z@8m7o9Gi0!QvsfL;qh1~a0>8kFt87dA0H8tyr1%;QLJS>s^3ehYkz7Z!48!4Nk$e; zB^g+JK&P9rqkn6m)|&E0KrYy_;9`wXbO7ilM;!0$Zi|4%o~M^*33IbfyUgf8oc#Wt zn79DvJnZwWn_3Uv{qYTg=fM!n(JW)$W?ay`L#17kiT?$+R_Ep#crGBG+%5Yd=+@2x zwj(edr>#UO#GcI4Q%{ z;3NywGl91|tjcVc6TYRAwCkF;Iqtb5vVAICAjH!-+_dt{O9wLowgdG3v{cj!AC*i5 zCM8+$K2(sqwSG6KRDHzPP9MO6A0su==UHaSu(t< zE%gY^fWFUBg~ziy{|OZ3BhA2@laVKX?=%qJNHwqQ1jf7H^3l>UjN5&B;EWab6je|# zwiSgDDMwDTYCz7L<^GWHV>CM1pkDoLi4fCxq(2~Uty$a!uSN_m3_a+%Xcd&PJ4sQuSFKthJ{a5`fd6qbIT6r) zw7aQ~1E!$3d=JIM3>ejQqLBmX;FVqcelR&ctVx-8j8dcHHGirD=lJy83xUoxQ>LY< zmSj31v}9U}J>=5k;q)44Z}%S}4DwDY^2c1PYg>2Sw7kkIl1&s8$zIi=%rItFeB}T4 zu#DUBj8lnKx;xD$;h!`EsNxAtzp^(ntd>gQ80${WNR*TX(DdI|YO z-U?st4lP}oc`-4K38Pr95a3_gthFJkT8AKcr*!b$6BuXAM(7>;2x^$$^<j{V|HKX-yXl_q3hScj%K3m!f4(uep|s!Sn#vOyd1LPPLB9L2l#?1L2wPbs z>tBP@X>4q_u&^Wz08Wfko>Q>hm8o9dsm0);7Q}4O-rMS!@i`i!#zg(j2xIPDQi8#o z$haGg0e3z^Fvq;Z8^|;9e{KKG-z#HiBo5vHIF=k9Wyf|$Sk9k`((7{jW9T}Jhda;T zX|aY_F`oz~{&Ma5!)|}~&L(ZtRJA0|IhiF(!FQ>u6~Yh=yVBH>IuZs0U2lGua8S>}PexAb_qRmy zx~e%Pv02*BcER2vjUSBszf{cbtWN+A7$el5_YdmdPLo0b8~xO!8kK)#4fE5x$BKua zC7@A_E}(fGVUg}co<-gFjdYYMLoHeeB2kgPld)V9g!|hdHvw>F(daT9u@a1p4JGE+ ziJCz);B3#Pb13P%O+W1kYq}5h`v{-9FlJb?Jwb-uDNn>lQJi0iea_*-g}LltmUY?s z0D5*newgyOj_KFUY*=kl`&&^%`9jVj_eR{O)U2a_Lw`HmW7f8V{|eWtzs!^S19#%B z)@=Bt%T~ge|DFGn`dR;JegN@n~WLiEof@Pjz*G`|7-Lz z1^ONg(O!)H!ta$`wc0=V^n|qCRt%IB7&pJ4E>4c;v**IB=tRl7GVf*2W0N@J!^m`I z8bfOjeDpuQ_uuCHMk|z9h3Ktn7pOXtvLA`0P!LkE>%b>kLr0kl;Pbz>Xm5513%wMY zaWZx^*vR*upL9QXnFkZPHVG3ng{v}Sy@Z(l0V^eeRRLTi!yk zELzpPCT8E6&&emvOn3hhJU$>S1)!KIJ^h7y`We*HI|o79OywRLA;OUhRdmG2-Q zz$X)5{zg+R!|B<-GQRt_xo`n|C+^1h`0(K7H-XXHnEdIVGI&GsjC|Iew3@A+ELFYp zonOm?zor(yYw<0J^29f~A&e^pEhxC#6TJw<4TbPX4!v1@7-ve(J04c$G5z-_`YK zZcaLdd}1Gj2xx!gD%-BBTR2c7qhHl1hr6@ccm>?))su1CfvFh9-EvpOECKuEG!6BmmXb)u}f06bZNPe5#W}`X*EL-w)0kG{hi#o zTrMF^#`m6G%?#ip?XY=R@1Rv0Oa1-h)`<+eS3gQ0Q7ynU1_wWff{9Lb~c`!x{ zn`&_tAtV5W@0^mNgk7-0ZDs759{W5ID3^5keID|)@ryq^SFZ+rAPU#4qQWg3yxnuR z_$guuyYzgydRSKxn(uWdT>m0yinGD=&B(i@x0Xk`xb4+KzGj7D!Kmv-`fR-&~SwrJG0k1^Vt(MNvIr2K6?M&F$6R^S%gPj~h5MwhiKchV0czV=FP?&jR3S6!;comV)X6j2>w@Yx zcu{e)XFu4Bjmh!h#$Q#07f*a^tO9=*X1>oC1~I<%cJ9<0AN9@a=l44P540i? zaFl6T7kBKdU~Q%zjHig=vX0Y-Gm(&pH%07QxrzG1Kb7IUMtnb3+9B(^%L0r6I7j|L zjHE8zdS2rMzm^$K^d!yyW~E`%b!1P>wqz}nb+-?n{oAo)-{!IieHR#HG_eY5VE@h< zm78d`wdr~NDh`b6vG9@!cJSZfbAZ_MqjmbPjCOGJ43eIg#A5!gBE3IKry&r{ZB>$O zF8q5u@ia_c!g+F7cES`>-6UzLu~FmH1U#p=K1^UG577bbRK8$4nGoZztrurSdGTF8 zUaAdQ1xG8?Va|K|)BgrKy3UGGR-ak~qf{~PzKUQgXKAlm)azh)0_;%#v7E1$AuQ z7k^f40Q#XwES}dqdOYJOhJ5!I;)wcTRttu(c<9I}+arSo3reUyz<6O6m5q}GI#o@+ zNisNCt2z`|9Vhi?5uJKD2G>dvfP>vsfTt3z#$vHB3oHLF0HeB<+w{+6eBca4i%(>g zU2c6av-;|lUMzg`xwU(ubYIc=gSAbd6z`Wcq$@stH1qQCN7V4KUr@wn(%2?9)s(FV(xAO_|t~V(-rDd8{9)LJR zQamHbOCffZ=@8ZK-{VnIXU$(7TnW1#79<#<^GnUKzczE)AUKH~T zDr0k4DnUMu`n9Y1$RUFs|Lfb%+JE8Q?bYM%HM*mPo8!@)7ek5n!A^SspSkPSfuUB8 z9BvEUL+N$;P6Tz_7eAc3LaOenCb;HL-jlh>AHyKoJ3?fzr(XCJCFZAUkcUiNuZDI0 zQgo2fVwV7%ogx%S|C8GtMJcpaM(%7kygn1&MJ*!#z$lYiompbn1EMYp@_~F)cfJYL zMfr~M41He@s)48=VoJKF=&$amDF6=jwgSr)4INc6j5vIGXlDH`5qt5MUE>Earh-8S z9{fXfNy@ve24jF7gTT69b2n$>8a=9@F*3R`V%#GF>8Uo*ZyJ(n=Rg$A=u8cFe7R<^ z4ItuKWzMH?r(!W!>r{4C;^HMyAXK5M1~-7ky-vyRq%pxO$bDsTQI$kyGyL2^gaH1R zD=+evY6;TYcd3=&F~Vmdr5};lf=(Ymd=#u8c1VvGkfThB4$xl6hp8skaZt?DMz}N@ zas1@^-y&tqlkDcP{s816t+vczlwk`@g|VU8qOG{5p)zzBakj@Vf1bz`vv=%)b8`hR9IXKF?tmBzRHz2Ad{E&+M+ z2d_M;7~y#{`laJQyJ@SMaib`7j&(VUqit+7Sb#`)<+0Wj=PwJt{bM^u$lB^0@P4R< zR{!i~?_398@T!~{K7=f~Ok6R9z<}T39DjUVJ>D&$)Zp?NRzJsiVsM13F>uy?vkAJn z7A`PGq4N$RW+Fxm&@-qeg(B2a-yoeyI0^^T@W_bTovCi@@)C%%Q<4=82ERVL4acRQ z;@{w4n@59nE{AoUVZ>}6ajVlniB&6|i7a59osf%PNcHf2a{#kBJcUdg~fGbFSdb-%^^gIxeccehmBgj;Y5B!~o|!x}q}g%bf^# zUhBSL26NNaZOTut4~?xR{hLv&enGjHv|^>%Loq^U`#}oL25VYC?&j&G*g7eoIH%$l zQY^kXc?8&Lw3QGW5)MtfiNTO92;|=>h6`hxMe*tnknTRS_0CueCXvgn-VKHGn7;W& zN%ejaev{$)M^Yf9RI(Y(-MbF+z&N8**waybXYXcqh6e4Qxp!6xCv{jwN(M=SuqiHn zA$R*XlQ2f+-JS0T5_CwRf>>0_d`v>coQLG5RsP;Bw2@Oldsdp0D)L)XH20|#Uo1zz z+8OFmi}pLSkve%TprUzHBfi^7WHBkXMI>4x(tV*f(P(Sv;HT#hB6|@6S(<=+BLLo8 z@KRT{FEhHgHM2H$5XgUu9LpH|UIME_8o0vbeBEi{3(H3p94Zij_zuzb;xiBG<^JFB zrqEJEAvVWhu?I8J0^r=YMwZ!KG8LB1Jodo)!eO*F7QP?J#*&h+yl1r75X zw#fQ{cu~ADMK85M6-QiwP$xyvE?xq2LmHYzzG?I}GN(BIcw+a>-YfBRbT zsgx-yA%d?f1?>CDo-adKSO2%g=C&^eTZ7Aob}1OxrNshTD@pd6$#YSZr-(&bj(u^* zSR9oF-8cA$b?y7BUhE30Z|{Y&T@X`1|8#MheoYhtYW?<6$#4uJfm+bho|hHOIbL*^ zT~ehg;kj#!e(COMUY7Pi6ckglCYSH19Efi!D8~X;BBZP z@~+0k4=7GTo6*g!%l;m(xM&A=DcA%)j8BXd z%J?(k^QX;_sv9IaUzg8qLQP^aDmCFvm9}_v&dgH-^OoQE1!^_b7{GokOT08!P_axG z{q|U9dp96HQZa&udr54GIH{@BN>0e;3y_&w{>v0|$x!tN;`9kYru$8IGDMpbuwR;j z)ra;ABKOX60=l>Q6MkJg$mnUNlC7m(eMn@_e1hAL%|5FWr5KK9Yz|XL!Ax7fp0An_0^|j`jq(F$qK5j(sE(A}~{G%YAL>v>J z`|=CcaR2hW>e;C}es3PbiR@YMr{tT3#ySfCCoKWnYx^Q2FNFw3{Xz<=X`0*r@s&WM z5$kixO)fk3X-6}&>mu9v)XP$>l%YUBTL$M|A*B=l2SAI|7Z` z7Tk^SWk}a39a-VeZVQv`DTF^> z8VF|hOc)+Us&T3*zN9=}LlCMq2jF8;G^Zxk6p{Q8UAK7e;tat<1*t}Xe(PDAp!CzE z&?^nxo|lx$JQAZWvi?b!ikJry9Q1{>-TNB|+yhUHVs)?^fX|oYYl^a-osMl5zj*Iy zs3<2=6F#_QS%O!<4J}Aa+g2KSWh!slWis(y4M(&%SRqMT<$-H8ep3xNPuMM?wG^=a z3)?5-zj{Yhai1-|)xD7}l;R*o{9S|J1~XM7#=IvG{cKjRh!?Zp(d$k~Xy5pQ^@B2gg!$I zZX6dFmudD->E-wCyO}~fB02c(8UmiMZyMrnqXBZ+Nt%_-u7@heG(AN&=vyTC39H~D z&HOCRf>mG9!c`=#n&%zZHhX83qk`}&y3@!(Kk(?RBsSW%u9Hz;q7L7nZd=eJGKmIUZ6p%2WK- zu@Mg4mD_e;zxR~dAT553#}2E}oOf;Z8>4tSw2A+^&xzz$wPBpX9TmgdJ9CREfVu7C z?yoamn>%3k*^>Bx7IxlkX9O#TSMVDG_8ma$e`YCV?Xn^eTuA)Whnt)3Q4n%O#J3wc zh`!GAQDgHK>B#DCmWzluiXBB}toZid^fN~ZxQ}n(Y8(UyQr!Mf%>@De07iy0qN!42whb7SL&2nxM0HY87TJ^y)JL7(4S z8JQ`R+qyqY#TGCfgE9xdDm22J!-4Vl`@_TPb@mi6E>E^ukX!7G*i*A@%S~m8K}J>E zEI8~p8Wk_4#Eqb0!%a1qSw4_}8;qR*39V=|^emO^7XP|v;Qy<=Nrg0|!l)&~Xncx^TCGTsmViUx zca?cMOS$|fWsY0kCw5pEt_OBT?sSw+vpR9NX!_7uP?ykhak80eCVaJLJm>3!r_;`) z2nEt+J%>zGp|mn-BC-L%epW%_V8rrpRezW|AmO@ew#aG&Q&dRNJ9q zw2d`i;d&USIW$O7dEQ+hZp&A0zfC|>OV{oW3grm=0lBYJIAk=H;)yNRZv^l`Ad6yL zm=n>Z=nT3Wd6a~Xs30^IWaEd}op$16K29IYA)EN=eEi z*n9A^eM9uh17JT)?YyGg!@=*hUT~$`ZA((^L_N^R19&u*7#@>7P${rD9I=Ytv{;G0ep&n*p2sHg>0z6$s)3Zutb4fX|G39WmrMz zS~QgCqt0gpbUvQG9Ft*jl=+zaS4dk>qwYZ>AY$lgHs1z4wQUW22e2Xm%c)F{ATD)R zkO@ki!Y}8QCVsy&-O^SfbfMzb7fp3$|1K<%)ZNg;NH*>*ryHUGCuSbasjG3r^dkrF zFb?QfF5h2&`(7v>%fOWt{_L*C)YrZ(dXwF$_&6McA~eF0=b9Ed>FWVum96aZPSmt_ zHM8|lGC2J`pk%zt=0Iz16xhGl_-$!`&RJO4m5lysOF$to>BS1fu;3tIx`~u4Hd5XxR>q_WT z)Y6|J8ta;k<=hH7iEkBjx^F`Q*j-Sm*Cc8JDED)npfi5YpHAtq@zD-q4j!6C03849 zElv$yYFv6sQ#zSvqP8?=a-24X?gL&IxE7YiovH&}TCC^BwgTO42 zo%2pVT$fEr+?O4U#ougEPjThi55gSniQ7oAE6>f<`QwNCA3~mm$j`}RC+BnOgh-=3YoVPL%SEobfZ_yMQXxmj zw62olt#+?pZw9B{xSx>+Vu_8w@2cNiN#xAj2=vrqW$t2ibSJpKqocs_+|HCwySS)v&HCt~O6BcbAs#U9xjBx3;XpJj>FBVTQ|5l? z`wvNTdmpsKT(q&UWc2~MprEhl>eHep{}eugX%jv+D(=jSu05%_Q;Gvcu-V`@r!YW2 zec^Z;&WutUUoEWim+?z@4glcX<^RLb+4Q!eEl;=W1oJ;i8^-a%{7v#yPx8w|8N2!an7hXA zI=VKTq_J%_HXGYkV;hap*tXR)wr$(Coi?@`ym{9;=RZ6jvaWUJoLqBb&&=NY#uzd~ z=wb(s-{i=OAeofudYCx#1=D{kAjF%R#GAJ+Wcb<%uyYP&z0LlXg7&xMli&4+a6*b2 zKaWh06&gQg_4laW^N~E`v#v3T+g8L@4shimmd2d^|C_yi`TjTL3K zXZrdKhdq-W!vpj1yW8@<4DG&j-R@?jVXxzD^C0ui)>LmRVfrSNbG2)6ml?BiP)YtO z8j~ygz1onvq(e;|-(i$H2}_rcFgcHISQ1Jri~wzjZWwqxc9EtjF5%B~>pa&i;C@u(lBEqd^uww) zVvO^*jO+vy{_^?)!Cf33et0jWCYA|U#d?Dj^s6lSTWTsJJhxsel{lN$3k^=IlZ)?$ z*3R(_0C{@qVkL`OH}ICa_mE2CF?xL6HzKX594=-xTRldC`dzxyGC1k&pbAAcy~xxs zJ*~J78yPoFEbC5GS`^~pkd9;l{sPebXCOjp&yiXX(y+H%-}8la^2NN8#l^uDX))j{ z0ufYLNZS|aRdAHmii#s!DJ3L+nP=1f{WD0Fh<`UA;6{H3?^9p^dbLHRv2WgnJKYu1 zxfl#IN{5F}HwH|n{C1a(z-UBxVZ0;bR+|bXz zMBD}N4bxL`Im6PZVQD@gDtGYcv_syKkv$OqHAa#!B0_20Hxrv=T6X=@NwNP zQIWN+sRlV2V222%cU1#7QU|as4vbpyU#SZ3oJ`sg+ZRs9vkI>dv4>ZIDX_$@GzVx$ z;!++Z9T^z3E!R_#Tcxq6z=Re9Z^ZY@t)Fq*-4@1QG6C{*&2ycMUtck5a)SRR}1gbnODStg$(xC;7NrZYGt)af(R zm&f&MdSCciv5d~~@QKkfsp>1c#Qcas2Uj5gPZ@~(Bn`2ZJ2YXN}gygTVJfEHS+ zAX2e7dJz`p$mX`((ApaGDAl{yMc&!+??k8~kwlxx+Sj++_P#bTLi2~CE9efqF3KPZ z-8eB@;Qi3P9C>AdW$4YqOy!yP(Sp8Q(jP1G67qhSln!&-Z9Q4FYMr&!`bn<$+~2#I z-0i?tYF8~z$gS%v^-hxe1!@@@;P--PW!DR>v%W%ahFV3tC|>Zlqn{FRHv5C&pgu>h z)lzJGX1nwWq;!l!%0Ap*?nS+q2oNQ4c?h_(Km5K~G7SRbR;9_}&yls$FKG!;+;RB~ zYp~2wwUC*4PhtyJ;9N&t$Q_A-FgYS2#bZdlc_~sNWj1vED@2Nnb5 zQ4hyK$HB`?w{Wg&VW*{p(X(7}ORB3ZQEL1{_3Tqz*U6LSkgG}8iiu*z;YUJQ6&tJ( zw^@H4A?IP`(AibU5C*WbKm}VP|4fI7pB7j&wFx(Dj$YY@Gvp8c@8_O03E~Yo8;k_r zB4TtYbkb-0Hxo+YPxXN%meimtX= z$_I-yC$QRzQQ+p#+4qF7SFMO(r66ryoNF}I!%{|G*0?}=F+zdGwoN�pw{P{w){H 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̓k4zGyW*D_6Hg;4=er!RMTHSz%qUD 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 YgYwc>I7RQj0DZF*^Z)<= literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed25519.abi3.so b/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed25519.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..e6fed9617bf662a3edb0e828acd111c0ca0924c5 GIT binary patch literal 220504 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%0D1)}^c};gkDx&Rj98Ys1!YZZC-@`+`9&|k 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 GX8#|azEau% literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed448.abi3.so b/lib/python3.11/site-packages/Cryptodome/PublicKey/_ed448.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..89e7713a76c2e1d6bc4cc59098cdad5bc76fdcc0 GIT binary patch literal 250552 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

MOW24nCHjF%WKxh! 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 fzop;s-1WMCav-+ +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import struct + +from Cryptodome.Cipher import AES +from Cryptodome.Hash import SHA512 +from Cryptodome.Protocol.KDF import _bcrypt_hash +from Cryptodome.Util.strxor import strxor +from Cryptodome.Util.py3compat import tostr, bchr, bord + + +def read_int4(data): + if len(data) < 4: + raise ValueError("Insufficient data") + value = struct.unpack(">I", data[:4])[0] + return value, data[4:] + + +def read_bytes(data): + size, data = read_int4(data) + if len(data) < size: + raise ValueError("Insufficient data (V)") + return data[:size], data[size:] + + +def read_string(data): + s, d = read_bytes(data) + return tostr(s), d + + +def check_padding(pad): + for v, x in enumerate(pad): + if bord(x) != ((v + 1) & 0xFF): + raise ValueError("Incorrect padding") + + +def import_openssh_private_generic(data, password): + # https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.key?annotate=HEAD + # https://github.com/openssh/openssh-portable/blob/master/sshkey.c + # https://coolaj86.com/articles/the-openssh-private-key-format/ + # https://coolaj86.com/articles/the-ssh-public-key-format/ + + if not data.startswith(b'openssh-key-v1\x00'): + raise ValueError("Incorrect magic value") + data = data[15:] + + ciphername, data = read_string(data) + kdfname, data = read_string(data) + kdfoptions, data = read_bytes(data) + number_of_keys, data = read_int4(data) + + if number_of_keys != 1: + raise ValueError("We only handle 1 key at a time") + + _, data = read_string(data) # Public key + encrypted, data = read_bytes(data) + if data: + raise ValueError("Too much data") + + if len(encrypted) % 8 != 0: + raise ValueError("Incorrect payload length") + + # Decrypt if necessary + if ciphername == 'none': + decrypted = encrypted + else: + if (ciphername, kdfname) != ('aes256-ctr', 'bcrypt'): + raise ValueError("Unsupported encryption scheme %s/%s" % (ciphername, kdfname)) + + salt, kdfoptions = read_bytes(kdfoptions) + iterations, kdfoptions = read_int4(kdfoptions) + + if len(salt) != 16: + raise ValueError("Incorrect salt length") + if kdfoptions: + raise ValueError("Too much data in kdfoptions") + + pwd_sha512 = SHA512.new(password).digest() + # We need 32+16 = 48 bytes, therefore 2 bcrypt outputs are sufficient + stripes = [] + constant = b"OxychromaticBlowfishSwatDynamite" + for count in range(1, 3): + salt_sha512 = SHA512.new(salt + struct.pack(">I", count)).digest() + out_le = _bcrypt_hash(pwd_sha512, 6, salt_sha512, constant, False) + out = struct.pack("IIIIIIII", out_le)) + acc = bytearray(out) + for _ in range(1, iterations): + out_le = _bcrypt_hash(pwd_sha512, 6, SHA512.new(out).digest(), constant, False) + out = struct.pack("IIIIIIII", out_le)) + strxor(acc, out, output=acc) + stripes.append(acc[:24]) + + result = b"".join([bchr(a)+bchr(b) for (a, b) in zip(*stripes)]) + + cipher = AES.new(result[:32], + AES.MODE_CTR, + nonce=b"", + initial_value=result[32:32+16]) + decrypted = cipher.decrypt(encrypted) + + checkint1, decrypted = read_int4(decrypted) + checkint2, decrypted = read_int4(decrypted) + if checkint1 != checkint2: + raise ValueError("Incorrect checksum") + ssh_name, decrypted = read_string(decrypted) + + return ssh_name, decrypted diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.pyi b/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.pyi new file mode 100644 index 0000000..15f3677 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/PublicKey/_openssh.pyi @@ -0,0 +1,7 @@ +from typing import Tuple + +def read_int4(data: bytes) -> Tuple[int, bytes]: ... +def read_bytes(data: bytes) -> Tuple[bytes, bytes]: ... +def read_string(data: bytes) -> Tuple[str, bytes]: ... +def check_padding(pad: bytes) -> None: ... +def import_openssh_private_generic(data: bytes, password: bytes) -> Tuple[str, bytes]: ... diff --git a/lib/python3.11/site-packages/Cryptodome/PublicKey/_x25519.abi3.so b/lib/python3.11/site-packages/Cryptodome/PublicKey/_x25519.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..88975a0b54fb017fcfaa3bef58ee9a595cfb713f GIT binary patch literal 79432 zcmeEvdwf*Ywf{MD<_r^(%mnfv2>}8O?^h-Xknl`kfJqn-5Cjwr2nnE(0GVKTKUJm} zO}toXFB;m?mbSE_rIuQ~O+XQ}+Nf1gZCizdsl~ zv)5XC?X}ikd+oLNKIdfEJSi~Qrt2Di3~ii7*uo@9DN+?DhJ<;Fv;r+oE7E#tJq52_ z@x&@-n3Bq+rsR?|QKfLEb9u72Y{w@{HSt)O`=>zwsWBB!ZcZb;ri&Z zK(#AUCATA#+9gew{7E-Nmo3UITsmd7u#xO!xou02;^R{E3A7o13N9hoSu7damV;G0 zF1g)Iv?Dve>WAGvOX<6uU!2MxT&nJh{-r>ffosb2IodDo`PTOa-W>tS%swcas9hKQzAkbGtWP!(_T=D$KLo+VE+3{C(AGqFq@vMvLF89eoMRttJ zm7sNwK_|W0G3W)Cq0a)nR}B6|pmo;bwd{0RnMi{1S&ob7IT-@g>M~_X{_Tue!f_<2 znwBQ$30hMgQ&d@2w)B>&6=l`IMXQ5lWm?(t70ZKKSp^EMtYr4IvL)rK%a<;%4wkQ; zJ#AuT)r#`ji*Bqemvymg$`;oyA_0pkm#-_=s%vg6yQON0R=H>iL}_JZi>j;3p{ioh z@=C38`Hd@s%T|{!S~9e{YG@AOiwPQ`O$n4tm{^uOGEC7k;VMn@-_{f~TL-~V|Mn-G$E3lRhQEcXOMTwPx4TCXAi|eX<(bo$@agj! z;dB~0(<1N}2&XOdnI_==y0Irg@Yk6~sVKYoR;DH@&FTuV=kno>`B|ilOcvJIE@nzId)b^npM0a`83AbBbrr zxf=fR`*uxt?wX(E+qEiv*G#8x*ZdUUu9==dDB!6_Rr;>t1b=9O=g_Y1zFo!kKq%;G z@$Fgz_CjLW7pO~kVb}63->&7^0kAbquS+QP?Ybc$5K8e-yPdvW*VuR6kU|aj?3$hx z*aZR9G6^l4e7h>LcdY?qz;mFqF2PR#1~A|`gxZskRYFJ;@n2vHA+1-{C47QwIw7Y5 zb%DQX)9ZrMw5tf3S{In6k-ih8Y$wS);@_3vndW}*90`GZn=RgO) z(7qG==g_t!^t`l5*wG63w~B)_f1+Tr30?*sZUqVwRC#_RzR<_C6d@a!WksQ7%E{<{+WcjWJuD1)1(>4I@57{5^PIfU%0 zX`$n2cM;@|M1wu}uJqJT(?6w9B)RXP9z|Mvj6mqwK&aAF zATZqzuqY6E5|ZB!)K${Fs=P(>@2d19!SnBx5*7eP-8x&M|CMU?i5^@476^R|6;w~5 zROvaQFsHx{Kyk*j(EC*13d+0FbOE1$EWjV5Q-I+4kA<46>IR>L!uIq3wnRUnLXY~ffh_;*s=EAD@Q)Y^3g-{lpZ(F!=h>&iLWV=} z)<08>pk}sb57~0W7pg*rUf@ac@5=XtsuIw>-}*wgCi(TF)S*K{Nd4A7QZvz55A_J$ zYFE`XM|{Z1`q4n>MDf=D0hjLApZ7PnX81x^r64sI`}Jmj=xI@9_?zE>LuY$(LRY2x zLoHk168vEH8$M4#Xl|B2bQEpDY6PlZiHQ#^T^~DQ{uP?r#xD3moTmXyb z^2$ffE0}iMCHIb2v8w*9B=q}|5CZMvN#0MqFL*C`Pr7?(({^S37QK2_n-u!cUzh(Z zEuw(|rvjrFJgXJE?>inSY$8(X7y2AbuLnY}`aga3`FAS(?iD91+?6MT zV?!@^oBYjh*-zh5OAHE8MR)SGeCj>h5GW{M(z7{DmzwuaxM` z6j}PQ;_ZLYgGnX5oh94f)u;8&DDgfM2z9;A+Z5>(t$1#Q`)rf+2^@e8!PfU$abxhj zyUL4eZIVB9*mHs$w9D%raM*JWVCbBCz+)cVFa_~WQTCy+b`RL$Ndhsn!$VIGv8%lA2IKAGG*yfS~L{K}3=@0|1qWP(sSv zDEy%l{^m1zaQk7|GlZY&@nO$O$=6DJyLNb-gdT;>!cINzX=r&*$e=Lo3mND=;mz+P zK>SAlWz>>Ow@~BVo^wG&O2c{M32ETNK^`9CjQ4N*{oCN{GOnVNlLR!LWs?K2I%y z=-f(GR;qHDDi^A9fhy;zGN4MoD#xg@K$YUz668ARW_Td9-_wec%sz$k%uLuE-XL#p z)pzX{{oHj>xFdvi7>guuA=qb7@tEfT6?;7?D14~&p~U`zX2T%@H+TkvDIloNgd;Z#{H5!59GrDeJImW?mF!8%bEqC^cOXIJy}%qm?vA-EJV#b2`&Rj z;|F6Z0S=bnN`MO_SPSqmfIbL5h~9&714ubkix>d~*g}cXAOUNV7>ypVe2LvDu_Y2a zAh9PTMo~zvIDs+%Gbs`$yB`@-=zauy`{EZbp>8EuDM3y0Ui3EmkP*n3;?OI_pT1G- zJ?rcFf%in7wVf6x-cp9R7eh(ujjc*-d94i zJt^K}c{`Xp3-gE?f|X>{64>(`jwk6@$p#mDk52ObuGrh;Lpu+6ibHSuFcWE1Xmk{N zvG>zrGS}zHo)kKTMkEae_J=59C${3yQ{LmS3*oT=C=MZmY1-xZysuL~DRM%mz%P{f zJoywq#3*nH?wai>fK`Z#fF}T_z+aRZe4s6WWYL8U9zWTC+n8Ap#C~d|)dMeL!~82`(_n z`)X*f2yK`!g93%*Q!l(vd5`%*C&-iyp4r~x=po4{4mD$ST?mO}2{os7u){0-wSX*v z7>aas;3>3S2!~-Ej56h7_8T!WF`7W9Sep|!EY4fG%QLmg~o0n^O(FofP9v9&(% z*P{}{zhRR183dG=Nuk%Mf~JSB=Z8Ko;`jNy-IDPfW*N;5>gyK4a1LE08Qx^+v|7@+I-Y^vLJMP5CX0^^eQxy2QcWfi?KQPLGu%^eoEcmcv3wn^t^8n z4q%f)uN61HlQE@kcPFxXQmCaEW}+rAXaizfu7s28?sO=7mq2_a8M_k;&?IZWC_5qh zqC*0@aHr=^THw@(O_p8m5c&+p%a!k`;;nRl$DrQs0BiGESc$b2VBKSdq%ZVA=;GGD z&=#fn{S0y?RUP({q3C-MR&EHLle=N*+daf^r|>N{8Db|3TMW4l!=k;YFUDq|H4`*) zq3R&i?x(7{tt6Yew-4wbOh4ig4JdFEFknUK5RLVqJH<#U0ct>LfKsSA1x|6Oi5!6` zlkOWd+mnrfls(olgg*EmT7?aDdkq@HVlfn%lk4`RR$$I>|-+Vss6eB)~No#7X)^sL7#f9K%!|f#ovS$o)ZG!XR+xg9njV zM65nf79@L+;%KVU6kS5Ka{B@yln}s><44xo0~j@aYA5G9YQ}&Pkdmki0iZJ^IveN$ zptB{q1ZXADc@hl*-2ij}&^r65Kk(S~wR=t+cPh5Mr1-O4*2Xeez5 zU2gUD=LhW;vg>wGlpAmwEd)@wk7Q7ubPtf*kh+v6U){Gv9vrk+x)!q&Ty^#t(77Lw zOrUg(*aECrKUViEVc%oYqjH<*!zwJYx8Z}~J}{#7K@_mJSZ}I(nCuvISh{?-+!l&S zu0IvJ03QAL)@C79ZcDcw6?UIPKWG?KrdK%t=8M!O(q9p(<-uIXW=3saWdbuu?$P49 zJA`04g5+&l>54=UMCy?e5;uJKWit+JdMzn-O#~*slA9}+ddb73H z8N^WN9T`5YDFXX25c-7Tio!V%`n2_8EAhM)2>m$_y3~3O7)hhKeORP23^!#NTF^zt z_z!Xe5SsqzCZ%a#-CZ>Fp_kBv5}gdFy6xl*^b#XUxm|DZ4Z@l)_;05w8e&>@L?of< z5o#)i58(t>T8CuRAd2e#i}Vh{L}U7Kar|DW@<7@_vt@f)WwYA1!>e3wS3}-tSS1x=(*m z4*G79T`{h-#3u=EnJIy03v{nM=E%DTNQ?QPwx(hoM;7tdr9Oi<)G*$yhM*uk{%mCp zkp;-{yKoBtg-8Yzh`P)pB5BYVqMinoZx5iFvJmA1no6w)aEA=}DiFFD2>qq?+rW@( zowqf)Z~NH?cw)3&9)U;-bpT$bR_b^e>`AVoBhpjqfa$3-Oo=w{vz2J${_mb3j0(2kH)c>O~#$CD}mt z0Gb5h^%sBL5yH{xY0+{eYN=zyWjV?{K(=Lp zgVuWm_KrXFe(N^?VypmC2HGGn@O(nCvO-{#kI=MrAz>J`b7Is!6fMrSmVzn-({Q(r z5ttC{4TF8dVAn911W;;jHHnHqnjxcLzlaQs5pL;#LOYcr5#akh*`h?~P}u`jq>HRO ziW|DPlUVatGLg7I|24fb3l**3N9C8xU#aBJQ1TbHm4744_t#+rm3)fLRzGU^{%zQv zT;`Wu{B=HPwsyRRTg;-Le#}%_IH;dXNO%)!zPyty zLim2MmbeET6pM*`o*TA%U8MXbC0`i7kmOtbo)yWb>>$_E>zu8_E!Nh7VX#LSObLT= zVeldjDYX3(TddY|z$i1fk`c&4WDE`FDbTSJ9ztitlHtB>2tc|~K?|N-Timzh*pbAr z4pzKWhgiu%$8pkf-*yvGaF-cH=tHao z?%N89B3GkgJgXL54$x?cA|Fo@L@>SpXV9UK7U)T#=fDZ#10a?(pU(7$zGyz1=x_cL zZbJV#!{7YJ#FDtylIB15Eopu$p(O4^=re!l6@T+z@^F{fANOhiv)~-LBJN@!?$wg! z|LNS1v!yvY5{rvi1; zahrRGxEWkB;DW#K75{ILN$9i1ecw_4_Rla1xHkeJfjWDENUJ2#eQ$Hz(}B=QdRQ>v z`9R^*g83qXLT(ULeY315Dy`st+FR0Rv%m0!`*U7aSxxOiU-+PCg zDX0@3AiJQJcxkGTolU^c%)fwXRhO8H_x>LpAsB{NBog1)6)0N2@dr_zOx5FM^%Pm% zO4T>Z>W=_FI!;#im(@q8Iv}fGqUy1-I!;#ar0OBE`Vp$8+u;7X;qN2}-Sep0C9ChF z>d~_L8Cgv_TF?HsFs+uVN6G4gvibsw))rYkpQ;OGb)Bp}LDdh*>QPi(Agfo%>OE9_ zkF4%W)gxu~RkC^+Rac{$sPz8McI$N=P_BHgc;Jc$u6W>z2d;SFiU+QE;ED&Xc;Jc$ zu6Q7}2dY;u9)>>)&K*A7TR3#FwtU5PIoD^88<(9sB75xE>>MI^C1JQl$ZgA!*Onu{ zEywV-93$FtjBLwM(3YbxilDl)xN5~3`ZMOr^4#GohnEGb0FB5G_jSVS>PAAC6cf_B z8lwlJ1~+N6^xxrFM^l1dSN}WBVpq=Xj$&8A_6|PR7TtK&;VJ;B*wr5_6I|(NGQs84v?4U8yWg{4zH}*( z>=UxU5L=e*Q&-N!wlV@}_Iq5}=&Se}b|C|%N6PS7_Dpf@a~kKz2d;SFiU%*gEVSkb0$75!JvmehXe6XtjOyQQDO5Xof!M|tMR^JFUzLQmXjVh;1oH#1G zKYsCTK(;przY6Bf&dtg7=6LgRvir{}Uy|)#6jT*MyxsvC9jT?urQ@>I&wt(DtF1zb z>wVSF`)N-7K{QP0sT>!pq3wM%ay;LKo~;_r4n8V$XCj&zwhnhwVee2Phz_?PnyVnq zZa0^&2%>>`hpbCOow*9I!&yrdr@2iO9q4JZEd?XfAt${Eu-QO_Nnr1g*JU~pzDooT zzB-KTN>-RZ$CqKZKM6gC)BZeFSAyRdko*R5ZO7L;xSYCX+d}k#S)UO78~C!J4bkr) z`tW2IP{E%m>2W=YUMT3gNyLsXP>nBf8jARhkRZRvFac=^gJHY9*wOa4>GZwdMz|(6 zqMf}sm0*r)*Ug}K_kmIgDa&xVD$7@ZHhKu)L%8V;BwE(snzTg zT|WTLXgIeP_&Uw*Q~17h?pa>cPf~ab;i#Xi@Ga}zwJSCI6onpIpG5P@?pOHf^+`V@ zV@niXzd6ZGc&Y0Vp{`|Zr$O+JeX5H(zZF&0xH@eho~dG_@=-kySLfxLJs`M#3hYO? zl2_vENu-g^H{u8P?ALZC5$}TbCtNAVA^)zPpx|TIT0pWdj2i{+)JxQP__qL8>PJ9s z1h9~hGeEupfKpcK8$ccgKyN&xz6j(s0H<)Jk+3cukuQyg)0?`a3ZQ;-$~*w9(Ww=I z)85-0hHR0#2{kqVbdM^v8puEZ{Ryc6G7G>ATxrxK{hOdA z_STaiJ%~$qt69l)XhmSMy!CTr!iR7PZ~Xzl>x7WE7)c|3;jKiZI|G;S)&l^(NeFo> z6F*kj8JFGNv{z;jOy>+)fC2t0NXG8!q9k+W~AMguLZU)wItEA#b$+ zIf_eo>nvX9{RuAmblrm0I2%J`?_<`(#H=3x&-zdLx(i=vRF&}%pkiEuaH%FMsYze+ zSd1oAC7MjcLOw(+<|(A5r4O}+*R<2rcz~IXB9-)cyJ^}mT&bjYK7hG|kp8UzHsea8 zCPL`rzTzplTW}G0-mpI7tW%^eW7` zrMSdECnBUwTw}za~DqR)k4qA7%z&tngM#KTUfMm+;mF0G|*--pWRs?zqyZN!VKp zK$?t8cxw>=`Z% z1tF9~>W5(miic7ImK0~4E)u;0Yi)$Ubhwh75Wxyq>v4Mo57m=7vu)CF zI0>QK5sDrY$pTqYI|n)TvbZcCsHuhc%FWZX99*eGfm{n<9wEJfYy+@`kaQqF25^9-IS}`7{FMO+89^Xp@#|w#9AOlr-w- z=Mik*xICLVL`DS-!9$m4ONwASb$Pa~5p0)Yvr!jrh+ymOYM&1&kFAg3@wewO8n$fG zy8TxKQ)PQ5q*txmsR*8i_B=+zAqaXug6S9SnS>x?XxLS+#^9k~ogBgQMGPJ?Xki3T zZ)`)`tOjD`(7OE~f@?~9E@4qq1kWw)dF&1Q);hFq&qZ)GwC56%-i_e-WqTfF(}dk+g14Ml_$q%@0^D+BP5Gruo|u&3AC~`!3sjT$|Gbn4fU|_qF=$#5&H=d6NLa>0p!^8f z_i<%B4rEF(?n2+{UQ{Z_SSI<=uY&NR_w#?#V)Y>|x)`R5>@cs=~>h=f(S_T1S z)9hLkY5AG!TGB%2Lyr%&xT5)-+BxET(6x>EmVjrW;QOv8EH6pRM)I^h{fZkUf!Wjj2Ab^&3 zfq@i2bzlkM%A^2dHk=&5W(Cbts6U2F1Pvo97%nNv2pW?7GuPcDnSw^2j&MUO8TZT= zubm^lL#`)?kK(=*sL{{kvbvxPsU7k49WdQb zjP&XHXHYccIQz=DHIyGe1DoFl2Y3!YUu z7R~wwb2NK*al^ZB&Z&+y%gzNlUqXHEp%Z>Wx8 z9b`*1=ss}&s+u5S*`%}oA_5CYXa5@soKE0?iPRw1CNvGO6Ov~W)(l*(>G?Ks4_)hb z3cB=DdZIz+NGbM|F2z<*g%rD#Kp}SEvK&o+O?Q#G1DAOT?kwS4g3~0NM{uTu^9k-Q z;o$@e=MP*qg5bWAK9b;p5-uQksDuj%&Lw!jY3jl2QnA*L9uesG!fZNpOSA9Qdkb&W zQpIR;!9Y0XK3(>?7N*{(r_vA%_zCs-KE0bjo*_y1>HP#UP9k{%p(v@r1Qp z_W-hh=GA~RB!83gIOK2AQ-pKM3G5<3jMOISZmnNm1MF4MN>f34rb_9B2~~PN$4Ql5 zDx3t7tCY!uv#7CMPs~Q1ppSU56{WtH_9jC_)Y)Zt=yQfbtz8DlA2CP&fNLlM#V!M7 z_zc`8ri%i`p}S~?{U`9Pf`-v>=$(m{GaF{&8nz4p zxP~o5Ksog8M0*7I&jbyD<6NWo-eLp73fC?*^e{8|0rnaM+e!Df<>B^k84;3`q4r5 zV>9sef`)!{ko`Cg{HUOzA01>r;%`JUz%{G_{pcY3kqbOW(9n+#vLEw-&lNQEql4_n zHsG5C4gKgK`*9NZlY)kRbdddUEylxGTsegr#?vV~G7^M5BHpYEVk-4`CkWe!7$=EY zMAVjO+C?J%LN@PB#C{<5!IiT>5`|-@gAgF%3`5BD5@!tv)kLHxcFjG#Widx1|d$`-nSf^BV5ClVi4lwAY27}s-R&I;^ZLg27ZsA zVG!cvAp9EmuLKQ)5GM!WH1IbB4TBIT2cbg+ZtUY4wiJU9CkJ6L@PUGcL5P!sa5eCm zf`&nelY_7hc&(se5aQ$@dnJ;twGHzFdkoUVp zJ}a_{cNzHfbK@prYl1)M`fc!I86ltb`VGDaS8JO24Zxm1)0pNZ8m|E9 zBj$775TS1Q3ebI&5pwI%@Gq#3IMDX0RWuCNal>H4)`TP{tD_ z{boFA!<9%qw|zc~Xg2|0LNxM{?elVy^(gR1h(_MBeO^PfPl2DumA~RvkhalcZ)>1O z%eKD@FBeo|h;VhHVX}Q8X#WZPUZNEttZiSUQf_`1_@9X87qlKk+X+3}aAi`b9>mbl z2V(HCrRs7w`zq>R!6kOHmjHZ02%Vt@ufV|J61&;Q06a_x?Pg1>urbAjoi=uvbcXsB zuwUX5yV*nivp)uKfDk%E{SLshgwSsGa{!+ZLc7@!tKbh@VmEso zfcb>b8EOlFO}NBvw#n*I4)y3j$KkzTAnj(q50>xY61!PulXpq1-R#q-KY>f^W*Jet z)Kf|_9uAV^L#~@hGVM~&qQzgS)&BrVUkxAN(uUKyi5uB02sPq^?eGI6fVRV9!9TiP z8%O6v99HcP>ee`ZhZhFOnGYXS+o;SO+_*bO&;=WbkLH~c7oBcc)QhTl^?!ov(| z^spJWh6e!Xhl@TV(unJR%IKOw z_W;CXw%y-TOlHiR`$u%j1{L$={t|*l9s;NB{yEc8jJ#36Hx5DJrTvAiQLNA20uuTi z5$}C58@?l=yzlB9&Gy|ydcCFZYA?V}63hjdD#1K}84}C~*iC}N0rn(NE5JWqsM(4- zk#d7vBdsm!!PXY#v$aK21Vl5lXeJp*hD=Bhri!UIQ6@q$|?LG%U^@s*FG zu|vA+r1xg(})#!F!G5673l;ZB@0|i%ZwIc&V@U=5-n0@7Rkij zkkB?A6ei$debM;m58uNe;|{o24-PAH|Vb#fJDPTKsi;R166y44pM`s(7}=7qDFa0q*U_c z&?tg*<*-QMY6Nm3^(&fJ(NrAg5?Yd+pFwi-qC>4DIm(QDrB$>f_Tg6G_e&aXu=#B0FA^M@K5k#u#dEWBMA}3p9oGzqu0e zts@oC_C?3vnQFtTRtATyUN&q=`I=x=Rb_Q~aELc&*y^gP;INwN)x+?Q&JJ6;c=52> zf)QmS@`tQ0U$Sgba7g9y6*aZPz_)zG;>wyO<(lASM2q;_Rj9df`O+0Nx8Uzs0hix$ z3*Pfwy?n*cWw@cF)$*UXQq_tj%NMOEudYTF(CQ%mN!$v_1{kdX8@Mkh{)Jo#Yo@Nn z+4x{UBE4hjk27ZgY^ z9rK~7pCi#Mt}vZ*O%ewMW6gx!^GxR=^Q(wV7;BCjZ93~Umtr~{ z#yVYyl~(>FrbslI8)YWRyqjctgiMc+NxhtFW{6%AT&-kv-C^cEN}Y4T?zyH*jCEhZ zFj3exalSbY!&hM@j4|Pc1c()m$yjP8oHCtrOs|lcFwS&d1G58W2F47$8Kq{zRMP{` zl*79D5K&6)F%VXt$Bn5moftz1fcK0lG%`9LBo8DQE5K@Wo@Y)ZveW1^53-98x=u%u z84r(513p&Z@KJ5S0<z7xf^sCi!lZS6&s65K(~Y7SVB=W=WR-Dyu%G>0St(zxkQb}AOJI=bedE?Lg+6g z{qV#*v$)h8q2y;DG`kvQWJ}K=G%X}3n>0x%XnIgf&3jUFFm^>)8r{aA2a@9;dcaWp zDl?BPhjPeaw~&3#TVdjSn3(4``BWGonCx)zw7ZUjCU_8D`>m;*5O zM*j+<79iE5<{%*x2|<*qNHF>!7L4l<4fSB@QxB^Ivxf!?R%IO!GO1<0syS%FN?{HS zS(I%F4r8v423;#^Z$iJX$DCbix{N~V{`}Gf01qV|WfLen{R4HYh<3$>}Fyimic$C~lw(o^Idm%~UzN+Ai(sG3xjb-+PM z2!Y`+s=-OYcMT-FDn<*k?ns`OJ#^?$yUk(Tv-uz;*>t2Tw@ztxjsAdX8Xf1EiB7*6 zKX#azG}Mg4JJE(?zL_FQUEx#BbcJV8sj5dw>UPC6Rxu@+g6ST!6Y%#Zt1}?l6A5 z=|fbyhM9VanQSCFv(eM)dhl(BozOJ~%2SN1w&71kk`3=riG2vnW%QXRuvnKjrSz${ddPNzWxK2EP1jU2t6DT2f?mKGSBs{IB=~=@em*(PjMp7lUQJ`3Z5XAF{wK_i zwmvR1-jr@Z8OuRylQrP*-U$p zikDH13GvcKJ;m&VerGtTkD0~~Y&6!1#%rQswz1z5LIki(E2WAO#SPU#TU1jt4&v4RKMVuDPGGpqI09+fE<$U8a4G+zy+pj%``J}6uLd%%=D9I zGOMVUaaf>|5xLm$v6myQ(xn_MgQEk36*DbN@7G({+cLIf1RsRvZ=#l_2)Uh74a_j!+(^^#F|lAKr-?ba6W?YAo#AAV zq;~qZ0A?4O|59-ZpT3e)v1p6`#Y%-W2WG&B<0%LJ*XC{LKW#sWiY?w4>g_nO_)RQb zqv+rsNe-U~zukuYmJtlzWX7+j(_ywzxNRG%N@#^qlJki7*KldP;f4!|9bi1z#_j+Y z?dTwJ80nur)Wn>njU9G=R@ES?ng#wgRbmS&Y2zigwcEqcuOt(UPS9xW_{OhZ0}FdY zzmxXTsCI3WE5Z)!O=y_z_&1GAKg_FCM|IRNUv_w4F&&S_!1d1|ekrn@6%qb;N)hMX zZgvt}PlG@a`~duB##f^q$MG2Quo_FbcaI+K2ZCTeD&+lobLmYHBRpD;+5@P6QbhX% z+FGv^BR-X-%1DSeCevV&W@ls-20q>>wW|J4M;mi{{OSrZ#3BNMI`RxA<0i3mbrHj1 z8^ZHW;UlB*OKP}OZ6VkGL(^3@z8|6-_>UG|N#R(KnDeQyE~E|9`1!_z2*obOv)B)W z14l9U2s5MdkN*s&l+aF-lpKsuBDyEC7beKzjrx4&d@(nUV<+KGqaOT24rtFzd+{zo z%*12*%h3M#rfmYo!GE4WgJv?#&`&7rhJdmQ`JB*tz~9(ROTaPRNu*zF4uZ53-z1CL z{1PzodXjMmEe6JC8i}UK&<{K^%@Z?Ek03a2hs0FJR^`NKYuO9G+$ht-)_+rah}LRe zHZ#zYLFWs3*Cg9v9K+P@S7Bz$<%qgQ%Mo|>QFy~isgVxs;6{#T=KrFq<)|7a6TRuY zP9fk!c4xlHO%gErtT9M@ojoJz$VcRmrkMz2lCOReba55&bkc6yG#*lf_Wg;jq zg^{_mHk!sK>uJ;5&-jL&MpJC=$x>t$qEJu>Xs4RM8vAY3kuaz zVnQvi1IZD|f7+;Ph0^;rkW#1d7lTd&hASvnfL$B(S6*?>e?^4)-*J5XcP!A^7`uM9 zft}mVw#$w<`S4kl?rC(N#Zv%U59olkj4GcIssG{4xN*g+1)HsdDtrlW| zju~X4h9fQtv4RE>1FPxomr{my8(%`r-&{*JN;S`sTBMhk(;_0&9(|N z$yP|Q)h?NZmmJP$O`=tj1I^@I{LRK~j`@z4X~#MQM@`(-c{KWrTaV)`^(Ef;{l*}U zIPniS$Iz)f!`N%nPe@x@Ri5099@6b0kyPhX_q)!+nYA1XveC7kAk017q1}qZps|?X z?)4D7XdBc|CH8(ewHfp0O}!h0?KnQ9+$8{U#>4Fr;=;Mfs&?&0ujRH|9&Hh(?byUg z&e=mr#1jt^KGp1ohYYUWN>myhckgX4Od3Wi&2CUl)->SgkAn&cX%NRuBtW*SL=fp@ zM`q!vg**+QV`r3yej+@SoSZiQm7l&M63j;}fRodj|rZjd>ybNqC! zWBZrXWA{y`iS1EsmdQ%Jp6U#kec_9eQZr?&Su)z}8!!i#l$gG;=HS2-K^tbK)X;f4f$qj` zHwVMBxuZ?rIJ(<54Wb7R1RIbpxj+)+Bcko_dNR?9K+AoESjU@5(**-=TSE?!aF?UY zRH99$`+jcRYlx%cPYNO!cl^m?gyO*%ZW4_)yNoik_L=F0kb?o(5yga!TM}+c_B4JI zC+-3oO>1y}3Mz+DOPqjNNc!TK&C`)v+p^O^HLL~qm?=%S!ABoc&-Dgdu z+m4Muvp%jc)7_|hLmNZ)NFB!W#=(f2t>Dw6@2|!s|6A^*;-O-4I%z`6h`yPM+os}1 zDJpP36+JRc+-}})r#_|gz0-e#Ri$)`SFbmdcg8de+PgT6U#!7#HhnIl!c6~_7|-9v zmC}HInYEaJ#<$@7%f$}v^Ol>j#(h491Ml-pg>>96MUX{BOZ4!^CC?X!gE+@Hv_i1l zii{o=T$I|4ZYiq{R;@0tDXU)Y%`MQ%%2wrQHF%9+M1EON zt6YS)3s!@pe5F?5Ez2v=Dyvp3%@$uZE2{Cv0)94&evztnc+M?3TE*}(Z=rT;)#@eH zTJV;YUi!+FI?99IvhtP7N95N=h@h5uRczLz*|X=DO`bD-;_Q;Erk9mzwcZ>OSDUvo zN5hX~FVQOUNig1*sHv=}76KQoSfVUmQdM(fWw{1R%fxFE+RB<6Z!TY}-Lk0qX03Yp zx^nbGbhA9j7OX2@U8PmzkxW>K7dA+AS#^0O`GtN}+R+8W8N57@5WEi@#qAI9*gV#0| zuPzU2iz+H=$q$fTS+!_MSxrH(3c@Rw2ZQKr1!!=3-byb#R8}Tm_9&}Zw7gPVylD06 zwGkFY{j@l#BXK<1))+2cwrI6hQAqZdmED3sSYB3xH&TLS%a_z@c$=kWak;cu{zN$i zNM0@+yJB^jH`hC2#0afsM1HWUz%sBvidvJqWVuF8gwH6py!ZmGhP5c~SawiE+*q}G zb=9p}#Yhr?Uu(;r=pFf0ey}Zj$Sv?*E{b5yit@2b%U6`IUcMOUqScF+jm4WeLq_Ch z4_TT$vAr-f-UbJ!z${8gSMZ6cFH@DPOs&PRyVRU8qi|DDsED#e!TIW?(=4urq z$V~nu;Z;8RJQpWRU7N#T-=30WXbnwk8KGa-p%3^N-X~ zSeDFUkb7g-&g-)p+qT5ZPx52nbtmnJayVOW(?&Kj+*|d?&{l44WMsG^I<w{P(gdl3eqV?_a6s#=jIejY5}3k)o zC=;cK@V8xCkt8whkzH#zw7#9$G5NN9MZT7GUrpY=ugG_9Z992Ro%`|aPO?AfM-2O7 z^2M+(Cg15z?er!lCE@&+mXVQ_)uTtRUVZxX?>}geWeeLxgUK+LHq9G@mK%eX7lW1` zgEl+{ZA1*($QZPO7_>r*#y+)aquP03h}B!>a%dk;p_I_})1DJ!6vL<9qM`{CkpI|I zT)MP|mUX-BYqYH1_*cQlTh?*Cu3gRGGb*U#v}!E@Kci}7HZqB=1b15lbCDO27%atW zl$1_d!|$QEVaNL2_N?CcmDV1OT*alXUB}=HmhSaJx1QO^q_FPm+Um|D0%?!Xzg0fvC!c^e zM%P3g|C@}CVBsn*b!|R_Pg+K=Wv4Rf&#DUC3`Q9JUOS_Qv(eT# z@3Bl?tu@q#{mk_D!zQ05lOtHTic4LaXMxI@aat|=Syv>s58UiZF2%2aMMdFW%eoq^ z;jyqonch_iMU=ix)&D;UMt=(0=$;$a{T}K5Z`R$Tk*m1WwOI_7S-MwqznK))Ju6zX zrj2PA=F62F%!~T9jBu%IGZ08NtWfJ|m4t?SoA5`qN_iAL~MrBw$46`bkc#o?rN z0ClgCQBF0Olnio;F}1a%iqV%X0kuSC)SCF=9KfW2T)I|jy?FJ4U&V4FR+e63#7g?e z4BkM=T#&|tOXSA}N|nsj$Wl3-n8+~b2%`yVgiNi5$c*yLk4OScD*HOklj*U6G9`DS zkri=@A=BVFM*CY92Z_w+2rJaA)WIYqYT65YJr0dwvCN_(p;~Td-JGjTElB=lw8ZKJ zO{qpkIq_h=FvtnV)K*h>8ND$=0LYB;{Ed-ROfh@g&0BEtY~_SvimBXg^JZu~cj<@8 z=z}d;jBR*Kz8Kr^n0)n{+v#=2$GcpeI;Es^>5`e*ty^|B?t9uTTi7PrHZ#m6ZJQb9 z(x&CcpykD&<;S26k3ky|gErEleMb$HO)F?*m`j^hXwlfGv9`?)jax7mw#_wmIS5hT z?Kv?%wV2s6|r|_Qa2SO;AW7mr**Jh z?#Dr1><+oB>0yH|kU?9*OEy<=i48S_qb!504Kq zd?QzJi6w-=g_dq>jb>6%E!n&JC_X*ZLzLBfA#MYF-4=ml*)|5$M z-R-uf$OlonZEBui;?p3BUf>Wtto@_!|n8m!?K{pn@M5avm{UWyK`zPAwoZX zwMwNXF0m9a_^PTBJ61+gl+F}w6%xO7^ikVUtJa$LGnkZZ8EfrpnKZjjGz;aut{8ss*Z16kA?hA#8ci=&qLb!H#*eCRcgo zc4p-sMeUNA*iUsc9`_imT{08H9i7p(qbWp?n_c?mi)oiDqqfKFo*ydrsEq)lmLI|{ zVNw#3NyFP5kJw-~a?P7cRtIbt3rH;wXT7dJ$8v)f*NQw5+vH~iuT$nX}6HnNf7do5Z)Bg0(M z>4RY|V|hS#9#T?*V)t;lb6-rp7>`wA^2Kh@aECoabZm z#qhklGd6(f>0P^a@7}Yg$J4Lhz=1=CSUOl2d6Z!;$)gN&NgidGOY$hgT+(c2m`j^B zJO*t<4B9{LQTA0Vj}EhX%Un1~-{5GM_V81B?KorK?Z}f`QH%RlHDcI=Zow8AH%P2= zG*@wngD8XNRI51Lr&RlCCb6M0j;;A*H*JJ1?faD+7wud33)SNOF4KP;wvO&7MzU}f zm)Nc__^D-`JmBGQ$)vD#?GAXu+gZ2EvJSW84zP9O8<~DQY#lwGie%v`E@`WxxaCjH z(NRbq0rC8fNnz{ev>jqRJBjk#vtiwLlJ0|SUXMnu;u1R!23=}i#^Ls!Iu9@@tb2A_ z-TY*PXG4;bf|#MlMGc2o_xMJx;u1$d2D2^Q@(752GpR*YfxE44elo(k`-FAxCf$cw zcaKJ{;!@XUGU&5(ui}0)DXe>DTiu03kcUqzVn-`UETz6chs z;u6~$2CFRltP>}bex|Cx%^;hMBjAyBZH*q)CQx>S4cbcvJ;pZoXyhs`aXMk}UdteP zZwOO}Nvs{*ZFS=(>)W`C|A{qSyM{q7=?SRP^01{%-VH)%FzHdN%JK}8!iKavhZb9p zkvMKx6>je_$SRyT;+6KP)_Pe=f1#8*#XV@MVaiEW12GJ;85oTx+KooUA-L^fIO@<# ze4Jc=sHQeO+QAu?QO<4%1O}h5IK{&nMmf`flfh>!PH~cAl=A{O8T{Ph6vr1vldO)< zV321oZTn#-qrDZU+RQV`QxU2d^jVy%=zzee-y(}AQ;hOlLEJFNb400Pbe$zYJOpEu zV>?Ee)6p6haER}-1PBWl<-my%xpcIK4>+VaCcxQtj_4ZwZXbRAoG#1QZ;Hg^i*ai_ zCSQ!l7mm2NgamiQmP$O9U|YDP%@o62(q@WbE@?BxFqgEMVwg+XOfk$QZKfFJ(x#1w zK^tk&ij~i3d&)4Ev^`~*eHv>s<zvE-S`P8Swf zy#HhErI`Mhs;8xMGqQ063s-T8*kSNC6)AkT9Qlz++~F9J#!o2Nwm*k;?tWAW{SZ(E#1~;ib-MJ^P=1bgr890-$GDY-w$iwL)u$e`}jt#;u4!B1_PFMYqP|p zDpdt;2H7B_;tOlrn#2z-!X|wjHfb-J^d6hkqmiq)#2$*lS(ZuG9*RkuER$w47-7=i z+nGc^Y${hw_R>AdBo}gO!#TERd?VBU9yWO&nH<5wRa{~-#i00cQK;g(?}#5Jv3)VN zUi`!(>@Y+157E1yw130~_GsiPF0uJyaH-`mYxBjVUs(>D$sikqG2GE^Ipqf-VUxNl z2`(&_4Hwv+@r_L963Y&Qb1i$UEd`UlY1uP_!3cYHwzCI!kHve0wmT;hDh;14Z>tcQS1V(l?bQ{wiV+-_NuY_19qc%Q**tu9@|AeUGO8T__og7qwr zN&I8mao7y0vmTSe*0tM#i5pF77slRMZUuKWy-j01?O^(Cmi03jWc#q+Vvy}}ipT!6 zIb+I?RVTvRHl~CPy}E5$z`Y{56XX3^tTK|va`r-Hu8G4d)_z90Hy8s3xi{A12PS-1 ziRggG1>*4o6CP6){qe>!1=1Gw7Tric45U|t14T=2@v>!=*pV>G=^XQb!S^gqv3q2c zQ!h9fJa2J|-6Nx%5y8pe=N6~jJt~wF5jZVS4VKzH>I&tg0Zs2vL!$~lwp)ZFJi(lNxgr?D2JkYR>NpG{@R_HblVq7>C_Av zo3U@)#N>ZMHK96B8X`jb1m$c7gm`mE{G0Y|H^BCrm_IV8Z zRDW%_4aqQvXk>V%>I4lV!-p(dK_kOF7&MFwa~W$GrFQ-fzjS{< z_5C4LV(0QF1%7OiW{g$6oT*CWlaKMNtuTF~(yv1NYi!@`A0&fqKo>SmwVG{R0815#6w_2q63~pu*;4T%qvtARfdQwqe zuo}!@@Fk0M9fPlhWzah=)lx=x<&43WQ)V!juSf}+crj(IY{1mfsupgh*H*-9)xxSf zRK-1Ei41|2E|<7s@Wo7A zG5BI8t{8kV5|=|`z9+5J-Ttq@>>692)ZOYu46QNwPPhNFD;<%o{J zgf7z_u@j?xjEJIlDec;eO7kC8nS&jA?=Ae%<1P-ajl@?)B13vQFJ(4z%QH$sF8&f` zt>Yh)@o2W}(=k=%;MPa9gqlb^h841X#JAIF6CXSKmP;B7hU=BhwB9lNxJAotWSG4~ z+ZKkor1dUBuK+tHh?Hr__f^GrJ3Htg9d~Icxsc7-s#N#KV;#^VJP_66L875>KDVHM z1cW|ClsqDxpY$HyjHJ)z!Cy@xOJa9?b&0F>2!kVRWJw20aOd?E7Vu&q=KPK$9dgKQG+l%C$i$lZz$#B-Y>qzMoZEl0T^4> zGQz*BKqA}St!8O$_3PSV?hbngJ^V-+azT~gGJ8r9{Cfbp)~?gU&`Gt(P$k&dO)rK? zU~Ko{ZiLNP%pms+mbGn`;Bt3jH**PVSs0fwJsP|1B5uQF46XR*5>?U<>uh%y)%I1G z?2Zm`EQ8DFG{k1eG}N~L&W`bk+>T3dMx>jF_DDBv+b3yAAlZ`2V;2=wJbE#sO0;g* z9u8xr99tkU$O2;okPY`R*a(&o5kMRcU%BOC))j8KsI3DWE|=P`G831SIT)@|E~5P^ z!#rClb1=;NY1*$c%w?<l$-dI`|GIzu#k4cM_@%{0f zJ9;k~b>xWH=Wz?}YWtSKsLe)rhZt14cBnEA#;ZLilkQMewC6-s)PW<)Ai1eyc6PC9 z7PT0~XtrBvIjG8%b|)L!b8_v2imUzkCrWgTJtw#1QEo5cA3Z@iDADtS4E(Gb4ZoeY<8~XGDbfgnnPo;><)|sHqYFMCnt?s`)q@*Mts!o)MD`t7>e?Y83);sExtn$KkLK8rM)!AOZS+ey@;MXGmBh#04;-dE*ZdJE^oCP(*m zxIx+-|GIrp>+bB^y%*k<-U({24RntjWy66@j)t8A+6U+Y)#06xRw^6zfO1Me^?;5L z)W`~^$_*}FtF#nhE`a0fQ^hK-`d?MyuTB58Ua^W*@?JCk(EoD1!qkStsH6Y13t7op zrEK=su52UT#bN2+|G(%GD>)SH^G&;ueee zx~hcuEt?(c4?~zZMVXUA*`~K=w_VoLH%>oojZl*&OcvRKP2y=h3-3FLJh5KoiFL>p zND`Rv-FvN4(+Y3UiWGr}7YRZn4VfY+X~-0@=dvkcc320eh_69Q+w5=|El3UjN?$lJ zq?yu@*Tn9Ni0*$y56kba^vq;EwRpJ>shG0PzaW1t<_?RV@^9`6%b%|FT*X~MN>wYw zKi?(FY%F-ezqunUpG#f4p20zCD#mFWIoUAjyp=Sr56?Xd5|i)=l@Ah;DCmO}uy6A+ z)f+C6+8Fd&+GJ|O-vBY`tflQ5DJ%R9B~jXbr?k$(pU@$iPGE*(?yC`5FQ+{wv6%KE z)K<#SI|OF2;2{l&Nslxjr#wymBh;d?voeEAyhp`gfo1$Ab`_I8wv4|aY_^0rg|e%5 zgk5!Db9dE_OT2Q=;JubM>*s8k#Hl;R3;J!f3tTvFrqavVW)?P5!ga!j%6Zk&d2okt zo^awytbmxerD}^`xQwqtZ1h(lb4;$;;qjcAN-MY`~GsCW;_<^(9 zM-QuiPnod=yMvj$JGhkDCRo3M`@h5+U(F)6WSp9dYhzgSe_+RIEER0RL}kj3f6NrJ z(#e5A$D!`M{#EagRcsA!=yt`hDx6=w#8v+W`x<|!T*W1hy9^$(lB@NH!%PY%*I8|o zDX&AEO1}uF@p~%szkB5W_Q@4 zz=EhjD;*cMQIUaVfnrVU!m@lA77!L?TlMYi&g@4!JA*T`xTr;={y{KR(qN+%3pEmr z{i98*Mw^CUt*x3?F_;!x+S1n6YOU4QSWIK+x$pjd_r1CAjjIi&FWLQ_bM86kp8N6M zyZ60$_tq(oByS`V7)iR5x{SW*)`JeZGhW8F>ZIab)>@6YUrrtUUmHm4=P-_+%tXdyrQbmU%YDudW@^(0)rd{;F z&wc3G(ql+g$Np(vwIZ==4;-03WZhgtvf53mrW+XyBbEYC%67}mpe^X;=d&%gc~Xrj zc^0*gJhPlu-3PRa^#j6OI_NMoh2Cwa(CiYE<&9+9oaz5k=AUmYR?5~(Z$b`R_&L8+R=!&iB|0&f!ebX zwMMJt$wxgT*-HAd5E=wU z+N91p2?ez~lG}ucTFhsB39H05mG-?S;!DY_$Q)~Ng_XxckXWd*N};&+$N0JxCVPRB z<-;**dyxE&&GKrSSBT(=!7-scy(U>*qj-1}^VrCrB$^l2_O*5J0z34Do@DFm;y>?Y zlW>>9clcy^6ARtXC~A;7w0yNk_BJ?}C_ixUzo(;s5BgsA&s=+f^QTw(X_=X%>KT_m zt&lm)R+(Omshcp#kSE~&J;%4ph*=k$nL5Bc@UZ?ATCqPAOxe0t91+q}Ia>HCr# zg0Y~rG1+T3HZ*ag=huG5lA%Adkg4~WWVclwip-KrQ}g95&3-9aI$qNnM#?N|r;-m{Dhg z+&-kR9C1Ep9rzKDTKRl1l4``-Y}*c7I3~U$OqKxDn(x0+H*_@Qa{u6|hAfXH|Vu&^BkAY7T!RF<1Wt zi|W_HY_7ajXq$6WwWb!u8IQs!DD1UvaQ5EdC$J86eP&=xCrJrdM@0TZoYtwkV9e7< zrdV#ya+`Ct;yxC|GgoDmAA@U|^N>6Wksb%jBBT4rAA?+fH9w}BXE*Jmgncz>QudK& zy!vzYf7NY?j#=dnjkz#`XApALCdvGha>uO|kGwz##l!BeM)A_GBEasMn6Yl;Hf|Ai5>!_jH^^<+nQAn)7FWPqBQAr7MiHn zM3(;LW*JqCsqG2%^g`s>@48DiQiI6z($$<|n}xNfhfOgNMipZtq!(iB53kq;Z2Fki zOe%VyQmr$SryI{tA}`i%iJ4vtd7iTEUHk8%mpxGf4?_MEAj`on?E0ghT6V5J{SoPx zl{%h2^;oa2{t66;Rsy-l=9j?t14n^h1>OqW1-ut{0LWcKzYqQ~;8Vb#0bc~Z1bhW} z5_sCDOvKZH{A!yx5AsWaD}Y_V&A^+1JAwBCzYXM9;BNhVfb>cJdSObXun8!)3vC7O zZW78ZKfgKCc;r^7a_#u+>ML7+i@$dA0XYWkGCLy8_1oe&O<$M)27S7f7JSO^QmRWb<^GYcXwzwi2S+R z!b{+}$-?X4-vho6mH^7)EBxCg>K@XLW~ft!F=0=d7z?cg5(J_6*X0MCNwg7>e3 zuT?(EpV1#i%JD4lMc@%2*MEN#JXcvaR>A-O)z9o1#>ZUXZNNK$Tm?PI$xvJ`{2A!| z0(cboD)67ce*@K-#y$x=2Y3N+KJZdt2QUxhTB~k6|F1aKpJgK12z(0YuH5RzJ6^q< zkMgo!mVkHbWhLZS13lmX(5*Kv0L%5I?}XliKrZ`w5ImP`Jr4elz}JCXXO(Lcb0yU; zq8_-6YVXIaA1>O-Rs6X8;x;T~#kCI~2k$QJ=hipZha;{&+h|-4oJ((W3_x#HR& zcrLeg3wW-w#>ErwhI}vZ0Psm5mr#2e{7->LfLu%MPv8?M-!veXAzKXoRMig`%pxW* z9^fKa#7&U9^~+7iCt@w2sX*?seLMI&fOi4+0J)sjsk-mG@r^eQx)J5t?TmxC8V&Jz zq#p*p0{jE;4d4gBX4#*O!r%7^RaxcPCVnR%ZvDf5AgfJ=cL!1ch5 zz#d=*I1J=U6z-ZcZvLNCzWe~1cxKAvOzZ|vd;vW12>9OsfA8Q4@I-!*ar*hnKlo*a z;e!94RC)KH-tPx;y#yjxrwAf3)OdDp!XN9A$a*BUrHsD~K-Q~^Ml1O5=C5E+tOwr+ zWPZe%kY7YQRedmC7wNxRTeuV?K;}b4Y5>rq9rcKTA}Hv)<(dXL?c8#)eqDdA9rcKA zd${)O7i{NRcKkAw_%z~m{V|;>HGtPG-`DlDX-dZe`N6_w(kWW;4 zW912TPprIN?Zj_|!oCvn_UU50lc|;`ReP*_qUw#6H>yUw$g1`u4{R{!u9iYuI-wS_eeolujNYLAmoQH{&uA;%ySdZO4HCqGLqh?Qf&?3g4J2FelnOh;nagu=kgNlmD89SQZZ44{*m zQ0F-k>d%VE>qJto-Z|+e=%Mih6>aw^kneW-gFcnC{$WS{Ig!_?px$(T`sk3qx|nwS zvdFccCOkvYy875Af3g)sq(9s(^0@fFC35X21wZ`3(8Io;$?AB!5OQ2#Ks_p0C;j$N zyAiNOYt_&5zW!9%#nR}9|Hs91)Yp&p&p-R}X#af6cNjfi{9g}A|8)D|WC^q`rr*vM zdCK=y{qGARpRVf%T~yoaW0fzDp4VNz+~|b=4~aY#7J$Cq*FQ}yKv(}7y7rD5`uB*u zImXYUzMq)uRez~cu8a;0r2ADiSIP|zmn*rFR~hm8^Tk50tUNDU^ak_AzD(ZBR*I#v zml+*X{l$^3`CKKJO)rSo@CJqp!(OIT%53*?g-U6=8YpE(a$a_HWMsRTgg8$$D^;pv z3l}eLy+k4!8O?h>tqLWtbz$q0B}>w6V!dHwXLomxw{r8kj_x(<*LhyLRirC7F6-*_ zI@hi6JRMZI=nZ8G*?dlUD|*%~>sr$x(pBp=d!4JHx_ZS%5p{QU&}h}#^~;y7_13Rk zxv8_;>t42eZKt?e)7|9-btCG!X1X(d;<-H9=ZzGz$}g_?%9P8wQpFp{4CmY1SFK&M zyu(|VUYK4iNrNNBf>*9&B-vB>OjbM^*R1p^$DY?emeF1_`QaOKjxSwdN~O!&M=F^< z!Ai;C5UE13l1mR3M$>(x!};vI;jHqxp-g#5rL)@$Vrj5aGAY|~rSfpGP{nwXR?6iw z+5ptnd_|@G+|!lZn9#bFC9RmvR5B`^8$!DdWyO}9u`ms6EJ$lBorO5?!^w;c_e%&x zaV-DRer|o`vPw&L8T z8Een+88HQWH-3m!RtTL&f4!QKgQ)LU`e6R7KbBwrOkA5R*Gh75yhqgK(}%W~QB9=& z#zdy;Bq@LX!TUGR9g!eBYRhj!s_i*`B(_^kLpbi`cZ${a9A^@*nO*IG_LSc4*mFEe z#H&fF`*md*A$Gx@^{?8I3T$*bObW?_uM447XwUI2@nR|h-TK=v@~}O}!NfUE{%n7` zeMAU7CS(8Lc=-gr$8hz@6CW4bsUdqiu3jfXIjCp2fT#S&lAuFm{v3Zdj$==MFAAai z9_=|!Z-V_{l%Ms+eAy3KXit0>_KuqJYQ#@F>L*0t%5>UYuy6P*H4VDD zQ)}4o(F1llo@B)sHj>wQHSD`?Fb023!LWw?g|K()Z}EM`;K~~LvmA?R bytes:... + def flush(self) -> None: ... + def reinit(self) -> None: ... + def close(self) -> None: ... + +def new(*args: Any, **kwargs: Any) -> _UrandomRNG: ... + +def atfork() -> None: ... + +get_random_bytes = urandom + diff --git a/lib/python3.11/site-packages/Cryptodome/Random/random.py b/lib/python3.11/site-packages/Cryptodome/Random/random.py new file mode 100644 index 0000000..da30795 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Random/random.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# +# Random/random.py : Strong alternative for the standard 'random' module +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +__all__ = ['StrongRandom', 'getrandbits', 'randrange', 'randint', 'choice', 'shuffle', 'sample'] + +from Cryptodome import Random + +from Cryptodome.Util.py3compat import is_native_int + +class StrongRandom(object): + def __init__(self, rng=None, randfunc=None): + if randfunc is None and rng is None: + self._randfunc = None + elif randfunc is not None and rng is None: + self._randfunc = randfunc + elif randfunc is None and rng is not None: + self._randfunc = rng.read + else: + raise ValueError("Cannot specify both 'rng' and 'randfunc'") + + def getrandbits(self, k): + """Return an integer with k random bits.""" + + if self._randfunc is None: + self._randfunc = Random.new().read + mask = (1 << k) - 1 + return mask & bytes_to_long(self._randfunc(ceil_div(k, 8))) + + def randrange(self, *args): + """randrange([start,] stop[, step]): + Return a randomly-selected element from range(start, stop, step).""" + if len(args) == 3: + (start, stop, step) = args + elif len(args) == 2: + (start, stop) = args + step = 1 + elif len(args) == 1: + (stop,) = args + start = 0 + step = 1 + else: + raise TypeError("randrange expected at most 3 arguments, got %d" % (len(args),)) + if (not is_native_int(start) or not is_native_int(stop) or not + is_native_int(step)): + raise TypeError("randrange requires integer arguments") + if step == 0: + raise ValueError("randrange step argument must not be zero") + + num_choices = ceil_div(stop - start, step) + if num_choices < 0: + num_choices = 0 + if num_choices < 1: + raise ValueError("empty range for randrange(%r, %r, %r)" % (start, stop, step)) + + # Pick a random number in the range of possible numbers + r = num_choices + while r >= num_choices: + r = self.getrandbits(size(num_choices)) + + return start + (step * r) + + def randint(self, a, b): + """Return a random integer N such that a <= N <= b.""" + if not is_native_int(a) or not is_native_int(b): + raise TypeError("randint requires integer arguments") + N = self.randrange(a, b+1) + assert a <= N <= b + return N + + def choice(self, seq): + """Return a random element from a (non-empty) sequence. + + If the seqence is empty, raises IndexError. + """ + if len(seq) == 0: + raise IndexError("empty sequence") + return seq[self.randrange(len(seq))] + + def shuffle(self, x): + """Shuffle the sequence in place.""" + # Fisher-Yates shuffle. O(n) + # See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle + # Working backwards from the end of the array, we choose a random item + # from the remaining items until all items have been chosen. + for i in range(len(x)-1, 0, -1): # iterate from len(x)-1 downto 1 + j = self.randrange(0, i+1) # choose random j such that 0 <= j <= i + x[i], x[j] = x[j], x[i] # exchange x[i] and x[j] + + def sample(self, population, k): + """Return a k-length list of unique elements chosen from the population sequence.""" + + num_choices = len(population) + if k > num_choices: + raise ValueError("sample larger than population") + + retval = [] + selected = {} # we emulate a set using a dict here + for i in range(k): + r = None + while r is None or r in selected: + r = self.randrange(num_choices) + retval.append(population[r]) + selected[r] = 1 + return retval + +_r = StrongRandom() +getrandbits = _r.getrandbits +randrange = _r.randrange +randint = _r.randint +choice = _r.choice +shuffle = _r.shuffle +sample = _r.sample + +# These are at the bottom to avoid problems with recursive imports +from Cryptodome.Util.number import ceil_div, bytes_to_long, long_to_bytes, size + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/Random/random.pyi b/lib/python3.11/site-packages/Cryptodome/Random/random.pyi new file mode 100644 index 0000000..9b7cf7e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Random/random.pyi @@ -0,0 +1,22 @@ +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[T]) -> T: ... + def shuffle(self, x: Sequence) -> None: ... + def sample(self, population: Sequence, k: int) -> list: ... + +_r = StrongRandom() +getrandbits = _r.getrandbits +randrange = _r.randrange +randint = _r.randint +choice = _r.choice +shuffle = _r.shuffle +sample = _r.sample diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/__init__.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/__init__.py new file mode 100644 index 0000000..330fa22 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/__init__.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/__init__.py: Self-test for cipher modules +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test for cipher modules""" + +__revision__ = "$Id$" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Cipher import test_AES; tests += test_AES.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_ARC2; tests += test_ARC2.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_ARC4; tests += test_ARC4.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_Blowfish; tests += test_Blowfish.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_CAST; tests += test_CAST.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_DES3; tests += test_DES3.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_DES; tests += test_DES.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_Salsa20; tests += test_Salsa20.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_ChaCha20; tests += test_ChaCha20.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_ChaCha20_Poly1305; tests += test_ChaCha20_Poly1305.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_pkcs1_15; tests += test_pkcs1_15.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_pkcs1_oaep; tests += test_pkcs1_oaep.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_OCB; tests += test_OCB.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_CBC; tests += test_CBC.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_CFB; tests += test_CFB.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_OpenPGP; tests += test_OpenPGP.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_OFB; tests += test_OFB.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_CTR; tests += test_CTR.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_CCM; tests += test_CCM.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_EAX; tests += test_EAX.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_GCM; tests += test_GCM.get_tests(config=config) + from Cryptodome.SelfTest.Cipher import test_SIV; tests += test_SIV.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/common.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/common.py new file mode 100644 index 0000000..a13d4fb --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/common.py @@ -0,0 +1,510 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/common.py: Common code for Cryptodome.SelfTest.Hash +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-testing for PyCryptodome hash modules""" + +import unittest +from binascii import a2b_hex, b2a_hex, hexlify + +from Cryptodome.Util.py3compat import b +from Cryptodome.Util.strxor import strxor_c + +class _NoDefault: pass # sentinel object +def _extract(d, k, default=_NoDefault): + """Get an item from a dictionary, and remove it from the dictionary.""" + try: + retval = d[k] + except KeyError: + if default is _NoDefault: + raise + return default + del d[k] + return retval + +# Generic cipher test case +class CipherSelfTest(unittest.TestCase): + + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + + # Extract the parameters + params = params.copy() + self.description = _extract(params, 'description') + self.key = b(_extract(params, 'key')) + self.plaintext = b(_extract(params, 'plaintext')) + self.ciphertext = b(_extract(params, 'ciphertext')) + self.module_name = _extract(params, 'module_name', None) + self.assoc_data = _extract(params, 'assoc_data', None) + self.mac = _extract(params, 'mac', None) + if self.assoc_data: + self.mac = b(self.mac) + + mode = _extract(params, 'mode', None) + self.mode_name = str(mode) + + if mode is not None: + # Block cipher + self.mode = getattr(self.module, "MODE_" + mode) + + self.iv = _extract(params, 'iv', None) + if self.iv is None: + self.iv = _extract(params, 'nonce', None) + if self.iv is not None: + self.iv = b(self.iv) + + else: + # Stream cipher + self.mode = None + self.iv = _extract(params, 'iv', None) + if self.iv is not None: + self.iv = b(self.iv) + + self.extra_params = params + + def shortDescription(self): + return self.description + + def _new(self): + params = self.extra_params.copy() + key = a2b_hex(self.key) + + old_style = [] + if self.mode is not None: + old_style = [ self.mode ] + if self.iv is not None: + old_style += [ a2b_hex(self.iv) ] + + return self.module.new(key, *old_style, **params) + + def isMode(self, name): + if not hasattr(self.module, "MODE_"+name): + return False + return self.mode == getattr(self.module, "MODE_"+name) + + def runTest(self): + plaintext = a2b_hex(self.plaintext) + ciphertext = a2b_hex(self.ciphertext) + assoc_data = [] + if self.assoc_data: + assoc_data = [ a2b_hex(b(x)) for x in self.assoc_data] + + ct = None + pt = None + + # + # Repeat the same encryption or decryption twice and verify + # that the result is always the same + # + for i in range(2): + cipher = self._new() + decipher = self._new() + + # Only AEAD modes + for comp in assoc_data: + cipher.update(comp) + decipher.update(comp) + + ctX = b2a_hex(cipher.encrypt(plaintext)) + ptX = b2a_hex(decipher.decrypt(ciphertext)) + + if ct: + self.assertEqual(ct, ctX) + self.assertEqual(pt, ptX) + ct, pt = ctX, ptX + + self.assertEqual(self.ciphertext, ct) # encrypt + self.assertEqual(self.plaintext, pt) # decrypt + + if self.mac: + mac = b2a_hex(cipher.digest()) + self.assertEqual(self.mac, mac) + decipher.verify(a2b_hex(self.mac)) + +class CipherStreamingSelfTest(CipherSelfTest): + + def shortDescription(self): + desc = self.module_name + if self.mode is not None: + desc += " in %s mode" % (self.mode_name,) + return "%s should behave like a stream cipher" % (desc,) + + def runTest(self): + plaintext = a2b_hex(self.plaintext) + ciphertext = a2b_hex(self.ciphertext) + + # The cipher should work like a stream cipher + + # Test counter mode encryption, 3 bytes at a time + ct3 = [] + cipher = self._new() + for i in range(0, len(plaintext), 3): + ct3.append(cipher.encrypt(plaintext[i:i+3])) + ct3 = b2a_hex(b("").join(ct3)) + self.assertEqual(self.ciphertext, ct3) # encryption (3 bytes at a time) + + # Test counter mode decryption, 3 bytes at a time + pt3 = [] + cipher = self._new() + for i in range(0, len(ciphertext), 3): + pt3.append(cipher.encrypt(ciphertext[i:i+3])) + # PY3K: This is meant to be text, do not change to bytes (data) + pt3 = b2a_hex(b("").join(pt3)) + self.assertEqual(self.plaintext, pt3) # decryption (3 bytes at a time) + + +class RoundtripTest(unittest.TestCase): + def __init__(self, module, params): + from Cryptodome import Random + unittest.TestCase.__init__(self) + self.module = module + self.iv = Random.get_random_bytes(module.block_size) + self.key = b(params['key']) + self.plaintext = 100 * b(params['plaintext']) + self.module_name = params.get('module_name', None) + + def shortDescription(self): + return """%s .decrypt() output of .encrypt() should not be garbled""" % (self.module_name,) + + def runTest(self): + + ## ECB mode + mode = self.module.MODE_ECB + encryption_cipher = self.module.new(a2b_hex(self.key), mode) + ciphertext = encryption_cipher.encrypt(self.plaintext) + decryption_cipher = self.module.new(a2b_hex(self.key), mode) + decrypted_plaintext = decryption_cipher.decrypt(ciphertext) + self.assertEqual(self.plaintext, decrypted_plaintext) + + +class IVLengthTest(unittest.TestCase): + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + self.key = b(params['key']) + + def shortDescription(self): + return "Check that all modes except MODE_ECB and MODE_CTR require an IV of the proper length" + + def runTest(self): + self.assertRaises(TypeError, self.module.new, a2b_hex(self.key), + self.module.MODE_ECB, b("")) + + def _dummy_counter(self): + return "\0" * self.module.block_size + + +class NoDefaultECBTest(unittest.TestCase): + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + self.key = b(params['key']) + + def runTest(self): + self.assertRaises(TypeError, self.module.new, a2b_hex(self.key)) + + +class BlockSizeTest(unittest.TestCase): + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + self.key = a2b_hex(b(params['key'])) + + def runTest(self): + cipher = self.module.new(self.key, self.module.MODE_ECB) + self.assertEqual(cipher.block_size, self.module.block_size) + + +class ByteArrayTest(unittest.TestCase): + """Verify we can use bytearray's for encrypting and decrypting""" + + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + + # Extract the parameters + params = params.copy() + self.description = _extract(params, 'description') + self.key = b(_extract(params, 'key')) + self.plaintext = b(_extract(params, 'plaintext')) + self.ciphertext = b(_extract(params, 'ciphertext')) + self.module_name = _extract(params, 'module_name', None) + self.assoc_data = _extract(params, 'assoc_data', None) + self.mac = _extract(params, 'mac', None) + if self.assoc_data: + self.mac = b(self.mac) + + mode = _extract(params, 'mode', None) + self.mode_name = str(mode) + + if mode is not None: + # Block cipher + self.mode = getattr(self.module, "MODE_" + mode) + + self.iv = _extract(params, 'iv', None) + if self.iv is None: + self.iv = _extract(params, 'nonce', None) + if self.iv is not None: + self.iv = b(self.iv) + else: + # Stream cipher + self.mode = None + self.iv = _extract(params, 'iv', None) + if self.iv is not None: + self.iv = b(self.iv) + + self.extra_params = params + + def _new(self): + params = self.extra_params.copy() + key = a2b_hex(self.key) + + old_style = [] + if self.mode is not None: + old_style = [ self.mode ] + if self.iv is not None: + old_style += [ a2b_hex(self.iv) ] + + return self.module.new(key, *old_style, **params) + + def runTest(self): + + plaintext = a2b_hex(self.plaintext) + ciphertext = a2b_hex(self.ciphertext) + assoc_data = [] + if self.assoc_data: + assoc_data = [ bytearray(a2b_hex(b(x))) for x in self.assoc_data] + + cipher = self._new() + decipher = self._new() + + # Only AEAD modes + for comp in assoc_data: + cipher.update(comp) + decipher.update(comp) + + ct = b2a_hex(cipher.encrypt(bytearray(plaintext))) + pt = b2a_hex(decipher.decrypt(bytearray(ciphertext))) + + self.assertEqual(self.ciphertext, ct) # encrypt + self.assertEqual(self.plaintext, pt) # decrypt + + if self.mac: + mac = b2a_hex(cipher.digest()) + self.assertEqual(self.mac, mac) + decipher.verify(bytearray(a2b_hex(self.mac))) + + +class MemoryviewTest(unittest.TestCase): + """Verify we can use memoryviews for encrypting and decrypting""" + + def __init__(self, module, params): + unittest.TestCase.__init__(self) + self.module = module + + # Extract the parameters + params = params.copy() + self.description = _extract(params, 'description') + self.key = b(_extract(params, 'key')) + self.plaintext = b(_extract(params, 'plaintext')) + self.ciphertext = b(_extract(params, 'ciphertext')) + self.module_name = _extract(params, 'module_name', None) + self.assoc_data = _extract(params, 'assoc_data', None) + self.mac = _extract(params, 'mac', None) + if self.assoc_data: + self.mac = b(self.mac) + + mode = _extract(params, 'mode', None) + self.mode_name = str(mode) + + if mode is not None: + # Block cipher + self.mode = getattr(self.module, "MODE_" + mode) + + self.iv = _extract(params, 'iv', None) + if self.iv is None: + self.iv = _extract(params, 'nonce', None) + if self.iv is not None: + self.iv = b(self.iv) + else: + # Stream cipher + self.mode = None + self.iv = _extract(params, 'iv', None) + if self.iv is not None: + self.iv = b(self.iv) + + self.extra_params = params + + def _new(self): + params = self.extra_params.copy() + key = a2b_hex(self.key) + + old_style = [] + if self.mode is not None: + old_style = [ self.mode ] + if self.iv is not None: + old_style += [ a2b_hex(self.iv) ] + + return self.module.new(key, *old_style, **params) + + def runTest(self): + + plaintext = a2b_hex(self.plaintext) + ciphertext = a2b_hex(self.ciphertext) + assoc_data = [] + if self.assoc_data: + assoc_data = [ memoryview(a2b_hex(b(x))) for x in self.assoc_data] + + cipher = self._new() + decipher = self._new() + + # Only AEAD modes + for comp in assoc_data: + cipher.update(comp) + decipher.update(comp) + + ct = b2a_hex(cipher.encrypt(memoryview(plaintext))) + pt = b2a_hex(decipher.decrypt(memoryview(ciphertext))) + + self.assertEqual(self.ciphertext, ct) # encrypt + self.assertEqual(self.plaintext, pt) # decrypt + + if self.mac: + mac = b2a_hex(cipher.digest()) + self.assertEqual(self.mac, mac) + decipher.verify(memoryview(a2b_hex(self.mac))) + + +def make_block_tests(module, module_name, test_data, additional_params=dict()): + tests = [] + extra_tests_added = False + for i in range(len(test_data)): + row = test_data[i] + + # Build the "params" dictionary with + # - plaintext + # - ciphertext + # - key + # - mode (default is ECB) + # - (optionally) description + # - (optionally) any other parameter that this cipher mode requires + params = {} + if len(row) == 3: + (params['plaintext'], params['ciphertext'], params['key']) = row + elif len(row) == 4: + (params['plaintext'], params['ciphertext'], params['key'], params['description']) = row + elif len(row) == 5: + (params['plaintext'], params['ciphertext'], params['key'], params['description'], extra_params) = row + params.update(extra_params) + else: + raise AssertionError("Unsupported tuple size %d" % (len(row),)) + + if not "mode" in params: + params["mode"] = "ECB" + + # Build the display-name for the test + p2 = params.copy() + p_key = _extract(p2, 'key') + p_plaintext = _extract(p2, 'plaintext') + p_ciphertext = _extract(p2, 'ciphertext') + p_mode = _extract(p2, 'mode') + p_description = _extract(p2, 'description', None) + + if p_description is not None: + description = p_description + elif p_mode == 'ECB' and not p2: + description = "p=%s, k=%s" % (p_plaintext, p_key) + else: + description = "p=%s, k=%s, %r" % (p_plaintext, p_key, p2) + name = "%s #%d: %s" % (module_name, i+1, description) + params['description'] = name + params['module_name'] = module_name + params.update(additional_params) + + # Add extra test(s) to the test suite before the current test + if not extra_tests_added: + tests += [ + RoundtripTest(module, params), + IVLengthTest(module, params), + NoDefaultECBTest(module, params), + ByteArrayTest(module, params), + BlockSizeTest(module, params), + ] + extra_tests_added = True + + # Add the current test to the test suite + tests.append(CipherSelfTest(module, params)) + + return tests + +def make_stream_tests(module, module_name, test_data): + tests = [] + extra_tests_added = False + for i in range(len(test_data)): + row = test_data[i] + + # Build the "params" dictionary + params = {} + if len(row) == 3: + (params['plaintext'], params['ciphertext'], params['key']) = row + elif len(row) == 4: + (params['plaintext'], params['ciphertext'], params['key'], params['description']) = row + elif len(row) == 5: + (params['plaintext'], params['ciphertext'], params['key'], params['description'], extra_params) = row + params.update(extra_params) + else: + raise AssertionError("Unsupported tuple size %d" % (len(row),)) + + # Build the display-name for the test + p2 = params.copy() + p_key = _extract(p2, 'key') + p_plaintext = _extract(p2, 'plaintext') + p_ciphertext = _extract(p2, 'ciphertext') + p_description = _extract(p2, 'description', None) + + if p_description is not None: + description = p_description + elif not p2: + description = "p=%s, k=%s" % (p_plaintext, p_key) + else: + description = "p=%s, k=%s, %r" % (p_plaintext, p_key, p2) + name = "%s #%d: %s" % (module_name, i+1, description) + params['description'] = name + params['module_name'] = module_name + + # Add extra test(s) to the test suite before the current test + if not extra_tests_added: + tests += [ + ByteArrayTest(module, params), + ] + + tests.append(MemoryviewTest(module, params)) + extra_tests_added = True + + # Add the test to the test suite + tests.append(CipherSelfTest(module, params)) + tests.append(CipherStreamingSelfTest(module, params)) + return tests + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py new file mode 100644 index 0000000..bd6c40e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py @@ -0,0 +1,1351 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/AES.py: Self-test for the AES cipher +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.AES""" + +from __future__ import print_function + +import unittest +from Cryptodome.Hash import SHA256 +from Cryptodome.Cipher import AES +from Cryptodome.Util.py3compat import * +from binascii import hexlify + +# This is a list of (plaintext, ciphertext, key[, description[, params]]) tuples. +test_data = [ + # FIPS PUB 197 test vectors + # http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf + + ('00112233445566778899aabbccddeeff', '69c4e0d86a7b0430d8cdb78070b4c55a', + '000102030405060708090a0b0c0d0e0f', 'FIPS 197 C.1 (AES-128)'), + + ('00112233445566778899aabbccddeeff', 'dda97ca4864cdfe06eaf70a0ec0d7191', + '000102030405060708090a0b0c0d0e0f1011121314151617', + 'FIPS 197 C.2 (AES-192)'), + + ('00112233445566778899aabbccddeeff', '8ea2b7ca516745bfeafc49904b496089', + '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + 'FIPS 197 C.3 (AES-256)'), + + # Rijndael128 test vectors + # Downloaded 2008-09-13 from + # http://www.iaik.tugraz.at/Research/krypto/AES/old/~rijmen/rijndael/testvalues.tar.gz + + # ecb_tbl.txt, KEYSIZE=128 + ('506812a45f08c889b97f5980038b8359', 'd8f532538289ef7d06b506a4fd5be9c9', + '00010203050607080a0b0c0d0f101112', + 'ecb-tbl-128: I=1'), + ('5c6d71ca30de8b8b00549984d2ec7d4b', '59ab30f4d4ee6e4ff9907ef65b1fb68c', + '14151617191a1b1c1e1f202123242526', + 'ecb-tbl-128: I=2'), + ('53f3f4c64f8616e4e7c56199f48f21f6', 'bf1ed2fcb2af3fd41443b56d85025cb1', + '28292a2b2d2e2f30323334353738393a', + 'ecb-tbl-128: I=3'), + ('a1eb65a3487165fb0f1c27ff9959f703', '7316632d5c32233edcb0780560eae8b2', + '3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-128: I=4'), + ('3553ecf0b1739558b08e350a98a39bfa', '408c073e3e2538072b72625e68b8364b', + '50515253555657585a5b5c5d5f606162', + 'ecb-tbl-128: I=5'), + ('67429969490b9711ae2b01dc497afde8', 'e1f94dfa776597beaca262f2f6366fea', + '64656667696a6b6c6e6f707173747576', + 'ecb-tbl-128: I=6'), + ('93385c1f2aec8bed192f5a8e161dd508', 'f29e986c6a1c27d7b29ffd7ee92b75f1', + '78797a7b7d7e7f80828384858788898a', + 'ecb-tbl-128: I=7'), + ('b5bf946be19beb8db3983b5f4c6e8ddb', '131c886a57f8c2e713aba6955e2b55b5', + '8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-128: I=8'), + ('41321ee10e21bd907227c4450ff42324', 'd2ab7662df9b8c740210e5eeb61c199d', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2', + 'ecb-tbl-128: I=9'), + ('00a82f59c91c8486d12c0a80124f6089', '14c10554b2859c484cab5869bbe7c470', + 'b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-128: I=10'), + ('7ce0fd076754691b4bbd9faf8a1372fe', 'db4d498f0a49cf55445d502c1f9ab3b5', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9da', + 'ecb-tbl-128: I=11'), + ('23605a8243d07764541bc5ad355b3129', '6d96fef7d66590a77a77bb2056667f7f', + 'dcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-128: I=12'), + ('12a8cfa23ea764fd876232b4e842bc44', '316fb68edba736c53e78477bf913725c', + 'f0f1f2f3f5f6f7f8fafbfcfdfe010002', + 'ecb-tbl-128: I=13'), + ('bcaf32415e8308b3723e5fdd853ccc80', '6936f2b93af8397fd3a771fc011c8c37', + '04050607090a0b0c0e0f101113141516', + 'ecb-tbl-128: I=14'), + ('89afae685d801ad747ace91fc49adde0', 'f3f92f7a9c59179c1fcc2c2ba0b082cd', + '2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-128: I=15'), + ('f521d07b484357c4a69e76124a634216', '6a95ea659ee3889158e7a9152ff04ebc', + '40414243454647484a4b4c4d4f505152', + 'ecb-tbl-128: I=16'), + ('3e23b3bc065bcc152407e23896d77783', '1959338344e945670678a5d432c90b93', + '54555657595a5b5c5e5f606163646566', + 'ecb-tbl-128: I=17'), + ('79f0fba002be1744670e7e99290d8f52', 'e49bddd2369b83ee66e6c75a1161b394', + '68696a6b6d6e6f70727374757778797a', + 'ecb-tbl-128: I=18'), + ('da23fe9d5bd63e1d72e3dafbe21a6c2a', 'd3388f19057ff704b70784164a74867d', + '7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-128: I=19'), + ('e3f5698ba90b6a022efd7db2c7e6c823', '23aa03e2d5e4cd24f3217e596480d1e1', + 'a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-128: I=20'), + ('bdc2691d4f1b73d2700679c3bcbf9c6e', 'c84113d68b666ab2a50a8bdb222e91b9', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2', + 'ecb-tbl-128: I=21'), + ('ba74e02093217ee1ba1b42bd5624349a', 'ac02403981cd4340b507963db65cb7b6', + '08090a0b0d0e0f10121314151718191a', + 'ecb-tbl-128: I=22'), + ('b5c593b5851c57fbf8b3f57715e8f680', '8d1299236223359474011f6bf5088414', + '6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-128: I=23'), + ('3da9bd9cec072381788f9387c3bbf4ee', '5a1d6ab8605505f7977e55b9a54d9b90', + '80818283858687888a8b8c8d8f909192', + 'ecb-tbl-128: I=24'), + ('4197f3051121702ab65d316b3c637374', '72e9c2d519cf555e4208805aabe3b258', + '94959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-128: I=25'), + ('9f46c62ec4f6ee3f6e8c62554bc48ab7', 'a8f3e81c4a23a39ef4d745dffe026e80', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9ba', + 'ecb-tbl-128: I=26'), + ('0220673fe9e699a4ebc8e0dbeb6979c8', '546f646449d31458f9eb4ef5483aee6c', + 'bcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-128: I=27'), + ('b2b99171337ded9bc8c2c23ff6f18867', '4dbe4bc84ac797c0ee4efb7f1a07401c', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2', + 'ecb-tbl-128: I=28'), + ('a7facf4e301e984e5efeefd645b23505', '25e10bfb411bbd4d625ac8795c8ca3b3', + 'e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-128: I=29'), + ('f7c762e4a9819160fd7acfb6c4eedcdd', '315637405054ec803614e43def177579', + 'f8f9fafbfdfefe00020304050708090a', + 'ecb-tbl-128: I=30'), + ('9b64fc21ea08709f4915436faa70f1be', '60c5bc8a1410247295c6386c59e572a8', + '0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-128: I=31'), + ('52af2c3de07ee6777f55a4abfc100b3f', '01366fc8ca52dfe055d6a00a76471ba6', + '20212223252627282a2b2c2d2f303132', + 'ecb-tbl-128: I=32'), + ('2fca001224386c57aa3f968cbe2c816f', 'ecc46595516ec612449c3f581e7d42ff', + '34353637393a3b3c3e3f404143444546', + 'ecb-tbl-128: I=33'), + ('4149c73658a4a9c564342755ee2c132f', '6b7ffe4c602a154b06ee9c7dab5331c9', + '48494a4b4d4e4f50525354555758595a', + 'ecb-tbl-128: I=34'), + ('af60005a00a1772f7c07a48a923c23d2', '7da234c14039a240dd02dd0fbf84eb67', + '5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-128: I=35'), + ('6fccbc28363759914b6f0280afaf20c6', 'c7dc217d9e3604ffe7e91f080ecd5a3a', + '70717273757677787a7b7c7d7f808182', + 'ecb-tbl-128: I=36'), + ('7d82a43ddf4fefa2fc5947499884d386', '37785901863f5c81260ea41e7580cda5', + '84858687898a8b8c8e8f909193949596', + 'ecb-tbl-128: I=37'), + ('5d5a990eaab9093afe4ce254dfa49ef9', 'a07b9338e92ed105e6ad720fccce9fe4', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aa', + 'ecb-tbl-128: I=38'), + ('4cd1e2fd3f4434b553aae453f0ed1a02', 'ae0fb9722418cc21a7da816bbc61322c', + 'acadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-128: I=39'), + ('5a2c9a9641d4299125fa1b9363104b5e', 'c826a193080ff91ffb21f71d3373c877', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2', + 'ecb-tbl-128: I=40'), + ('b517fe34c0fa217d341740bfd4fe8dd4', '1181b11b0e494e8d8b0aa6b1d5ac2c48', + 'd4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-128: I=41'), + ('014baf2278a69d331d5180103643e99a', '6743c3d1519ab4f2cd9a78ab09a511bd', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fa', + 'ecb-tbl-128: I=42'), + ('b529bd8164f20d0aa443d4932116841c', 'dc55c076d52bacdf2eefd952946a439d', + 'fcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-128: I=43'), + ('2e596dcbb2f33d4216a1176d5bd1e456', '711b17b590ffc72b5c8e342b601e8003', + '10111213151617181a1b1c1d1f202122', + 'ecb-tbl-128: I=44'), + ('7274a1ea2b7ee2424e9a0e4673689143', '19983bb0950783a537e1339f4aa21c75', + '24252627292a2b2c2e2f303133343536', + 'ecb-tbl-128: I=45'), + ('ae20020bd4f13e9d90140bee3b5d26af', '3ba7762e15554169c0f4fa39164c410c', + '38393a3b3d3e3f40424344454748494a', + 'ecb-tbl-128: I=46'), + ('baac065da7ac26e855e79c8849d75a02', 'a0564c41245afca7af8aa2e0e588ea89', + '4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-128: I=47'), + ('7c917d8d1d45fab9e2540e28832540cc', '5e36a42a2e099f54ae85ecd92e2381ed', + '60616263656667686a6b6c6d6f707172', + 'ecb-tbl-128: I=48'), + ('bde6f89e16daadb0e847a2a614566a91', '770036f878cd0f6ca2268172f106f2fe', + '74757677797a7b7c7e7f808183848586', + 'ecb-tbl-128: I=49'), + ('c9de163725f1f5be44ebb1db51d07fbc', '7e4e03908b716116443ccf7c94e7c259', + '88898a8b8d8e8f90929394959798999a', + 'ecb-tbl-128: I=50'), + ('3af57a58f0c07dffa669572b521e2b92', '482735a48c30613a242dd494c7f9185d', + '9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-128: I=51'), + ('3d5ebac306dde4604f1b4fbbbfcdae55', 'b4c0f6c9d4d7079addf9369fc081061d', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2', + 'ecb-tbl-128: I=52'), + ('c2dfa91bceb76a1183c995020ac0b556', 'd5810fe0509ac53edcd74f89962e6270', + 'c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-128: I=53'), + ('c70f54305885e9a0746d01ec56c8596b', '03f17a16b3f91848269ecdd38ebb2165', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9ea', + 'ecb-tbl-128: I=54'), + ('c4f81b610e98012ce000182050c0c2b2', 'da1248c3180348bad4a93b4d9856c9df', + 'ecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-128: I=55'), + ('eaab86b1d02a95d7404eff67489f97d4', '3d10d7b63f3452c06cdf6cce18be0c2c', + '00010203050607080a0b0c0d0f101112', + 'ecb-tbl-128: I=56'), + ('7c55bdb40b88870b52bec3738de82886', '4ab823e7477dfddc0e6789018fcb6258', + '14151617191a1b1c1e1f202123242526', + 'ecb-tbl-128: I=57'), + ('ba6eaa88371ff0a3bd875e3f2a975ce0', 'e6478ba56a77e70cfdaa5c843abde30e', + '28292a2b2d2e2f30323334353738393a', + 'ecb-tbl-128: I=58'), + ('08059130c4c24bd30cf0575e4e0373dc', '1673064895fbeaf7f09c5429ff75772d', + '3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-128: I=59'), + ('9a8eab004ef53093dfcf96f57e7eda82', '4488033ae9f2efd0ca9383bfca1a94e9', + '50515253555657585a5b5c5d5f606162', + 'ecb-tbl-128: I=60'), + ('0745b589e2400c25f117b1d796c28129', '978f3b8c8f9d6f46626cac3c0bcb9217', + '64656667696a6b6c6e6f707173747576', + 'ecb-tbl-128: I=61'), + ('2f1777781216cec3f044f134b1b92bbe', 'e08c8a7e582e15e5527f1d9e2eecb236', + '78797a7b7d7e7f80828384858788898a', + 'ecb-tbl-128: I=62'), + ('353a779ffc541b3a3805d90ce17580fc', 'cec155b76ac5ffda4cf4f9ca91e49a7a', + '8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-128: I=63'), + ('1a1eae4415cefcf08c4ac1c8f68bea8f', 'd5ac7165763225dd2a38cdc6862c29ad', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2', + 'ecb-tbl-128: I=64'), + ('e6e7e4e5b0b3b2b5d4d5aaab16111013', '03680fe19f7ce7275452020be70e8204', + 'b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-128: I=65'), + ('f8f9fafbfbf8f9e677767170efe0e1e2', '461df740c9781c388e94bb861ceb54f6', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9da', + 'ecb-tbl-128: I=66'), + ('63626160a1a2a3a445444b4a75727370', '451bd60367f96483042742219786a074', + 'dcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-128: I=67'), + ('717073720605040b2d2c2b2a05fafbf9', 'e4dfa42671a02e57ef173b85c0ea9f2b', + 'f0f1f2f3f5f6f7f8fafbfcfdfe010002', + 'ecb-tbl-128: I=68'), + ('78797a7beae9e8ef3736292891969794', 'ed11b89e76274282227d854700a78b9e', + '04050607090a0b0c0e0f101113141516', + 'ecb-tbl-128: I=69'), + ('838281803231300fdddcdbdaa0afaead', '433946eaa51ea47af33895f2b90b3b75', + '18191a1b1d1e1f20222324252728292a', + 'ecb-tbl-128: I=70'), + ('18191a1bbfbcbdba75747b7a7f78797a', '6bc6d616a5d7d0284a5910ab35022528', + '2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-128: I=71'), + ('848586879b989996a3a2a5a4849b9a99', 'd2a920ecfe919d354b5f49eae9719c98', + '40414243454647484a4b4c4d4f505152', + 'ecb-tbl-128: I=72'), + ('0001020322212027cacbf4f551565754', '3a061b17f6a92885efbd0676985b373d', + '54555657595a5b5c5e5f606163646566', + 'ecb-tbl-128: I=73'), + ('cecfcccdafacadb2515057564a454447', 'fadeec16e33ea2f4688499d157e20d8f', + '68696a6b6d6e6f70727374757778797a', + 'ecb-tbl-128: I=74'), + ('92939091cdcecfc813121d1c80878685', '5cdefede59601aa3c3cda36fa6b1fa13', + '7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-128: I=75'), + ('d2d3d0d16f6c6d6259585f5ed1eeefec', '9574b00039844d92ebba7ee8719265f8', + '90919293959697989a9b9c9d9fa0a1a2', + 'ecb-tbl-128: I=76'), + ('acadaeaf878485820f0e1110d5d2d3d0', '9a9cf33758671787e5006928188643fa', + 'a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-128: I=77'), + ('9091929364676619e6e7e0e1757a7b78', '2cddd634c846ba66bb46cbfea4a674f9', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9ca', + 'ecb-tbl-128: I=78'), + ('babbb8b98a89888f74757a7b92959497', 'd28bae029393c3e7e26e9fafbbb4b98f', + 'cccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-128: I=79'), + ('8d8c8f8e6e6d6c633b3a3d3ccad5d4d7', 'ec27529b1bee0a9ab6a0d73ebc82e9b7', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2', + 'ecb-tbl-128: I=80'), + ('86878485010203040808f7f767606162', '3cb25c09472aff6ee7e2b47ccd7ccb17', + 'f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-128: I=81'), + ('8e8f8c8d656667788a8b8c8d010e0f0c', 'dee33103a7283370d725e44ca38f8fe5', + '08090a0b0d0e0f10121314151718191a', + 'ecb-tbl-128: I=82'), + ('c8c9cacb858687807a7b7475e7e0e1e2', '27f9bcd1aac64bffc11e7815702c1a69', + '1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-128: I=83'), + ('6d6c6f6e5053525d8c8d8a8badd2d3d0', '5df534ffad4ed0749a9988e9849d0021', + '30313233353637383a3b3c3d3f404142', + 'ecb-tbl-128: I=84'), + ('28292a2b393a3b3c0607181903040506', 'a48bee75db04fb60ca2b80f752a8421b', + '44454647494a4b4c4e4f505153545556', + 'ecb-tbl-128: I=85'), + ('a5a4a7a6b0b3b28ddbdadddcbdb2b3b0', '024c8cf70bc86ee5ce03678cb7af45f9', + '58595a5b5d5e5f60626364656768696a', + 'ecb-tbl-128: I=86'), + ('323330316467666130313e3f2c2b2a29', '3c19ac0f8a3a3862ce577831301e166b', + '6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-128: I=87'), + ('27262524080b0a05171611100b141516', 'c5e355b796a57421d59ca6be82e73bca', + '80818283858687888a8b8c8d8f909192', + 'ecb-tbl-128: I=88'), + ('040506074142434435340b0aa3a4a5a6', 'd94033276417abfb05a69d15b6e386e2', + '94959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-128: I=89'), + ('242526271112130c61606766bdb2b3b0', '24b36559ea3a9b9b958fe6da3e5b8d85', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9ba', + 'ecb-tbl-128: I=90'), + ('4b4a4948252627209e9f9091cec9c8cb', '20fd4feaa0e8bf0cce7861d74ef4cb72', + 'bcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-128: I=91'), + ('68696a6b6665646b9f9e9998d9e6e7e4', '350e20d5174277b9ec314c501570a11d', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2', + 'ecb-tbl-128: I=92'), + ('34353637c5c6c7c0f0f1eeef7c7b7a79', '87a29d61b7c604d238fe73045a7efd57', + 'e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-128: I=93'), + ('32333031c2c1c13f0d0c0b0a050a0b08', '2c3164c1cc7d0064816bdc0faa362c52', + 'f8f9fafbfdfefe00020304050708090a', + 'ecb-tbl-128: I=94'), + ('cdcccfcebebdbcbbabaaa5a4181f1e1d', '195fe5e8a05a2ed594f6e4400eee10b3', + '0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-128: I=95'), + ('212023223635343ba0a1a6a7445b5a59', 'e4663df19b9a21a5a284c2bd7f905025', + '20212223252627282a2b2c2d2f303132', + 'ecb-tbl-128: I=96'), + ('0e0f0c0da8abaaad2f2e515002050407', '21b88714cfb4e2a933bd281a2c4743fd', + '34353637393a3b3c3e3f404143444546', + 'ecb-tbl-128: I=97'), + ('070605042a2928378e8f8889bdb2b3b0', 'cbfc3980d704fd0fc54378ab84e17870', + '48494a4b4d4e4f50525354555758595a', + 'ecb-tbl-128: I=98'), + ('cbcac9c893909196a9a8a7a6a5a2a3a0', 'bc5144baa48bdeb8b63e22e03da418ef', + '5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-128: I=99'), + ('80818283c1c2c3cc9c9d9a9b0cf3f2f1', '5a1dbaef1ee2984b8395da3bdffa3ccc', + '70717273757677787a7b7c7d7f808182', + 'ecb-tbl-128: I=100'), + ('1213101125262720fafbe4e5b1b6b7b4', 'f0b11cd0729dfcc80cec903d97159574', + '84858687898a8b8c8e8f909193949596', + 'ecb-tbl-128: I=101'), + ('7f7e7d7c3033320d97969190222d2c2f', '9f95314acfddc6d1914b7f19a9cc8209', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aa', + 'ecb-tbl-128: I=102'), + ('4e4f4c4d484b4a4d81808f8e53545556', '595736f6f0f70914a94e9e007f022519', + 'acadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-128: I=103'), + ('dcdddedfb0b3b2bd15141312a1bebfbc', '1f19f57892cae586fcdfb4c694deb183', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2', + 'ecb-tbl-128: I=104'), + ('93929190282b2a2dc4c5fafb92959497', '540700ee1f6f3dab0b3eddf6caee1ef5', + 'd4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-128: I=105'), + ('f5f4f7f6c4c7c6d9373631307e717073', '14a342a91019a331687a2254e6626ca2', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fa', + 'ecb-tbl-128: I=106'), + ('93929190b6b5b4b364656a6b05020300', '7b25f3c3b2eea18d743ef283140f29ff', + 'fcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-128: I=107'), + ('babbb8b90d0e0f00a4a5a2a3043b3a39', '46c2587d66e5e6fa7f7ca6411ad28047', + '10111213151617181a1b1c1d1f202122', + 'ecb-tbl-128: I=108'), + ('d8d9dadb7f7c7d7a10110e0f787f7e7d', '09470e72229d954ed5ee73886dfeeba9', + '24252627292a2b2c2e2f303133343536', + 'ecb-tbl-128: I=109'), + ('fefffcfdefeced923b3a3d3c6768696a', 'd77c03de92d4d0d79ef8d4824ef365eb', + '38393a3b3d3e3f40424344454748494a', + 'ecb-tbl-128: I=110'), + ('d6d7d4d58a89888f96979899a5a2a3a0', '1d190219f290e0f1715d152d41a23593', + '4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-128: I=111'), + ('18191a1ba8abaaa5303136379b848586', 'a2cd332ce3a0818769616292e87f757b', + '60616263656667686a6b6c6d6f707172', + 'ecb-tbl-128: I=112'), + ('6b6a6968a4a7a6a1d6d72829b0b7b6b5', 'd54afa6ce60fbf9341a3690e21385102', + '74757677797a7b7c7e7f808183848586', + 'ecb-tbl-128: I=113'), + ('000102038a89889755545352a6a9a8ab', '06e5c364ded628a3f5e05e613e356f46', + '88898a8b8d8e8f90929394959798999a', + 'ecb-tbl-128: I=114'), + ('2d2c2f2eb3b0b1b6b6b7b8b9f2f5f4f7', 'eae63c0e62556dac85d221099896355a', + '9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-128: I=115'), + ('979695943536373856575051e09f9e9d', '1fed060e2c6fc93ee764403a889985a2', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2', + 'ecb-tbl-128: I=116'), + ('a4a5a6a7989b9a9db1b0afae7a7d7c7f', 'c25235c1a30fdec1c7cb5c5737b2a588', + 'c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-128: I=117'), + ('c1c0c3c2686b6a55a8a9aeafeae5e4e7', '796dbef95147d4d30873ad8b7b92efc0', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9ea', + 'ecb-tbl-128: I=118'), + ('c1c0c3c2141716118c8d828364636261', 'cbcf0fb34d98d0bd5c22ce37211a46bf', + 'ecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-128: I=119'), + ('93929190cccfcec196979091e0fffefd', '94b44da6466126cafa7c7fd09063fc24', + '00010203050607080a0b0c0d0f101112', + 'ecb-tbl-128: I=120'), + ('b4b5b6b7f9fafbfc25241b1a6e69686b', 'd78c5b5ebf9b4dbda6ae506c5074c8fe', + '14151617191a1b1c1e1f202123242526', + 'ecb-tbl-128: I=121'), + ('868784850704051ac7c6c1c08788898a', '6c27444c27204b043812cf8cf95f9769', + '28292a2b2d2e2f30323334353738393a', + 'ecb-tbl-128: I=122'), + ('f4f5f6f7aaa9a8affdfcf3f277707172', 'be94524ee5a2aa50bba8b75f4c0aebcf', + '3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-128: I=123'), + ('d3d2d1d00605040bc3c2c5c43e010003', 'a0aeaae91ba9f31f51aeb3588cf3a39e', + '50515253555657585a5b5c5d5f606162', + 'ecb-tbl-128: I=124'), + ('73727170424140476a6b74750d0a0b08', '275297779c28266ef9fe4c6a13c08488', + '64656667696a6b6c6e6f707173747576', + 'ecb-tbl-128: I=125'), + ('c2c3c0c10a0908f754555253a1aeafac', '86523d92bb8672cb01cf4a77fd725882', + '78797a7b7d7e7f80828384858788898a', + 'ecb-tbl-128: I=126'), + ('6d6c6f6ef8fbfafd82838c8df8fffefd', '4b8327640e9f33322a04dd96fcbf9a36', + '8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-128: I=127'), + ('f5f4f7f684878689a6a7a0a1d2cdcccf', 'ce52af650d088ca559425223f4d32694', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2', + 'ecb-tbl-128: I=128'), + + # ecb_tbl.txt, KEYSIZE=192 + ('2d33eef2c0430a8a9ebf45e809c40bb6', 'dff4945e0336df4c1c56bc700eff837f', + '00010203050607080a0b0c0d0f10111214151617191a1b1c', + 'ecb-tbl-192: I=1'), + ('6aa375d1fa155a61fb72353e0a5a8756', 'b6fddef4752765e347d5d2dc196d1252', + '1e1f20212324252628292a2b2d2e2f30323334353738393a', + 'ecb-tbl-192: I=2'), + ('bc3736518b9490dcb8ed60eb26758ed4', 'd23684e3d963b3afcf1a114aca90cbd6', + '3c3d3e3f41424344464748494b4c4d4e5051525355565758', + 'ecb-tbl-192: I=3'), + ('aa214402b46cffb9f761ec11263a311e', '3a7ac027753e2a18c2ceab9e17c11fd0', + '5a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-192: I=4'), + ('02aea86e572eeab66b2c3af5e9a46fd6', '8f6786bd007528ba26603c1601cdd0d8', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394', + 'ecb-tbl-192: I=5'), + ('e2aef6acc33b965c4fa1f91c75ff6f36', 'd17d073b01e71502e28b47ab551168b3', + '969798999b9c9d9ea0a1a2a3a5a6a7a8aaabacadafb0b1b2', + 'ecb-tbl-192: I=6'), + ('0659df46427162b9434865dd9499f91d', 'a469da517119fab95876f41d06d40ffa', + 'b4b5b6b7b9babbbcbebfc0c1c3c4c5c6c8c9cacbcdcecfd0', + 'ecb-tbl-192: I=7'), + ('49a44239c748feb456f59c276a5658df', '6091aa3b695c11f5c0b6ad26d3d862ff', + 'd2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-192: I=8'), + ('66208f6e9d04525bdedb2733b6a6be37', '70f9e67f9f8df1294131662dc6e69364', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c', + 'ecb-tbl-192: I=9'), + ('3393f8dfc729c97f5480b950bc9666b0', 'd154dcafad8b207fa5cbc95e9996b559', + '0e0f10111314151618191a1b1d1e1f20222324252728292a', + 'ecb-tbl-192: I=10'), + ('606834c8ce063f3234cf1145325dbd71', '4934d541e8b46fa339c805a7aeb9e5da', + '2c2d2e2f31323334363738393b3c3d3e4041424345464748', + 'ecb-tbl-192: I=11'), + ('fec1c04f529bbd17d8cecfcc4718b17f', '62564c738f3efe186e1a127a0c4d3c61', + '4a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-192: I=12'), + ('32df99b431ed5dc5acf8caf6dc6ce475', '07805aa043986eb23693e23bef8f3438', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384', + 'ecb-tbl-192: I=13'), + ('7fdc2b746f3f665296943b83710d1f82', 'df0b4931038bade848dee3b4b85aa44b', + '868788898b8c8d8e90919293959697989a9b9c9d9fa0a1a2', + 'ecb-tbl-192: I=14'), + ('8fba1510a3c5b87e2eaa3f7a91455ca2', '592d5fded76582e4143c65099309477c', + 'a4a5a6a7a9aaabacaeafb0b1b3b4b5b6b8b9babbbdbebfc0', + 'ecb-tbl-192: I=15'), + ('2c9b468b1c2eed92578d41b0716b223b', 'c9b8d6545580d3dfbcdd09b954ed4e92', + 'c2c3c4c5c7c8c9cacccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-192: I=16'), + ('0a2bbf0efc6bc0034f8a03433fca1b1a', '5dccd5d6eb7c1b42acb008201df707a0', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2f4f5f6f7f9fafbfc', + 'ecb-tbl-192: I=17'), + ('25260e1f31f4104d387222e70632504b', 'a2a91682ffeb6ed1d34340946829e6f9', + 'fefe01010304050608090a0b0d0e0f10121314151718191a', + 'ecb-tbl-192: I=18'), + ('c527d25a49f08a5228d338642ae65137', 'e45d185b797000348d9267960a68435d', + '1c1d1e1f21222324262728292b2c2d2e3031323335363738', + 'ecb-tbl-192: I=19'), + ('3b49fc081432f5890d0e3d87e884a69e', '45e060dae5901cda8089e10d4f4c246b', + '3a3b3c3d3f40414244454647494a4b4c4e4f505153545556', + 'ecb-tbl-192: I=20'), + ('d173f9ed1e57597e166931df2754a083', 'f6951afacc0079a369c71fdcff45df50', + '58595a5b5d5e5f60626364656768696a6c6d6e6f71727374', + 'ecb-tbl-192: I=21'), + ('8c2b7cafa5afe7f13562daeae1adede0', '9e95e00f351d5b3ac3d0e22e626ddad6', + '767778797b7c7d7e80818283858687888a8b8c8d8f909192', + 'ecb-tbl-192: I=22'), + ('aaf4ec8c1a815aeb826cab741339532c', '9cb566ff26d92dad083b51fdc18c173c', + '94959697999a9b9c9e9fa0a1a3a4a5a6a8a9aaabadaeafb0', + 'ecb-tbl-192: I=23'), + ('40be8c5d9108e663f38f1a2395279ecf', 'c9c82766176a9b228eb9a974a010b4fb', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2e4e5e6e7e9eaebec', + 'ecb-tbl-192: I=24'), + ('0c8ad9bc32d43e04716753aa4cfbe351', 'd8e26aa02945881d5137f1c1e1386e88', + '2a2b2c2d2f30313234353637393a3b3c3e3f404143444546', + 'ecb-tbl-192: I=25'), + ('1407b1d5f87d63357c8dc7ebbaebbfee', 'c0e024ccd68ff5ffa4d139c355a77c55', + '48494a4b4d4e4f50525354555758595a5c5d5e5f61626364', + 'ecb-tbl-192: I=26'), + ('e62734d1ae3378c4549e939e6f123416', '0b18b3d16f491619da338640df391d43', + '84858687898a8b8c8e8f90919394959698999a9b9d9e9fa0', + 'ecb-tbl-192: I=27'), + ('5a752cff2a176db1a1de77f2d2cdee41', 'dbe09ac8f66027bf20cb6e434f252efc', + 'a2a3a4a5a7a8a9aaacadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-192: I=28'), + ('a9c8c3a4eabedc80c64730ddd018cd88', '6d04e5e43c5b9cbe05feb9606b6480fe', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2d4d5d6d7d9dadbdc', + 'ecb-tbl-192: I=29'), + ('ee9b3dbbdb86180072130834d305999a', 'dd1d6553b96be526d9fee0fbd7176866', + '1a1b1c1d1f20212224252627292a2b2c2e2f303133343536', + 'ecb-tbl-192: I=30'), + ('a7fa8c3586b8ebde7568ead6f634a879', '0260ca7e3f979fd015b0dd4690e16d2a', + '38393a3b3d3e3f40424344454748494a4c4d4e4f51525354', + 'ecb-tbl-192: I=31'), + ('37e0f4a87f127d45ac936fe7ad88c10a', '9893734de10edcc8a67c3b110b8b8cc6', + '929394959798999a9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-192: I=32'), + ('3f77d8b5d92bac148e4e46f697a535c5', '93b30b750516b2d18808d710c2ee84ef', + '464748494b4c4d4e50515253555657585a5b5c5d5f606162', + 'ecb-tbl-192: I=33'), + ('d25ebb686c40f7e2c4da1014936571ca', '16f65fa47be3cb5e6dfe7c6c37016c0e', + '828384858788898a8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-192: I=34'), + ('4f1c769d1e5b0552c7eca84dea26a549', 'f3847210d5391e2360608e5acb560581', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbc', + 'ecb-tbl-192: I=35'), + ('8548e2f882d7584d0fafc54372b6633a', '8754462cd223366d0753913e6af2643d', + 'bebfc0c1c3c4c5c6c8c9cacbcdcecfd0d2d3d4d5d7d8d9da', + 'ecb-tbl-192: I=36'), + ('87d7a336cb476f177cd2a51af2a62cdf', '1ea20617468d1b806a1fd58145462017', + 'dcdddedfe1e2e3e4e6e7e8e9ebecedeef0f1f2f3f5f6f7f8', + 'ecb-tbl-192: I=37'), + ('03b1feac668c4e485c1065dfc22b44ee', '3b155d927355d737c6be9dda60136e2e', + 'fafbfcfdfe01000204050607090a0b0c0e0f101113141516', + 'ecb-tbl-192: I=38'), + ('bda15e66819fa72d653a6866aa287962', '26144f7b66daa91b6333dbd3850502b3', + '18191a1b1d1e1f20222324252728292a2c2d2e2f31323334', + 'ecb-tbl-192: I=39'), + ('4d0c7a0d2505b80bf8b62ceb12467f0a', 'e4f9a4ab52ced8134c649bf319ebcc90', + '363738393b3c3d3e40414243454647484a4b4c4d4f505152', + 'ecb-tbl-192: I=40'), + ('626d34c9429b37211330986466b94e5f', 'b9ddd29ac6128a6cab121e34a4c62b36', + '54555657595a5b5c5e5f60616364656668696a6b6d6e6f70', + 'ecb-tbl-192: I=41'), + ('333c3e6bf00656b088a17e5ff0e7f60a', '6fcddad898f2ce4eff51294f5eaaf5c9', + '727374757778797a7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-192: I=42'), + ('687ed0cdc0d2a2bc8c466d05ef9d2891', 'c9a6fe2bf4028080bea6f7fc417bd7e3', + '90919293959697989a9b9c9d9fa0a1a2a4a5a6a7a9aaabac', + 'ecb-tbl-192: I=43'), + ('487830e78cc56c1693e64b2a6660c7b6', '6a2026846d8609d60f298a9c0673127f', + 'aeafb0b1b3b4b5b6b8b9babbbdbebfc0c2c3c4c5c7c8c9ca', + 'ecb-tbl-192: I=44'), + ('7a48d6b7b52b29392aa2072a32b66160', '2cb25c005e26efea44336c4c97a4240b', + 'cccdcecfd1d2d3d4d6d7d8d9dbdcdddee0e1e2e3e5e6e7e8', + 'ecb-tbl-192: I=45'), + ('907320e64c8c5314d10f8d7a11c8618d', '496967ab8680ddd73d09a0e4c7dcc8aa', + 'eaebecedeff0f1f2f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-192: I=46'), + ('b561f2ca2d6e65a4a98341f3ed9ff533', 'd5af94de93487d1f3a8c577cb84a66a4', + '08090a0b0d0e0f10121314151718191a1c1d1e1f21222324', + 'ecb-tbl-192: I=47'), + ('df769380d212792d026f049e2e3e48ef', '84bdac569cae2828705f267cc8376e90', + '262728292b2c2d2e30313233353637383a3b3c3d3f404142', + 'ecb-tbl-192: I=48'), + ('79f374bc445bdabf8fccb8843d6054c6', 'f7401dda5ad5ab712b7eb5d10c6f99b6', + '44454647494a4b4c4e4f50515354555658595a5b5d5e5f60', + 'ecb-tbl-192: I=49'), + ('4e02f1242fa56b05c68dbae8fe44c9d6', '1c9d54318539ebd4c3b5b7e37bf119f0', + '626364656768696a6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-192: I=50'), + ('cf73c93cbff57ac635a6f4ad2a4a1545', 'aca572d65fb2764cffd4a6eca090ea0d', + '80818283858687888a8b8c8d8f90919294959697999a9b9c', + 'ecb-tbl-192: I=51'), + ('9923548e2875750725b886566784c625', '36d9c627b8c2a886a10ccb36eae3dfbb', + '9e9fa0a1a3a4a5a6a8a9aaabadaeafb0b2b3b4b5b7b8b9ba', + 'ecb-tbl-192: I=52'), + ('4888336b723a022c9545320f836a4207', '010edbf5981e143a81d646e597a4a568', + 'bcbdbebfc1c2c3c4c6c7c8c9cbcccdced0d1d2d3d5d6d7d8', + 'ecb-tbl-192: I=53'), + ('f84d9a5561b0608b1160dee000c41ba8', '8db44d538dc20cc2f40f3067fd298e60', + 'dadbdcdddfe0e1e2e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-192: I=54'), + ('c23192a0418e30a19b45ae3e3625bf22', '930eb53bc71e6ac4b82972bdcd5aafb3', + 'f8f9fafbfdfefe00020304050708090a0c0d0e0f11121314', + 'ecb-tbl-192: I=55'), + ('b84e0690b28b0025381ad82a15e501a7', '6c42a81edcbc9517ccd89c30c95597b4', + '161718191b1c1d1e20212223252627282a2b2c2d2f303132', + 'ecb-tbl-192: I=56'), + ('acef5e5c108876c4f06269f865b8f0b0', 'da389847ad06df19d76ee119c71e1dd3', + '34353637393a3b3c3e3f40414344454648494a4b4d4e4f50', + 'ecb-tbl-192: I=57'), + ('0f1b3603e0f5ddea4548246153a5e064', 'e018fdae13d3118f9a5d1a647a3f0462', + '525354555758595a5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-192: I=58'), + ('fbb63893450d42b58c6d88cd3c1809e3', '2aa65db36264239d3846180fabdfad20', + '70717273757677787a7b7c7d7f80818284858687898a8b8c', + 'ecb-tbl-192: I=59'), + ('4bef736df150259dae0c91354e8a5f92', '1472163e9a4f780f1ceb44b07ecf4fdb', + '8e8f90919394959698999a9b9d9e9fa0a2a3a4a5a7a8a9aa', + 'ecb-tbl-192: I=60'), + ('7d2d46242056ef13d3c3fc93c128f4c7', 'c8273fdc8f3a9f72e91097614b62397c', + 'acadaeafb1b2b3b4b6b7b8b9bbbcbdbec0c1c2c3c5c6c7c8', + 'ecb-tbl-192: I=61'), + ('e9c1ba2df415657a256edb33934680fd', '66c8427dcd733aaf7b3470cb7d976e3f', + 'cacbcccdcfd0d1d2d4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-192: I=62'), + ('e23ee277b0aa0a1dfb81f7527c3514f1', '146131cb17f1424d4f8da91e6f80c1d0', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fafcfdfeff01020304', + 'ecb-tbl-192: I=63'), + ('3e7445b0b63caaf75e4a911e12106b4c', '2610d0ad83659081ae085266a88770dc', + '060708090b0c0d0e10111213151617181a1b1c1d1f202122', + 'ecb-tbl-192: I=64'), + ('767774752023222544455a5be6e1e0e3', '38a2b5a974b0575c5d733917fb0d4570', + '24252627292a2b2c2e2f30313334353638393a3b3d3e3f40', + 'ecb-tbl-192: I=65'), + ('72737475717e7f7ce9e8ebea696a6b6c', 'e21d401ebc60de20d6c486e4f39a588b', + '424344454748494a4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-192: I=66'), + ('dfdedddc25262728c9c8cfcef1eeefec', 'e51d5f88c670b079c0ca1f0c2c4405a2', + '60616263656667686a6b6c6d6f70717274757677797a7b7c', + 'ecb-tbl-192: I=67'), + ('fffe0100707776755f5e5d5c7675746b', '246a94788a642fb3d1b823c8762380c8', + '7e7f80818384858688898a8b8d8e8f90929394959798999a', + 'ecb-tbl-192: I=68'), + ('e0e1e2e3424140479f9e9190292e2f2c', 'b80c391c5c41a4c3b30c68e0e3d7550f', + '9c9d9e9fa1a2a3a4a6a7a8a9abacadaeb0b1b2b3b5b6b7b8', + 'ecb-tbl-192: I=69'), + ('2120272690efeeed3b3a39384e4d4c4b', 'b77c4754fc64eb9a1154a9af0bb1f21c', + 'babbbcbdbfc0c1c2c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-192: I=70'), + ('ecedeeef5350516ea1a0a7a6a3acadae', 'fb554de520d159a06bf219fc7f34a02f', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9eaecedeeeff1f2f3f4', + 'ecb-tbl-192: I=71'), + ('32333c3d25222320e9e8ebeacecdccc3', 'a89fba152d76b4927beed160ddb76c57', + 'f6f7f8f9fbfcfdfe00010203050607080a0b0c0d0f101112', + 'ecb-tbl-192: I=72'), + ('40414243626160678a8bb4b511161714', '5676eab4a98d2e8473b3f3d46424247c', + '14151617191a1b1c1e1f20212324252628292a2b2d2e2f30', + 'ecb-tbl-192: I=73'), + ('94959293f5fafbf81f1e1d1c7c7f7e79', '4e8f068bd7ede52a639036ec86c33568', + '323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-192: I=74'), + ('bebfbcbd191a1b14cfcec9c8546b6a69', 'f0193c4d7aff1791ee4c07eb4a1824fc', + '50515253555657585a5b5c5d5f60616264656667696a6b6c', + 'ecb-tbl-192: I=75'), + ('2c2d3233898e8f8cbbbab9b8333031ce', 'ac8686eeca9ba761afe82d67b928c33f', + '6e6f70717374757678797a7b7d7e7f80828384858788898a', + 'ecb-tbl-192: I=76'), + ('84858687bfbcbdba37363938fdfafbf8', '5faf8573e33b145b6a369cd3606ab2c9', + '8c8d8e8f91929394969798999b9c9d9ea0a1a2a3a5a6a7a8', + 'ecb-tbl-192: I=77'), + ('828384857669686b909192930b08090e', '31587e9944ab1c16b844ecad0df2e7da', + 'aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-192: I=78'), + ('bebfbcbd9695948b707176779e919093', 'd017fecd91148aba37f6f3068aa67d8a', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4', + 'ecb-tbl-192: I=79'), + ('8b8a85846067666521202322d0d3d2dd', '788ef2f021a73cba2794b616078a8500', + 'e6e7e8e9ebecedeef0f1f2f3f5f6f7f8fafbfcfdfe010002', + 'ecb-tbl-192: I=80'), + ('76777475f1f2f3f4f8f9e6e777707172', '5d1ef20dced6bcbc12131ac7c54788aa', + '04050607090a0b0c0e0f10111314151618191a1b1d1e1f20', + 'ecb-tbl-192: I=81'), + ('a4a5a2a34f404142b4b5b6b727242522', 'b3c8cf961faf9ea05fdde6d1e4d8f663', + '222324252728292a2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-192: I=82'), + ('94959697e1e2e3ec16171011839c9d9e', '143075c70605861c7fac6526199e459f', + '40414243454647484a4b4c4d4f50515254555657595a5b5c', + 'ecb-tbl-192: I=83'), + ('03023d3c06010003dedfdcddfffcfde2', 'a5ae12eade9a87268d898bfc8fc0252a', + '5e5f60616364656668696a6b6d6e6f70727374757778797a', + 'ecb-tbl-192: I=84'), + ('10111213f1f2f3f4cecfc0c1dbdcddde', '0924f7cf2e877a4819f5244a360dcea9', + '7c7d7e7f81828384868788898b8c8d8e9091929395969798', + 'ecb-tbl-192: I=85'), + ('67666160724d4c4f1d1c1f1e73707176', '3d9e9635afcc3e291cc7ab3f27d1c99a', + '9a9b9c9d9fa0a1a2a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-192: I=86'), + ('e6e7e4e5a8abaad584858283909f9e9d', '9d80feebf87510e2b8fb98bb54fd788c', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9cacccdcecfd1d2d3d4', + 'ecb-tbl-192: I=87'), + ('71707f7e565150537d7c7f7e6162636c', '5f9d1a082a1a37985f174002eca01309', + 'd6d7d8d9dbdcdddee0e1e2e3e5e6e7e8eaebecedeff0f1f2', + 'ecb-tbl-192: I=88'), + ('64656667212223245555aaaa03040506', 'a390ebb1d1403930184a44b4876646e4', + 'f4f5f6f7f9fafbfcfefe01010304050608090a0b0d0e0f10', + 'ecb-tbl-192: I=89'), + ('9e9f9899aba4a5a6cfcecdcc2b28292e', '700fe918981c3195bb6c4bcb46b74e29', + '121314151718191a1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-192: I=90'), + ('c7c6c5c4d1d2d3dc626364653a454447', '907984406f7bf2d17fb1eb15b673d747', + '30313233353637383a3b3c3d3f40414244454647494a4b4c', + 'ecb-tbl-192: I=91'), + ('f6f7e8e9e0e7e6e51d1c1f1e5b585966', 'c32a956dcfc875c2ac7c7cc8b8cc26e1', + '4e4f50515354555658595a5b5d5e5f60626364656768696a', + 'ecb-tbl-192: I=92'), + ('bcbdbebf5d5e5f5868696667f4f3f2f1', '02646e2ebfa9b820cf8424e9b9b6eb51', + '6c6d6e6f71727374767778797b7c7d7e8081828385868788', + 'ecb-tbl-192: I=93'), + ('40414647b0afaead9b9a99989b98999e', '621fda3a5bbd54c6d3c685816bd4ead8', + '8a8b8c8d8f90919294959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-192: I=94'), + ('69686b6a0201001f0f0e0908b4bbbab9', 'd4e216040426dfaf18b152469bc5ac2f', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9babcbdbebfc1c2c3c4', + 'ecb-tbl-192: I=95'), + ('c7c6c9c8d8dfdedd5a5b5859bebdbcb3', '9d0635b9d33b6cdbd71f5d246ea17cc8', + 'c6c7c8c9cbcccdced0d1d2d3d5d6d7d8dadbdcdddfe0e1e2', + 'ecb-tbl-192: I=96'), + ('dedfdcdd787b7a7dfffee1e0b2b5b4b7', '10abad1bd9bae5448808765583a2cc1a', + 'e4e5e6e7e9eaebeceeeff0f1f3f4f5f6f8f9fafbfdfefe00', + 'ecb-tbl-192: I=97'), + ('4d4c4b4a606f6e6dd0d1d2d3fbf8f9fe', '6891889e16544e355ff65a793c39c9a8', + '020304050708090a0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-192: I=98'), + ('b7b6b5b4d7d4d5dae5e4e3e2e1fefffc', 'cc735582e68072c163cd9ddf46b91279', + '20212223252627282a2b2c2d2f30313234353637393a3b3c', + 'ecb-tbl-192: I=99'), + ('cecfb0b1f7f0f1f2aeafacad3e3d3c23', 'c5c68b9aeeb7f878df578efa562f9574', + '3e3f40414344454648494a4b4d4e4f50525354555758595a', + 'ecb-tbl-192: I=100'), + ('cacbc8c9cdcecfc812131c1d494e4f4c', '5f4764395a667a47d73452955d0d2ce8', + '5c5d5e5f61626364666768696b6c6d6e7071727375767778', + 'ecb-tbl-192: I=101'), + ('9d9c9b9ad22d2c2fb1b0b3b20c0f0e09', '701448331f66106cefddf1eb8267c357', + '7a7b7c7d7f80818284858687898a8b8c8e8f909193949596', + 'ecb-tbl-192: I=102'), + ('7a7b787964676659959493924f404142', 'cb3ee56d2e14b4e1941666f13379d657', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aaacadaeafb1b2b3b4', + 'ecb-tbl-192: I=103'), + ('aaaba4a5cec9c8cb1f1e1d1caba8a9a6', '9fe16efd18ab6e1981191851fedb0764', + 'b6b7b8b9bbbcbdbec0c1c2c3c5c6c7c8cacbcccdcfd0d1d2', + 'ecb-tbl-192: I=104'), + ('93929190282b2a2dc4c5fafb92959497', '3dc9ba24e1b223589b147adceb4c8e48', + 'd4d5d6d7d9dadbdcdedfe0e1e3e4e5e6e8e9eaebedeeeff0', + 'ecb-tbl-192: I=105'), + ('efeee9e8ded1d0d339383b3a888b8a8d', '1c333032682e7d4de5e5afc05c3e483c', + 'f2f3f4f5f7f8f9fafcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-192: I=106'), + ('7f7e7d7ca2a1a0af78797e7f112e2f2c', 'd593cc99a95afef7e92038e05a59d00a', + '10111213151617181a1b1c1d1f20212224252627292a2b2c', + 'ecb-tbl-192: I=107'), + ('84859a9b2b2c2d2e868784852625245b', '51e7f96f53b4353923452c222134e1ec', + '2e2f30313334353638393a3b3d3e3f40424344454748494a', + 'ecb-tbl-192: I=108'), + ('b0b1b2b3070405026869666710171615', '4075b357a1a2b473400c3b25f32f81a4', + '4c4d4e4f51525354565758595b5c5d5e6061626365666768', + 'ecb-tbl-192: I=109'), + ('acadaaabbda2a3a00d0c0f0e595a5b5c', '302e341a3ebcd74f0d55f61714570284', + '6a6b6c6d6f70717274757677797a7b7c7e7f808183848586', + 'ecb-tbl-192: I=110'), + ('121310115655544b5253545569666764', '57abdd8231280da01c5042b78cf76522', + '88898a8b8d8e8f90929394959798999a9c9d9e9fa1a2a3a4', + 'ecb-tbl-192: I=111'), + ('dedfd0d166616063eaebe8e94142434c', '17f9ea7eea17ac1adf0e190fef799e92', + 'a6a7a8a9abacadaeb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2', + 'ecb-tbl-192: I=112'), + ('dbdad9d81417161166677879e0e7e6e5', '2e1bdd563dd87ee5c338dd6d098d0a7a', + 'c4c5c6c7c9cacbcccecfd0d1d3d4d5d6d8d9dadbdddedfe0', + 'ecb-tbl-192: I=113'), + ('6a6b6c6de0efeeed2b2a2928c0c3c2c5', 'eb869996e6f8bfb2bfdd9e0c4504dbb2', + 'e2e3e4e5e7e8e9eaecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-192: I=114'), + ('b1b0b3b21714151a1a1b1c1d5649484b', 'c2e01549e9decf317468b3e018c61ba8', + '00010203050607080a0b0c0d0f10111214151617191a1b1c', + 'ecb-tbl-192: I=115'), + ('39380706a3a4a5a6c4c5c6c77271706f', '8da875d033c01dd463b244a1770f4a22', + '1e1f20212324252628292a2b2d2e2f30323334353738393a', + 'ecb-tbl-192: I=116'), + ('5c5d5e5f1013121539383736e2e5e4e7', '8ba0dcf3a186844f026d022f8839d696', + '3c3d3e3f41424344464748494b4c4d4e5051525355565758', + 'ecb-tbl-192: I=117'), + ('43424544ead5d4d72e2f2c2d64676661', 'e9691ff9a6cc6970e51670a0fd5b88c1', + '5a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-192: I=118'), + ('55545756989b9a65f8f9feff18171615', 'f2baec06faeed30f88ee63ba081a6e5b', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394', + 'ecb-tbl-192: I=119'), + ('05040b0a525554573c3d3e3f4a494847', '9c39d4c459ae5753394d6094adc21e78', + '969798999b9c9d9ea0a1a2a3a5a6a7a8aaabacadafb0b1b2', + 'ecb-tbl-192: I=120'), + ('14151617595a5b5c8584fbfa8e89888b', '6345b532a11904502ea43ba99c6bd2b2', + 'b4b5b6b7b9babbbcbebfc0c1c3c4c5c6c8c9cacbcdcecfd0', + 'ecb-tbl-192: I=121'), + ('7c7d7a7bfdf2f3f029282b2a51525354', '5ffae3061a95172e4070cedce1e428c8', + 'd2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-192: I=122'), + ('38393a3b1e1d1c1341404746c23d3c3e', '0a4566be4cdf9adce5dec865b5ab34cd', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c', + 'ecb-tbl-192: I=123'), + ('8d8c939240474645818083827c7f7e41', 'ca17fcce79b7404f2559b22928f126fb', + '0e0f10111314151618191a1b1d1e1f20222324252728292a', + 'ecb-tbl-192: I=124'), + ('3b3a39381a19181f32333c3d45424340', '97ca39b849ed73a6470a97c821d82f58', + '2c2d2e2f31323334363738393b3c3d3e4041424345464748', + 'ecb-tbl-192: I=125'), + ('f0f1f6f738272625828380817f7c7d7a', '8198cb06bc684c6d3e9b7989428dcf7a', + '4a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-192: I=126'), + ('89888b8a0407061966676061141b1a19', 'f53c464c705ee0f28d9a4c59374928bd', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384', + 'ecb-tbl-192: I=127'), + ('d3d2dddcaaadacaf9c9d9e9fe8ebeae5', '9adb3d4cca559bb98c3e2ed73dbf1154', + '868788898b8c8d8e90919293959697989a9b9c9d9fa0a1a2', + 'ecb-tbl-192: I=128'), + + # ecb_tbl.txt, KEYSIZE=256 + ('834eadfccac7e1b30664b1aba44815ab', '1946dabf6a03a2a2c3d0b05080aed6fc', + '00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526', + 'ecb-tbl-256: I=1'), + ('d9dc4dba3021b05d67c0518f72b62bf1', '5ed301d747d3cc715445ebdec62f2fb4', + '28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-256: I=2'), + ('a291d86301a4a739f7392173aa3c604c', '6585c8f43d13a6beab6419fc5935b9d0', + '50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-256: I=3'), + ('4264b2696498de4df79788a9f83e9390', '2a5b56a596680fcc0e05f5e0f151ecae', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-256: I=4'), + ('ee9932b3721804d5a83ef5949245b6f6', 'f5d6ff414fd2c6181494d20c37f2b8c4', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-256: I=5'), + ('e6248f55c5fdcbca9cbbb01c88a2ea77', '85399c01f59fffb5204f19f8482f00b8', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-256: I=6'), + ('b8358e41b9dff65fd461d55a99266247', '92097b4c88a041ddf98144bc8d22e8e7', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516', + 'ecb-tbl-256: I=7'), + ('f0e2d72260af58e21e015ab3a4c0d906', '89bd5b73b356ab412aef9f76cea2d65c', + '18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-256: I=8'), + ('475b8b823ce8893db3c44a9f2a379ff7', '2536969093c55ff9454692f2fac2f530', + '40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-256: I=9'), + ('688f5281945812862f5f3076cf80412f', '07fc76a872843f3f6e0081ee9396d637', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-256: I=10'), + ('08d1d2bc750af553365d35e75afaceaa', 'e38ba8ec2aa741358dcc93e8f141c491', + '90919293959697989a9b9c9d9fa0a1a2a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-256: I=11'), + ('8707121f47cc3efceca5f9a8474950a1', 'd028ee23e4a89075d0b03e868d7d3a42', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9cacccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-256: I=12'), + ('e51aa0b135dba566939c3b6359a980c5', '8cd9423dfc459e547155c5d1d522e540', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-256: I=13'), + ('069a007fc76a459f98baf917fedf9521', '080e9517eb1677719acf728086040ae3', + '08090a0b0d0e0f10121314151718191a1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-256: I=14'), + ('726165c1723fbcf6c026d7d00b091027', '7c1700211a3991fc0ecded0ab3e576b0', + '30313233353637383a3b3c3d3f40414244454647494a4b4c4e4f505153545556', + 'ecb-tbl-256: I=15'), + ('d7c544de91d55cfcde1f84ca382200ce', 'dabcbcc855839251db51e224fbe87435', + '58595a5b5d5e5f60626364656768696a6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-256: I=16'), + ('fed3c9a161b9b5b2bd611b41dc9da357', '68d56fad0406947a4dd27a7448c10f1d', + '80818283858687888a8b8c8d8f90919294959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-256: I=17'), + ('4f634cdc6551043409f30b635832cf82', 'da9a11479844d1ffee24bbf3719a9925', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9babcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-256: I=18'), + ('109ce98db0dfb36734d9f3394711b4e6', '5e4ba572f8d23e738da9b05ba24b8d81', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-256: I=19'), + ('4ea6dfaba2d8a02ffdffa89835987242', 'a115a2065d667e3f0b883837a6e903f8', + '70717273757677787a7b7c7d7f80818284858687898a8b8c8e8f909193949596', + 'ecb-tbl-256: I=20'), + ('5ae094f54af58e6e3cdbf976dac6d9ef', '3e9e90dc33eac2437d86ad30b137e66e', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aaacadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-256: I=21'), + ('764d8e8e0f29926dbe5122e66354fdbe', '01ce82d8fbcdae824cb3c48e495c3692', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2d4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-256: I=22'), + ('3f0418f888cdf29a982bf6b75410d6a9', '0c9cff163ce936faaf083cfd3dea3117', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fafcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-256: I=23'), + ('e4a3e7cb12cdd56aa4a75197a9530220', '5131ba9bd48f2bba85560680df504b52', + '10111213151617181a1b1c1d1f20212224252627292a2b2c2e2f303133343536', + 'ecb-tbl-256: I=24'), + ('211677684aac1ec1a160f44c4ebf3f26', '9dc503bbf09823aec8a977a5ad26ccb2', + '38393a3b3d3e3f40424344454748494a4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-256: I=25'), + ('d21e439ff749ac8f18d6d4b105e03895', '9a6db0c0862e506a9e397225884041d7', + '60616263656667686a6b6c6d6f70717274757677797a7b7c7e7f808183848586', + 'ecb-tbl-256: I=26'), + ('d9f6ff44646c4725bd4c0103ff5552a7', '430bf9570804185e1ab6365fc6a6860c', + '88898a8b8d8e8f90929394959798999a9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-256: I=27'), + ('0b1256c2a00b976250cfc5b0c37ed382', '3525ebc02f4886e6a5a3762813e8ce8a', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-256: I=28'), + ('b056447ffc6dc4523a36cc2e972a3a79', '07fa265c763779cce224c7bad671027b', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9eaecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-256: I=29'), + ('5e25ca78f0de55802524d38da3fe4456', 'e8b72b4e8be243438c9fff1f0e205872', + '00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526', + 'ecb-tbl-256: I=30'), + ('a5bcf4728fa5eaad8567c0dc24675f83', '109d4f999a0e11ace1f05e6b22cbcb50', + '28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-256: I=31'), + ('814e59f97ed84646b78b2ca022e9ca43', '45a5e8d4c3ed58403ff08d68a0cc4029', + '50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-256: I=32'), + ('15478beec58f4775c7a7f5d4395514d7', '196865964db3d417b6bd4d586bcb7634', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-256: I=33'), + ('253548ffca461c67c8cbc78cd59f4756', '60436ad45ac7d30d99195f815d98d2ae', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-256: I=34'), + ('fd7ad8d73b9b0f8cc41600640f503d65', 'bb07a23f0b61014b197620c185e2cd75', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-256: I=35'), + ('06199de52c6cbf8af954cd65830bcd56', '5bc0b2850129c854423aff0751fe343b', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516', + 'ecb-tbl-256: I=36'), + ('f17c4ffe48e44c61bd891e257e725794', '7541a78f96738e6417d2a24bd2beca40', + '18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-256: I=37'), + ('9a5b4a402a3e8a59be6bf5cd8154f029', 'b0a303054412882e464591f1546c5b9e', + '40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-256: I=38'), + ('79bd40b91a7e07dc939d441782ae6b17', '778c06d8a355eeee214fcea14b4e0eef', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-256: I=39'), + ('d8ceaaf8976e5fbe1012d8c84f323799', '09614206d15cbace63227d06db6beebb', + '90919293959697989a9b9c9d9fa0a1a2a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-256: I=40'), + ('3316e2751e2e388b083da23dd6ac3fbe', '41b97fb20e427a9fdbbb358d9262255d', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9cacccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-256: I=41'), + ('8b7cfbe37de7dca793521819242c5816', 'c1940f703d845f957652c2d64abd7adf', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-256: I=42'), + ('f23f033c0eebf8ec55752662fd58ce68', 'd2d44fcdae5332343366db297efcf21b', + '08090a0b0d0e0f10121314151718191a1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-256: I=43'), + ('59eb34f6c8bdbacc5fc6ad73a59a1301', 'ea8196b79dbe167b6aa9896e287eed2b', + '30313233353637383a3b3c3d3f40414244454647494a4b4c4e4f505153545556', + 'ecb-tbl-256: I=44'), + ('dcde8b6bd5cf7cc22d9505e3ce81261a', 'd6b0b0c4ba6c7dbe5ed467a1e3f06c2d', + '58595a5b5d5e5f60626364656768696a6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-256: I=45'), + ('e33cf7e524fed781e7042ff9f4b35dc7', 'ec51eb295250c22c2fb01816fb72bcae', + '80818283858687888a8b8c8d8f90919294959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-256: I=46'), + ('27963c8facdf73062867d164df6d064c', 'aded6630a07ce9c7408a155d3bd0d36f', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9babcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-256: I=47'), + ('77b1ce386b551b995f2f2a1da994eef8', '697c9245b9937f32f5d1c82319f0363a', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-256: I=48'), + ('f083388b013679efcf0bb9b15d52ae5c', 'aad5ad50c6262aaec30541a1b7b5b19c', + 'f8f9fafbfdfefe00020304050708090a0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-256: I=49'), + ('c5009e0dab55db0abdb636f2600290c8', '7d34b893855341ec625bd6875ac18c0d', + '20212223252627282a2b2c2d2f30313234353637393a3b3c3e3f404143444546', + 'ecb-tbl-256: I=50'), + ('7804881e26cd532d8514d3683f00f1b9', '7ef05105440f83862f5d780e88f02b41', + '48494a4b4d4e4f50525354555758595a5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-256: I=51'), + ('46cddcd73d1eb53e675ca012870a92a3', 'c377c06403382061af2c9c93a8e70df6', + '70717273757677787a7b7c7d7f80818284858687898a8b8c8e8f909193949596', + 'ecb-tbl-256: I=52'), + ('a9fb44062bb07fe130a8e8299eacb1ab', '1dbdb3ffdc052dacc83318853abc6de5', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aaacadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-256: I=53'), + ('2b6ff8d7a5cc3a28a22d5a6f221af26b', '69a6eab00432517d0bf483c91c0963c7', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2d4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-256: I=54'), + ('1a9527c29b8add4b0e3e656dbb2af8b4', '0797f41dc217c80446e1d514bd6ab197', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fafcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-256: I=55'), + ('7f99cf2c75244df015eb4b0c1050aeae', '9dfd76575902a637c01343c58e011a03', + '10111213151617181a1b1c1d1f20212224252627292a2b2c2e2f303133343536', + 'ecb-tbl-256: I=56'), + ('e84ff85b0d9454071909c1381646c4ed', 'acf4328ae78f34b9fa9b459747cc2658', + '38393a3b3d3e3f40424344454748494a4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-256: I=57'), + ('89afd40f99521280d5399b12404f6db4', 'b0479aea12bac4fe2384cf98995150c6', + '60616263656667686a6b6c6d6f70717274757677797a7b7c7e7f808183848586', + 'ecb-tbl-256: I=58'), + ('a09ef32dbc5119a35ab7fa38656f0329', '9dd52789efe3ffb99f33b3da5030109a', + '88898a8b8d8e8f90929394959798999a9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-256: I=59'), + ('61773457f068c376c7829b93e696e716', 'abbb755e4621ef8f1214c19f649fb9fd', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-256: I=60'), + ('a34f0cae726cce41dd498747d891b967', 'da27fb8174357bce2bed0e7354f380f9', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9eaecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-256: I=61'), + ('856f59496c7388ee2d2b1a27b7697847', 'c59a0663f0993838f6e5856593bdc5ef', + '00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526', + 'ecb-tbl-256: I=62'), + ('cb090c593ef7720bd95908fb93b49df4', 'ed60b264b5213e831607a99c0ce5e57e', + '28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-256: I=63'), + ('a0ac75cd2f1923d460fc4d457ad95baf', 'e50548746846f3eb77b8c520640884ed', + '50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-256: I=64'), + ('2a2b282974777689e8e9eeef525d5c5f', '28282cc7d21d6a2923641e52d188ef0c', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-256: I=65'), + ('909192939390919e0f0e09089788898a', '0dfa5b02abb18e5a815305216d6d4f8e', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-256: I=66'), + ('777675748d8e8f907170777649464744', '7359635c0eecefe31d673395fb46fb99', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-256: I=67'), + ('717073720605040b2d2c2b2a05fafbf9', '73c679f7d5aef2745c9737bb4c47fb36', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516', + 'ecb-tbl-256: I=68'), + ('64656667fefdfcc31b1a1d1ca5aaaba8', 'b192bd472a4d2eafb786e97458967626', + '18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-256: I=69'), + ('dbdad9d86a696867b5b4b3b2c8d7d6d5', '0ec327f6c8a2b147598ca3fde61dc6a4', + '40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-256: I=70'), + ('5c5d5e5fe3e0e1fe31303736333c3d3e', 'fc418eb3c41b859b38d4b6f646629729', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-256: I=71'), + ('545556574b48494673727574546b6a69', '30249e5ac282b1c981ea64b609f3a154', + '90919293959697989a9b9c9d9fa0a1a2a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-256: I=72'), + ('ecedeeefc6c5c4bb56575051f5fafbf8', '5e6e08646d12150776bb43c2d78a9703', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9cacccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-256: I=73'), + ('464744452724252ac9c8cfced2cdcccf', 'faeb3d5de652cd3447dceb343f30394a', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-256: I=74'), + ('e6e7e4e54142435c878681801c131211', 'a8e88706823f6993ef80d05c1c7b2cf0', + '08090a0b0d0e0f10121314151718191a1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-256: I=75'), + ('72737071cfcccdc2f9f8fffe710e0f0c', '8ced86677e6e00a1a1b15968f2d3cce6', + '30313233353637383a3b3c3d3f40414244454647494a4b4c4e4f505153545556', + 'ecb-tbl-256: I=76'), + ('505152537370714ec3c2c5c4010e0f0c', '9fc7c23858be03bdebb84e90db6786a9', + '58595a5b5d5e5f60626364656768696a6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-256: I=77'), + ('a8a9aaab5c5f5e51aeafa8a93d222320', 'b4fbd65b33f70d8cf7f1111ac4649c36', + '80818283858687888a8b8c8d8f90919294959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-256: I=78'), + ('dedfdcddf6f5f4eb10111617fef1f0f3', 'c5c32d5ed03c4b53cc8c1bd0ef0dbbf6', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9babcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-256: I=79'), + ('bdbcbfbe5e5d5c530b0a0d0cfac5c4c7', 'd1a7f03b773e5c212464b63709c6a891', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-256: I=80'), + ('8a8b8889050606f8f4f5f2f3636c6d6e', '6b7161d8745947ac6950438ea138d028', + 'f8f9fafbfdfefe00020304050708090a0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-256: I=81'), + ('a6a7a4a54d4e4f40b2b3b4b539262724', 'fd47a9f7e366ee7a09bc508b00460661', + '20212223252627282a2b2c2d2f30313234353637393a3b3c3e3f404143444546', + 'ecb-tbl-256: I=82'), + ('9c9d9e9fe9eaebf40e0f08099b949596', '00d40b003dc3a0d9310b659b98c7e416', + '48494a4b4d4e4f50525354555758595a5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-256: I=83'), + ('2d2c2f2e1013121dcccdcacbed121310', 'eea4c79dcc8e2bda691f20ac48be0717', + '70717273757677787a7b7c7d7f80818284858687898a8b8c8e8f909193949596', + 'ecb-tbl-256: I=84'), + ('f4f5f6f7edeeefd0eaebecedf7f8f9fa', 'e78f43b11c204403e5751f89d05a2509', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aaacadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-256: I=85'), + ('3d3c3f3e282b2a2573727574150a0b08', 'd0f0e3d1f1244bb979931e38dd1786ef', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2d4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-256: I=86'), + ('b6b7b4b5f8fbfae5b4b5b2b3a0afaead', '042e639dc4e1e4dde7b75b749ea6f765', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fafcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-256: I=87'), + ('b7b6b5b4989b9a95878681809ba4a5a6', 'bc032fdd0efe29503a980a7d07ab46a8', + '10111213151617181a1b1c1d1f20212224252627292a2b2c2e2f303133343536', + 'ecb-tbl-256: I=88'), + ('a8a9aaabe5e6e798e9e8efee4748494a', '0c93ac949c0da6446effb86183b6c910', + '38393a3b3d3e3f40424344454748494a4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-256: I=89'), + ('ecedeeefd9dadbd4b9b8bfbe657a7b78', 'e0d343e14da75c917b4a5cec4810d7c2', + '60616263656667686a6b6c6d6f70717274757677797a7b7c7e7f808183848586', + 'ecb-tbl-256: I=90'), + ('7f7e7d7c696a6b74cacbcccd929d9c9f', '0eafb821748408279b937b626792e619', + '88898a8b8d8e8f90929394959798999a9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-256: I=91'), + ('08090a0b0605040bfffef9f8b9c6c7c4', 'fa1ac6e02d23b106a1fef18b274a553f', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-256: I=92'), + ('08090a0bf1f2f3ccfcfdfafb68676665', '0dadfe019cd12368075507df33c1a1e9', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9eaecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-256: I=93'), + ('cacbc8c93a393837050403020d121310', '3a0879b414465d9ffbaf86b33a63a1b9', + '00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526', + 'ecb-tbl-256: I=94'), + ('e9e8ebea8281809f8f8e8988343b3a39', '62199fadc76d0be1805d3ba0b7d914bf', + '28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-256: I=95'), + ('515053524645444bd0d1d6d7340b0a09', '1b06d6c5d333e742730130cf78e719b4', + '50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-256: I=96'), + ('42434041ecefee1193929594c6c9c8cb', 'f1f848824c32e9dcdcbf21580f069329', + '78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e', + 'ecb-tbl-256: I=97'), + ('efeeedecc2c1c0cf76777071455a5b58', '1a09050cbd684f784d8e965e0782f28a', + 'a0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6', + 'ecb-tbl-256: I=98'), + ('5f5e5d5c3f3c3d221d1c1b1a19161714', '79c2969e7ded2ba7d088f3f320692360', + 'c8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee', + 'ecb-tbl-256: I=99'), + ('000102034142434c1c1d1a1b8d727371', '091a658a2f7444c16accb669450c7b63', + 'f0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516', + 'ecb-tbl-256: I=100'), + ('8e8f8c8db1b2b38c56575051050a0b08', '97c1e3a72cca65fa977d5ed0e8a7bbfc', + '18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e', + 'ecb-tbl-256: I=101'), + ('a7a6a5a4e8ebeae57f7e7978cad5d4d7', '70c430c6db9a17828937305a2df91a2a', + '40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566', + 'ecb-tbl-256: I=102'), + ('8a8b888994979689454443429f909192', '629553457fbe2479098571c7c903fde8', + '68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e', + 'ecb-tbl-256: I=103'), + ('8c8d8e8fe0e3e2ed45444342f1cecfcc', 'a25b25a61f612669e7d91265c7d476ba', + '90919293959697989a9b9c9d9fa0a1a2a4a5a6a7a9aaabacaeafb0b1b3b4b5b6', + 'ecb-tbl-256: I=104'), + ('fffefdfc4c4f4e31d8d9dedfb6b9b8bb', 'eb7e4e49b8ae0f024570dda293254fed', + 'b8b9babbbdbebfc0c2c3c4c5c7c8c9cacccdcecfd1d2d3d4d6d7d8d9dbdcddde', + 'ecb-tbl-256: I=105'), + ('fdfcfffecccfcec12f2e29286679787b', '38fe15d61cca84516e924adce5014f67', + 'e0e1e2e3e5e6e7e8eaebecedeff0f1f2f4f5f6f7f9fafbfcfefe010103040506', + 'ecb-tbl-256: I=106'), + ('67666564bab9b8a77071767719161714', '3ad208492249108c9f3ebeb167ad0583', + '08090a0b0d0e0f10121314151718191a1c1d1e1f21222324262728292b2c2d2e', + 'ecb-tbl-256: I=107'), + ('9a9b98992d2e2f2084858283245b5a59', '299ba9f9bf5ab05c3580fc26edd1ed12', + '30313233353637383a3b3c3d3f40414244454647494a4b4c4e4f505153545556', + 'ecb-tbl-256: I=108'), + ('a4a5a6a70b0809365c5d5a5b2c232221', '19dc705b857a60fb07717b2ea5717781', + '58595a5b5d5e5f60626364656768696a6c6d6e6f71727374767778797b7c7d7e', + 'ecb-tbl-256: I=109'), + ('464744455754555af3f2f5f4afb0b1b2', 'ffc8aeb885b5efcad06b6dbebf92e76b', + '80818283858687888a8b8c8d8f90919294959697999a9b9c9e9fa0a1a3a4a5a6', + 'ecb-tbl-256: I=110'), + ('323330317675746b7273747549464744', 'f58900c5e0b385253ff2546250a0142b', + 'a8a9aaabadaeafb0b2b3b4b5b7b8b9babcbdbebfc1c2c3c4c6c7c8c9cbcccdce', + 'ecb-tbl-256: I=111'), + ('a8a9aaab181b1a15808186872b141516', '2ee67b56280bc462429cee6e3370cbc1', + 'd0d1d2d3d5d6d7d8dadbdcdddfe0e1e2e4e5e6e7e9eaebeceeeff0f1f3f4f5f6', + 'ecb-tbl-256: I=112'), + ('e7e6e5e4202323ddaaabacad343b3a39', '20db650a9c8e9a84ab4d25f7edc8f03f', + 'f8f9fafbfdfefe00020304050708090a0c0d0e0f11121314161718191b1c1d1e', + 'ecb-tbl-256: I=113'), + ('a8a9aaab2221202fedecebea1e010003', '3c36da169525cf818843805f25b78ae5', + '20212223252627282a2b2c2d2f30313234353637393a3b3c3e3f404143444546', + 'ecb-tbl-256: I=114'), + ('f9f8fbfa5f5c5d42424344450e010003', '9a781d960db9e45e37779042fea51922', + '48494a4b4d4e4f50525354555758595a5c5d5e5f61626364666768696b6c6d6e', + 'ecb-tbl-256: I=115'), + ('57565554f5f6f7f89697909120dfdedd', '6560395ec269c672a3c288226efdba77', + '70717273757677787a7b7c7d7f80818284858687898a8b8c8e8f909193949596', + 'ecb-tbl-256: I=116'), + ('f8f9fafbcccfcef1dddcdbda0e010003', '8c772b7a189ac544453d5916ebb27b9a', + '98999a9b9d9e9fa0a2a3a4a5a7a8a9aaacadaeafb1b2b3b4b6b7b8b9bbbcbdbe', + 'ecb-tbl-256: I=117'), + ('d9d8dbda7073727d80818687c2dddcdf', '77ca5468cc48e843d05f78eed9d6578f', + 'c0c1c2c3c5c6c7c8cacbcccdcfd0d1d2d4d5d6d7d9dadbdcdedfe0e1e3e4e5e6', + 'ecb-tbl-256: I=118'), + ('c5c4c7c6080b0a1588898e8f68676665', '72cdcc71dc82c60d4429c9e2d8195baa', + 'e8e9eaebedeeeff0f2f3f4f5f7f8f9fafcfdfeff01020304060708090b0c0d0e', + 'ecb-tbl-256: I=119'), + ('83828180dcdfded186878081f0cfcecd', '8080d68ce60e94b40b5b8b69eeb35afa', + '10111213151617181a1b1c1d1f20212224252627292a2b2c2e2f303133343536', + 'ecb-tbl-256: I=120'), + ('98999a9bdddedfa079787f7e0a050407', '44222d3cde299c04369d58ac0eba1e8e', + '38393a3b3d3e3f40424344454748494a4c4d4e4f51525354565758595b5c5d5e', + 'ecb-tbl-256: I=121'), + ('cecfcccd4f4c4d429f9e9998dfc0c1c2', '9b8721b0a8dfc691c5bc5885dbfcb27a', + '60616263656667686a6b6c6d6f70717274757677797a7b7c7e7f808183848586', + 'ecb-tbl-256: I=122'), + ('404142436665647b29282f2eaba4a5a6', '0dc015ce9a3a3414b5e62ec643384183', + '88898a8b8d8e8f90929394959798999a9c9d9e9fa1a2a3a4a6a7a8a9abacadae', + 'ecb-tbl-256: I=123'), + ('33323130e6e5e4eb23222524dea1a0a3', '705715448a8da412025ce38345c2a148', + 'b0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c4c5c6c7c9cacbcccecfd0d1d3d4d5d6', + 'ecb-tbl-256: I=124'), + ('cfcecdccf6f5f4cbe6e7e0e199969794', 'c32b5b0b6fbae165266c569f4b6ecf0b', + 'd8d9dadbdddedfe0e2e3e4e5e7e8e9eaecedeeeff1f2f3f4f6f7f8f9fbfcfdfe', + 'ecb-tbl-256: I=125'), + ('babbb8b97271707fdcdddadb29363734', '4dca6c75192a01ddca9476af2a521e87', + '00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526', + 'ecb-tbl-256: I=126'), + ('c9c8cbca4447465926272021545b5a59', '058691e627ecbc36ac07b6db423bd698', + '28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e', + 'ecb-tbl-256: I=127'), + ('050407067477767956575051221d1c1f', '7444527095838fe080fc2bcdd30847eb', + '50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576', + 'ecb-tbl-256: I=128'), + + # FIPS PUB 800-38A test vectors, 2001 edition. Annex F. + + ('6bc1bee22e409f96e93d7e117393172a'+'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+'f69f2445df4f9b17ad2b417be66c3710', + '3ad77bb40d7a3660a89ecaf32466ef97'+'f5d3d58503b9699de785895a96fdbaaf'+ + '43b1cd7f598ece23881b00e3ed030688'+'7b0c785e27e8ad3f8223207104725dd4', + '2b7e151628aed2a6abf7158809cf4f3c', + 'NIST 800-38A, F.1.1, ECB and AES-128'), + + ('6bc1bee22e409f96e93d7e117393172a'+'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+'f69f2445df4f9b17ad2b417be66c3710', + 'bd334f1d6e45f25ff712a214571fa5cc'+'974104846d0ad3ad7734ecb3ecee4eef'+ + 'ef7afd2270e2e60adce0ba2face6444e'+'9a4b41ba738d6c72fb16691603c18e0e', + '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b', + 'NIST 800-38A, F.1.3, ECB and AES-192'), + + ('6bc1bee22e409f96e93d7e117393172a'+'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+'f69f2445df4f9b17ad2b417be66c3710', + 'f3eed1bdb5d2a03c064b5a7e3db181f8'+'591ccb10d410ed26dc5ba74a31362870'+ + 'b6ed21b99ca6f4f9f153e7b1beafed1d'+'23304b7a39f9f3ff067d8d8f9e24ecc7', + '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4', + 'NIST 800-38A, F.1.3, ECB and AES-256'), + +] + +test_data_8_lanes = [] +for td in test_data: + test_data_8_lanes.append((td[0] * 8, td[1] * 8, td[2], td[3])) +test_data += test_data_8_lanes + +class TestMultipleBlocks(unittest.TestCase): + + def __init__(self, use_aesni): + unittest.TestCase.__init__(self) + self.use_aesni = use_aesni + + def runTest(self): + # Encrypt data which is 8*2+4 bytes long, so as to trigger (for the + # AESNI variant) both the path that parallelizes 8 lanes and the one + # that processes data serially + + tvs = [ + (b'a' * 16, 'c0b27011eb15bf144d2fc9fae80ea16d4c231cb230416c5fac02e6835ad9d7d0'), + (b'a' * 24, 'df8435ce361a78c535b41dcb57da952abbf9ee5954dc6fbcd75fd00fa626915d'), + (b'a' * 32, '211402de6c80db1f92ba255881178e1f70783b8cfd3b37808205e48b80486cd8') + ] + + for key, expected in tvs: + + cipher = AES.new(key, AES.MODE_ECB, use_aesni=self.use_aesni) + h = SHA256.new() + + pt = b"".join([ tobytes('{0:016x}'.format(x)) for x in range(20) ]) + ct = cipher.encrypt(pt) + self.assertEqual(SHA256.new(ct).hexdigest(), expected) + + +class TestIncompleteBlocks(unittest.TestCase): + + def __init__(self, use_aesni): + unittest.TestCase.__init__(self) + self.use_aesni = use_aesni + + def runTest(self): + # Encrypt data with length not multiple of 16 bytes + + cipher = AES.new(b'4'*16, AES.MODE_ECB, use_aesni=self.use_aesni) + + for msg_len in range(1, 16): + self.assertRaises(ValueError, cipher.encrypt, b'1' * msg_len) + self.assertRaises(ValueError, cipher.encrypt, b'1' * (msg_len+16)) + self.assertRaises(ValueError, cipher.decrypt, b'1' * msg_len) + self.assertRaises(ValueError, cipher.decrypt, b'1' * (msg_len+16)) + + self.assertEqual(cipher.encrypt(b''), b'') + self.assertEqual(cipher.decrypt(b''), b'') + + +class TestOutput(unittest.TestCase): + + def __init__(self, use_aesni): + unittest.TestCase.__init__(self) + self.use_aesni = use_aesni + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = AES.new(b'4'*16, AES.MODE_ECB, use_aesni=self.use_aesni) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(15) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from Cryptodome.Util import _cpu_features + from .common import make_block_tests + + tests = make_block_tests(AES, "AES", test_data, {'use_aesni': False}) + tests += [ TestMultipleBlocks(False) ] + tests += [ TestIncompleteBlocks(False) ] + if _cpu_features.have_aes_ni(): + # Run tests with AES-NI instructions if they are available. + tests += make_block_tests(AES, "AESNI", test_data, {'use_aesni': True}) + tests += [ TestMultipleBlocks(True) ] + tests += [ TestIncompleteBlocks(True) ] + tests += [ TestOutput(True) ] + else: + print("Skipping AESNI tests") + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py new file mode 100644 index 0000000..0072506 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/ARC2.py: Self-test for the Alleged-RC2 cipher +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.ARC2""" + +import unittest + +from Cryptodome.Util.py3compat import b, bchr + +from Cryptodome.Cipher import ARC2 + +# This is a list of (plaintext, ciphertext, key[, description[, extra_params]]) tuples. +test_data = [ + # Test vectors from RFC 2268 + + # 63-bit effective key length + ('0000000000000000', 'ebb773f993278eff', '0000000000000000', + 'RFC2268-1', dict(effective_keylen=63)), + + # 64-bit effective key length + ('ffffffffffffffff', '278b27e42e2f0d49', 'ffffffffffffffff', + 'RFC2268-2', dict(effective_keylen=64)), + ('1000000000000001', '30649edf9be7d2c2', '3000000000000000', + 'RFC2268-3', dict(effective_keylen=64)), + #('0000000000000000', '61a8a244adacccf0', '88', + # 'RFC2268-4', dict(effective_keylen=64)), + ('0000000000000000', '6ccf4308974c267f', '88bca90e90875a', + 'RFC2268-5', dict(effective_keylen=64)), + ('0000000000000000', '1a807d272bbe5db1', '88bca90e90875a7f0f79c384627bafb2', + 'RFC2268-6', dict(effective_keylen=64)), + + # 128-bit effective key length + ('0000000000000000', '2269552ab0f85ca6', '88bca90e90875a7f0f79c384627bafb2', + "RFC2268-7", dict(effective_keylen=128)), + ('0000000000000000', '5b78d3a43dfff1f1', + '88bca90e90875a7f0f79c384627bafb216f80a6f85920584c42fceb0be255daf1e', + "RFC2268-8", dict(effective_keylen=129)), + + # Test vectors from PyCryptodome 2.0.1's testdata.py + # 1024-bit effective key length + ('0000000000000000', '624fb3e887419e48', '5068696c6970476c617373', + 'PCTv201-0'), + ('ffffffffffffffff', '79cadef44c4a5a85', '5068696c6970476c617373', + 'PCTv201-1'), + ('0001020304050607', '90411525b34e4c2c', '5068696c6970476c617373', + 'PCTv201-2'), + ('0011223344556677', '078656aaba61cbfb', '5068696c6970476c617373', + 'PCTv201-3'), + ('0000000000000000', 'd7bcc5dbb4d6e56a', 'ffffffffffffffff', + 'PCTv201-4'), + ('ffffffffffffffff', '7259018ec557b357', 'ffffffffffffffff', + 'PCTv201-5'), + ('0001020304050607', '93d20a497f2ccb62', 'ffffffffffffffff', + 'PCTv201-6'), + ('0011223344556677', 'cb15a7f819c0014d', 'ffffffffffffffff', + 'PCTv201-7'), + ('0000000000000000', '63ac98cdf3843a7a', 'ffffffffffffffff5065746572477265656e6177617953e5ffe553', + 'PCTv201-8'), + ('ffffffffffffffff', '3fb49e2fa12371dd', 'ffffffffffffffff5065746572477265656e6177617953e5ffe553', + 'PCTv201-9'), + ('0001020304050607', '46414781ab387d5f', 'ffffffffffffffff5065746572477265656e6177617953e5ffe553', + 'PCTv201-10'), + ('0011223344556677', 'be09dc81feaca271', 'ffffffffffffffff5065746572477265656e6177617953e5ffe553', + 'PCTv201-11'), + ('0000000000000000', 'e64221e608be30ab', '53e5ffe553', + 'PCTv201-12'), + ('ffffffffffffffff', '862bc60fdcd4d9a9', '53e5ffe553', + 'PCTv201-13'), + ('0001020304050607', '6a34da50fa5e47de', '53e5ffe553', + 'PCTv201-14'), + ('0011223344556677', '584644c34503122c', '53e5ffe553', + 'PCTv201-15'), +] + +class BufferOverflowTest(unittest.TestCase): + # Test a buffer overflow found in older versions of PyCrypto + + def runTest(self): + """ARC2 with keylength > 128""" + key = b("x") * 16384 + self.assertRaises(ValueError, ARC2.new, key, ARC2.MODE_ECB) + +class KeyLength(unittest.TestCase): + + def runTest(self): + ARC2.new(b'\x00' * 16, ARC2.MODE_ECB, effective_keylen=40) + self.assertRaises(ValueError, ARC2.new, bchr(0) * 4, ARC2.MODE_ECB) + self.assertRaises(ValueError, ARC2.new, bchr(0) * 129, ARC2.MODE_ECB) + + self.assertRaises(ValueError, ARC2.new, bchr(0) * 16, ARC2.MODE_ECB, + effective_keylen=39) + self.assertRaises(ValueError, ARC2.new, bchr(0) * 16, ARC2.MODE_ECB, + effective_keylen=1025) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = ARC2.new(b'4'*16, ARC2.MODE_ECB) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(7) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from Cryptodome.Cipher import ARC2 + from .common import make_block_tests + + tests = make_block_tests(ARC2, "ARC2", test_data) + tests.append(BufferOverflowTest()) + tests.append(KeyLength()) + tests += [TestOutput()] + + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py new file mode 100644 index 0000000..a160c98 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py @@ -0,0 +1,471 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/ARC4.py: Self-test for the Alleged-RC4 cipher +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.ARC4""" + +import unittest + +from Cryptodome.Util.py3compat import b +from Cryptodome.SelfTest.st_common import list_test_cases +from binascii import unhexlify + +from Cryptodome.Cipher import ARC4 + +# This is a list of (plaintext, ciphertext, key[, description]) tuples. +test_data = [ + # Test vectors from Eric Rescorla's message with the subject + # "RC4 compatibility testing", sent to the cipherpunks mailing list on + # September 13, 1994. + # http://cypherpunks.venona.com/date/1994/09/msg00420.html + + ('0123456789abcdef', '75b7878099e0c596', '0123456789abcdef', + 'Test vector 0'), + + ('0000000000000000', '7494c2e7104b0879', '0123456789abcdef', + 'Test vector 1'), + + ('0000000000000000', 'de188941a3375d3a', '0000000000000000', + 'Test vector 2'), + + ('00000000000000000000', 'd6a141a7ec3c38dfbd61', 'ef012345', + 'Test vector 3'), + + ('01' * 512, + '7595c3e6114a09780c4ad452338e1ffd9a1be9498f813d76533449b6778dcad8' + + 'c78a8d2ba9ac66085d0e53d59c26c2d1c490c1ebbe0ce66d1b6b1b13b6b919b8' + + '47c25a91447a95e75e4ef16779cde8bf0a95850e32af9689444fd377108f98fd' + + 'cbd4e726567500990bcc7e0ca3c4aaa304a387d20f3b8fbbcd42a1bd311d7a43' + + '03dda5ab078896ae80c18b0af66dff319616eb784e495ad2ce90d7f772a81747' + + 'b65f62093b1e0db9e5ba532fafec47508323e671327df9444432cb7367cec82f' + + '5d44c0d00b67d650a075cd4b70dedd77eb9b10231b6b5b741347396d62897421' + + 'd43df9b42e446e358e9c11a9b2184ecbef0cd8e7a877ef968f1390ec9b3d35a5' + + '585cb009290e2fcde7b5ec66d9084be44055a619d9dd7fc3166f9487f7cb2729' + + '12426445998514c15d53a18c864ce3a2b7555793988126520eacf2e3066e230c' + + '91bee4dd5304f5fd0405b35bd99c73135d3d9bc335ee049ef69b3867bf2d7bd1' + + 'eaa595d8bfc0066ff8d31509eb0c6caa006c807a623ef84c3d33c195d23ee320' + + 'c40de0558157c822d4b8c569d849aed59d4e0fd7f379586b4b7ff684ed6a189f' + + '7486d49b9c4bad9ba24b96abf924372c8a8fffb10d55354900a77a3db5f205e1' + + 'b99fcd8660863a159ad4abe40fa48934163ddde542a6585540fd683cbfd8c00f' + + '12129a284deacc4cdefe58be7137541c047126c8d49e2755ab181ab7e940b0c0', + '0123456789abcdef', + "Test vector 4"), + # shortest key - generated with arc4 package + ('7468697320697320616e206578616d706c65', + '7260677d38495a09585d69321e17eaf3cdd0', + '01'), +] + + +class RFC6229_Tests(unittest.TestCase): + # Test vectors from RFC 6229. Each test vector is a tuple with two items: + # the ARC4 key and a dictionary. The dictionary has keystream offsets as keys + # and the 16-byte keystream starting at the relevant offset as value. + rfc6229_data = [ + # Page 3 + ( + '0102030405', + { + 0: 'b2 39 63 05 f0 3d c0 27 cc c3 52 4a 0a 11 18 a8', + 16: '69 82 94 4f 18 fc 82 d5 89 c4 03 a4 7a 0d 09 19', + 240: '28 cb 11 32 c9 6c e2 86 42 1d ca ad b8 b6 9e ae', + 256: '1c fc f6 2b 03 ed db 64 1d 77 df cf 7f 8d 8c 93', + 496: '42 b7 d0 cd d9 18 a8 a3 3d d5 17 81 c8 1f 40 41', + 512: '64 59 84 44 32 a7 da 92 3c fb 3e b4 98 06 61 f6', + 752: 'ec 10 32 7b de 2b ee fd 18 f9 27 76 80 45 7e 22', + 768: 'eb 62 63 8d 4f 0b a1 fe 9f ca 20 e0 5b f8 ff 2b', + 1008: '45 12 90 48 e6 a0 ed 0b 56 b4 90 33 8f 07 8d a5', + 1024: '30 ab bc c7 c2 0b 01 60 9f 23 ee 2d 5f 6b b7 df', + 1520: '32 94 f7 44 d8 f9 79 05 07 e7 0f 62 e5 bb ce ea', + 1536: 'd8 72 9d b4 18 82 25 9b ee 4f 82 53 25 f5 a1 30', + 2032: '1e b1 4a 0c 13 b3 bf 47 fa 2a 0b a9 3a d4 5b 8b', + 2048: 'cc 58 2f 8b a9 f2 65 e2 b1 be 91 12 e9 75 d2 d7', + 3056: 'f2 e3 0f 9b d1 02 ec bf 75 aa ad e9 bc 35 c4 3c', + 3072: 'ec 0e 11 c4 79 dc 32 9d c8 da 79 68 fe 96 56 81', + 4080: '06 83 26 a2 11 84 16 d2 1f 9d 04 b2 cd 1c a0 50', + 4096: 'ff 25 b5 89 95 99 67 07 e5 1f bd f0 8b 34 d8 75' + } + ), + # Page 4 + ( + '01020304050607', + { + 0: '29 3f 02 d4 7f 37 c9 b6 33 f2 af 52 85 fe b4 6b', + 16: 'e6 20 f1 39 0d 19 bd 84 e2 e0 fd 75 20 31 af c1', + 240: '91 4f 02 53 1c 92 18 81 0d f6 0f 67 e3 38 15 4c', + 256: 'd0 fd b5 83 07 3c e8 5a b8 39 17 74 0e c0 11 d5', + 496: '75 f8 14 11 e8 71 cf fa 70 b9 0c 74 c5 92 e4 54', + 512: '0b b8 72 02 93 8d ad 60 9e 87 a5 a1 b0 79 e5 e4', + 752: 'c2 91 12 46 b6 12 e7 e7 b9 03 df ed a1 da d8 66', + 768: '32 82 8f 91 50 2b 62 91 36 8d e8 08 1d e3 6f c2', + 1008: 'f3 b9 a7 e3 b2 97 bf 9a d8 04 51 2f 90 63 ef f1', + 1024: '8e cb 67 a9 ba 1f 55 a5 a0 67 e2 b0 26 a3 67 6f', + 1520: 'd2 aa 90 2b d4 2d 0d 7c fd 34 0c d4 58 10 52 9f', + 1536: '78 b2 72 c9 6e 42 ea b4 c6 0b d9 14 e3 9d 06 e3', + 2032: 'f4 33 2f d3 1a 07 93 96 ee 3c ee 3f 2a 4f f0 49', + 2048: '05 45 97 81 d4 1f da 7f 30 c1 be 7e 12 46 c6 23', + 3056: 'ad fd 38 68 b8 e5 14 85 d5 e6 10 01 7e 3d d6 09', + 3072: 'ad 26 58 1c 0c 5b e4 5f 4c ea 01 db 2f 38 05 d5', + 4080: 'f3 17 2c ef fc 3b 3d 99 7c 85 cc d5 af 1a 95 0c', + 4096: 'e7 4b 0b 97 31 22 7f d3 7c 0e c0 8a 47 dd d8 b8' + } + ), + ( + '0102030405060708', + { + 0: '97 ab 8a 1b f0 af b9 61 32 f2 f6 72 58 da 15 a8', + 16: '82 63 ef db 45 c4 a1 86 84 ef 87 e6 b1 9e 5b 09', + 240: '96 36 eb c9 84 19 26 f4 f7 d1 f3 62 bd df 6e 18', + 256: 'd0 a9 90 ff 2c 05 fe f5 b9 03 73 c9 ff 4b 87 0a', + 496: '73 23 9f 1d b7 f4 1d 80 b6 43 c0 c5 25 18 ec 63', + 512: '16 3b 31 99 23 a6 bd b4 52 7c 62 61 26 70 3c 0f', + 752: '49 d6 c8 af 0f 97 14 4a 87 df 21 d9 14 72 f9 66', + 768: '44 17 3a 10 3b 66 16 c5 d5 ad 1c ee 40 c8 63 d0', + 1008: '27 3c 9c 4b 27 f3 22 e4 e7 16 ef 53 a4 7d e7 a4', + 1024: 'c6 d0 e7 b2 26 25 9f a9 02 34 90 b2 61 67 ad 1d', + 1520: '1f e8 98 67 13 f0 7c 3d 9a e1 c1 63 ff 8c f9 d3', + 1536: '83 69 e1 a9 65 61 0b e8 87 fb d0 c7 91 62 aa fb', + 2032: '0a 01 27 ab b4 44 84 b9 fb ef 5a bc ae 1b 57 9f', + 2048: 'c2 cd ad c6 40 2e 8e e8 66 e1 f3 7b db 47 e4 2c', + 3056: '26 b5 1e a3 7d f8 e1 d6 f7 6f c3 b6 6a 74 29 b3', + 3072: 'bc 76 83 20 5d 4f 44 3d c1 f2 9d da 33 15 c8 7b', + 4080: 'd5 fa 5a 34 69 d2 9a aa f8 3d 23 58 9d b8 c8 5b', + 4096: '3f b4 6e 2c 8f 0f 06 8e dc e8 cd cd 7d fc 58 62' + } + ), + # Page 5 + ( + '0102030405060708090a', + { + 0: 'ed e3 b0 46 43 e5 86 cc 90 7d c2 18 51 70 99 02', + 16: '03 51 6b a7 8f 41 3b eb 22 3a a5 d4 d2 df 67 11', + 240: '3c fd 6c b5 8e e0 fd de 64 01 76 ad 00 00 04 4d', + 256: '48 53 2b 21 fb 60 79 c9 11 4c 0f fd 9c 04 a1 ad', + 496: '3e 8c ea 98 01 71 09 97 90 84 b1 ef 92 f9 9d 86', + 512: 'e2 0f b4 9b db 33 7e e4 8b 8d 8d c0 f4 af ef fe', + 752: '5c 25 21 ea cd 79 66 f1 5e 05 65 44 be a0 d3 15', + 768: 'e0 67 a7 03 19 31 a2 46 a6 c3 87 5d 2f 67 8a cb', + 1008: 'a6 4f 70 af 88 ae 56 b6 f8 75 81 c0 e2 3e 6b 08', + 1024: 'f4 49 03 1d e3 12 81 4e c6 f3 19 29 1f 4a 05 16', + 1520: 'bd ae 85 92 4b 3c b1 d0 a2 e3 3a 30 c6 d7 95 99', + 1536: '8a 0f ed db ac 86 5a 09 bc d1 27 fb 56 2e d6 0a', + 2032: 'b5 5a 0a 5b 51 a1 2a 8b e3 48 99 c3 e0 47 51 1a', + 2048: 'd9 a0 9c ea 3c e7 5f e3 96 98 07 03 17 a7 13 39', + 3056: '55 22 25 ed 11 77 f4 45 84 ac 8c fa 6c 4e b5 fc', + 3072: '7e 82 cb ab fc 95 38 1b 08 09 98 44 21 29 c2 f8', + 4080: '1f 13 5e d1 4c e6 0a 91 36 9d 23 22 be f2 5e 3c', + 4096: '08 b6 be 45 12 4a 43 e2 eb 77 95 3f 84 dc 85 53' + } + ), + ( + '0102030405060708090a0b0c0d0e0f10', + { + 0: '9a c7 cc 9a 60 9d 1e f7 b2 93 28 99 cd e4 1b 97', + 16: '52 48 c4 95 90 14 12 6a 6e 8a 84 f1 1d 1a 9e 1c', + 240: '06 59 02 e4 b6 20 f6 cc 36 c8 58 9f 66 43 2f 2b', + 256: 'd3 9d 56 6b c6 bc e3 01 07 68 15 15 49 f3 87 3f', + 496: 'b6 d1 e6 c4 a5 e4 77 1c ad 79 53 8d f2 95 fb 11', + 512: 'c6 8c 1d 5c 55 9a 97 41 23 df 1d bc 52 a4 3b 89', + 752: 'c5 ec f8 8d e8 97 fd 57 fe d3 01 70 1b 82 a2 59', + 768: 'ec cb e1 3d e1 fc c9 1c 11 a0 b2 6c 0b c8 fa 4d', + 1008: 'e7 a7 25 74 f8 78 2a e2 6a ab cf 9e bc d6 60 65', + 1024: 'bd f0 32 4e 60 83 dc c6 d3 ce dd 3c a8 c5 3c 16', + 1520: 'b4 01 10 c4 19 0b 56 22 a9 61 16 b0 01 7e d2 97', + 1536: 'ff a0 b5 14 64 7e c0 4f 63 06 b8 92 ae 66 11 81', + 2032: 'd0 3d 1b c0 3c d3 3d 70 df f9 fa 5d 71 96 3e bd', + 2048: '8a 44 12 64 11 ea a7 8b d5 1e 8d 87 a8 87 9b f5', + 3056: 'fa be b7 60 28 ad e2 d0 e4 87 22 e4 6c 46 15 a3', + 3072: 'c0 5d 88 ab d5 03 57 f9 35 a6 3c 59 ee 53 76 23', + 4080: 'ff 38 26 5c 16 42 c1 ab e8 d3 c2 fe 5e 57 2b f8', + 4096: 'a3 6a 4c 30 1a e8 ac 13 61 0c cb c1 22 56 ca cc' + } + ), + # Page 6 + ( + '0102030405060708090a0b0c0d0e0f101112131415161718', + { + 0: '05 95 e5 7f e5 f0 bb 3c 70 6e da c8 a4 b2 db 11', + 16: 'df de 31 34 4a 1a f7 69 c7 4f 07 0a ee 9e 23 26', + 240: 'b0 6b 9b 1e 19 5d 13 d8 f4 a7 99 5c 45 53 ac 05', + 256: '6b d2 37 8e c3 41 c9 a4 2f 37 ba 79 f8 8a 32 ff', + 496: 'e7 0b ce 1d f7 64 5a db 5d 2c 41 30 21 5c 35 22', + 512: '9a 57 30 c7 fc b4 c9 af 51 ff da 89 c7 f1 ad 22', + 752: '04 85 05 5f d4 f6 f0 d9 63 ef 5a b9 a5 47 69 82', + 768: '59 1f c6 6b cd a1 0e 45 2b 03 d4 55 1f 6b 62 ac', + 1008: '27 53 cc 83 98 8a fa 3e 16 88 a1 d3 b4 2c 9a 02', + 1024: '93 61 0d 52 3d 1d 3f 00 62 b3 c2 a3 bb c7 c7 f0', + 1520: '96 c2 48 61 0a ad ed fe af 89 78 c0 3d e8 20 5a', + 1536: '0e 31 7b 3d 1c 73 b9 e9 a4 68 8f 29 6d 13 3a 19', + 2032: 'bd f0 e6 c3 cc a5 b5 b9 d5 33 b6 9c 56 ad a1 20', + 2048: '88 a2 18 b6 e2 ec e1 e6 24 6d 44 c7 59 d1 9b 10', + 3056: '68 66 39 7e 95 c1 40 53 4f 94 26 34 21 00 6e 40', + 3072: '32 cb 0a 1e 95 42 c6 b3 b8 b3 98 ab c3 b0 f1 d5', + 4080: '29 a0 b8 ae d5 4a 13 23 24 c6 2e 42 3f 54 b4 c8', + 4096: '3c b0 f3 b5 02 0a 98 b8 2a f9 fe 15 44 84 a1 68' + } + ), + ( + '0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20', + { + 0: 'ea a6 bd 25 88 0b f9 3d 3f 5d 1e 4c a2 61 1d 91', + 16: 'cf a4 5c 9f 7e 71 4b 54 bd fa 80 02 7c b1 43 80', + 240: '11 4a e3 44 de d7 1b 35 f2 e6 0f eb ad 72 7f d8', + 256: '02 e1 e7 05 6b 0f 62 39 00 49 64 22 94 3e 97 b6', + 496: '91 cb 93 c7 87 96 4e 10 d9 52 7d 99 9c 6f 93 6b', + 512: '49 b1 8b 42 f8 e8 36 7c be b5 ef 10 4b a1 c7 cd', + 752: '87 08 4b 3b a7 00 ba de 95 56 10 67 27 45 b3 74', + 768: 'e7 a7 b9 e9 ec 54 0d 5f f4 3b db 12 79 2d 1b 35', + 1008: 'c7 99 b5 96 73 8f 6b 01 8c 76 c7 4b 17 59 bd 90', + 1024: '7f ec 5b fd 9f 9b 89 ce 65 48 30 90 92 d7 e9 58', + 1520: '40 f2 50 b2 6d 1f 09 6a 4a fd 4c 34 0a 58 88 15', + 1536: '3e 34 13 5c 79 db 01 02 00 76 76 51 cf 26 30 73', + 2032: 'f6 56 ab cc f8 8d d8 27 02 7b 2c e9 17 d4 64 ec', + 2048: '18 b6 25 03 bf bc 07 7f ba bb 98 f2 0d 98 ab 34', + 3056: '8a ed 95 ee 5b 0d cb fb ef 4e b2 1d 3a 3f 52 f9', + 3072: '62 5a 1a b0 0e e3 9a 53 27 34 6b dd b0 1a 9c 18', + 4080: 'a1 3a 7c 79 c7 e1 19 b5 ab 02 96 ab 28 c3 00 b9', + 4096: 'f3 e4 c0 a2 e0 2d 1d 01 f7 f0 a7 46 18 af 2b 48' + } + ), + # Page 7 + ( + '833222772a', + { + 0: '80 ad 97 bd c9 73 df 8a 2e 87 9e 92 a4 97 ef da', + 16: '20 f0 60 c2 f2 e5 12 65 01 d3 d4 fe a1 0d 5f c0', + 240: 'fa a1 48 e9 90 46 18 1f ec 6b 20 85 f3 b2 0e d9', + 256: 'f0 da f5 ba b3 d5 96 83 98 57 84 6f 73 fb fe 5a', + 496: '1c 7e 2f c4 63 92 32 fe 29 75 84 b2 96 99 6b c8', + 512: '3d b9 b2 49 40 6c c8 ed ff ac 55 cc d3 22 ba 12', + 752: 'e4 f9 f7 e0 06 61 54 bb d1 25 b7 45 56 9b c8 97', + 768: '75 d5 ef 26 2b 44 c4 1a 9c f6 3a e1 45 68 e1 b9', + 1008: '6d a4 53 db f8 1e 82 33 4a 3d 88 66 cb 50 a1 e3', + 1024: '78 28 d0 74 11 9c ab 5c 22 b2 94 d7 a9 bf a0 bb', + 1520: 'ad b8 9c ea 9a 15 fb e6 17 29 5b d0 4b 8c a0 5c', + 1536: '62 51 d8 7f d4 aa ae 9a 7e 4a d5 c2 17 d3 f3 00', + 2032: 'e7 11 9b d6 dd 9b 22 af e8 f8 95 85 43 28 81 e2', + 2048: '78 5b 60 fd 7e c4 e9 fc b6 54 5f 35 0d 66 0f ab', + 3056: 'af ec c0 37 fd b7 b0 83 8e b3 d7 0b cd 26 83 82', + 3072: 'db c1 a7 b4 9d 57 35 8c c9 fa 6d 61 d7 3b 7c f0', + 4080: '63 49 d1 26 a3 7a fc ba 89 79 4f 98 04 91 4f dc', + 4096: 'bf 42 c3 01 8c 2f 7c 66 bf de 52 49 75 76 81 15' + } + ), + ( + '1910833222772a', + { + 0: 'bc 92 22 db d3 27 4d 8f c6 6d 14 cc bd a6 69 0b', + 16: '7a e6 27 41 0c 9a 2b e6 93 df 5b b7 48 5a 63 e3', + 240: '3f 09 31 aa 03 de fb 30 0f 06 01 03 82 6f 2a 64', + 256: 'be aa 9e c8 d5 9b b6 81 29 f3 02 7c 96 36 11 81', + 496: '74 e0 4d b4 6d 28 64 8d 7d ee 8a 00 64 b0 6c fe', + 512: '9b 5e 81 c6 2f e0 23 c5 5b e4 2f 87 bb f9 32 b8', + 752: 'ce 17 8f c1 82 6e fe cb c1 82 f5 79 99 a4 61 40', + 768: '8b df 55 cd 55 06 1c 06 db a6 be 11 de 4a 57 8a', + 1008: '62 6f 5f 4d ce 65 25 01 f3 08 7d 39 c9 2c c3 49', + 1024: '42 da ac 6a 8f 9a b9 a7 fd 13 7c 60 37 82 56 82', + 1520: 'cc 03 fd b7 91 92 a2 07 31 2f 53 f5 d4 dc 33 d9', + 1536: 'f7 0f 14 12 2a 1c 98 a3 15 5d 28 b8 a0 a8 a4 1d', + 2032: '2a 3a 30 7a b2 70 8a 9c 00 fe 0b 42 f9 c2 d6 a1', + 2048: '86 26 17 62 7d 22 61 ea b0 b1 24 65 97 ca 0a e9', + 3056: '55 f8 77 ce 4f 2e 1d db bf 8e 13 e2 cd e0 fd c8', + 3072: '1b 15 56 cb 93 5f 17 33 37 70 5f bb 5d 50 1f c1', + 4080: 'ec d0 e9 66 02 be 7f 8d 50 92 81 6c cc f2 c2 e9', + 4096: '02 78 81 fa b4 99 3a 1c 26 20 24 a9 4f ff 3f 61' + } + ), + # Page 8 + ( + '641910833222772a', + { + 0: 'bb f6 09 de 94 13 17 2d 07 66 0c b6 80 71 69 26', + 16: '46 10 1a 6d ab 43 11 5d 6c 52 2b 4f e9 36 04 a9', + 240: 'cb e1 ff f2 1c 96 f3 ee f6 1e 8f e0 54 2c bd f0', + 256: '34 79 38 bf fa 40 09 c5 12 cf b4 03 4b 0d d1 a7', + 496: '78 67 a7 86 d0 0a 71 47 90 4d 76 dd f1 e5 20 e3', + 512: '8d 3e 9e 1c ae fc cc b3 fb f8 d1 8f 64 12 0b 32', + 752: '94 23 37 f8 fd 76 f0 fa e8 c5 2d 79 54 81 06 72', + 768: 'b8 54 8c 10 f5 16 67 f6 e6 0e 18 2f a1 9b 30 f7', + 1008: '02 11 c7 c6 19 0c 9e fd 12 37 c3 4c 8f 2e 06 c4', + 1024: 'bd a6 4f 65 27 6d 2a ac b8 f9 02 12 20 3a 80 8e', + 1520: 'bd 38 20 f7 32 ff b5 3e c1 93 e7 9d 33 e2 7c 73', + 1536: 'd0 16 86 16 86 19 07 d4 82 e3 6c da c8 cf 57 49', + 2032: '97 b0 f0 f2 24 b2 d2 31 71 14 80 8f b0 3a f7 a0', + 2048: 'e5 96 16 e4 69 78 79 39 a0 63 ce ea 9a f9 56 d1', + 3056: 'c4 7e 0d c1 66 09 19 c1 11 01 20 8f 9e 69 aa 1f', + 3072: '5a e4 f1 28 96 b8 37 9a 2a ad 89 b5 b5 53 d6 b0', + 4080: '6b 6b 09 8d 0c 29 3b c2 99 3d 80 bf 05 18 b6 d9', + 4096: '81 70 cc 3c cd 92 a6 98 62 1b 93 9d d3 8f e7 b9' + } + ), + ( + '8b37641910833222772a', + { + 0: 'ab 65 c2 6e dd b2 87 60 0d b2 fd a1 0d 1e 60 5c', + 16: 'bb 75 90 10 c2 96 58 f2 c7 2d 93 a2 d1 6d 29 30', + 240: 'b9 01 e8 03 6e d1 c3 83 cd 3c 4c 4d d0 a6 ab 05', + 256: '3d 25 ce 49 22 92 4c 55 f0 64 94 33 53 d7 8a 6c', + 496: '12 c1 aa 44 bb f8 7e 75 e6 11 f6 9b 2c 38 f4 9b', + 512: '28 f2 b3 43 4b 65 c0 98 77 47 00 44 c6 ea 17 0d', + 752: 'bd 9e f8 22 de 52 88 19 61 34 cf 8a f7 83 93 04', + 768: '67 55 9c 23 f0 52 15 84 70 a2 96 f7 25 73 5a 32', + 1008: '8b ab 26 fb c2 c1 2b 0f 13 e2 ab 18 5e ab f2 41', + 1024: '31 18 5a 6d 69 6f 0c fa 9b 42 80 8b 38 e1 32 a2', + 1520: '56 4d 3d ae 18 3c 52 34 c8 af 1e 51 06 1c 44 b5', + 1536: '3c 07 78 a7 b5 f7 2d 3c 23 a3 13 5c 7d 67 b9 f4', + 2032: 'f3 43 69 89 0f cf 16 fb 51 7d ca ae 44 63 b2 dd', + 2048: '02 f3 1c 81 e8 20 07 31 b8 99 b0 28 e7 91 bf a7', + 3056: '72 da 64 62 83 22 8c 14 30 08 53 70 17 95 61 6f', + 3072: '4e 0a 8c 6f 79 34 a7 88 e2 26 5e 81 d6 d0 c8 f4', + 4080: '43 8d d5 ea fe a0 11 1b 6f 36 b4 b9 38 da 2a 68', + 4096: '5f 6b fc 73 81 58 74 d9 71 00 f0 86 97 93 57 d8' + } + ), + # Page 9 + ( + 'ebb46227c6cc8b37641910833222772a', + { + 0: '72 0c 94 b6 3e df 44 e1 31 d9 50 ca 21 1a 5a 30', + 16: 'c3 66 fd ea cf 9c a8 04 36 be 7c 35 84 24 d2 0b', + 240: 'b3 39 4a 40 aa bf 75 cb a4 22 82 ef 25 a0 05 9f', + 256: '48 47 d8 1d a4 94 2d bc 24 9d ef c4 8c 92 2b 9f', + 496: '08 12 8c 46 9f 27 53 42 ad da 20 2b 2b 58 da 95', + 512: '97 0d ac ef 40 ad 98 72 3b ac 5d 69 55 b8 17 61', + 752: '3c b8 99 93 b0 7b 0c ed 93 de 13 d2 a1 10 13 ac', + 768: 'ef 2d 67 6f 15 45 c2 c1 3d c6 80 a0 2f 4a db fe', + 1008: 'b6 05 95 51 4f 24 bc 9f e5 22 a6 ca d7 39 36 44', + 1024: 'b5 15 a8 c5 01 17 54 f5 90 03 05 8b db 81 51 4e', + 1520: '3c 70 04 7e 8c bc 03 8e 3b 98 20 db 60 1d a4 95', + 1536: '11 75 da 6e e7 56 de 46 a5 3e 2b 07 56 60 b7 70', + 2032: '00 a5 42 bb a0 21 11 cc 2c 65 b3 8e bd ba 58 7e', + 2048: '58 65 fd bb 5b 48 06 41 04 e8 30 b3 80 f2 ae de', + 3056: '34 b2 1a d2 ad 44 e9 99 db 2d 7f 08 63 f0 d9 b6', + 3072: '84 a9 21 8f c3 6e 8a 5f 2c cf be ae 53 a2 7d 25', + 4080: 'a2 22 1a 11 b8 33 cc b4 98 a5 95 40 f0 54 5f 4a', + 4096: '5b be b4 78 7d 59 e5 37 3f db ea 6c 6f 75 c2 9b' + } + ), + ( + 'c109163908ebe51debb46227c6cc8b37641910833222772a', + { + 0: '54 b6 4e 6b 5a 20 b5 e2 ec 84 59 3d c7 98 9d a7', + 16: 'c1 35 ee e2 37 a8 54 65 ff 97 dc 03 92 4f 45 ce', + 240: 'cf cc 92 2f b4 a1 4a b4 5d 61 75 aa bb f2 d2 01', + 256: '83 7b 87 e2 a4 46 ad 0e f7 98 ac d0 2b 94 12 4f', + 496: '17 a6 db d6 64 92 6a 06 36 b3 f4 c3 7a 4f 46 94', + 512: '4a 5f 9f 26 ae ee d4 d4 a2 5f 63 2d 30 52 33 d9', + 752: '80 a3 d0 1e f0 0c 8e 9a 42 09 c1 7f 4e eb 35 8c', + 768: 'd1 5e 7d 5f fa aa bc 02 07 bf 20 0a 11 77 93 a2', + 1008: '34 96 82 bf 58 8e aa 52 d0 aa 15 60 34 6a ea fa', + 1024: 'f5 85 4c db 76 c8 89 e3 ad 63 35 4e 5f 72 75 e3', + 1520: '53 2c 7c ec cb 39 df 32 36 31 84 05 a4 b1 27 9c', + 1536: 'ba ef e6 d9 ce b6 51 84 22 60 e0 d1 e0 5e 3b 90', + 2032: 'e8 2d 8c 6d b5 4e 3c 63 3f 58 1c 95 2b a0 42 07', + 2048: '4b 16 e5 0a bd 38 1b d7 09 00 a9 cd 9a 62 cb 23', + 3056: '36 82 ee 33 bd 14 8b d9 f5 86 56 cd 8f 30 d9 fb', + 3072: '1e 5a 0b 84 75 04 5d 9b 20 b2 62 86 24 ed fd 9e', + 4080: '63 ed d6 84 fb 82 62 82 fe 52 8f 9c 0e 92 37 bc', + 4096: 'e4 dd 2e 98 d6 96 0f ae 0b 43 54 54 56 74 33 91' + } + ), + # Page 10 + ( + '1ada31d5cf688221c109163908ebe51debb46227c6cc8b37641910833222772a', + { + 0: 'dd 5b cb 00 18 e9 22 d4 94 75 9d 7c 39 5d 02 d3', + 16: 'c8 44 6f 8f 77 ab f7 37 68 53 53 eb 89 a1 c9 eb', + 240: 'af 3e 30 f9 c0 95 04 59 38 15 15 75 c3 fb 90 98', + 256: 'f8 cb 62 74 db 99 b8 0b 1d 20 12 a9 8e d4 8f 0e', + 496: '25 c3 00 5a 1c b8 5d e0 76 25 98 39 ab 71 98 ab', + 512: '9d cb c1 83 e8 cb 99 4b 72 7b 75 be 31 80 76 9c', + 752: 'a1 d3 07 8d fa 91 69 50 3e d9 d4 49 1d ee 4e b2', + 768: '85 14 a5 49 58 58 09 6f 59 6e 4b cd 66 b1 06 65', + 1008: '5f 40 d5 9e c1 b0 3b 33 73 8e fa 60 b2 25 5d 31', + 1024: '34 77 c7 f7 64 a4 1b ac ef f9 0b f1 4f 92 b7 cc', + 1520: 'ac 4e 95 36 8d 99 b9 eb 78 b8 da 8f 81 ff a7 95', + 1536: '8c 3c 13 f8 c2 38 8b b7 3f 38 57 6e 65 b7 c4 46', + 2032: '13 c4 b9 c1 df b6 65 79 ed dd 8a 28 0b 9f 73 16', + 2048: 'dd d2 78 20 55 01 26 69 8e fa ad c6 4b 64 f6 6e', + 3056: 'f0 8f 2e 66 d2 8e d1 43 f3 a2 37 cf 9d e7 35 59', + 3072: '9e a3 6c 52 55 31 b8 80 ba 12 43 34 f5 7b 0b 70', + 4080: 'd5 a3 9e 3d fc c5 02 80 ba c4 a6 b5 aa 0d ca 7d', + 4096: '37 0b 1c 1f e6 55 91 6d 97 fd 0d 47 ca 1d 72 b8' + } + ) + ] + + def test_keystream(self): + for tv in self.rfc6229_data: + key = unhexlify(b((tv[0]))) + cipher = ARC4.new(key) + count = 0 + for offset in range(0, 4096+1, 16): + ct = cipher.encrypt(b('\x00')*16) + expected = tv[1].get(offset) + if expected: + expected = unhexlify(b(expected.replace(" ", ''))) + self.assertEqual(ct, expected) + count += 1 + self.assertEqual(count, len(tv[1])) + + +class Drop_Tests(unittest.TestCase): + key = b('\xAA')*16 + data = b('\x00')*5000 + + def setUp(self): + self.cipher = ARC4.new(self.key) + + def test_drop256_encrypt(self): + cipher_drop = ARC4.new(self.key, 256) + ct_drop = cipher_drop.encrypt(self.data[:16]) + ct = self.cipher.encrypt(self.data)[256:256+16] + self.assertEqual(ct_drop, ct) + + def test_drop256_decrypt(self): + cipher_drop = ARC4.new(self.key, 256) + pt_drop = cipher_drop.decrypt(self.data[:16]) + pt = self.cipher.decrypt(self.data)[256:256+16] + self.assertEqual(pt_drop, pt) + + +class KeyLength(unittest.TestCase): + + def runTest(self): + self.assertRaises(ValueError, ARC4.new, b'') + self.assertRaises(ValueError, ARC4.new, b'\x00' * 257) + + +def get_tests(config={}): + from .common import make_stream_tests + tests = make_stream_tests(ARC4, "ARC4", test_data) + tests += list_test_cases(RFC6229_Tests) + tests += list_test_cases(Drop_Tests) + tests.append(KeyLength()) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py new file mode 100644 index 0000000..ca5c603 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py @@ -0,0 +1,160 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/test_Blowfish.py: Self-test for the Blowfish cipher +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.Blowfish""" + +import unittest + +from Cryptodome.Util.py3compat import bchr + +from Cryptodome.Cipher import Blowfish + +# This is a list of (plaintext, ciphertext, key) tuples. +test_data = [ + # Test vectors from http://www.schneier.com/code/vectors.txt + ('0000000000000000', '4ef997456198dd78', '0000000000000000'), + ('ffffffffffffffff', '51866fd5b85ecb8a', 'ffffffffffffffff'), + ('1000000000000001', '7d856f9a613063f2', '3000000000000000'), + ('1111111111111111', '2466dd878b963c9d', '1111111111111111'), + ('1111111111111111', '61f9c3802281b096', '0123456789abcdef'), + ('0123456789abcdef', '7d0cc630afda1ec7', '1111111111111111'), + ('0000000000000000', '4ef997456198dd78', '0000000000000000'), + ('0123456789abcdef', '0aceab0fc6a0a28d', 'fedcba9876543210'), + ('01a1d6d039776742', '59c68245eb05282b', '7ca110454a1a6e57'), + ('5cd54ca83def57da', 'b1b8cc0b250f09a0', '0131d9619dc1376e'), + ('0248d43806f67172', '1730e5778bea1da4', '07a1133e4a0b2686'), + ('51454b582ddf440a', 'a25e7856cf2651eb', '3849674c2602319e'), + ('42fd443059577fa2', '353882b109ce8f1a', '04b915ba43feb5b6'), + ('059b5e0851cf143a', '48f4d0884c379918', '0113b970fd34f2ce'), + ('0756d8e0774761d2', '432193b78951fc98', '0170f175468fb5e6'), + ('762514b829bf486a', '13f04154d69d1ae5', '43297fad38e373fe'), + ('3bdd119049372802', '2eedda93ffd39c79', '07a7137045da2a16'), + ('26955f6835af609a', 'd887e0393c2da6e3', '04689104c2fd3b2f'), + ('164d5e404f275232', '5f99d04f5b163969', '37d06bb516cb7546'), + ('6b056e18759f5cca', '4a057a3b24d3977b', '1f08260d1ac2465e'), + ('004bd6ef09176062', '452031c1e4fada8e', '584023641aba6176'), + ('480d39006ee762f2', '7555ae39f59b87bd', '025816164629b007'), + ('437540c8698f3cfa', '53c55f9cb49fc019', '49793ebc79b3258f'), + ('072d43a077075292', '7a8e7bfa937e89a3', '4fb05e1515ab73a7'), + ('02fe55778117f12a', 'cf9c5d7a4986adb5', '49e95d6d4ca229bf'), + ('1d9d5c5018f728c2', 'd1abb290658bc778', '018310dc409b26d6'), + ('305532286d6f295a', '55cb3774d13ef201', '1c587f1c13924fef'), + ('0123456789abcdef', 'fa34ec4847b268b2', '0101010101010101'), + ('0123456789abcdef', 'a790795108ea3cae', '1f1f1f1f0e0e0e0e'), + ('0123456789abcdef', 'c39e072d9fac631d', 'e0fee0fef1fef1fe'), + ('ffffffffffffffff', '014933e0cdaff6e4', '0000000000000000'), + ('0000000000000000', 'f21e9a77b71c49bc', 'ffffffffffffffff'), + ('0000000000000000', '245946885754369a', '0123456789abcdef'), + ('ffffffffffffffff', '6b5c5a9c5d9e0a5a', 'fedcba9876543210'), + #('fedcba9876543210', 'f9ad597c49db005e', 'f0'), + #('fedcba9876543210', 'e91d21c1d961a6d6', 'f0e1'), + #('fedcba9876543210', 'e9c2b70a1bc65cf3', 'f0e1d2'), + ('fedcba9876543210', 'be1e639408640f05', 'f0e1d2c3'), + ('fedcba9876543210', 'b39e44481bdb1e6e', 'f0e1d2c3b4'), + ('fedcba9876543210', '9457aa83b1928c0d', 'f0e1d2c3b4a5'), + ('fedcba9876543210', '8bb77032f960629d', 'f0e1d2c3b4a596'), + ('fedcba9876543210', 'e87a244e2cc85e82', 'f0e1d2c3b4a59687'), + ('fedcba9876543210', '15750e7a4f4ec577', 'f0e1d2c3b4a5968778'), + ('fedcba9876543210', '122ba70b3ab64ae0', 'f0e1d2c3b4a596877869'), + ('fedcba9876543210', '3a833c9affc537f6', 'f0e1d2c3b4a5968778695a'), + ('fedcba9876543210', '9409da87a90f6bf2', 'f0e1d2c3b4a5968778695a4b'), + ('fedcba9876543210', '884f80625060b8b4', 'f0e1d2c3b4a5968778695a4b3c'), + ('fedcba9876543210', '1f85031c19e11968', 'f0e1d2c3b4a5968778695a4b3c2d'), + ('fedcba9876543210', '79d9373a714ca34f', 'f0e1d2c3b4a5968778695a4b3c2d1e'), + ('fedcba9876543210', '93142887ee3be15c', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f'), + ('fedcba9876543210', '03429e838ce2d14b', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f00'), + ('fedcba9876543210', 'a4299e27469ff67b', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f0011'), + ('fedcba9876543210', 'afd5aed1c1bc96a8', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f001122'), + ('fedcba9876543210', '10851c0e3858da9f', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f00112233'), + ('fedcba9876543210', 'e6f51ed79b9db21f', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f0011223344'), + ('fedcba9876543210', '64a6e14afd36b46f', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f001122334455'), + ('fedcba9876543210', '80c7d7d45a5479ad', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f00112233445566'), + ('fedcba9876543210', '05044b62fa52d080', + 'f0e1d2c3b4a5968778695a4b3c2d1e0f0011223344556677'), +] + + +class KeyLength(unittest.TestCase): + + def runTest(self): + self.assertRaises(ValueError, Blowfish.new, bchr(0) * 3, + Blowfish.MODE_ECB) + self.assertRaises(ValueError, Blowfish.new, bchr(0) * 57, + Blowfish.MODE_ECB) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = Blowfish.new(b'4'*16, Blowfish.MODE_ECB) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(7) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from .common import make_block_tests + tests = make_block_tests(Blowfish, "Blowfish", test_data) + tests.append(KeyLength()) + tests += [TestOutput()] + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py new file mode 100644 index 0000000..8bc21fd --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/CAST.py: Self-test for the CAST-128 (CAST5) cipher +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.CAST""" + +import unittest + +from Cryptodome.Util.py3compat import bchr + +from Cryptodome.Cipher import CAST + +# This is a list of (plaintext, ciphertext, key) tuples. +test_data = [ + # Test vectors from RFC 2144, B.1 + ('0123456789abcdef', '238b4fe5847e44b2', + '0123456712345678234567893456789a', + '128-bit key'), + + ('0123456789abcdef', 'eb6a711a2c02271b', + '01234567123456782345', + '80-bit key'), + + ('0123456789abcdef', '7ac816d16e9b302e', + '0123456712', + '40-bit key'), +] + + +class KeyLength(unittest.TestCase): + + def runTest(self): + self.assertRaises(ValueError, CAST.new, bchr(0) * 4, CAST.MODE_ECB) + self.assertRaises(ValueError, CAST.new, bchr(0) * 17, CAST.MODE_ECB) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = CAST.new(b'4'*16, CAST.MODE_ECB) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(7) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from .common import make_block_tests + + tests = make_block_tests(CAST, "CAST", test_data) + tests.append(KeyLength()) + tests.append(TestOutput()) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py new file mode 100644 index 0000000..f118eb6 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py @@ -0,0 +1,556 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import tobytes, is_string +from Cryptodome.Cipher import AES, DES3, DES +from Cryptodome.Hash import SHAKE128 + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + +class BlockChainingTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + key_192 = get_tag_random("key_192", 24) + iv_128 = get_tag_random("iv_128", 16) + iv_64 = get_tag_random("iv_64", 8) + data_128 = get_tag_random("data_128", 16) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_loopback_64(self): + cipher = DES3.new(self.key_192, self.des3_mode, self.iv_64) + pt = get_tag_random("plaintext", 8 * 100) + ct = cipher.encrypt(pt) + + cipher = DES3.new(self.key_192, self.des3_mode, self.iv_64) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_iv(self): + # If not passed, the iv is created randomly + cipher = AES.new(self.key_128, self.aes_mode) + iv1 = cipher.iv + cipher = AES.new(self.key_128, self.aes_mode) + iv2 = cipher.iv + self.assertNotEqual(iv1, iv2) + self.assertEqual(len(iv1), 16) + + # IV can be passed in uppercase or lowercase + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + ct = cipher.encrypt(self.data_128) + + cipher = AES.new(self.key_128, self.aes_mode, iv=self.iv_128) + self.assertEqual(ct, cipher.encrypt(self.data_128)) + + cipher = AES.new(self.key_128, self.aes_mode, IV=self.iv_128) + self.assertEqual(ct, cipher.encrypt(self.data_128)) + + def test_iv_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_128, self.aes_mode, + iv = u'test1234567890-*') + + def test_only_one_iv(self): + # Only one IV/iv keyword allowed + self.assertRaises(TypeError, AES.new, self.key_128, self.aes_mode, + iv=self.iv_128, IV=self.iv_128) + + def test_iv_with_matching_length(self): + self.assertRaises(ValueError, AES.new, self.key_128, self.aes_mode, + b"") + self.assertRaises(ValueError, AES.new, self.key_128, self.aes_mode, + self.iv_128[:15]) + self.assertRaises(ValueError, AES.new, self.key_128, self.aes_mode, + self.iv_128 + b"0") + + def test_block_size_128(self): + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_block_size_64(self): + cipher = DES3.new(self.key_192, self.des3_mode, self.iv_64) + self.assertEqual(cipher.block_size, DES3.block_size) + + def test_unaligned_data_128(self): + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + for wrong_length in range(1,16): + self.assertRaises(ValueError, cipher.encrypt, b"5" * wrong_length) + + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + for wrong_length in range(1,16): + self.assertRaises(ValueError, cipher.decrypt, b"5" * wrong_length) + + def test_unaligned_data_64(self): + cipher = DES3.new(self.key_192, self.des3_mode, self.iv_64) + for wrong_length in range(1,8): + self.assertRaises(ValueError, cipher.encrypt, b"5" * wrong_length) + + cipher = DES3.new(self.key_192, self.des3_mode, self.iv_64) + for wrong_length in range(1,8): + self.assertRaises(ValueError, cipher.decrypt, b"5" * wrong_length) + + def test_IV_iv_attributes(self): + data = get_tag_random("data", 16 * 100) + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + getattr(cipher, func)(data) + self.assertEqual(cipher.iv, self.iv_128) + self.assertEqual(cipher.IV, self.iv_128) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, self.aes_mode, + self.iv_128, 7) + self.assertRaises(TypeError, AES.new, self.key_128, self.aes_mode, + iv=self.iv_128, unknown=7) + # But some are only known by the base cipher (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, self.aes_mode, iv=self.iv_128, use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_128, self.aes_mode, self.iv_128) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_bytearray(self): + data = b"1" * 128 + data_ba = bytearray(data) + + # Encrypt + key_ba = bytearray(self.key_128) + iv_ba = bytearray(self.iv_128) + + cipher1 = AES.new(self.key_128, self.aes_mode, self.iv_128) + ref1 = cipher1.encrypt(data) + + cipher2 = AES.new(key_ba, self.aes_mode, iv_ba) + key_ba[:3] = b'\xFF\xFF\xFF' + iv_ba[:3] = b'\xFF\xFF\xFF' + ref2 = cipher2.encrypt(data_ba) + + self.assertEqual(ref1, ref2) + self.assertEqual(cipher1.iv, cipher2.iv) + + # Decrypt + key_ba = bytearray(self.key_128) + iv_ba = bytearray(self.iv_128) + + cipher3 = AES.new(self.key_128, self.aes_mode, self.iv_128) + ref3 = cipher3.decrypt(data) + + cipher4 = AES.new(key_ba, self.aes_mode, iv_ba) + key_ba[:3] = b'\xFF\xFF\xFF' + iv_ba[:3] = b'\xFF\xFF\xFF' + ref4 = cipher4.decrypt(data_ba) + + self.assertEqual(ref3, ref4) + + def test_memoryview(self): + data = b"1" * 128 + data_mv = memoryview(bytearray(data)) + + # Encrypt + key_mv = memoryview(bytearray(self.key_128)) + iv_mv = memoryview(bytearray(self.iv_128)) + + cipher1 = AES.new(self.key_128, self.aes_mode, self.iv_128) + ref1 = cipher1.encrypt(data) + + cipher2 = AES.new(key_mv, self.aes_mode, iv_mv) + key_mv[:3] = b'\xFF\xFF\xFF' + iv_mv[:3] = b'\xFF\xFF\xFF' + ref2 = cipher2.encrypt(data_mv) + + self.assertEqual(ref1, ref2) + self.assertEqual(cipher1.iv, cipher2.iv) + + # Decrypt + key_mv = memoryview(bytearray(self.key_128)) + iv_mv = memoryview(bytearray(self.iv_128)) + + cipher3 = AES.new(self.key_128, self.aes_mode, self.iv_128) + ref3 = cipher3.decrypt(data) + + cipher4 = AES.new(key_mv, self.aes_mode, iv_mv) + key_mv[:3] = b'\xFF\xFF\xFF' + iv_mv[:3] = b'\xFF\xFF\xFF' + ref4 = cipher4.decrypt(data_mv) + + self.assertEqual(ref3, ref4) + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + ct = cipher.encrypt(pt) + + output = bytearray(128) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + + def test_output_param_same_buffer(self): + + pt = b'5' * 128 + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + ct = cipher.encrypt(pt) + + pt_ba = bytearray(pt) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + res = cipher.encrypt(pt_ba, output=pt_ba) + self.assertEqual(ct, pt_ba) + self.assertEqual(res, None) + + ct_ba = bytearray(ct) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + res = cipher.decrypt(ct_ba, output=ct_ba) + self.assertEqual(pt, ct_ba) + self.assertEqual(res, None) + + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + ct = cipher.encrypt(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + LEN_PT = 128 + + pt = b'5' * LEN_PT + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + ct = cipher.encrypt(pt) + + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0' * LEN_PT) + + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0' * LEN_PT) + + shorter_output = bytearray(LEN_PT - 1) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + cipher = AES.new(b'4'*16, self.aes_mode, iv=self.iv_128) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +class CbcTests(BlockChainingTests): + aes_mode = AES.MODE_CBC + des3_mode = DES3.MODE_CBC + + +class NistBlockChainingVectors(unittest.TestCase): + + def _do_kat_aes_test(self, file_name): + + test_vectors = load_test_vectors(("Cipher", "AES"), + file_name, + "AES CBC KAT", + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + + cipher = AES.new(tv.key, self.aes_mode, tv.iv) + if direction == "[ENCRYPT]": + self.assertEqual(cipher.encrypt(tv.plaintext), tv.ciphertext) + elif direction == "[DECRYPT]": + self.assertEqual(cipher.decrypt(tv.ciphertext), tv.plaintext) + else: + assert False + + # See Section 6.4.2 in AESAVS + def _do_mct_aes_test(self, file_name): + + test_vectors = load_test_vectors(("Cipher", "AES"), + file_name, + "AES CBC Montecarlo", + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + cipher = AES.new(tv.key, self.aes_mode, tv.iv) + + if direction == '[ENCRYPT]': + cts = [ tv.iv ] + for count in range(1000): + cts.append(cipher.encrypt(tv.plaintext)) + tv.plaintext = cts[-2] + self.assertEqual(cts[-1], tv.ciphertext) + elif direction == '[DECRYPT]': + pts = [ tv.iv] + for count in range(1000): + pts.append(cipher.decrypt(tv.ciphertext)) + tv.ciphertext = pts[-2] + self.assertEqual(pts[-1], tv.plaintext) + else: + assert False + + def _do_tdes_test(self, file_name): + + test_vectors = load_test_vectors(("Cipher", "TDES"), + file_name, + "TDES CBC KAT", + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + if hasattr(tv, "keys"): + cipher = DES.new(tv.keys, self.des_mode, tv.iv) + else: + if tv.key1 != tv.key3: + key = tv.key1 + tv.key2 + tv.key3 # Option 3 + else: + key = tv.key1 + tv.key2 # Option 2 + cipher = DES3.new(key, self.des3_mode, tv.iv) + + if direction == "[ENCRYPT]": + self.assertEqual(cipher.encrypt(tv.plaintext), tv.ciphertext) + elif direction == "[DECRYPT]": + self.assertEqual(cipher.decrypt(tv.ciphertext), tv.plaintext) + else: + assert False + + +class NistCbcVectors(NistBlockChainingVectors): + aes_mode = AES.MODE_CBC + des_mode = DES.MODE_CBC + des3_mode = DES3.MODE_CBC + + +# Create one test method per file +nist_aes_kat_mmt_files = ( + # KAT + "CBCGFSbox128.rsp", + "CBCGFSbox192.rsp", + "CBCGFSbox256.rsp", + "CBCKeySbox128.rsp", + "CBCKeySbox192.rsp", + "CBCKeySbox256.rsp", + "CBCVarKey128.rsp", + "CBCVarKey192.rsp", + "CBCVarKey256.rsp", + "CBCVarTxt128.rsp", + "CBCVarTxt192.rsp", + "CBCVarTxt256.rsp", + # MMT + "CBCMMT128.rsp", + "CBCMMT192.rsp", + "CBCMMT256.rsp", + ) +nist_aes_mct_files = ( + "CBCMCT128.rsp", + "CBCMCT192.rsp", + "CBCMCT256.rsp", + ) + +for file_name in nist_aes_kat_mmt_files: + def new_func(self, file_name=file_name): + self._do_kat_aes_test(file_name) + setattr(NistCbcVectors, "test_AES_" + file_name, new_func) + +for file_name in nist_aes_mct_files: + def new_func(self, file_name=file_name): + self._do_mct_aes_test(file_name) + setattr(NistCbcVectors, "test_AES_" + file_name, new_func) +del file_name, new_func + +nist_tdes_files = ( + "TCBCMMT2.rsp", # 2TDES + "TCBCMMT3.rsp", # 3TDES + "TCBCinvperm.rsp", # Single DES + "TCBCpermop.rsp", + "TCBCsubtab.rsp", + "TCBCvarkey.rsp", + "TCBCvartext.rsp", + ) + +for file_name in nist_tdes_files: + def new_func(self, file_name=file_name): + self._do_tdes_test(file_name) + setattr(NistCbcVectors, "test_TDES_" + file_name, new_func) + +# END OF NIST CBC TEST VECTORS + + +class SP800TestVectors(unittest.TestCase): + """Class exercising the CBC test vectors found in Section F.2 + of NIST SP 800-3A""" + + def test_aes_128(self): + key = '2b7e151628aed2a6abf7158809cf4f3c' + iv = '000102030405060708090a0b0c0d0e0f' + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '7649abac8119b246cee98e9b12e9197d' +\ + '5086cb9b507219ee95db113a917678b2' +\ + '73bed6b8e3c1743b7116e69e22229516' +\ + '3ff1caa1681fac09120eca307586e1a7' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_192(self): + key = '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' + iv = '000102030405060708090a0b0c0d0e0f' + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '4f021db243bc633d7178183a9fa071e8' +\ + 'b4d9ada9ad7dedf4e5e738763f69145a' +\ + '571b242012fb7ae07fa9baac3df102e0' +\ + '08b0e27988598881d920a9e64f5615cd' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_256(self): + key = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' + iv = '000102030405060708090a0b0c0d0e0f' + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = 'f58c4c04d6e5f1ba779eabfb5f7bfbd6' +\ + '9cfc4e967edb808d679f777bc6702c7d' +\ + '39f23369a9d9bacfa530e26304231461' +\ + 'b2eb05e2c39be9fcda6c19078c6a9d1b' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CBC, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(CbcTests) + if config.get('slow_tests'): + tests += list_test_cases(NistCbcVectors) + tests += list_test_cases(SP800TestVectors) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py new file mode 100644 index 0000000..2615720 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py @@ -0,0 +1,936 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof +from Cryptodome.Util.py3compat import tobytes, bchr +from Cryptodome.Cipher import AES +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.Util.strxor import strxor + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class CcmTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # If not passed, the nonce is created randomly + cipher = AES.new(self.key_128, AES.MODE_CCM) + nonce1 = cipher.nonce + cipher = AES.new(self.key_128, AES.MODE_CCM) + nonce2 = cipher.nonce + self.assertEqual(len(nonce1), 11) + self.assertNotEqual(nonce1, nonce2) + + cipher = AES.new(self.key_128, AES.MODE_CCM, self.nonce_96) + ct = cipher.encrypt(self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertEqual(ct, cipher.encrypt(self.data)) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CCM, + nonce=u'test12345678') + + def test_nonce_length(self): + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CCM, + nonce=b"") + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CCM, + nonce=bchr(1) * 6) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CCM, + nonce=bchr(1) * 14) + for x in range(7, 13 + 1): + AES.new(self.key_128, AES.MODE_CCM, nonce=bchr(1) * x) + + def test_block_size(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_nonce_attribute(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, a 11 bytes long nonce is randomly generated + nonce1 = AES.new(self.key_128, AES.MODE_CCM).nonce + nonce2 = AES.new(self.key_128, AES.MODE_CCM).nonce + self.assertEqual(len(nonce1), 11) + self.assertNotEqual(nonce1, nonce2) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CCM, + self.nonce_96, 7) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, unknown=7) + + # But some are only known by the base cipher + # (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_mac_len(self): + # Invalid MAC length + for mac_len in range(3, 17 + 1, 2): + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, mac_len=mac_len) + + # Valid MAC length + for mac_len in range(4, 16 + 1, 2): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + mac_len=mac_len) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), mac_len) + + # Default MAC length + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_longer_assoc_data_than_declared(self): + # More than zero + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=0) + self.assertRaises(ValueError, cipher.update, b"1") + + # Too large + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=15) + self.assertRaises(ValueError, cipher.update, self.data) + + def test_shorter_assoc_data_than_expected(self): + DATA_LEN = len(self.data) + + # With plaintext + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=DATA_LEN + 1) + cipher.update(self.data) + self.assertRaises(ValueError, cipher.encrypt, self.data) + + # With empty plaintext + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=DATA_LEN + 1) + cipher.update(self.data) + self.assertRaises(ValueError, cipher.digest) + + # With ciphertext + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=DATA_LEN + 1) + cipher.update(self.data) + self.assertRaises(ValueError, cipher.decrypt, self.data) + + # With empty ciphertext + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(self.data) + mac = cipher.digest() + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + assoc_len=DATA_LEN + 1) + cipher.update(self.data) + self.assertRaises(ValueError, cipher.verify, mac) + + def test_shorter_and_longer_plaintext_than_declared(self): + DATA_LEN = len(self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=DATA_LEN + 1) + cipher.encrypt(self.data) + self.assertRaises(ValueError, cipher.digest) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=DATA_LEN - 1) + self.assertRaises(ValueError, cipher.encrypt, self.data) + + def test_shorter_ciphertext_than_declared(self): + DATA_LEN = len(self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=DATA_LEN + 1) + cipher.decrypt(ct) + self.assertRaises(ValueError, cipher.verify, mac) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=DATA_LEN - 1) + self.assertRaises(ValueError, cipher.decrypt, ct) + + def test_message_chunks(self): + # Validate that both associated data and plaintext/ciphertext + # can be broken up in chunks of arbitrary length + + auth_data = get_tag_random("authenticated data", 127) + plaintext = get_tag_random("plaintext", 127) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(auth_data) + ciphertext, ref_mac = cipher.encrypt_and_digest(plaintext) + + def break_up(data, chunk_length): + return [data[i:i+chunk_length] for i in range(0, len(data), + chunk_length)] + + # Encryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=127, assoc_len=127) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + pt2 = b"" + for chunk in break_up(ciphertext, chunk_length): + pt2 += cipher.decrypt(chunk) + self.assertEqual(plaintext, pt2) + cipher.verify(ref_mac) + + # Decryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96, + msg_len=127, assoc_len=127) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + ct2 = b"" + for chunk in break_up(plaintext, chunk_length): + ct2 += cipher.encrypt(chunk) + self.assertEqual(ciphertext, ct2) + self.assertEqual(cipher.digest(), ref_mac) + + def test_bytearray(self): + + # Encrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + data_ba = bytearray(self.data) + + cipher1 = AES.new(self.key_128, + AES.MODE_CCM, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + tag = cipher1.digest() + + cipher2 = AES.new(key_ba, + AES.MODE_CCM, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_ba) + data_ba[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + del data_ba + + cipher4 = AES.new(key_ba, + AES.MODE_CCM, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(bytearray(ct_test), bytearray(tag_test)) + + self.assertEqual(self.data, pt_test) + + def test_memoryview(self): + + # Encrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + data_mv = memoryview(bytearray(self.data)) + + cipher1 = AES.new(self.key_128, + AES.MODE_CCM, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + tag = cipher1.digest() + + cipher2 = AES.new(key_mv, + AES.MODE_CCM, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_mv) + data_mv[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + del data_mv + + cipher4 = AES.new(key_mv, + AES.MODE_CCM, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(memoryview(ct_test), memoryview(tag_test)) + + self.assertEqual(self.data, pt_test) + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + tag = cipher.digest() + + output = bytearray(128) + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + res, tag_out = cipher.encrypt_and_digest(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + self.assertEqual(tag, tag_out) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + res = cipher.decrypt_and_verify(ct, tag, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + + pt = b'5' * 16 + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(15) + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +class CcmFSMTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 16) + + def test_valid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + for assoc_len in (None, 0): + for msg_len in (None, len(self.data)): + # Verify path INIT->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + # Verify path INIT->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + for assoc_len in (None, len(self.data)): + for msg_len in (None, 0): + # Verify path INIT->UPDATE->DIGEST + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + cipher.update(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + cipher.update(self.data) + cipher.verify(mac) + + def test_valid_full_path(self): + # Fixed authenticated data, fixed plaintext + for assoc_len in (None, len(self.data)): + for msg_len in (None, len(self.data)): + # Verify path INIT->UPDATE->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + cipher.update(self.data) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + assoc_len=assoc_len, + msg_len=msg_len) + cipher.update(self.data) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + mac = cipher.digest() + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_encrypt_or_decrypt(self): + # Only possible if msg_len is declared in advance + for method_name in "encrypt", "decrypt": + for auth_data in (None, b"333", self.data, + self.data + b"3"): + if auth_data is None: + assoc_len = None + else: + assoc_len = len(auth_data) + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + msg_len=64, + assoc_len=assoc_len) + if auth_data is not None: + cipher.update(auth_data) + method = getattr(cipher, method_name) + method(self.data) + method(self.data) + method(self.data) + method(self.data) + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(self.data) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(self.data) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(self.data) + ct, mac = cipher.encrypt_and_digest(self.data) + + # decrypt_and_verify + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.update(self.data) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data, pt) + + def test_invalid_multiple_encrypt_decrypt_without_msg_len(self): + # Once per method, with or without assoc. data + for method_name in "encrypt", "decrypt": + for assoc_data_present in (True, False): + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96) + if assoc_data_present: + cipher.update(self.data) + method = getattr(cipher, method_name) + method(self.data) + self.assertRaises(TypeError, method, self.data) + + def test_invalid_mixing_encrypt_decrypt(self): + # Once per method, with or without assoc. data + for method1_name, method2_name in (("encrypt", "decrypt"), + ("decrypt", "encrypt")): + for assoc_data_present in (True, False): + cipher = AES.new(self.key_128, AES.MODE_CCM, + nonce=self.nonce_96, + msg_len=32) + if assoc_data_present: + cipher.update(self.data) + getattr(cipher, method1_name)(self.data) + self.assertRaises(TypeError, getattr(cipher, method2_name), + self.data) + + def test_invalid_encrypt_or_update_after_digest(self): + for method_name in "encrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.encrypt(self.data) + cipher.digest() + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data) + + def test_invalid_decrypt_or_update_after_verify(self): + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + for method_name in "decrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_CCM, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + +class TestVectors(unittest.TestCase): + """Class exercising the CCM test vectors found in Appendix C + of NIST SP 800-38C and in RFC 3610""" + + # List of test vectors, each made up of: + # - authenticated data + # - plaintext + # - ciphertext + # - MAC + # - AES key + # - nonce + test_vectors_hex = [ + # NIST SP 800 38C + ( '0001020304050607', + '20212223', + '7162015b', + '4dac255d', + '404142434445464748494a4b4c4d4e4f', + '10111213141516'), + ( '000102030405060708090a0b0c0d0e0f', + '202122232425262728292a2b2c2d2e2f', + 'd2a1f0e051ea5f62081a7792073d593d', + '1fc64fbfaccd', + '404142434445464748494a4b4c4d4e4f', + '1011121314151617'), + ( '000102030405060708090a0b0c0d0e0f10111213', + '202122232425262728292a2b2c2d2e2f3031323334353637', + 'e3b201a9f5b71a7a9b1ceaeccd97e70b6176aad9a4428aa5', + '484392fbc1b09951', + '404142434445464748494a4b4c4d4e4f', + '101112131415161718191a1b'), + ( (''.join(["%02X" % (x*16+y) for x in range(0,16) for y in range(0,16)]))*256, + '202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f', + '69915dad1e84c6376a68c2967e4dab615ae0fd1faec44cc484828529463ccf72', + 'b4ac6bec93e8598e7f0dadbcea5b', + '404142434445464748494a4b4c4d4e4f', + '101112131415161718191a1b1c'), + # RFC3610 + ( '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e', + '588c979a61c663d2f066d0c2c0f989806d5f6b61dac384', + '17e8d12cfdf926e0', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000003020100a0a1a2a3a4a5'), + ( + '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + '72c91a36e135f8cf291ca894085c87e3cc15c439c9e43a3b', + 'a091d56e10400916', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000004030201a0a1a2a3a4a5'), + ( '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20', + '51b1e5f44a197d1da46b0f8e2d282ae871e838bb64da859657', + '4adaa76fbd9fb0c5', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000005040302A0A1A2A3A4A5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e', + 'a28c6865939a9a79faaa5c4c2a9d4a91cdac8c', + '96c861b9c9e61ef1', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000006050403a0a1a2a3a4a5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e1f', + 'dcf1fb7b5d9e23fb9d4e131253658ad86ebdca3e', + '51e83f077d9c2d93', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000007060504a0a1a2a3a4a5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e1f20', + '6fc1b011f006568b5171a42d953d469b2570a4bd87', + '405a0443ac91cb94', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000008070605a0a1a2a3a4a5'), + ( '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e', + '0135d1b2c95f41d5d1d4fec185d166b8094e999dfed96c', + '048c56602c97acbb7490', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '00000009080706a0a1a2a3a4a5'), + ( '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + '7b75399ac0831dd2f0bbd75879a2fd8f6cae6b6cd9b7db24', + 'c17b4433f434963f34b4', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '0000000a090807a0a1a2a3a4a5'), + ( '0001020304050607', + '08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20', + '82531a60cc24945a4b8279181ab5c84df21ce7f9b73f42e197', + 'ea9c07e56b5eb17e5f4e', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '0000000b0a0908a0a1a2a3a4a5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e', + '07342594157785152b074098330abb141b947b', + '566aa9406b4d999988dd', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '0000000c0b0a09a0a1a2a3a4a5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e1f', + '676bb20380b0e301e8ab79590a396da78b834934', + 'f53aa2e9107a8b6c022c', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '0000000d0c0b0aa0a1a2a3a4a5'), + ( '000102030405060708090a0b', + '0c0d0e0f101112131415161718191a1b1c1d1e1f20', + 'c0ffa0d6f05bdb67f24d43a4338d2aa4bed7b20e43', + 'cd1aa31662e7ad65d6db', + 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf', + '0000000e0d0c0ba0a1a2a3a4a5'), + ( '0be1a88bace018b1', + '08e8cf97d820ea258460e96ad9cf5289054d895ceac47c', + '4cb97f86a2a4689a877947ab8091ef5386a6ffbdd080f8', + 'e78cf7cb0cddd7b3', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00412b4ea9cdbe3c9696766cfa'), + ( '63018f76dc8a1bcb', + '9020ea6f91bdd85afa0039ba4baff9bfb79c7028949cd0ec', + '4ccb1e7ca981befaa0726c55d378061298c85c92814abc33', + 'c52ee81d7d77c08a', + 'd7828d13b2b0bdc325a76236df93cc6b', + '0033568ef7b2633c9696766cfa'), + ( 'aa6cfa36cae86b40', + 'b916e0eacc1c00d7dcec68ec0b3bbb1a02de8a2d1aa346132e', + 'b1d23a2220ddc0ac900d9aa03c61fcf4a559a4417767089708', + 'a776796edb723506', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00103fe41336713c9696766cfa'), + ( 'd0d0735c531e1becf049c244', + '12daac5630efa5396f770ce1a66b21f7b2101c', + '14d253c3967b70609b7cbb7c49916028324526', + '9a6f49975bcadeaf', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00764c63b8058e3c9696766cfa'), + ( '77b60f011c03e1525899bcae', + 'e88b6a46c78d63e52eb8c546efb5de6f75e9cc0d', + '5545ff1a085ee2efbf52b2e04bee1e2336c73e3f', + '762c0c7744fe7e3c', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00f8b678094e3b3c9696766cfa'), + ( 'cd9044d2b71fdb8120ea60c0', + '6435acbafb11a82e2f071d7ca4a5ebd93a803ba87f', + '009769ecabdf48625594c59251e6035722675e04c8', + '47099e5ae0704551', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00d560912d3f703c9696766cfa'), + ( 'd85bc7e69f944fb8', + '8a19b950bcf71a018e5e6701c91787659809d67dbedd18', + 'bc218daa947427b6db386a99ac1aef23ade0b52939cb6a', + '637cf9bec2408897c6ba', + 'd7828d13b2b0bdc325a76236df93cc6b', + '0042fff8f1951c3c9696766cfa'), + ( '74a0ebc9069f5b37', + '1761433c37c5a35fc1f39f406302eb907c6163be38c98437', + '5810e6fd25874022e80361a478e3e9cf484ab04f447efff6', + 'f0a477cc2fc9bf548944', + 'd7828d13b2b0bdc325a76236df93cc6b', + '00920f40e56cdc3c9696766cfa'), + ( '44a3aa3aae6475ca', + 'a434a8e58500c6e41530538862d686ea9e81301b5ae4226bfa', + 'f2beed7bc5098e83feb5b31608f8e29c38819a89c8e776f154', + '4d4151a4ed3a8b87b9ce', + 'd7828d13b2b0bdc325a76236df93cc6b', + '0027ca0c7120bc3c9696766cfa'), + ( 'ec46bb63b02520c33c49fd70', + 'b96b49e21d621741632875db7f6c9243d2d7c2', + '31d750a09da3ed7fddd49a2032aabf17ec8ebf', + '7d22c8088c666be5c197', + 'd7828d13b2b0bdc325a76236df93cc6b', + '005b8ccbcd9af83c9696766cfa'), + ( '47a65ac78b3d594227e85e71', + 'e2fcfbb880442c731bf95167c8ffd7895e337076', + 'e882f1dbd38ce3eda7c23f04dd65071eb41342ac', + 'df7e00dccec7ae52987d', + 'd7828d13b2b0bdc325a76236df93cc6b', + '003ebe94044b9a3c9696766cfa'), + ( '6e37a6ef546d955d34ab6059', + 'abf21c0b02feb88f856df4a37381bce3cc128517d4', + 'f32905b88a641b04b9c9ffb58cc390900f3da12ab1', + '6dce9e82efa16da62059', + 'd7828d13b2b0bdc325a76236df93cc6b', + '008d493b30ae8b3c9696766cfa'), + ] + + test_vectors = [[unhexlify(x) for x in tv] for tv in test_vectors_hex] + + def runTest(self): + for assoc_data, pt, ct, mac, key, nonce in self.test_vectors: + # Encrypt + cipher = AES.new(key, AES.MODE_CCM, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + ct2, mac2 = cipher.encrypt_and_digest(pt) + self.assertEqual(ct, ct2) + self.assertEqual(mac, mac2) + + # Decrypt + cipher = AES.new(key, AES.MODE_CCM, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, **extra_params): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._extra_params = extra_params + self._id = "None" + + def setUp(self): + + def filter_tag(group): + return group['tagSize'] // 8 + + self.tv = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + "aes_ccm_test.json", + "Wycheproof AES CCM", + group_tag={'tag_size': filter_tag}) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt CCM Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_CCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + except ValueError as e: + if len(tv.iv) not in range(7, 13 + 1, 2) and "Length of parameter 'nonce'" in str(e): + assert not tv.valid + return + if tv.tag_size not in range(4, 16 + 1, 2) and "Parameter 'mac_len'" in str(e): + assert not tv.valid + return + raise e + + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(ct, tv.ct) + self.assertEqual(tag, tv.tag) + self.warn(tv) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt CCM Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_CCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + except ValueError as e: + if len(tv.iv) not in range(7, 13 + 1, 2) and "Length of parameter 'nonce'" in str(e): + assert not tv.valid + return + if tv.tag_size not in range(4, 16 + 1, 2) and "Parameter 'mac_len'" in str(e): + assert not tv.valid + return + raise e + + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def test_corrupt_decrypt(self, tv): + self._id = "Wycheproof Corrupt Decrypt CCM Test #" + str(tv.id) + if len(tv.iv) not in range(7, 13 + 1, 2) or len(tv.ct) == 0: + return + cipher = AES.new(tv.key, AES.MODE_CCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + cipher.update(tv.aad) + ct_corrupt = strxor(tv.ct, b"\x00" * (len(tv.ct) - 1) + b"\x01") + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct_corrupt, tv.tag) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + self.test_corrupt_decrypt(tv) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(CcmTests) + tests += list_test_cases(CcmFSMTests) + tests += [TestVectors()] + tests += [TestVectorsWycheproof(wycheproof_warnings)] + + return tests + + +if __name__ == '__main__': + def suite(): + unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py new file mode 100644 index 0000000..673bf8e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py @@ -0,0 +1,411 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import tobytes, is_string +from Cryptodome.Cipher import AES, DES3, DES +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.SelfTest.Cipher.test_CBC import BlockChainingTests + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class CfbTests(BlockChainingTests): + + aes_mode = AES.MODE_CFB + des3_mode = DES3.MODE_CFB + + # Redefine test_unaligned_data_128/64 + + def test_unaligned_data_128(self): + plaintexts = [ b"7777777" ] * 100 + + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=8) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=8) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=128) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=128) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_unaligned_data_64(self): + plaintexts = [ b"7777777" ] * 100 + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=8) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=8) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=64) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=64) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + # Extra + + def test_segment_size_128(self): + for bits in range(8, 129, 8): + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, + segment_size=bits) + + for bits in 0, 7, 9, 127, 129: + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CFB, + self.iv_128, + segment_size=bits) + + def test_segment_size_64(self): + for bits in range(8, 65, 8): + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, + segment_size=bits) + + for bits in 0, 7, 9, 63, 65: + self.assertRaises(ValueError, DES3.new, self.key_192, AES.MODE_CFB, + self.iv_64, + segment_size=bits) + + +class NistCfbVectors(unittest.TestCase): + + def _do_kat_aes_test(self, file_name, segment_size): + + test_vectors = load_test_vectors(("Cipher", "AES"), + file_name, + "AES CFB%d KAT" % segment_size, + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + cipher = AES.new(tv.key, AES.MODE_CFB, tv.iv, + segment_size=segment_size) + if direction == "[ENCRYPT]": + self.assertEqual(cipher.encrypt(tv.plaintext), tv.ciphertext) + elif direction == "[DECRYPT]": + self.assertEqual(cipher.decrypt(tv.ciphertext), tv.plaintext) + else: + assert False + + # See Section 6.4.5 in AESAVS + def _do_mct_aes_test(self, file_name, segment_size): + + test_vectors = load_test_vectors(("Cipher", "AES"), + file_name, + "AES CFB%d Montecarlo" % segment_size, + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + assert(segment_size in (8, 128)) + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + cipher = AES.new(tv.key, AES.MODE_CFB, tv.iv, + segment_size=segment_size) + + def get_input(input_text, output_seq, j): + # CFB128 + if segment_size == 128: + if j >= 2: + return output_seq[-2] + return [input_text, tv.iv][j] + # CFB8 + if j == 0: + return input_text + elif j <= 16: + return tv.iv[j - 1:j] + return output_seq[j - 17] + + if direction == '[ENCRYPT]': + cts = [] + for j in range(1000): + plaintext = get_input(tv.plaintext, cts, j) + cts.append(cipher.encrypt(plaintext)) + self.assertEqual(cts[-1], tv.ciphertext) + elif direction == '[DECRYPT]': + pts = [] + for j in range(1000): + ciphertext = get_input(tv.ciphertext, pts, j) + pts.append(cipher.decrypt(ciphertext)) + self.assertEqual(pts[-1], tv.plaintext) + else: + assert False + + def _do_tdes_test(self, file_name, segment_size): + + test_vectors = load_test_vectors(("Cipher", "TDES"), + file_name, + "TDES CFB%d KAT" % segment_size, + { "count" : lambda x: int(x) } ) + if test_vectors is None: + return + + direction = None + for tv in test_vectors: + + # The test vector file contains some directive lines + if is_string(tv): + direction = tv + continue + + self.description = tv.desc + if hasattr(tv, "keys"): + cipher = DES.new(tv.keys, DES.MODE_CFB, tv.iv, + segment_size=segment_size) + else: + if tv.key1 != tv.key3: + key = tv.key1 + tv.key2 + tv.key3 # Option 3 + else: + key = tv.key1 + tv.key2 # Option 2 + cipher = DES3.new(key, DES3.MODE_CFB, tv.iv, + segment_size=segment_size) + if direction == "[ENCRYPT]": + self.assertEqual(cipher.encrypt(tv.plaintext), tv.ciphertext) + elif direction == "[DECRYPT]": + self.assertEqual(cipher.decrypt(tv.ciphertext), tv.plaintext) + else: + assert False + + +# Create one test method per file +nist_aes_kat_mmt_files = ( + # KAT + "CFB?GFSbox128.rsp", + "CFB?GFSbox192.rsp", + "CFB?GFSbox256.rsp", + "CFB?KeySbox128.rsp", + "CFB?KeySbox192.rsp", + "CFB?KeySbox256.rsp", + "CFB?VarKey128.rsp", + "CFB?VarKey192.rsp", + "CFB?VarKey256.rsp", + "CFB?VarTxt128.rsp", + "CFB?VarTxt192.rsp", + "CFB?VarTxt256.rsp", + # MMT + "CFB?MMT128.rsp", + "CFB?MMT192.rsp", + "CFB?MMT256.rsp", + ) +nist_aes_mct_files = ( + "CFB?MCT128.rsp", + "CFB?MCT192.rsp", + "CFB?MCT256.rsp", + ) + +for file_gen_name in nist_aes_kat_mmt_files: + for bits in "8", "128": + file_name = file_gen_name.replace("?", bits) + def new_func(self, file_name=file_name, bits=bits): + self._do_kat_aes_test(file_name, int(bits)) + setattr(NistCfbVectors, "test_AES_" + file_name, new_func) + +for file_gen_name in nist_aes_mct_files: + for bits in "8", "128": + file_name = file_gen_name.replace("?", bits) + def new_func(self, file_name=file_name, bits=bits): + self._do_mct_aes_test(file_name, int(bits)) + setattr(NistCfbVectors, "test_AES_" + file_name, new_func) +del file_name, new_func + +nist_tdes_files = ( + "TCFB?MMT2.rsp", # 2TDES + "TCFB?MMT3.rsp", # 3TDES + "TCFB?invperm.rsp", # Single DES + "TCFB?permop.rsp", + "TCFB?subtab.rsp", + "TCFB?varkey.rsp", + "TCFB?vartext.rsp", + ) + +for file_gen_name in nist_tdes_files: + for bits in "8", "64": + file_name = file_gen_name.replace("?", bits) + def new_func(self, file_name=file_name, bits=bits): + self._do_tdes_test(file_name, int(bits)) + setattr(NistCfbVectors, "test_TDES_" + file_name, new_func) + +# END OF NIST CBC TEST VECTORS + + +class SP800TestVectors(unittest.TestCase): + """Class exercising the CFB test vectors found in Section F.3 + of NIST SP 800-3A""" + + def test_aes_128_cfb8(self): + plaintext = '6bc1bee22e409f96e93d7e117393172aae2d' + ciphertext = '3b79424c9c0dd436bace9e0ed4586a4f32b9' + key = '2b7e151628aed2a6abf7158809cf4f3c' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_192_cfb8(self): + plaintext = '6bc1bee22e409f96e93d7e117393172aae2d' + ciphertext = 'cda2521ef0a905ca44cd057cbf0d47a0678a' + key = '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_256_cfb8(self): + plaintext = '6bc1bee22e409f96e93d7e117393172aae2d' + ciphertext = 'dc1f1a8520a64db55fcc8ac554844e889700' + key = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=8) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_128_cfb128(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '3b3fd92eb72dad20333449f8e83cfb4a' +\ + 'c8a64537a0b3a93fcde3cdad9f1ce58b' +\ + '26751f67a3cbb140b1808cf187a4f4df' +\ + 'c04b05357c5d1c0eeac4c66f9ff7f2e6' + key = '2b7e151628aed2a6abf7158809cf4f3c' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_192_cfb128(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = 'cdc80d6fddf18cab34c25909c99a4174' +\ + '67ce7f7f81173621961a2b70171d3d7a' +\ + '2e1e8a1dd59b88b1c8e60fed1efac4c9' +\ + 'c05f9f9ca9834fa042ae8fba584b09ff' + key = '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_256_cfb128(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + + ciphertext = 'dc7e84bfda79164b7ecd8486985d3860' +\ + '39ffed143b28b1c832113c6331e5407b' +\ + 'df10132415e54b92a13ed0a8267ae2f9' +\ + '75a385741ab9cef82031623d55b1e471' + key = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CFB, iv, segment_size=128) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(CfbTests) + if config.get('slow_tests'): + tests += list_test_cases(NistCfbVectors) + tests += list_test_cases(SP800TestVectors) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py new file mode 100644 index 0000000..ef5be5d --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py @@ -0,0 +1,472 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import tobytes, bchr +from Cryptodome.Cipher import AES, DES3 +from Cryptodome.Hash import SHAKE128, SHA256 +from Cryptodome.Util import Counter + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + +class CtrTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + key_192 = get_tag_random("key_192", 24) + nonce_32 = get_tag_random("nonce_32", 4) + nonce_64 = get_tag_random("nonce_64", 8) + ctr_64 = Counter.new(32, prefix=nonce_32) + ctr_128 = Counter.new(64, prefix=nonce_64) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_loopback_64(self): + cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64) + pt = get_tag_random("plaintext", 8 * 100) + ct = cipher.encrypt(pt) + + cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_invalid_counter_parameter(self): + # Counter object is required for ciphers with short block size + self.assertRaises(TypeError, DES3.new, self.key_192, AES.MODE_CTR) + # Positional arguments are not allowed (Counter must be passed as + # keyword) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR, self.ctr_128) + + def test_nonce_attribute(self): + # Nonce attribute is the prefix passed to Counter (DES3) + cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64) + self.assertEqual(cipher.nonce, self.nonce_32) + + # Nonce attribute is the prefix passed to Counter (AES) + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + self.assertEqual(cipher.nonce, self.nonce_64) + + # Nonce attribute is not defined if suffix is used in Counter + counter = Counter.new(64, prefix=self.nonce_32, suffix=self.nonce_32) + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + self.assertFalse(hasattr(cipher, "nonce")) + + def test_nonce_parameter(self): + # Nonce parameter becomes nonce attribute + cipher1 = AES.new(self.key_128, AES.MODE_CTR, nonce=self.nonce_64) + self.assertEqual(cipher1.nonce, self.nonce_64) + + counter = Counter.new(64, prefix=self.nonce_64, initial_value=0) + cipher2 = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + pt = get_tag_random("plaintext", 65536) + self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt)) + + # Nonce is implicitly created (for AES) when no parameters are passed + nonce1 = AES.new(self.key_128, AES.MODE_CTR).nonce + nonce2 = AES.new(self.key_128, AES.MODE_CTR).nonce + self.assertNotEqual(nonce1, nonce2) + self.assertEqual(len(nonce1), 8) + + # Nonce can be zero-length + cipher = AES.new(self.key_128, AES.MODE_CTR, nonce=b"") + self.assertEqual(b"", cipher.nonce) + cipher.encrypt(b'0'*300) + + # Nonce and Counter are mutually exclusive + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR, + counter=self.ctr_128, nonce=self.nonce_64) + + def test_initial_value_parameter(self): + # Test with nonce parameter + cipher1 = AES.new(self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, initial_value=0xFFFF) + counter = Counter.new(64, prefix=self.nonce_64, initial_value=0xFFFF) + cipher2 = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + pt = get_tag_random("plaintext", 65536) + self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt)) + + # Test without nonce parameter + cipher1 = AES.new(self.key_128, AES.MODE_CTR, + initial_value=0xFFFF) + counter = Counter.new(64, prefix=cipher1.nonce, initial_value=0xFFFF) + cipher2 = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + pt = get_tag_random("plaintext", 65536) + self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt)) + + # Initial_value and Counter are mutually exclusive + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR, + counter=self.ctr_128, initial_value=0) + + def test_initial_value_bytes_parameter(self): + # Same result as when passing an integer + cipher1 = AES.new(self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, + initial_value=b"\x00"*6+b"\xFF\xFF") + cipher2 = AES.new(self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, initial_value=0xFFFF) + pt = get_tag_random("plaintext", 65536) + self.assertEqual(cipher1.encrypt(pt), cipher2.encrypt(pt)) + + # Fail if the iv is too large + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + initial_value=b"5"*17) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, initial_value=b"5"*9) + + # Fail if the iv is too short + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + initial_value=b"5"*15) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, initial_value=b"5"*7) + + def test_iv_with_matching_length(self): + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + counter=Counter.new(120)) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_CTR, + counter=Counter.new(136)) + + def test_block_size_128(self): + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_block_size_64(self): + cipher = DES3.new(self.key_192, DES3.MODE_CTR, counter=self.ctr_64) + self.assertEqual(cipher.block_size, DES3.block_size) + + def test_unaligned_data_128(self): + plaintexts = [ b"7777777" ] * 100 + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_unaligned_data_64(self): + plaintexts = [ b"7777777" ] * 100 + cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, AES.MODE_CTR, counter=self.ctr_64) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR, + 7, counter=self.ctr_128) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_CTR, + counter=self.ctr_128, unknown=7) + # But some are only known by the base cipher (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128, use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=self.ctr_128) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_wrap_around(self): + # Counter is only 8 bits, so we can only encrypt/decrypt 256 blocks (=4096 bytes) + counter = Counter.new(8, prefix=bchr(9) * 15) + max_bytes = 4096 + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + cipher.encrypt(b'9' * max_bytes) + self.assertRaises(OverflowError, cipher.encrypt, b'9') + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + self.assertRaises(OverflowError, cipher.encrypt, b'9' * (max_bytes + 1)) + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + cipher.decrypt(b'9' * max_bytes) + self.assertRaises(OverflowError, cipher.decrypt, b'9') + + cipher = AES.new(self.key_128, AES.MODE_CTR, counter=counter) + self.assertRaises(OverflowError, cipher.decrypt, b'9' * (max_bytes + 1)) + + def test_bytearray(self): + data = b"1" * 16 + iv = b"\x00" * 6 + b"\xFF\xFF" + + # Encrypt + cipher1 = AES.new(self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, + initial_value=iv) + ref1 = cipher1.encrypt(data) + + cipher2 = AES.new(self.key_128, AES.MODE_CTR, + nonce=bytearray(self.nonce_64), + initial_value=bytearray(iv)) + ref2 = cipher2.encrypt(bytearray(data)) + + self.assertEqual(ref1, ref2) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + cipher3 = AES.new(self.key_128, AES.MODE_CTR, + nonce=self.nonce_64, + initial_value=iv) + ref3 = cipher3.decrypt(data) + + cipher4 = AES.new(self.key_128, AES.MODE_CTR, + nonce=bytearray(self.nonce_64), + initial_value=bytearray(iv)) + ref4 = cipher4.decrypt(bytearray(data)) + + self.assertEqual(ref3, ref4) + + def test_very_long_data(self): + cipher = AES.new(b'A' * 32, AES.MODE_CTR, nonce=b'') + ct = cipher.encrypt(b'B' * 1000000) + digest = SHA256.new(ct).hexdigest() + self.assertEqual(digest, "96204fc470476561a3a8f3b6fe6d24be85c87510b638142d1d0fb90989f8a6a6") + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + ct = cipher.encrypt(pt) + + output = bytearray(128) + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + ct = cipher.encrypt(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + LEN_PT = 128 + + pt = b'5' * LEN_PT + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + ct = cipher.encrypt(pt) + + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0' * LEN_PT) + + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0' * LEN_PT) + + shorter_output = bytearray(LEN_PT - 1) + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + cipher = AES.new(b'4'*16, AES.MODE_CTR, nonce=self.nonce_64) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +class SP800TestVectors(unittest.TestCase): + """Class exercising the CTR test vectors found in Section F.5 + of NIST SP 800-38A""" + + def test_aes_128(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '874d6191b620e3261bef6864990db6ce' +\ + '9806f66b7970fdff8617187bb9fffdff' +\ + '5ae4df3edbd5d35e5b4f09020db03eab' +\ + '1e031dda2fbe03d1792170a0f3009cee' + key = '2b7e151628aed2a6abf7158809cf4f3c' + counter = Counter.new(nbits=16, + prefix=unhexlify('f0f1f2f3f4f5f6f7f8f9fafbfcfd'), + initial_value=0xfeff) + + key = unhexlify(key) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_192(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '1abc932417521ca24f2b0459fe7e6e0b' +\ + '090339ec0aa6faefd5ccc2c6f4ce8e94' +\ + '1e36b26bd1ebc670d1bd1d665620abf7' +\ + '4f78a7f6d29809585a97daec58c6b050' + key = '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' + counter = Counter.new(nbits=16, + prefix=unhexlify('f0f1f2f3f4f5f6f7f8f9fafbfcfd'), + initial_value=0xfeff) + + key = unhexlify(key) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + def test_aes_256(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '601ec313775789a5b7a7f504bbf3d228' +\ + 'f443e3ca4d62b59aca84e990cacaf5c5' +\ + '2b0930daa23de94ce87017ba2d84988d' +\ + 'dfc9c58db67aada613c2dd08457941a6' + key = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' + counter = Counter.new(nbits=16, + prefix=unhexlify('f0f1f2f3f4f5f6f7f8f9fafbfcfd'), + initial_value=0xfeff) + key = unhexlify(key) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + +class RFC3686TestVectors(unittest.TestCase): + + # Each item is a test vector with: + # - plaintext + # - ciphertext + # - key (AES 128, 192 or 256 bits) + # - counter prefix (4 byte nonce + 8 byte nonce) + data = ( + ('53696e676c6520626c6f636b206d7367', + 'e4095d4fb7a7b3792d6175a3261311b8', + 'ae6852f8121067cc4bf7a5765577f39e', + '000000300000000000000000'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + '5104a106168a72d9790d41ee8edad388eb2e1efc46da57c8fce630df9141be28', + '7e24067817fae0d743d6ce1f32539163', + '006cb6dbc0543b59da48d90b'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223', + 'c1cf48a89f2ffdd9cf4652e9efdb72d74540a42bde6d7836d59a5ceaaef3105325b2072f', + '7691be035e5020a8ac6e618529f9a0dc', + '00e0017b27777f3f4a1786f0'), + ('53696e676c6520626c6f636b206d7367', + '4b55384fe259c9c84e7935a003cbe928', + '16af5b145fc9f579c175f93e3bfb0eed863d06ccfdb78515', + '0000004836733c147d6d93cb'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + '453243fc609b23327edfaafa7131cd9f8490701c5ad4a79cfc1fe0ff42f4fb00', + '7c5cb2401b3dc33c19e7340819e0f69c678c3db8e6f6a91a', + '0096b03b020c6eadc2cb500d'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223', + '96893fc55e5c722f540b7dd1ddf7e758d288bc95c69165884536c811662f2188abee0935', + '02bf391ee8ecb159b959617b0965279bf59b60a786d3e0fe', + '0007bdfd5cbd60278dcc0912'), + ('53696e676c6520626c6f636b206d7367', + '145ad01dbf824ec7560863dc71e3e0c0', + '776beff2851db06f4c8a0542c8696f6c6a81af1eec96b4d37fc1d689e6c1c104', + '00000060db5672c97aa8f0b2'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', + 'f05e231b3894612c49ee000b804eb2a9b8306b508f839d6a5530831d9344af1c', + 'f6d66d6bd52d59bb0796365879eff886c66dd51a5b6a99744b50590c87a23884', + '00faac24c1585ef15a43d875'), + ('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223', + 'eb6c52821d0bbbf7ce7594462aca4faab407df866569fd07f48cc0b583d6071f1ec0e6b8', + 'ff7a617ce69148e4f1726e2f43581de2aa62d9f805532edff1eed687fb54153d', + '001cc5b751a51d70a1c11148') + ) + + bindata = [] + for tv in data: + bindata.append([unhexlify(x) for x in tv]) + + def runTest(self): + for pt, ct, key, prefix in self.bindata: + counter = Counter.new(32, prefix=prefix) + cipher = AES.new(key, AES.MODE_CTR, counter=counter) + result = cipher.encrypt(pt) + self.assertEqual(hexlify(ct), hexlify(result)) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(CtrTests) + tests += list_test_cases(SP800TestVectors) + tests += [ RFC3686TestVectors() ] + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py new file mode 100644 index 0000000..92c6f3c --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py @@ -0,0 +1,529 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import os +import re +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.Util.py3compat import b, tobytes, bchr +from Cryptodome.Util.strxor import strxor_c +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Cipher import ChaCha20 + + +class ChaCha20Test(unittest.TestCase): + + def test_new_positive(self): + cipher = ChaCha20.new(key=b("0")*32, nonce=b"0"*8) + self.assertEqual(cipher.nonce, b"0" * 8) + cipher = ChaCha20.new(key=b("0")*32, nonce=b"0"*12) + self.assertEqual(cipher.nonce, b"0" * 12) + + def test_new_negative(self): + new = ChaCha20.new + self.assertRaises(TypeError, new) + self.assertRaises(TypeError, new, nonce=b("0")) + self.assertRaises(ValueError, new, nonce=b("0")*8, key=b("0")) + self.assertRaises(ValueError, new, nonce=b("0"), key=b("0")*32) + + def test_default_nonce(self): + cipher1 = ChaCha20.new(key=bchr(1) * 32) + cipher2 = ChaCha20.new(key=bchr(1) * 32) + self.assertEqual(len(cipher1.nonce), 8) + self.assertNotEqual(cipher1.nonce, cipher2.nonce) + + def test_nonce(self): + key = b'A' * 32 + + nonce1 = b'P' * 8 + cipher1 = ChaCha20.new(key=key, nonce=nonce1) + self.assertEqual(nonce1, cipher1.nonce) + + nonce2 = b'Q' * 12 + cipher2 = ChaCha20.new(key=key, nonce=nonce2) + self.assertEqual(nonce2, cipher2.nonce) + + def test_eiter_encrypt_or_decrypt(self): + """Verify that a cipher cannot be used for both decrypting and encrypting""" + + c1 = ChaCha20.new(key=b("5") * 32, nonce=b("6") * 8) + c1.encrypt(b("8")) + self.assertRaises(TypeError, c1.decrypt, b("9")) + + c2 = ChaCha20.new(key=b("5") * 32, nonce=b("6") * 8) + c2.decrypt(b("8")) + self.assertRaises(TypeError, c2.encrypt, b("9")) + + def test_round_trip(self): + pt = b("A") * 1024 + c1 = ChaCha20.new(key=b("5") * 32, nonce=b("6") * 8) + c2 = ChaCha20.new(key=b("5") * 32, nonce=b("6") * 8) + ct = c1.encrypt(pt) + self.assertEqual(c2.decrypt(ct), pt) + + self.assertEqual(c1.encrypt(b("")), b("")) + self.assertEqual(c2.decrypt(b("")), b("")) + + def test_streaming(self): + """Verify that an arbitrary number of bytes can be encrypted/decrypted""" + from Cryptodome.Hash import SHA1 + + segments = (1, 3, 5, 7, 11, 17, 23) + total = sum(segments) + + pt = b("") + while len(pt) < total: + pt += SHA1.new(pt).digest() + + cipher1 = ChaCha20.new(key=b("7") * 32, nonce=b("t") * 8) + ct = cipher1.encrypt(pt) + + cipher2 = ChaCha20.new(key=b("7") * 32, nonce=b("t") * 8) + cipher3 = ChaCha20.new(key=b("7") * 32, nonce=b("t") * 8) + idx = 0 + for segment in segments: + self.assertEqual(cipher2.decrypt(ct[idx:idx+segment]), pt[idx:idx+segment]) + self.assertEqual(cipher3.encrypt(pt[idx:idx+segment]), ct[idx:idx+segment]) + idx += segment + + def test_seek(self): + cipher1 = ChaCha20.new(key=b("9") * 32, nonce=b("e") * 8) + + offset = 64 * 900 + 7 + pt = b("1") * 64 + + cipher1.encrypt(b("0") * offset) + ct1 = cipher1.encrypt(pt) + + cipher2 = ChaCha20.new(key=b("9") * 32, nonce=b("e") * 8) + cipher2.seek(offset) + ct2 = cipher2.encrypt(pt) + + self.assertEqual(ct1, ct2) + + def test_seek_tv(self): + # Test Vector #4, A.1 from + # http://tools.ietf.org/html/draft-nir-cfrg-chacha20-poly1305-04 + key = bchr(0) + bchr(255) + bchr(0) * 30 + nonce = bchr(0) * 8 + cipher = ChaCha20.new(key=key, nonce=nonce) + cipher.seek(64 * 2) + expected_key_stream = unhexlify(b( + "72d54dfbf12ec44b362692df94137f32" + "8fea8da73990265ec1bbbea1ae9af0ca" + "13b25aa26cb4a648cb9b9d1be65b2c09" + "24a66c54d545ec1b7374f4872e99f096" + )) + ct = cipher.encrypt(bchr(0) * len(expected_key_stream)) + self.assertEqual(expected_key_stream, ct) + + def test_rfc7539(self): + # from https://tools.ietf.org/html/rfc7539 Annex A.1 + # Each item is: key, nonce, block #, plaintext, ciphertext + tvs = [ + # Test Vector #1 + ( + "00"*32, + "00"*12, + 0, + "00"*16*4, + "76b8e0ada0f13d90405d6ae55386bd28" + "bdd219b8a08ded1aa836efcc8b770dc7" + "da41597c5157488d7724e03fb8d84a37" + "6a43b8f41518a11cc387b669b2ee6586" + ), + # Test Vector #2 + ( + "00"*31 + "01", + "00"*11 + "02", + 1, + "416e79207375626d697373696f6e2074" + "6f20746865204945544620696e74656e" + "6465642062792074686520436f6e7472" + "696275746f7220666f72207075626c69" + "636174696f6e20617320616c6c206f72" + "2070617274206f6620616e2049455446" + "20496e7465726e65742d447261667420" + "6f722052464320616e6420616e792073" + "746174656d656e74206d616465207769" + "7468696e2074686520636f6e74657874" + "206f6620616e20494554462061637469" + "7669747920697320636f6e7369646572" + "656420616e20224945544620436f6e74" + "7269627574696f6e222e205375636820" + "73746174656d656e747320696e636c75" + "6465206f72616c2073746174656d656e" + "747320696e2049455446207365737369" + "6f6e732c2061732077656c6c20617320" + "7772697474656e20616e6420656c6563" + "74726f6e696320636f6d6d756e696361" + "74696f6e73206d61646520617420616e" + "792074696d65206f7220706c6163652c" + "20776869636820617265206164647265" + "7373656420746f", + "a3fbf07df3fa2fde4f376ca23e827370" + "41605d9f4f4f57bd8cff2c1d4b7955ec" + "2a97948bd3722915c8f3d337f7d37005" + "0e9e96d647b7c39f56e031ca5eb6250d" + "4042e02785ececfa4b4bb5e8ead0440e" + "20b6e8db09d881a7c6132f420e527950" + "42bdfa7773d8a9051447b3291ce1411c" + "680465552aa6c405b7764d5e87bea85a" + "d00f8449ed8f72d0d662ab052691ca66" + "424bc86d2df80ea41f43abf937d3259d" + "c4b2d0dfb48a6c9139ddd7f76966e928" + "e635553ba76c5c879d7b35d49eb2e62b" + "0871cdac638939e25e8a1e0ef9d5280f" + "a8ca328b351c3c765989cbcf3daa8b6c" + "cc3aaf9f3979c92b3720fc88dc95ed84" + "a1be059c6499b9fda236e7e818b04b0b" + "c39c1e876b193bfe5569753f88128cc0" + "8aaa9b63d1a16f80ef2554d7189c411f" + "5869ca52c5b83fa36ff216b9c1d30062" + "bebcfd2dc5bce0911934fda79a86f6e6" + "98ced759c3ff9b6477338f3da4f9cd85" + "14ea9982ccafb341b2384dd902f3d1ab" + "7ac61dd29c6f21ba5b862f3730e37cfd" + "c4fd806c22f221" + ), + # Test Vector #3 + ( + "1c9240a5eb55d38af333888604f6b5f0" + "473917c1402b80099dca5cbc207075c0", + "00"*11 + "02", + 42, + "2754776173206272696c6c69672c2061" + "6e642074686520736c6974687920746f" + "7665730a446964206779726520616e64" + "2067696d626c6520696e207468652077" + "6162653a0a416c6c206d696d73792077" + "6572652074686520626f726f676f7665" + "732c0a416e6420746865206d6f6d6520" + "7261746873206f757467726162652e", + "62e6347f95ed87a45ffae7426f27a1df" + "5fb69110044c0d73118effa95b01e5cf" + "166d3df2d721caf9b21e5fb14c616871" + "fd84c54f9d65b283196c7fe4f60553eb" + "f39c6402c42234e32a356b3e764312a6" + "1a5532055716ead6962568f87d3f3f77" + "04c6a8d1bcd1bf4d50d6154b6da731b1" + "87b58dfd728afa36757a797ac188d1" + ) + ] + + for tv in tvs: + key = unhexlify(tv[0]) + nonce = unhexlify(tv[1]) + offset = tv[2] * 64 + pt = unhexlify(tv[3]) + ct_expect = unhexlify(tv[4]) + + cipher = ChaCha20.new(key=key, nonce=nonce) + if offset != 0: + cipher.seek(offset) + ct = cipher.encrypt(pt) + assert(ct == ct_expect) + + +class XChaCha20Test(unittest.TestCase): + + # From https://tools.ietf.org/html/draft-arciszewski-xchacha-03 + + def test_hchacha20(self): + # Section 2.2.1 + + from Cryptodome.Cipher.ChaCha20 import _HChaCha20 + + key = b"00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:14:15:16:17:18:19:1a:1b:1c:1d:1e:1f" + key = unhexlify(key.replace(b":", b"")) + + nonce = b"00:00:00:09:00:00:00:4a:00:00:00:00:31:41:59:27" + nonce = unhexlify(nonce.replace(b":", b"")) + + subkey = _HChaCha20(key, nonce) + + expected = b"82413b42 27b27bfe d30e4250 8a877d73 a0f9e4d5 8a74a853 c12ec413 26d3ecdc" + expected = unhexlify(expected.replace(b" ", b"")) + + self.assertEqual(subkey, expected) + + def test_nonce(self): + key = b'A' * 32 + nonce = b'P' * 24 + cipher = ChaCha20.new(key=key, nonce=nonce) + self.assertEqual(nonce, cipher.nonce) + + def test_encrypt(self): + # Section A.3.2 + + pt = b""" + 5468652064686f6c65202870726f6e6f756e6365642022646f6c652229206973 + 20616c736f206b6e6f776e2061732074686520417369617469632077696c6420 + 646f672c2072656420646f672c20616e642077686973746c696e6720646f672e + 2049742069732061626f7574207468652073697a65206f662061204765726d61 + 6e20736865706865726420627574206c6f6f6b73206d6f7265206c696b652061 + 206c6f6e672d6c656767656420666f782e205468697320686967686c7920656c + 757369766520616e6420736b696c6c6564206a756d70657220697320636c6173 + 736966696564207769746820776f6c7665732c20636f796f7465732c206a6163 + 6b616c732c20616e6420666f78657320696e20746865207461786f6e6f6d6963 + 2066616d696c792043616e696461652e""" + pt = unhexlify(pt.replace(b"\n", b"").replace(b" ", b"")) + + key = unhexlify(b"808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f") + iv = unhexlify(b"404142434445464748494a4b4c4d4e4f5051525354555658") + + ct = b""" + 7d0a2e6b7f7c65a236542630294e063b7ab9b555a5d5149aa21e4ae1e4fbce87 + ecc8e08a8b5e350abe622b2ffa617b202cfad72032a3037e76ffdcdc4376ee05 + 3a190d7e46ca1de04144850381b9cb29f051915386b8a710b8ac4d027b8b050f + 7cba5854e028d564e453b8a968824173fc16488b8970cac828f11ae53cabd201 + 12f87107df24ee6183d2274fe4c8b1485534ef2c5fbc1ec24bfc3663efaa08bc + 047d29d25043532db8391a8a3d776bf4372a6955827ccb0cdd4af403a7ce4c63 + d595c75a43e045f0cce1f29c8b93bd65afc5974922f214a40b7c402cdb91ae73 + c0b63615cdad0480680f16515a7ace9d39236464328a37743ffc28f4ddb324f4 + d0f5bbdc270c65b1749a6efff1fbaa09536175ccd29fb9e6057b307320d31683 + 8a9c71f70b5b5907a66f7ea49aadc409""" + ct = unhexlify(ct.replace(b"\n", b"").replace(b" ", b"")) + + cipher = ChaCha20.new(key=key, nonce=iv) + cipher.seek(64) # Counter = 1 + ct_test = cipher.encrypt(pt) + self.assertEqual(ct, ct_test) + + +class ByteArrayTest(unittest.TestCase): + """Verify we can encrypt or decrypt bytearrays""" + + def runTest(self): + + data = b"0123" + key = b"9" * 32 + nonce = b"t" * 8 + + # Encryption + data_ba = bytearray(data) + key_ba = bytearray(key) + nonce_ba = bytearray(nonce) + + cipher1 = ChaCha20.new(key=key, nonce=nonce) + ct = cipher1.encrypt(data) + + cipher2 = ChaCha20.new(key=key_ba, nonce=nonce_ba) + key_ba[:1] = b'\xFF' + nonce_ba[:1] = b'\xFF' + ct_test = cipher2.encrypt(data_ba) + + self.assertEqual(ct, ct_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decryption + key_ba = bytearray(key) + nonce_ba = bytearray(nonce) + ct_ba = bytearray(ct) + + cipher3 = ChaCha20.new(key=key_ba, nonce=nonce_ba) + key_ba[:1] = b'\xFF' + nonce_ba[:1] = b'\xFF' + pt_test = cipher3.decrypt(ct_ba) + + self.assertEqual(data, pt_test) + + +class MemoryviewTest(unittest.TestCase): + """Verify we can encrypt or decrypt bytearrays""" + + def runTest(self): + + data = b"0123" + key = b"9" * 32 + nonce = b"t" * 8 + + # Encryption + data_mv = memoryview(bytearray(data)) + key_mv = memoryview(bytearray(key)) + nonce_mv = memoryview(bytearray(nonce)) + + cipher1 = ChaCha20.new(key=key, nonce=nonce) + ct = cipher1.encrypt(data) + + cipher2 = ChaCha20.new(key=key_mv, nonce=nonce_mv) + key_mv[:1] = b'\xFF' + nonce_mv[:1] = b'\xFF' + ct_test = cipher2.encrypt(data_mv) + + self.assertEqual(ct, ct_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decryption + key_mv = memoryview(bytearray(key)) + nonce_mv = memoryview(bytearray(nonce)) + ct_mv = memoryview(bytearray(ct)) + + cipher3 = ChaCha20.new(key=key_mv, nonce=nonce_mv) + key_mv[:1] = b'\xFF' + nonce_mv[:1] = b'\xFF' + pt_test = cipher3.decrypt(ct_mv) + + self.assertEqual(data, pt_test) + + +class ChaCha20_AGL_NIR(unittest.TestCase): + + # From http://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-04 + # and http://tools.ietf.org/html/draft-nir-cfrg-chacha20-poly1305-04 + tv = [ + ( "00" * 32, + "00" * 8, + "76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc" + "8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11c" + "c387b669b2ee6586" + "9f07e7be5551387a98ba977c732d080d" + "cb0f29a048e3656912c6533e32ee7aed" + "29b721769ce64e43d57133b074d839d5" + "31ed1f28510afb45ace10a1f4b794d6f" + ), + ( "00" * 31 + "01", + "00" * 8, + "4540f05a9f1fb296d7736e7b208e3c96eb4fe1834688d2604f450952" + "ed432d41bbe2a0b6ea7566d2a5d1e7e20d42af2c53d792b1c43fea81" + "7e9ad275ae546963" + "3aeb5224ecf849929b9d828db1ced4dd" + "832025e8018b8160b82284f3c949aa5a" + "8eca00bbb4a73bdad192b5c42f73f2fd" + "4e273644c8b36125a64addeb006c13a0" + ), + ( "00" * 32, + "00" * 7 + "01", + "de9cba7bf3d69ef5e786dc63973f653a0b49e015adbff7134fcb7df1" + "37821031e85a050278a7084527214f73efc7fa5b5277062eb7a0433e" + "445f41e3" + ), + ( "00" * 32, + "01" + "00" * 7, + "ef3fdfd6c61578fbf5cf35bd3dd33b8009631634d21e42ac33960bd1" + "38e50d32111e4caf237ee53ca8ad6426194a88545ddc497a0b466e7d" + "6bbdb0041b2f586b" + ), + ( "000102030405060708090a0b0c0d0e0f101112131415161718191a1b" + "1c1d1e1f", + "0001020304050607", + "f798a189f195e66982105ffb640bb7757f579da31602fc93ec01ac56" + "f85ac3c134a4547b733b46413042c9440049176905d3be59ea1c53f1" + "5916155c2be8241a38008b9a26bc35941e2444177c8ade6689de9526" + "4986d95889fb60e84629c9bd9a5acb1cc118be563eb9b3a4a472f82e" + "09a7e778492b562ef7130e88dfe031c79db9d4f7c7a899151b9a4750" + "32b63fc385245fe054e3dd5a97a5f576fe064025d3ce042c566ab2c5" + "07b138db853e3d6959660996546cc9c4a6eafdc777c040d70eaf46f7" + "6dad3979e5c5360c3317166a1c894c94a371876a94df7628fe4eaaf2" + "ccb27d5aaae0ad7ad0f9d4b6ad3b54098746d4524d38407a6deb3ab7" + "8fab78c9" + ), + ( "00" * 32, + "00" * 7 + "02", + "c2c64d378cd536374ae204b9ef933fcd" + "1a8b2288b3dfa49672ab765b54ee27c7" + "8a970e0e955c14f3a88e741b97c286f7" + "5f8fc299e8148362fa198a39531bed6d" + ), + ] + + def runTest(self): + for (key, nonce, stream) in self.tv: + c = ChaCha20.new(key=unhexlify(b(key)), nonce=unhexlify(b(nonce))) + ct = unhexlify(b(stream)) + pt = b("\x00") * len(ct) + self.assertEqual(c.encrypt(pt), ct) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + key = b'4' * 32 + nonce = b'5' * 8 + cipher = ChaCha20.new(key=key, nonce=nonce) + + pt = b'5' * 300 + ct = cipher.encrypt(pt) + + output = bytearray(len(pt)) + cipher = ChaCha20.new(key=key, nonce=nonce) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = ChaCha20.new(key=key, nonce=nonce) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(len(pt))) + cipher = ChaCha20.new(key=key, nonce=nonce) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = ChaCha20.new(key=key, nonce=nonce) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + cipher = ChaCha20.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*len(pt)) + + cipher = ChaCha20.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*len(pt)) + + shorter_output = bytearray(len(pt) - 1) + + cipher = ChaCha20.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + + cipher = ChaCha20.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(ChaCha20Test) + tests += list_test_cases(XChaCha20Test) + tests.append(ChaCha20_AGL_NIR()) + tests.append(ByteArrayTest()) + tests.append(MemoryviewTest()) + tests.append(TestOutput()) + + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py new file mode 100644 index 0000000..495028a --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py @@ -0,0 +1,776 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Cipher import ChaCha20_Poly1305 +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.Util.strxor import strxor + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class ChaCha20Poly1305Tests(unittest.TestCase): + + key_256 = get_tag_random("key_256", 32) + nonce_96 = get_tag_random("nonce_96", 12) + data_128 = get_tag_random("data_128", 16) + + def test_loopback(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # Nonce can only be 8 or 12 bytes + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=b'H' * 8) + self.assertEqual(len(cipher.nonce), 8) + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=b'H' * 12) + self.assertEqual(len(cipher.nonce), 12) + + # If not passed, the nonce is created randomly + cipher = ChaCha20_Poly1305.new(key=self.key_256) + nonce1 = cipher.nonce + cipher = ChaCha20_Poly1305.new(key=self.key_256) + nonce2 = cipher.nonce + self.assertEqual(len(nonce1), 12) + self.assertNotEqual(nonce1, nonce2) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data_128) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertEqual(ct, cipher.encrypt(self.data_128)) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, + ChaCha20_Poly1305.new, + key=self.key_256, + nonce=u'test12345678') + + def test_nonce_length(self): + # nonce can only be 8 or 12 bytes long + self.assertRaises(ValueError, + ChaCha20_Poly1305.new, + key=self.key_256, + nonce=b'0' * 7) + self.assertRaises(ValueError, + ChaCha20_Poly1305.new, + key=self.key_256, + nonce=b'') + + def test_block_size(self): + # Not based on block ciphers + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertFalse(hasattr(cipher, 'block_size')) + + def test_nonce_attribute(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, a 12 bytes long nonce is randomly generated + nonce1 = ChaCha20_Poly1305.new(key=self.key_256).nonce + nonce2 = ChaCha20_Poly1305.new(key=self.key_256).nonce + self.assertEqual(len(nonce1), 12) + self.assertNotEqual(nonce1, nonce2) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, + ChaCha20_Poly1305.new, + key=self.key_256, + param=9) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_data_must_be_bytes(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_mac_len(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data_128) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data_128) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_message_chunks(self): + # Validate that both associated data and plaintext/ciphertext + # can be broken up in chunks of arbitrary length + + auth_data = get_tag_random("authenticated data", 127) + plaintext = get_tag_random("plaintext", 127) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(auth_data) + ciphertext, ref_mac = cipher.encrypt_and_digest(plaintext) + + def break_up(data, chunk_length): + return [data[i:i+chunk_length] for i in range(0, len(data), + chunk_length)] + + # Encryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + pt2 = b"" + for chunk in break_up(ciphertext, chunk_length): + pt2 += cipher.decrypt(chunk) + self.assertEqual(plaintext, pt2) + cipher.verify(ref_mac) + + # Decryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + ct2 = b"" + for chunk in break_up(plaintext, chunk_length): + ct2 += cipher.encrypt(chunk) + self.assertEqual(ciphertext, ct2) + self.assertEqual(cipher.digest(), ref_mac) + + def test_bytearray(self): + + # Encrypt + key_ba = bytearray(self.key_256) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data_128) + data_ba = bytearray(self.data_128) + + cipher1 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher1.update(self.data_128) + ct = cipher1.encrypt(self.data_128) + tag = cipher1.digest() + + cipher2 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + key_ba[:3] = b'\xFF\xFF\xFF' + nonce_ba[:3] = b'\xFF\xFF\xFF' + cipher2.update(header_ba) + header_ba[:3] = b'\xFF\xFF\xFF' + ct_test = cipher2.encrypt(data_ba) + data_ba[:3] = b'\x99\x99\x99' + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_ba = bytearray(self.key_256) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data_128) + ct_ba = bytearray(ct) + tag_ba = bytearray(tag) + del data_ba + + cipher3 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + key_ba[:3] = b'\xFF\xFF\xFF' + nonce_ba[:3] = b'\xFF\xFF\xFF' + cipher3.update(header_ba) + header_ba[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt(ct_ba) + ct_ba[:3] = b'\xFF\xFF\xFF' + cipher3.verify(tag_ba) + + self.assertEqual(pt_test, self.data_128) + + def test_memoryview(self): + + # Encrypt + key_mv = memoryview(bytearray(self.key_256)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data_128)) + data_mv = memoryview(bytearray(self.data_128)) + + cipher1 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher1.update(self.data_128) + ct = cipher1.encrypt(self.data_128) + tag = cipher1.digest() + + cipher2 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + key_mv[:3] = b'\xFF\xFF\xFF' + nonce_mv[:3] = b'\xFF\xFF\xFF' + cipher2.update(header_mv) + header_mv[:3] = b'\xFF\xFF\xFF' + ct_test = cipher2.encrypt(data_mv) + data_mv[:3] = b'\x99\x99\x99' + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_mv = memoryview(bytearray(self.key_256)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data_128)) + ct_mv = memoryview(bytearray(ct)) + tag_mv = memoryview(bytearray(tag)) + del data_mv + + cipher3 = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + key_mv[:3] = b'\xFF\xFF\xFF' + nonce_mv[:3] = b'\xFF\xFF\xFF' + cipher3.update(header_mv) + header_mv[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt(ct_mv) + ct_mv[:3] = b'\x99\x99\x99' + cipher3.verify(tag_mv) + + self.assertEqual(pt_test, self.data_128) + + +class XChaCha20Poly1305Tests(unittest.TestCase): + + def test_nonce(self): + # Nonce can only be 24 bytes + cipher = ChaCha20_Poly1305.new(key=b'Y' * 32, + nonce=b'H' * 24) + self.assertEqual(len(cipher.nonce), 24) + self.assertEqual(cipher.nonce, b'H' * 24) + + def test_encrypt(self): + # From https://tools.ietf.org/html/draft-arciszewski-xchacha-03 + # Section A.3.1 + + pt = b""" + 4c616469657320616e642047656e746c656d656e206f662074686520636c6173 + 73206f66202739393a204966204920636f756c64206f6666657220796f75206f + 6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73 + 637265656e20776f756c642062652069742e""" + pt = unhexlify(pt.replace(b"\n", b"").replace(b" ", b"")) + + aad = unhexlify(b"50515253c0c1c2c3c4c5c6c7") + key = unhexlify(b"808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f") + iv = unhexlify(b"404142434445464748494a4b4c4d4e4f5051525354555657") + + ct = b""" + bd6d179d3e83d43b9576579493c0e939572a1700252bfaccbed2902c21396cbb + 731c7f1b0b4aa6440bf3a82f4eda7e39ae64c6708c54c216cb96b72e1213b452 + 2f8c9ba40db5d945b11b69b982c1bb9e3f3fac2bc369488f76b2383565d3fff9 + 21f9664c97637da9768812f615c68b13b52e""" + ct = unhexlify(ct.replace(b"\n", b"").replace(b" ", b"")) + + tag = unhexlify(b"c0875924c1c7987947deafd8780acf49") + + cipher = ChaCha20_Poly1305.new(key=key, nonce=iv) + cipher.update(aad) + ct_test, tag_test = cipher.encrypt_and_digest(pt) + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=iv) + cipher.update(aad) + cipher.decrypt_and_verify(ct, tag) + + +class ChaCha20Poly1305FSMTests(unittest.TestCase): + + key_256 = get_tag_random("key_256", 32) + nonce_96 = get_tag_random("nonce_96", 12) + data_128 = get_tag_random("data_128", 16) + + def test_valid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + # Verify path INIT->ENCRYPT->DIGEST + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + # Verify path INIT->DECRYPT->VERIFY + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + # Verify path INIT->UPDATE->DIGEST + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + cipher.verify(mac) + + def test_valid_full_path(self): + # Fixed authenticated data, fixed plaintext + # Verify path INIT->UPDATE->ENCRYPT->DIGEST + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + # Verify path INIT->UPDATE->DECRYPT->VERIFY + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + mac = cipher.digest() + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_encrypt_or_decrypt(self): + for method_name in "encrypt", "decrypt": + for auth_data in (None, b"333", self.data_128, + self.data_128 + b"3"): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + if auth_data is not None: + cipher.update(auth_data) + method = getattr(cipher, method_name) + method(self.data_128) + method(self.data_128) + method(self.data_128) + method(self.data_128) + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + ct, mac = cipher.encrypt_and_digest(self.data_128) + + # decrypt_and_verify + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.update(self.data_128) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data_128, pt) + + def test_invalid_mixing_encrypt_decrypt(self): + # Once per method, with or without assoc. data + for method1_name, method2_name in (("encrypt", "decrypt"), + ("decrypt", "encrypt")): + for assoc_data_present in (True, False): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + if assoc_data_present: + cipher.update(self.data_128) + getattr(cipher, method1_name)(self.data_128) + self.assertRaises(TypeError, getattr(cipher, method2_name), + self.data_128) + + def test_invalid_encrypt_or_update_after_digest(self): + for method_name in "encrypt", "update": + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.encrypt(self.data_128) + cipher.digest() + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data_128) + + def test_invalid_decrypt_or_update_after_verify(self): + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + for method_name in "decrypt", "update": + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + cipher = ChaCha20_Poly1305.new(key=self.key_256, + nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + +def compact(x): + return unhexlify(x.replace(" ", "").replace(":", "")) + + +class TestVectorsRFC(unittest.TestCase): + """Test cases from RFC7539""" + + # AAD, PT, CT, MAC, KEY, NONCE + test_vectors_hex = [ + ( '50 51 52 53 c0 c1 c2 c3 c4 c5 c6 c7', + '4c 61 64 69 65 73 20 61 6e 64 20 47 65 6e 74 6c' + '65 6d 65 6e 20 6f 66 20 74 68 65 20 63 6c 61 73' + '73 20 6f 66 20 27 39 39 3a 20 49 66 20 49 20 63' + '6f 75 6c 64 20 6f 66 66 65 72 20 79 6f 75 20 6f' + '6e 6c 79 20 6f 6e 65 20 74 69 70 20 66 6f 72 20' + '74 68 65 20 66 75 74 75 72 65 2c 20 73 75 6e 73' + '63 72 65 65 6e 20 77 6f 75 6c 64 20 62 65 20 69' + '74 2e', + 'd3 1a 8d 34 64 8e 60 db 7b 86 af bc 53 ef 7e c2' + 'a4 ad ed 51 29 6e 08 fe a9 e2 b5 a7 36 ee 62 d6' + '3d be a4 5e 8c a9 67 12 82 fa fb 69 da 92 72 8b' + '1a 71 de 0a 9e 06 0b 29 05 d6 a5 b6 7e cd 3b 36' + '92 dd bd 7f 2d 77 8b 8c 98 03 ae e3 28 09 1b 58' + 'fa b3 24 e4 fa d6 75 94 55 85 80 8b 48 31 d7 bc' + '3f f4 de f0 8e 4b 7a 9d e5 76 d2 65 86 ce c6 4b' + '61 16', + '1a:e1:0b:59:4f:09:e2:6a:7e:90:2e:cb:d0:60:06:91', + '80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f' + '90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f', + '07 00 00 00' + '40 41 42 43 44 45 46 47', + ), + ( 'f3 33 88 86 00 00 00 00 00 00 4e 91', + '49 6e 74 65 72 6e 65 74 2d 44 72 61 66 74 73 20' + '61 72 65 20 64 72 61 66 74 20 64 6f 63 75 6d 65' + '6e 74 73 20 76 61 6c 69 64 20 66 6f 72 20 61 20' + '6d 61 78 69 6d 75 6d 20 6f 66 20 73 69 78 20 6d' + '6f 6e 74 68 73 20 61 6e 64 20 6d 61 79 20 62 65' + '20 75 70 64 61 74 65 64 2c 20 72 65 70 6c 61 63' + '65 64 2c 20 6f 72 20 6f 62 73 6f 6c 65 74 65 64' + '20 62 79 20 6f 74 68 65 72 20 64 6f 63 75 6d 65' + '6e 74 73 20 61 74 20 61 6e 79 20 74 69 6d 65 2e' + '20 49 74 20 69 73 20 69 6e 61 70 70 72 6f 70 72' + '69 61 74 65 20 74 6f 20 75 73 65 20 49 6e 74 65' + '72 6e 65 74 2d 44 72 61 66 74 73 20 61 73 20 72' + '65 66 65 72 65 6e 63 65 20 6d 61 74 65 72 69 61' + '6c 20 6f 72 20 74 6f 20 63 69 74 65 20 74 68 65' + '6d 20 6f 74 68 65 72 20 74 68 61 6e 20 61 73 20' + '2f e2 80 9c 77 6f 72 6b 20 69 6e 20 70 72 6f 67' + '72 65 73 73 2e 2f e2 80 9d', + '64 a0 86 15 75 86 1a f4 60 f0 62 c7 9b e6 43 bd' + '5e 80 5c fd 34 5c f3 89 f1 08 67 0a c7 6c 8c b2' + '4c 6c fc 18 75 5d 43 ee a0 9e e9 4e 38 2d 26 b0' + 'bd b7 b7 3c 32 1b 01 00 d4 f0 3b 7f 35 58 94 cf' + '33 2f 83 0e 71 0b 97 ce 98 c8 a8 4a bd 0b 94 81' + '14 ad 17 6e 00 8d 33 bd 60 f9 82 b1 ff 37 c8 55' + '97 97 a0 6e f4 f0 ef 61 c1 86 32 4e 2b 35 06 38' + '36 06 90 7b 6a 7c 02 b0 f9 f6 15 7b 53 c8 67 e4' + 'b9 16 6c 76 7b 80 4d 46 a5 9b 52 16 cd e7 a4 e9' + '90 40 c5 a4 04 33 22 5e e2 82 a1 b0 a0 6c 52 3e' + 'af 45 34 d7 f8 3f a1 15 5b 00 47 71 8c bc 54 6a' + '0d 07 2b 04 b3 56 4e ea 1b 42 22 73 f5 48 27 1a' + '0b b2 31 60 53 fa 76 99 19 55 eb d6 31 59 43 4e' + 'ce bb 4e 46 6d ae 5a 10 73 a6 72 76 27 09 7a 10' + '49 e6 17 d9 1d 36 10 94 fa 68 f0 ff 77 98 71 30' + '30 5b ea ba 2e da 04 df 99 7b 71 4d 6c 6f 2c 29' + 'a6 ad 5c b4 02 2b 02 70 9b', + 'ee ad 9d 67 89 0c bb 22 39 23 36 fe a1 85 1f 38', + '1c 92 40 a5 eb 55 d3 8a f3 33 88 86 04 f6 b5 f0' + '47 39 17 c1 40 2b 80 09 9d ca 5c bc 20 70 75 c0', + '00 00 00 00 01 02 03 04 05 06 07 08', + ) + ] + + test_vectors = [[unhexlify(x.replace(" ", "").replace(":", "")) for x in tv] for tv in test_vectors_hex] + + def runTest(self): + for assoc_data, pt, ct, mac, key, nonce in self.test_vectors: + # Encrypt + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + cipher.update(assoc_data) + ct2, mac2 = cipher.encrypt_and_digest(pt) + self.assertEqual(ct, ct2) + self.assertEqual(mac, mac2) + + # Decrypt + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + cipher.update(assoc_data) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def load_tests(self, filename): + + def filter_tag(group): + return group['tagSize'] // 8 + + def filter_algo(root): + return root['algorithm'] + + result = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + filename, + "Wycheproof ChaCha20-Poly1305", + root_tag={'algo': filter_algo}, + group_tag={'tag_size': filter_tag}) + return result + + def setUp(self): + self.tv = [] + self.tv.extend(self.load_tests("chacha20_poly1305_test.json")) + self.tv.extend(self.load_tests("xchacha20_poly1305_test.json")) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt %s Test #%s" % (tv.algo, tv.id) + + try: + cipher = ChaCha20_Poly1305.new(key=tv.key, nonce=tv.iv) + except ValueError as e: + assert len(tv.iv) not in (8, 12) and "Nonce must be" in str(e) + return + + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(ct, tv.ct) + self.assertEqual(tag, tv.tag) + self.warn(tv) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt %s Test #%s" % (tv.algo, tv.id) + + try: + cipher = ChaCha20_Poly1305.new(key=tv.key, nonce=tv.iv) + except ValueError as e: + assert len(tv.iv) not in (8, 12) and "Nonce must be" in str(e) + return + + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def test_corrupt_decrypt(self, tv): + self._id = "Wycheproof Corrupt Decrypt ChaCha20-Poly1305 Test #" + str(tv.id) + if len(tv.iv) == 0 or len(tv.ct) < 1: + return + cipher = ChaCha20_Poly1305.new(key=tv.key, nonce=tv.iv) + cipher.update(tv.aad) + ct_corrupt = strxor(tv.ct, b"\x00" * (len(tv.ct) - 1) + b"\x01") + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct_corrupt, tv.tag) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + self.test_corrupt_decrypt(tv) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + key = b'4' * 32 + nonce = b'5' * 12 + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(7) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + + cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(ChaCha20Poly1305Tests) + tests += list_test_cases(XChaCha20Poly1305Tests) + tests += list_test_cases(ChaCha20Poly1305FSMTests) + tests += [TestVectorsRFC()] + tests += [TestVectorsWycheproof(wycheproof_warnings)] + tests += [TestOutput()] + return tests + + +if __name__ == '__main__': + def suite(): + unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py new file mode 100644 index 0000000..df1313a --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py @@ -0,0 +1,374 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/DES.py: Self-test for the (Single) DES cipher +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.DES""" + +import unittest + +from Cryptodome.Cipher import DES + +# This is a list of (plaintext, ciphertext, key, description) tuples. +SP800_17_B1_KEY = '01' * 8 +SP800_17_B2_PT = '00' * 8 +test_data = [ + # Test vectors from Appendix A of NIST SP 800-17 + # "Modes of Operation Validation System (MOVS): Requirements and Procedures" + # http://csrc.nist.gov/publications/nistpubs/800-17/800-17.pdf + + # Appendix A - "Sample Round Outputs for the DES" + ('0000000000000000', '82dcbafbdeab6602', '10316e028c8f3b4a', + "NIST SP800-17 A"), + + # Table B.1 - Variable Plaintext Known Answer Test + ('8000000000000000', '95f8a5e5dd31d900', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #0'), + ('4000000000000000', 'dd7f121ca5015619', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #1'), + ('2000000000000000', '2e8653104f3834ea', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #2'), + ('1000000000000000', '4bd388ff6cd81d4f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #3'), + ('0800000000000000', '20b9e767b2fb1456', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #4'), + ('0400000000000000', '55579380d77138ef', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #5'), + ('0200000000000000', '6cc5defaaf04512f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #6'), + ('0100000000000000', '0d9f279ba5d87260', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #7'), + ('0080000000000000', 'd9031b0271bd5a0a', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #8'), + ('0040000000000000', '424250b37c3dd951', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #9'), + ('0020000000000000', 'b8061b7ecd9a21e5', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #10'), + ('0010000000000000', 'f15d0f286b65bd28', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #11'), + ('0008000000000000', 'add0cc8d6e5deba1', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #12'), + ('0004000000000000', 'e6d5f82752ad63d1', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #13'), + ('0002000000000000', 'ecbfe3bd3f591a5e', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #14'), + ('0001000000000000', 'f356834379d165cd', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #15'), + ('0000800000000000', '2b9f982f20037fa9', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #16'), + ('0000400000000000', '889de068a16f0be6', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #17'), + ('0000200000000000', 'e19e275d846a1298', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #18'), + ('0000100000000000', '329a8ed523d71aec', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #19'), + ('0000080000000000', 'e7fce22557d23c97', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #20'), + ('0000040000000000', '12a9f5817ff2d65d', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #21'), + ('0000020000000000', 'a484c3ad38dc9c19', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #22'), + ('0000010000000000', 'fbe00a8a1ef8ad72', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #23'), + ('0000008000000000', '750d079407521363', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #24'), + ('0000004000000000', '64feed9c724c2faf', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #25'), + ('0000002000000000', 'f02b263b328e2b60', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #26'), + ('0000001000000000', '9d64555a9a10b852', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #27'), + ('0000000800000000', 'd106ff0bed5255d7', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #28'), + ('0000000400000000', 'e1652c6b138c64a5', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #29'), + ('0000000200000000', 'e428581186ec8f46', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #30'), + ('0000000100000000', 'aeb5f5ede22d1a36', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #31'), + ('0000000080000000', 'e943d7568aec0c5c', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #32'), + ('0000000040000000', 'df98c8276f54b04b', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #33'), + ('0000000020000000', 'b160e4680f6c696f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #34'), + ('0000000010000000', 'fa0752b07d9c4ab8', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #35'), + ('0000000008000000', 'ca3a2b036dbc8502', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #36'), + ('0000000004000000', '5e0905517bb59bcf', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #37'), + ('0000000002000000', '814eeb3b91d90726', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #38'), + ('0000000001000000', '4d49db1532919c9f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #39'), + ('0000000000800000', '25eb5fc3f8cf0621', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #40'), + ('0000000000400000', 'ab6a20c0620d1c6f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #41'), + ('0000000000200000', '79e90dbc98f92cca', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #42'), + ('0000000000100000', '866ecedd8072bb0e', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #43'), + ('0000000000080000', '8b54536f2f3e64a8', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #44'), + ('0000000000040000', 'ea51d3975595b86b', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #45'), + ('0000000000020000', 'caffc6ac4542de31', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #46'), + ('0000000000010000', '8dd45a2ddf90796c', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #47'), + ('0000000000008000', '1029d55e880ec2d0', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #48'), + ('0000000000004000', '5d86cb23639dbea9', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #49'), + ('0000000000002000', '1d1ca853ae7c0c5f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #50'), + ('0000000000001000', 'ce332329248f3228', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #51'), + ('0000000000000800', '8405d1abe24fb942', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #52'), + ('0000000000000400', 'e643d78090ca4207', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #53'), + ('0000000000000200', '48221b9937748a23', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #54'), + ('0000000000000100', 'dd7c0bbd61fafd54', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #55'), + ('0000000000000080', '2fbc291a570db5c4', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #56'), + ('0000000000000040', 'e07c30d7e4e26e12', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #57'), + ('0000000000000020', '0953e2258e8e90a1', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #58'), + ('0000000000000010', '5b711bc4ceebf2ee', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #59'), + ('0000000000000008', 'cc083f1e6d9e85f6', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #60'), + ('0000000000000004', 'd2fd8867d50d2dfe', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #61'), + ('0000000000000002', '06e7ea22ce92708f', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #62'), + ('0000000000000001', '166b40b44aba4bd6', SP800_17_B1_KEY, + 'NIST SP800-17 B.1 #63'), + + # Table B.2 - Variable Key Known Answer Test + (SP800_17_B2_PT, '95a8d72813daa94d', '8001010101010101', + 'NIST SP800-17 B.2 #0'), + (SP800_17_B2_PT, '0eec1487dd8c26d5', '4001010101010101', + 'NIST SP800-17 B.2 #1'), + (SP800_17_B2_PT, '7ad16ffb79c45926', '2001010101010101', + 'NIST SP800-17 B.2 #2'), + (SP800_17_B2_PT, 'd3746294ca6a6cf3', '1001010101010101', + 'NIST SP800-17 B.2 #3'), + (SP800_17_B2_PT, '809f5f873c1fd761', '0801010101010101', + 'NIST SP800-17 B.2 #4'), + (SP800_17_B2_PT, 'c02faffec989d1fc', '0401010101010101', + 'NIST SP800-17 B.2 #5'), + (SP800_17_B2_PT, '4615aa1d33e72f10', '0201010101010101', + 'NIST SP800-17 B.2 #6'), + (SP800_17_B2_PT, '2055123350c00858', '0180010101010101', + 'NIST SP800-17 B.2 #7'), + (SP800_17_B2_PT, 'df3b99d6577397c8', '0140010101010101', + 'NIST SP800-17 B.2 #8'), + (SP800_17_B2_PT, '31fe17369b5288c9', '0120010101010101', + 'NIST SP800-17 B.2 #9'), + (SP800_17_B2_PT, 'dfdd3cc64dae1642', '0110010101010101', + 'NIST SP800-17 B.2 #10'), + (SP800_17_B2_PT, '178c83ce2b399d94', '0108010101010101', + 'NIST SP800-17 B.2 #11'), + (SP800_17_B2_PT, '50f636324a9b7f80', '0104010101010101', + 'NIST SP800-17 B.2 #12'), + (SP800_17_B2_PT, 'a8468ee3bc18f06d', '0102010101010101', + 'NIST SP800-17 B.2 #13'), + (SP800_17_B2_PT, 'a2dc9e92fd3cde92', '0101800101010101', + 'NIST SP800-17 B.2 #14'), + (SP800_17_B2_PT, 'cac09f797d031287', '0101400101010101', + 'NIST SP800-17 B.2 #15'), + (SP800_17_B2_PT, '90ba680b22aeb525', '0101200101010101', + 'NIST SP800-17 B.2 #16'), + (SP800_17_B2_PT, 'ce7a24f350e280b6', '0101100101010101', + 'NIST SP800-17 B.2 #17'), + (SP800_17_B2_PT, '882bff0aa01a0b87', '0101080101010101', + 'NIST SP800-17 B.2 #18'), + (SP800_17_B2_PT, '25610288924511c2', '0101040101010101', + 'NIST SP800-17 B.2 #19'), + (SP800_17_B2_PT, 'c71516c29c75d170', '0101020101010101', + 'NIST SP800-17 B.2 #20'), + (SP800_17_B2_PT, '5199c29a52c9f059', '0101018001010101', + 'NIST SP800-17 B.2 #21'), + (SP800_17_B2_PT, 'c22f0a294a71f29f', '0101014001010101', + 'NIST SP800-17 B.2 #22'), + (SP800_17_B2_PT, 'ee371483714c02ea', '0101012001010101', + 'NIST SP800-17 B.2 #23'), + (SP800_17_B2_PT, 'a81fbd448f9e522f', '0101011001010101', + 'NIST SP800-17 B.2 #24'), + (SP800_17_B2_PT, '4f644c92e192dfed', '0101010801010101', + 'NIST SP800-17 B.2 #25'), + (SP800_17_B2_PT, '1afa9a66a6df92ae', '0101010401010101', + 'NIST SP800-17 B.2 #26'), + (SP800_17_B2_PT, 'b3c1cc715cb879d8', '0101010201010101', + 'NIST SP800-17 B.2 #27'), + (SP800_17_B2_PT, '19d032e64ab0bd8b', '0101010180010101', + 'NIST SP800-17 B.2 #28'), + (SP800_17_B2_PT, '3cfaa7a7dc8720dc', '0101010140010101', + 'NIST SP800-17 B.2 #29'), + (SP800_17_B2_PT, 'b7265f7f447ac6f3', '0101010120010101', + 'NIST SP800-17 B.2 #30'), + (SP800_17_B2_PT, '9db73b3c0d163f54', '0101010110010101', + 'NIST SP800-17 B.2 #31'), + (SP800_17_B2_PT, '8181b65babf4a975', '0101010108010101', + 'NIST SP800-17 B.2 #32'), + (SP800_17_B2_PT, '93c9b64042eaa240', '0101010104010101', + 'NIST SP800-17 B.2 #33'), + (SP800_17_B2_PT, '5570530829705592', '0101010102010101', + 'NIST SP800-17 B.2 #34'), + (SP800_17_B2_PT, '8638809e878787a0', '0101010101800101', + 'NIST SP800-17 B.2 #35'), + (SP800_17_B2_PT, '41b9a79af79ac208', '0101010101400101', + 'NIST SP800-17 B.2 #36'), + (SP800_17_B2_PT, '7a9be42f2009a892', '0101010101200101', + 'NIST SP800-17 B.2 #37'), + (SP800_17_B2_PT, '29038d56ba6d2745', '0101010101100101', + 'NIST SP800-17 B.2 #38'), + (SP800_17_B2_PT, '5495c6abf1e5df51', '0101010101080101', + 'NIST SP800-17 B.2 #39'), + (SP800_17_B2_PT, 'ae13dbd561488933', '0101010101040101', + 'NIST SP800-17 B.2 #40'), + (SP800_17_B2_PT, '024d1ffa8904e389', '0101010101020101', + 'NIST SP800-17 B.2 #41'), + (SP800_17_B2_PT, 'd1399712f99bf02e', '0101010101018001', + 'NIST SP800-17 B.2 #42'), + (SP800_17_B2_PT, '14c1d7c1cffec79e', '0101010101014001', + 'NIST SP800-17 B.2 #43'), + (SP800_17_B2_PT, '1de5279dae3bed6f', '0101010101012001', + 'NIST SP800-17 B.2 #44'), + (SP800_17_B2_PT, 'e941a33f85501303', '0101010101011001', + 'NIST SP800-17 B.2 #45'), + (SP800_17_B2_PT, 'da99dbbc9a03f379', '0101010101010801', + 'NIST SP800-17 B.2 #46'), + (SP800_17_B2_PT, 'b7fc92f91d8e92e9', '0101010101010401', + 'NIST SP800-17 B.2 #47'), + (SP800_17_B2_PT, 'ae8e5caa3ca04e85', '0101010101010201', + 'NIST SP800-17 B.2 #48'), + (SP800_17_B2_PT, '9cc62df43b6eed74', '0101010101010180', + 'NIST SP800-17 B.2 #49'), + (SP800_17_B2_PT, 'd863dbb5c59a91a0', '0101010101010140', + 'NIST SP800-17 B.2 #50'), + (SP800_17_B2_PT, 'a1ab2190545b91d7', '0101010101010120', + 'NIST SP800-17 B.2 #51'), + (SP800_17_B2_PT, '0875041e64c570f7', '0101010101010110', + 'NIST SP800-17 B.2 #52'), + (SP800_17_B2_PT, '5a594528bebef1cc', '0101010101010108', + 'NIST SP800-17 B.2 #53'), + (SP800_17_B2_PT, 'fcdb3291de21f0c0', '0101010101010104', + 'NIST SP800-17 B.2 #54'), + (SP800_17_B2_PT, '869efd7f9f265a09', '0101010101010102', + 'NIST SP800-17 B.2 #55'), +] + +class RonRivestTest(unittest.TestCase): + """ Ronald L. Rivest's DES test, see + http://people.csail.mit.edu/rivest/Destest.txt + ABSTRACT + -------- + + We present a simple way to test the correctness of a DES implementation: + Use the recurrence relation: + + X0 = 9474B8E8C73BCA7D (hexadecimal) + + X(i+1) = IF (i is even) THEN E(Xi,Xi) ELSE D(Xi,Xi) + + to compute a sequence of 64-bit values: X0, X1, X2, ..., X16. Here + E(X,K) denotes the DES encryption of X using key K, and D(X,K) denotes + the DES decryption of X using key K. If you obtain + + X16 = 1B1A2DDB4C642438 + + your implementation does not have any of the 36,568 possible single-fault + errors described herein. + """ + def runTest(self): + from binascii import b2a_hex + + X = [] + X[0:] = [b'\x94\x74\xB8\xE8\xC7\x3B\xCA\x7D'] + + for i in range(16): + c = DES.new(X[i],DES.MODE_ECB) + if not (i&1): # (num&1) returns 1 for odd numbers + X[i+1:] = [c.encrypt(X[i])] # even + else: + X[i+1:] = [c.decrypt(X[i])] # odd + + self.assertEqual(b2a_hex(X[16]), + b2a_hex(b'\x1B\x1A\x2D\xDB\x4C\x64\x24\x38')) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = DES.new(b'4'*8, DES.MODE_ECB) + + pt = b'5' * 8 + ct = cipher.encrypt(pt) + + output = bytearray(8) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(8)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*8) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*8) + + shorter_output = bytearray(7) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from .common import make_block_tests + tests = make_block_tests(DES, "DES", test_data) + tests += [RonRivestTest()] + tests += [TestOutput()] + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py new file mode 100644 index 0000000..8f8479b --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py @@ -0,0 +1,195 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/DES3.py: Self-test for the Triple-DES cipher +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.DES3""" + +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.Cipher import DES3 + +from Cryptodome.Util.strxor import strxor_c +from Cryptodome.Util.py3compat import bchr, tostr +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases + +# This is a list of (plaintext, ciphertext, key, description) tuples. +test_data = [ + # Test vector from Appendix B of NIST SP 800-67 + # "Recommendation for the Triple Data Encryption Algorithm (TDEA) Block + # Cipher" + # http://csrc.nist.gov/publications/nistpubs/800-67/SP800-67.pdf + ('54686520717566636b2062726f776e20666f78206a756d70', + 'a826fd8ce53b855fcce21c8112256fe668d5c05dd9b6b900', + '0123456789abcdef23456789abcdef01456789abcdef0123', + 'NIST SP800-67 B.1'), + + # This test is designed to test the DES3 API, not the correctness of the + # output. + ('21e81b7ade88a259', '5c577d4d9b20c0f8', + '9b397ebf81b1181e282f4bb8adbadc6b', 'Two-key 3DES'), +] + +# NIST CAVP test vectors + +nist_tdes_mmt_files = ("TECBMMT2.rsp", "TECBMMT3.rsp") + +for tdes_file in nist_tdes_mmt_files: + + test_vectors = load_test_vectors( + ("Cipher", "TDES"), + tdes_file, + "TDES ECB (%s)" % tdes_file, + {"count": lambda x: int(x)}) or [] + + for index, tv in enumerate(test_vectors): + + # The test vector file contains some directive lines + if isinstance(tv, str): + continue + + key = tv.key1 + tv.key2 + tv.key3 + test_data_item = (tostr(hexlify(tv.plaintext)), + tostr(hexlify(tv.ciphertext)), + tostr(hexlify(key)), + "%s (%s)" % (tdes_file, index)) + test_data.append(test_data_item) + + +class CheckParity(unittest.TestCase): + + def test_parity_option2(self): + before_2k = unhexlify("CABF326FA56734324FFCCABCDEFACABF") + after_2k = DES3.adjust_key_parity(before_2k) + self.assertEqual(after_2k, + unhexlify("CBBF326EA46734324FFDCBBCDFFBCBBF")) + + def test_parity_option3(self): + before_3k = unhexlify("AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCC") + after_3k = DES3.adjust_key_parity(before_3k) + self.assertEqual(after_3k, + unhexlify("ABABABABABABABABBABABABABABABABACDCDCDCDCDCDCDCD")) + + def test_degradation(self): + sub_key1 = bchr(1) * 8 + sub_key2 = bchr(255) * 8 + + # K1 == K2 + self.assertRaises(ValueError, DES3.adjust_key_parity, + sub_key1 * 2 + sub_key2) + + # K2 == K3 + self.assertRaises(ValueError, DES3.adjust_key_parity, + sub_key1 + sub_key2 * 2) + + # K1 == K2 == K3 + self.assertRaises(ValueError, DES3.adjust_key_parity, + sub_key1 * 3) + + # K1 == K2 (with different parity) + self.assertRaises(ValueError, DES3.adjust_key_parity, + sub_key1 + strxor_c(sub_key1, 1) + sub_key2) + + +class DegenerateToDESTest(unittest.TestCase): + + def runTest(self): + sub_key1 = bchr(1) * 8 + sub_key2 = bchr(255) * 8 + + # K1 == K2 + self.assertRaises(ValueError, DES3.new, + sub_key1 * 2 + sub_key2, + DES3.MODE_ECB) + + # K2 == K3 + self.assertRaises(ValueError, DES3.new, + sub_key1 + sub_key2 * 2, + DES3.MODE_ECB) + + # K1 == K2 == K3 + self.assertRaises(ValueError, DES3.new, + sub_key1 * 3, + DES3.MODE_ECB) + + # K2 == K3 (parity is ignored) + self.assertRaises(ValueError, DES3.new, + sub_key1 + sub_key2 + strxor_c(sub_key2, 0x1), + DES3.MODE_ECB) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + cipher = DES3.new(b'4'*8 + b'G'*8 + b'T'*8, DES3.MODE_ECB) + + pt = b'5' * 16 + ct = cipher.encrypt(pt) + + output = bytearray(16) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(16)) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*16) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*16) + + shorter_output = bytearray(7) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + from .common import make_block_tests + + tests = [] + tests = make_block_tests(DES3, "DES3", test_data) + tests.append(DegenerateToDESTest()) + tests += list_test_cases(CheckParity) + tests += [TestOutput()] + return tests + + +if __name__ == '__main__': + import unittest + + def suite(): + unittest.TestSuite(get_tests()) + + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py new file mode 100644 index 0000000..4127a88 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py @@ -0,0 +1,773 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof +from Cryptodome.Util.py3compat import tobytes, bchr +from Cryptodome.Cipher import AES, DES3 +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.Util.strxor import strxor + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class EaxTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + key_192 = get_tag_random("key_192", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data_128 = get_tag_random("data_128", 16) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_loopback_64(self): + cipher = DES3.new(self.key_192, DES3.MODE_EAX, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 8 * 100) + ct = cipher.encrypt(pt) + + cipher = DES3.new(self.key_192, DES3.MODE_EAX, nonce=self.nonce_96) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # If not passed, the nonce is created randomly + cipher = AES.new(self.key_128, AES.MODE_EAX) + nonce1 = cipher.nonce + cipher = AES.new(self.key_128, AES.MODE_EAX) + nonce2 = cipher.nonce + self.assertEqual(len(nonce1), 16) + self.assertNotEqual(nonce1, nonce2) + + cipher = AES.new(self.key_128, AES.MODE_EAX, self.nonce_96) + ct = cipher.encrypt(self.data_128) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertEqual(ct, cipher.encrypt(self.data_128)) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_EAX, + nonce=u'test12345678') + + def test_nonce_length(self): + # nonce can be of any length (but not empty) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_EAX, + nonce=b"") + + for x in range(1, 128): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=bchr(1) * x) + cipher.encrypt(bchr(1)) + + def test_block_size_128(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_block_size_64(self): + cipher = DES3.new(self.key_192, AES.MODE_EAX, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, DES3.block_size) + + def test_nonce_attribute(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, a 16 bytes long nonce is randomly generated + nonce1 = AES.new(self.key_128, AES.MODE_EAX).nonce + nonce2 = AES.new(self.key_128, AES.MODE_EAX).nonce + self.assertEqual(len(nonce1), 16) + self.assertNotEqual(nonce1, nonce2) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_EAX, + self.nonce_96, 7) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_EAX, + nonce=self.nonce_96, unknown=7) + + # But some are only known by the base cipher + # (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96, + use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_mac_len(self): + # Invalid MAC length + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_EAX, + nonce=self.nonce_96, mac_len=2-1) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_EAX, + nonce=self.nonce_96, mac_len=16+1) + + # Valid MAC length + for mac_len in range(2, 16 + 1): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96, + mac_len=mac_len) + _, mac = cipher.encrypt_and_digest(self.data_128) + self.assertEqual(len(mac), mac_len) + + # Default MAC length + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data_128) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data_128) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_message_chunks(self): + # Validate that both associated data and plaintext/ciphertext + # can be broken up in chunks of arbitrary length + + auth_data = get_tag_random("authenticated data", 127) + plaintext = get_tag_random("plaintext", 127) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.update(auth_data) + ciphertext, ref_mac = cipher.encrypt_and_digest(plaintext) + + def break_up(data, chunk_length): + return [data[i:i+chunk_length] for i in range(0, len(data), + chunk_length)] + + # Encryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + pt2 = b"" + for chunk in break_up(ciphertext, chunk_length): + pt2 += cipher.decrypt(chunk) + self.assertEqual(plaintext, pt2) + cipher.verify(ref_mac) + + # Decryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + ct2 = b"" + for chunk in break_up(plaintext, chunk_length): + ct2 += cipher.encrypt(chunk) + self.assertEqual(ciphertext, ct2) + self.assertEqual(cipher.digest(), ref_mac) + + def test_bytearray(self): + + # Encrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data_128) + data_ba = bytearray(self.data_128) + + cipher1 = AES.new(self.key_128, + AES.MODE_EAX, + nonce=self.nonce_96) + cipher1.update(self.data_128) + ct = cipher1.encrypt(self.data_128) + tag = cipher1.digest() + + cipher2 = AES.new(key_ba, + AES.MODE_EAX, + nonce=nonce_ba) + key_ba[:3] = b'\xFF\xFF\xFF' + nonce_ba[:3] = b'\xFF\xFF\xFF' + cipher2.update(header_ba) + header_ba[:3] = b'\xFF\xFF\xFF' + ct_test = cipher2.encrypt(data_ba) + data_ba[:3] = b'\x99\x99\x99' + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data_128) + ct_ba = bytearray(ct) + tag_ba = bytearray(tag) + del data_ba + + cipher3 = AES.new(key_ba, + AES.MODE_EAX, + nonce=nonce_ba) + key_ba[:3] = b'\xFF\xFF\xFF' + nonce_ba[:3] = b'\xFF\xFF\xFF' + cipher3.update(header_ba) + header_ba[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt(ct_ba) + ct_ba[:3] = b'\xFF\xFF\xFF' + cipher3.verify(tag_ba) + + self.assertEqual(pt_test, self.data_128) + + def test_memoryview(self): + + # Encrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data_128)) + data_mv = memoryview(bytearray(self.data_128)) + + cipher1 = AES.new(self.key_128, + AES.MODE_EAX, + nonce=self.nonce_96) + cipher1.update(self.data_128) + ct = cipher1.encrypt(self.data_128) + tag = cipher1.digest() + + cipher2 = AES.new(key_mv, + AES.MODE_EAX, + nonce=nonce_mv) + key_mv[:3] = b'\xFF\xFF\xFF' + nonce_mv[:3] = b'\xFF\xFF\xFF' + cipher2.update(header_mv) + header_mv[:3] = b'\xFF\xFF\xFF' + ct_test = cipher2.encrypt(data_mv) + data_mv[:3] = b'\x99\x99\x99' + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data_128)) + ct_mv = memoryview(bytearray(ct)) + tag_mv = memoryview(bytearray(tag)) + del data_mv + + cipher3 = AES.new(key_mv, + AES.MODE_EAX, + nonce=nonce_mv) + key_mv[:3] = b'\xFF\xFF\xFF' + nonce_mv[:3] = b'\xFF\xFF\xFF' + cipher3.update(header_mv) + header_mv[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt(ct_mv) + ct_mv[:3] = b'\x99\x99\x99' + cipher3.verify(tag_mv) + + self.assertEqual(pt_test, self.data_128) + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + tag = cipher.digest() + + output = bytearray(128) + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + res, tag_out = cipher.encrypt_and_digest(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + self.assertEqual(tag, tag_out) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + res = cipher.decrypt_and_verify(ct, tag, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + LEN_PT = 16 + + pt = b'5' * LEN_PT + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0' * LEN_PT) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0' * LEN_PT) + + shorter_output = bytearray(LEN_PT - 1) + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +class EaxFSMTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data_128 = get_tag_random("data_128", 16) + + def test_valid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + # Verify path INIT->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + # Verify path INIT->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + # Verify path INIT->UPDATE->DIGEST + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + cipher.update(self.data_128) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + cipher.update(self.data_128) + cipher.verify(mac) + + def test_valid_full_path(self): + # Fixed authenticated data, fixed plaintext + # Verify path INIT->UPDATE->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + cipher.update(self.data_128) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + # Verify path INIT->UPDATE->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + cipher.update(self.data_128) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + mac = cipher.digest() + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_encrypt_or_decrypt(self): + for method_name in "encrypt", "decrypt": + for auth_data in (None, b"333", self.data_128, + self.data_128 + b"3"): + if auth_data is None: + assoc_len = None + else: + assoc_len = len(auth_data) + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + if auth_data is not None: + cipher.update(auth_data) + method = getattr(cipher, method_name) + method(self.data_128) + method(self.data_128) + method(self.data_128) + method(self.data_128) + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.update(self.data_128) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.update(self.data_128) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.update(self.data_128) + ct, mac = cipher.encrypt_and_digest(self.data_128) + + # decrypt_and_verify + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.update(self.data_128) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data_128, pt) + + def test_invalid_mixing_encrypt_decrypt(self): + # Once per method, with or without assoc. data + for method1_name, method2_name in (("encrypt", "decrypt"), + ("decrypt", "encrypt")): + for assoc_data_present in (True, False): + cipher = AES.new(self.key_128, AES.MODE_EAX, + nonce=self.nonce_96) + if assoc_data_present: + cipher.update(self.data_128) + getattr(cipher, method1_name)(self.data_128) + self.assertRaises(TypeError, getattr(cipher, method2_name), + self.data_128) + + def test_invalid_encrypt_or_update_after_digest(self): + for method_name in "encrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.encrypt(self.data_128) + cipher.digest() + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data_128) + + def test_invalid_decrypt_or_update_after_verify(self): + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + ct = cipher.encrypt(self.data_128) + mac = cipher.digest() + + for method_name in "decrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + cipher = AES.new(self.key_128, AES.MODE_EAX, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data_128) + + +class TestVectorsPaper(unittest.TestCase): + """Class exercising the EAX test vectors found in + http://www.cs.ucdavis.edu/~rogaway/papers/eax.pdf""" + + test_vectors_hex = [ + ( '6bfb914fd07eae6b', + '', + '', + 'e037830e8389f27b025a2d6527e79d01', + '233952dee4d5ed5f9b9c6d6ff80ff478', + '62EC67F9C3A4A407FCB2A8C49031A8B3' + ), + ( + 'fa3bfd4806eb53fa', + 'f7fb', + '19dd', + '5c4c9331049d0bdab0277408f67967e5', + '91945d3f4dcbee0bf45ef52255f095a4', + 'BECAF043B0A23D843194BA972C66DEBD' + ), + ( '234a3463c1264ac6', + '1a47cb4933', + 'd851d5bae0', + '3a59f238a23e39199dc9266626c40f80', + '01f74ad64077f2e704c0f60ada3dd523', + '70C3DB4F0D26368400A10ED05D2BFF5E' + ), + ( + '33cce2eabff5a79d', + '481c9e39b1', + '632a9d131a', + 'd4c168a4225d8e1ff755939974a7bede', + 'd07cf6cbb7f313bdde66b727afd3c5e8', + '8408DFFF3C1A2B1292DC199E46B7D617' + ), + ( + 'aeb96eaebe2970e9', + '40d0c07da5e4', + '071dfe16c675', + 'cb0677e536f73afe6a14b74ee49844dd', + '35b6d0580005bbc12b0587124557d2c2', + 'FDB6B06676EEDC5C61D74276E1F8E816' + ), + ( + 'd4482d1ca78dce0f', + '4de3b35c3fc039245bd1fb7d', + '835bb4f15d743e350e728414', + 'abb8644fd6ccb86947c5e10590210a4f', + 'bd8e6e11475e60b268784c38c62feb22', + '6EAC5C93072D8E8513F750935E46DA1B' + ), + ( + '65d2017990d62528', + '8b0a79306c9ce7ed99dae4f87f8dd61636', + '02083e3979da014812f59f11d52630da30', + '137327d10649b0aa6e1c181db617d7f2', + '7c77d6e813bed5ac98baa417477a2e7d', + '1A8C98DCD73D38393B2BF1569DEEFC19' + ), + ( + '54b9f04e6a09189a', + '1bda122bce8a8dbaf1877d962b8592dd2d56', + '2ec47b2c4954a489afc7ba4897edcdae8cc3', + '3b60450599bd02c96382902aef7f832a', + '5fff20cafab119ca2fc73549e20f5b0d', + 'DDE59B97D722156D4D9AFF2BC7559826' + ), + ( + '899a175897561d7e', + '6cf36720872b8513f6eab1a8a44438d5ef11', + '0de18fd0fdd91e7af19f1d8ee8733938b1e8', + 'e7f6d2231618102fdb7fe55ff1991700', + 'a4a4782bcffd3ec5e7ef6d8c34a56123', + 'B781FCF2F75FA5A8DE97A9CA48E522EC' + ), + ( + '126735fcc320d25a', + 'ca40d7446e545ffaed3bd12a740a659ffbbb3ceab7', + 'cb8920f87a6c75cff39627b56e3ed197c552d295a7', + 'cfc46afc253b4652b1af3795b124ab6e', + '8395fcf1e95bebd697bd010bc766aac3', + '22E7ADD93CFC6393C57EC0B3C17D6B44' + ), + ] + + test_vectors = [[unhexlify(x) for x in tv] for tv in test_vectors_hex] + + def runTest(self): + for assoc_data, pt, ct, mac, key, nonce in self.test_vectors: + # Encrypt + cipher = AES.new(key, AES.MODE_EAX, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + ct2, mac2 = cipher.encrypt_and_digest(pt) + self.assertEqual(ct, ct2) + self.assertEqual(mac, mac2) + + # Decrypt + cipher = AES.new(key, AES.MODE_EAX, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def setUp(self): + + def filter_tag(group): + return group['tagSize'] // 8 + + self.tv = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + "aes_eax_test.json", + "Wycheproof EAX", + group_tag={'tag_size': filter_tag}) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt EAX Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_EAX, tv.iv, mac_len=tv.tag_size) + except ValueError as e: + assert len(tv.iv) == 0 and "Nonce cannot be empty" in str(e) + return + + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(ct, tv.ct) + self.assertEqual(tag, tv.tag) + self.warn(tv) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt EAX Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_EAX, tv.iv, mac_len=tv.tag_size) + except ValueError as e: + assert len(tv.iv) == 0 and "Nonce cannot be empty" in str(e) + return + + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def test_corrupt_decrypt(self, tv): + self._id = "Wycheproof Corrupt Decrypt EAX Test #" + str(tv.id) + if len(tv.iv) == 0 or len(tv.ct) < 1: + return + cipher = AES.new(tv.key, AES.MODE_EAX, tv.iv, mac_len=tv.tag_size) + cipher.update(tv.aad) + ct_corrupt = strxor(tv.ct, b"\x00" * (len(tv.ct) - 1) + b"\x01") + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct_corrupt, tv.tag) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + self.test_corrupt_decrypt(tv) + + +class TestOtherCiphers(unittest.TestCase): + + @classmethod + def create_test(cls, name, factory, key_size): + + def test_template(self, factory=factory, key_size=key_size): + cipher = factory.new(get_tag_random("cipher", key_size), + factory.MODE_EAX, + nonce=b"nonce") + ct, mac = cipher.encrypt_and_digest(b"plaintext") + + cipher = factory.new(get_tag_random("cipher", key_size), + factory.MODE_EAX, + nonce=b"nonce") + pt2 = cipher.decrypt_and_verify(ct, mac) + + self.assertEqual(b"plaintext", pt2) + + setattr(cls, "test_" + name, test_template) + + +from Cryptodome.Cipher import DES, DES3, ARC2, CAST, Blowfish + +TestOtherCiphers.create_test("DES_" + str(DES.key_size), DES, DES.key_size) +for ks in DES3.key_size: + TestOtherCiphers.create_test("DES3_" + str(ks), DES3, ks) +for ks in ARC2.key_size: + TestOtherCiphers.create_test("ARC2_" + str(ks), ARC2, ks) +for ks in CAST.key_size: + TestOtherCiphers.create_test("CAST_" + str(ks), CAST, ks) +for ks in Blowfish.key_size: + TestOtherCiphers.create_test("Blowfish_" + str(ks), Blowfish, ks) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(EaxTests) + tests += list_test_cases(EaxFSMTests) + tests += [ TestVectorsPaper() ] + tests += [ TestVectorsWycheproof(wycheproof_warnings) ] + tests += list_test_cases(TestOtherCiphers) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py new file mode 100644 index 0000000..ac8e741 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py @@ -0,0 +1,951 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from __future__ import print_function + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors, load_test_vectors_wycheproof + +from Cryptodome.Util.py3compat import tobytes, bchr +from Cryptodome.Cipher import AES +from Cryptodome.Hash import SHAKE128, SHA256 + +from Cryptodome.Util.strxor import strxor + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class GcmTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # Nonce is optional (a random one will be created) + AES.new(self.key_128, AES.MODE_GCM) + + cipher = AES.new(self.key_128, AES.MODE_GCM, self.nonce_96) + ct = cipher.encrypt(self.data) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertEqual(ct, cipher.encrypt(self.data)) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_GCM, + nonce=u'test12345678') + + def test_nonce_length(self): + # nonce can be of any length (but not empty) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_GCM, + nonce=b"") + + for x in range(1, 128): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=bchr(1) * x) + cipher.encrypt(bchr(1)) + + def test_block_size_128(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_nonce_attribute(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, a 15 bytes long nonce is randomly generated + nonce1 = AES.new(self.key_128, AES.MODE_GCM).nonce + nonce2 = AES.new(self.key_128, AES.MODE_GCM).nonce + self.assertEqual(len(nonce1), 16) + self.assertNotEqual(nonce1, nonce2) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_GCM, + self.nonce_96, 7) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_GCM, + nonce=self.nonce_96, unknown=7) + + # But some are only known by the base cipher + # (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96, + use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + result = getattr(cipher, func)(b"") + self.assertEqual(result, b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_mac_len(self): + # Invalid MAC length + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_GCM, + nonce=self.nonce_96, mac_len=3) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_GCM, + nonce=self.nonce_96, mac_len=16+1) + + # Valid MAC length + for mac_len in range(5, 16 + 1): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96, + mac_len=mac_len) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), mac_len) + + # Default MAC length + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_message_chunks(self): + # Validate that both associated data and plaintext/ciphertext + # can be broken up in chunks of arbitrary length + + auth_data = get_tag_random("authenticated data", 127) + plaintext = get_tag_random("plaintext", 127) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.update(auth_data) + ciphertext, ref_mac = cipher.encrypt_and_digest(plaintext) + + def break_up(data, chunk_length): + return [data[i:i+chunk_length] for i in range(0, len(data), + chunk_length)] + + # Encryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + pt2 = b"" + for chunk in break_up(ciphertext, chunk_length): + pt2 += cipher.decrypt(chunk) + self.assertEqual(plaintext, pt2) + cipher.verify(ref_mac) + + # Decryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + ct2 = b"" + for chunk in break_up(plaintext, chunk_length): + ct2 += cipher.encrypt(chunk) + self.assertEqual(ciphertext, ct2) + self.assertEqual(cipher.digest(), ref_mac) + + def test_bytearray(self): + + # Encrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + data_ba = bytearray(self.data) + + cipher1 = AES.new(self.key_128, + AES.MODE_GCM, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + tag = cipher1.digest() + + cipher2 = AES.new(key_ba, + AES.MODE_GCM, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_ba) + data_ba[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + del data_ba + + cipher4 = AES.new(key_ba, + AES.MODE_GCM, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(bytearray(ct_test), bytearray(tag_test)) + + self.assertEqual(self.data, pt_test) + + def test_memoryview(self): + + # Encrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + data_mv = memoryview(bytearray(self.data)) + + cipher1 = AES.new(self.key_128, + AES.MODE_GCM, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + tag = cipher1.digest() + + cipher2 = AES.new(key_mv, + AES.MODE_GCM, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_mv) + data_mv[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + del data_mv + + cipher4 = AES.new(key_mv, + AES.MODE_GCM, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(memoryview(ct_test), memoryview(tag_test)) + + self.assertEqual(self.data, pt_test) + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + tag = cipher.digest() + + output = bytearray(128) + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + res, tag_out = cipher.encrypt_and_digest(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + self.assertEqual(tag, tag_out) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + res = cipher.decrypt_and_verify(ct, tag, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + LEN_PT = 128 + + pt = b'5' * LEN_PT + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + ct = cipher.encrypt(pt) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0' * LEN_PT) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0' * LEN_PT) + + shorter_output = bytearray(LEN_PT - 1) + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +class GcmFSMTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_valid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + # Verify path INIT->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + # Verify path INIT->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + # Verify path INIT->UPDATE->DIGEST + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + cipher.update(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.verify(mac) + + def test_valid_full_path(self): + # Fixed authenticated data, fixed plaintext + # Verify path INIT->UPDATE->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + cipher.update(self.data) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.decrypt(ct) + cipher.verify(mac) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + mac = cipher.digest() + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_encrypt_or_decrypt(self): + for method_name in "encrypt", "decrypt": + for auth_data in (None, b"333", self.data, + self.data + b"3"): + if auth_data is None: + assoc_len = None + else: + assoc_len = len(auth_data) + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + if auth_data is not None: + cipher.update(auth_data) + method = getattr(cipher, method_name) + method(self.data) + method(self.data) + method(self.data) + method(self.data) + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.update(self.data) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.update(self.data) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.update(self.data) + ct, mac = cipher.encrypt_and_digest(self.data) + + # decrypt_and_verify + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.update(self.data) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data, pt) + + def test_invalid_mixing_encrypt_decrypt(self): + # Once per method, with or without assoc. data + for method1_name, method2_name in (("encrypt", "decrypt"), + ("decrypt", "encrypt")): + for assoc_data_present in (True, False): + cipher = AES.new(self.key_128, AES.MODE_GCM, + nonce=self.nonce_96) + if assoc_data_present: + cipher.update(self.data) + getattr(cipher, method1_name)(self.data) + self.assertRaises(TypeError, getattr(cipher, method2_name), + self.data) + + def test_invalid_encrypt_or_update_after_digest(self): + for method_name in "encrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.encrypt(self.data) + cipher.digest() + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data) + + def test_invalid_decrypt_or_update_after_verify(self): + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + mac = cipher.digest() + + for method_name in "decrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_GCM, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + +class TestVectors(unittest.TestCase): + """Class exercising the GCM test vectors found in + http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf""" + + # List of test vectors, each made up of: + # - authenticated data + # - plaintext + # - ciphertext + # - MAC + # - AES key + # - nonce + test_vectors_hex = [ + ( + '', + '', + '', + '58e2fccefa7e3061367f1d57a4e7455a', + '00000000000000000000000000000000', + '000000000000000000000000' + ), + ( + '', + '00000000000000000000000000000000', + '0388dace60b6a392f328c2b971b2fe78', + 'ab6e47d42cec13bdf53a67b21257bddf', + '00000000000000000000000000000000', + '000000000000000000000000' + ), + ( + '', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255', + '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e' + + '21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985', + '4d5c2af327cd64a62cf35abd2ba6fab4', + 'feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e' + + '21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091', + '5bc94fbc3221a5db94fae95ae7121a47', + 'feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c7423' + + '73806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598', + '3612d2e79e3b0785561be14aaca2fccb', + 'feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbad' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca7' + + '01e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5', + '619cc5aefffe0bfa462af43c1699d050', + 'feffe9928665731c6d6a8f9467308308', + '9313225df88406e555909c5aff5269aa' + + '6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b5254' + + '16aedbf5a0de6a57a637b39b' + ), + ( + '', + '', + '', + 'cd33b28ac773f74ba00ed1f312572435', + '000000000000000000000000000000000000000000000000', + '000000000000000000000000' + ), + ( + '', + '00000000000000000000000000000000', + '98e7247c07f0fe411c267e4384b0f600', + '2ff58d80033927ab8ef4d4587514f0fb', + '000000000000000000000000000000000000000000000000', + '000000000000000000000000' + ), + ( + '', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255', + '3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c' + + '7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256', + '9924a7c8587336bfb118024db8674a14', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c' + + '7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710', + '2519498e80f1478f37ba55bd6d27618c', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057' + + 'fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7', + '65dcc57fcf623a24094fcca40d3533f8', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c', + 'cafebabefacedbad' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'd27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e45' + + '81e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b', + 'dcf566ff291c25bbb8568fc3d376a6d9', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c', + '9313225df88406e555909c5aff5269aa' + + '6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b5254' + + '16aedbf5a0de6a57a637b39b' + ), + ( + '', + '', + '', + '530f8afbc74536b9a963b4f1c4cb738b', + '0000000000000000000000000000000000000000000000000000000000000000', + '000000000000000000000000' + ), + ( + '', + '00000000000000000000000000000000', + 'cea7403d4d606b6e074ec5d3baf39d18', + 'd0d1c8a799996bf0265b98b5d48ab919', + '0000000000000000000000000000000000000000000000000000000000000000', + '000000000000000000000000' + ), + ( '', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255', + '522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa' + + '8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad', + 'b094dac5d93471bdec1a502270e3cc6c', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa' + + '8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662', + '76fc6ece0f4e1768cddf8853bb2d551b', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbaddecaf888' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + 'c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0' + + 'feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f', + '3a337dbf46a792c45e454913fe2ea8f2', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308', + 'cafebabefacedbad' + ), + ( + 'feedfacedeadbeeffeedfacedeadbeefabaddad2', + 'd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a72' + + '1c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39', + '5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf4' + + '0fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f', + 'a44a8266ee1c8eb0c8b5d4cf5ae9f19a', + 'feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308', + '9313225df88406e555909c5aff5269aa' + + '6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b5254' + + '16aedbf5a0de6a57a637b39b' + ) + ] + + test_vectors = [[unhexlify(x) for x in tv] for tv in test_vectors_hex] + + def runTest(self): + for assoc_data, pt, ct, mac, key, nonce in self.test_vectors: + + # Encrypt + cipher = AES.new(key, AES.MODE_GCM, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + ct2, mac2 = cipher.encrypt_and_digest(pt) + self.assertEqual(ct, ct2) + self.assertEqual(mac, mac2) + + # Decrypt + cipher = AES.new(key, AES.MODE_GCM, nonce, mac_len=len(mac)) + cipher.update(assoc_data) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + +class TestVectorsGueronKrasnov(unittest.TestCase): + """Class exercising the GCM test vectors found in + 'The fragility of AES-GCM authentication algorithm', Gueron, Krasnov + https://eprint.iacr.org/2013/157.pdf""" + + def test_1(self): + key = unhexlify("3da6c536d6295579c0959a7043efb503") + iv = unhexlify("2b926197d34e091ef722db94") + aad = unhexlify("00000000000000000000000000000000" + + "000102030405060708090a0b0c0d0e0f" + + "101112131415161718191a1b1c1d1e1f" + + "202122232425262728292a2b2c2d2e2f" + + "303132333435363738393a3b3c3d3e3f") + digest = unhexlify("69dd586555ce3fcc89663801a71d957b") + + cipher = AES.new(key, AES.MODE_GCM, iv).update(aad) + self.assertEqual(digest, cipher.digest()) + + def test_2(self): + key = unhexlify("843ffcf5d2b72694d19ed01d01249412") + iv = unhexlify("dbcca32ebf9b804617c3aa9e") + aad = unhexlify("00000000000000000000000000000000" + + "101112131415161718191a1b1c1d1e1f") + pt = unhexlify("000102030405060708090a0b0c0d0e0f" + + "101112131415161718191a1b1c1d1e1f" + + "202122232425262728292a2b2c2d2e2f" + + "303132333435363738393a3b3c3d3e3f" + + "404142434445464748494a4b4c4d4e4f") + ct = unhexlify("6268c6fa2a80b2d137467f092f657ac0" + + "4d89be2beaa623d61b5a868c8f03ff95" + + "d3dcee23ad2f1ab3a6c80eaf4b140eb0" + + "5de3457f0fbc111a6b43d0763aa422a3" + + "013cf1dc37fe417d1fbfc449b75d4cc5") + digest = unhexlify("3b629ccfbc1119b7319e1dce2cd6fd6d") + + cipher = AES.new(key, AES.MODE_GCM, iv).update(aad) + ct2, digest2 = cipher.encrypt_and_digest(pt) + + self.assertEqual(ct, ct2) + self.assertEqual(digest, digest2) + + +class NISTTestVectorsGCM(unittest.TestCase): + + def __init__(self, a): + self.use_clmul = True + unittest.TestCase.__init__(self, a) + + +class NISTTestVectorsGCM_no_clmul(unittest.TestCase): + + def __init__(self, a): + self.use_clmul = False + unittest.TestCase.__init__(self, a) + + +test_vectors_nist = load_test_vectors( + ("Cipher", "AES"), + "gcmDecrypt128.rsp", + "GCM decrypt", + {"count": lambda x: int(x)}) or [] + +test_vectors_nist += load_test_vectors( + ("Cipher", "AES"), + "gcmEncryptExtIV128.rsp", + "GCM encrypt", + {"count": lambda x: int(x)}) or [] + +for idx, tv in enumerate(test_vectors_nist): + + # The test vector file contains some directive lines + if isinstance(tv, str): + continue + + def single_test(self, tv=tv): + + self.description = tv.desc + cipher = AES.new(tv.key, AES.MODE_GCM, nonce=tv.iv, + mac_len=len(tv.tag), use_clmul=self.use_clmul) + cipher.update(tv.aad) + if "FAIL" in tv.others: + self.assertRaises(ValueError, cipher.decrypt_and_verify, + tv.ct, tv.tag) + else: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + self.assertEqual(pt, tv.pt) + + setattr(NISTTestVectorsGCM, "test_%d" % idx, single_test) + setattr(NISTTestVectorsGCM_no_clmul, "test_%d" % idx, single_test) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, **extra_params): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._extra_params = extra_params + self._id = "None" + + def setUp(self): + + def filter_tag(group): + return group['tagSize'] // 8 + + self.tv = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + "aes_gcm_test.json", + "Wycheproof GCM", + group_tag={'tag_size': filter_tag}) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt GCM Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_GCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + except ValueError as e: + if len(tv.iv) == 0 and "Nonce cannot be empty" in str(e): + return + raise e + + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(ct, tv.ct) + self.assertEqual(tag, tv.tag) + self.warn(tv) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt GCM Test #" + str(tv.id) + + try: + cipher = AES.new(tv.key, AES.MODE_GCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + except ValueError as e: + if len(tv.iv) == 0 and "Nonce cannot be empty" in str(e): + return + raise e + + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def test_corrupt_decrypt(self, tv): + self._id = "Wycheproof Corrupt Decrypt GCM Test #" + str(tv.id) + if len(tv.iv) == 0 or len(tv.ct) < 1: + return + cipher = AES.new(tv.key, AES.MODE_GCM, tv.iv, mac_len=tv.tag_size, + **self._extra_params) + cipher.update(tv.aad) + ct_corrupt = strxor(tv.ct, b"\x00" * (len(tv.ct) - 1) + b"\x01") + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct_corrupt, tv.tag) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + self.test_corrupt_decrypt(tv) + + +class TestVariableLength(unittest.TestCase): + + def __init__(self, **extra_params): + unittest.TestCase.__init__(self) + self._extra_params = extra_params + + def runTest(self): + key = b'0' * 16 + h = SHA256.new() + + for length in range(160): + nonce = '{0:04d}'.format(length).encode('utf-8') + data = bchr(length) * length + cipher = AES.new(key, AES.MODE_GCM, nonce=nonce, **self._extra_params) + ct, tag = cipher.encrypt_and_digest(data) + h.update(ct) + h.update(tag) + + self.assertEqual(h.hexdigest(), "7b7eb1ffbe67a2e53a912067c0ec8e62ebc7ce4d83490ea7426941349811bdf4") + + +def get_tests(config={}): + from Cryptodome.Util import _cpu_features + + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(GcmTests) + tests += list_test_cases(GcmFSMTests) + tests += [TestVectors()] + tests += [TestVectorsWycheproof(wycheproof_warnings)] + tests += list_test_cases(TestVectorsGueronKrasnov) + tests += [TestVariableLength()] + if config.get('slow_tests'): + tests += list_test_cases(NISTTestVectorsGCM) + + if _cpu_features.have_clmul(): + tests += [TestVectorsWycheproof(wycheproof_warnings, use_clmul=False)] + tests += [TestVariableLength(use_clmul=False)] + if config.get('slow_tests'): + tests += list_test_cases(NISTTestVectorsGCM_no_clmul) + else: + print("Skipping test of PCLMULDQD in AES GCM") + + return tests + + +if __name__ == '__main__': + def suite(): + unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py new file mode 100644 index 0000000..1f2ffbc --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py @@ -0,0 +1,845 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.Util.py3compat import b, tobytes, bchr +from Cryptodome.Util.number import long_to_bytes +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Cipher import AES +from Cryptodome.Hash import SHAKE128 + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class OcbTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct, mac = cipher.encrypt_and_digest(pt) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # Nonce is optional + AES.new(self.key_128, AES.MODE_OCB) + + cipher = AES.new(self.key_128, AES.MODE_OCB, self.nonce_96) + ct = cipher.encrypt(self.data) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertEqual(ct, cipher.encrypt(self.data)) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_OCB, + nonce=u'test12345678') + + def test_nonce_length(self): + # nonce cannot be empty + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_OCB, + nonce=b("")) + + # nonce can be up to 15 bytes long + for length in range(1, 16): + AES.new(self.key_128, AES.MODE_OCB, nonce=self.data[:length]) + + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_OCB, + nonce=self.data) + + def test_block_size_128(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, AES.block_size) + + # By default, a 15 bytes long nonce is randomly generated + nonce1 = AES.new(self.key_128, AES.MODE_OCB).nonce + nonce2 = AES.new(self.key_128, AES.MODE_OCB).nonce + self.assertEqual(len(nonce1), 15) + self.assertNotEqual(nonce1, nonce2) + + def test_nonce_attribute(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, a 15 bytes long nonce is randomly generated + nonce1 = AES.new(self.key_128, AES.MODE_OCB).nonce + nonce2 = AES.new(self.key_128, AES.MODE_OCB).nonce + self.assertEqual(len(nonce1), 15) + self.assertNotEqual(nonce1, nonce2) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_OCB, + self.nonce_96, 7) + self.assertRaises(TypeError, AES.new, self.key_128, AES.MODE_OCB, + nonce=self.nonce_96, unknown=7) + + # But some are only known by the base cipher + # (e.g. use_aesni consumed by the AES module) + AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96, + use_aesni=False) + + def test_null_encryption_decryption(self): + for func in "encrypt", "decrypt": + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + result = getattr(cipher, func)(b("")) + self.assertEqual(result, b("")) + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.encrypt(b("xyz")) + self.assertRaises(TypeError, cipher.decrypt, b("xyz")) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.decrypt(b("xyz")) + self.assertRaises(TypeError, cipher.encrypt, b("xyz")) + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, u'test1234567890-*') + + def test_mac_len(self): + # Invalid MAC length + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_OCB, + nonce=self.nonce_96, mac_len=7) + self.assertRaises(ValueError, AES.new, self.key_128, AES.MODE_OCB, + nonce=self.nonce_96, mac_len=16+1) + + # Valid MAC length + for mac_len in range(8, 16 + 1): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96, + mac_len=mac_len) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), mac_len) + + # Default MAC length + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_message_chunks(self): + # Validate that both associated data and plaintext/ciphertext + # can be broken up in chunks of arbitrary length + + auth_data = get_tag_random("authenticated data", 127) + plaintext = get_tag_random("plaintext", 127) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.update(auth_data) + ciphertext, ref_mac = cipher.encrypt_and_digest(plaintext) + + def break_up(data, chunk_length): + return [data[i:i+chunk_length] for i in range(0, len(data), + chunk_length)] + + # Encryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + pt2 = b("") + for chunk in break_up(ciphertext, chunk_length): + pt2 += cipher.decrypt(chunk) + pt2 += cipher.decrypt() + self.assertEqual(plaintext, pt2) + cipher.verify(ref_mac) + + # Decryption + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + + for chunk in break_up(auth_data, chunk_length): + cipher.update(chunk) + ct2 = b("") + for chunk in break_up(plaintext, chunk_length): + ct2 += cipher.encrypt(chunk) + ct2 += cipher.encrypt() + self.assertEqual(ciphertext, ct2) + self.assertEqual(cipher.digest(), ref_mac) + + def test_bytearray(self): + + # Encrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + data_ba = bytearray(self.data) + + cipher1 = AES.new(self.key_128, + AES.MODE_OCB, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + cipher1.encrypt() + tag = cipher1.digest() + + cipher2 = AES.new(key_ba, + AES.MODE_OCB, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_ba) + cipher2.encrypt() + data_ba[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_ba = bytearray(self.key_128) + nonce_ba = bytearray(self.nonce_96) + header_ba = bytearray(self.data) + del data_ba + + cipher4 = AES.new(key_ba, + AES.MODE_OCB, + nonce=nonce_ba) + key_ba[:3] = b"\xFF\xFF\xFF" + nonce_ba[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_ba) + header_ba[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(bytearray(ct_test), bytearray(tag_test)) + + self.assertEqual(self.data, pt_test) + + def test_memoryview(self): + + # Encrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + data_mv = memoryview(bytearray(self.data)) + + cipher1 = AES.new(self.key_128, + AES.MODE_OCB, + nonce=self.nonce_96) + cipher1.update(self.data) + ct = cipher1.encrypt(self.data) + cipher1.encrypt() + tag = cipher1.digest() + + cipher2 = AES.new(key_mv, + AES.MODE_OCB, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher2.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + ct_test = cipher2.encrypt(data_mv) + cipher2.encrypt() + data_mv[:3] = b"\xFF\xFF\xFF" + tag_test = cipher2.digest() + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key_mv = memoryview(bytearray(self.key_128)) + nonce_mv = memoryview(bytearray(self.nonce_96)) + header_mv = memoryview(bytearray(self.data)) + del data_mv + + cipher4 = AES.new(key_mv, + AES.MODE_OCB, + nonce=nonce_mv) + key_mv[:3] = b"\xFF\xFF\xFF" + nonce_mv[:3] = b"\xFF\xFF\xFF" + cipher4.update(header_mv) + header_mv[:3] = b"\xFF\xFF\xFF" + pt_test = cipher4.decrypt_and_verify(memoryview(ct_test), memoryview(tag_test)) + + self.assertEqual(self.data, pt_test) + + +class OcbFSMTests(unittest.TestCase): + + key_128 = get_tag_random("key_128", 16) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_valid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + # Verify path INIT->ENCRYPT->ENCRYPT(NONE)->DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + ct += cipher.encrypt() + mac = cipher.digest() + + # Verify path INIT->DECRYPT->DECRYPT(NONCE)->VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.decrypt() + cipher.verify(mac) + + def test_invalid_init_encrypt_decrypt_digest_verify(self): + # No authenticated data, fixed plaintext + # Verify path INIT->ENCRYPT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + self.assertRaises(TypeError, cipher.digest) + + # Verify path INIT->DECRYPT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.decrypt(ct) + self.assertRaises(TypeError, cipher.verify) + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + # Verify path INIT->UPDATE->DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.verify(mac) + + def test_valid_full_path(self): + # Fixed authenticated data, fixed plaintext + # Verify path INIT->UPDATE->ENCRYPT->ENCRYPT(NONE)->DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + ct = cipher.encrypt(self.data) + ct += cipher.encrypt() + mac = cipher.digest() + + # Verify path INIT->UPDATE->DECRYPT->DECRYPT(NONE)->VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.decrypt(ct) + cipher.decrypt() + cipher.verify(mac) + + # Verify path INIT->UPDATE->ENCRYPT->ENCRYPT_AND_DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + ct1 = cipher.encrypt(self.data[:2]) + ct2, mac = cipher.encrypt_and_digest(self.data[2:]) + + # Verify path INIT->UPDATE->DECRYPT->DECRYPT_AND_VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.decrypt(ct1) + cipher.decrypt_and_verify(ct2, mac) + + def test_invalid_encrypt_after_final(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.encrypt(self.data) + cipher.encrypt() + self.assertRaises(TypeError, cipher.encrypt, self.data) + + def test_invalid_decrypt_after_final(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.decrypt(self.data) + cipher.decrypt() + self.assertRaises(TypeError, cipher.decrypt, self.data) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + mac = cipher.digest() + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_encrypt_or_decrypt(self): + for method_name in "encrypt", "decrypt": + for auth_data in (None, b("333"), self.data, + self.data + b("3")): + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + if auth_data is not None: + cipher.update(auth_data) + method = getattr(cipher, method_name) + method(self.data) + method(self.data) + method(self.data) + method(self.data) + method() + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.update(self.data) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.update(self.data) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.update(self.data) + ct, mac = cipher.encrypt_and_digest(self.data) + + # decrypt_and_verify + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.update(self.data) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data, pt) + + def test_invalid_mixing_encrypt_decrypt(self): + # Once per method, with or without assoc. data + for method1_name, method2_name in (("encrypt", "decrypt"), + ("decrypt", "encrypt")): + for assoc_data_present in (True, False): + cipher = AES.new(self.key_128, AES.MODE_OCB, + nonce=self.nonce_96) + if assoc_data_present: + cipher.update(self.data) + getattr(cipher, method1_name)(self.data) + self.assertRaises(TypeError, getattr(cipher, method2_name), + self.data) + + def test_invalid_encrypt_or_update_after_digest(self): + for method_name in "encrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.encrypt(self.data) + cipher.encrypt() + cipher.digest() + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data) + + def test_invalid_decrypt_or_update_after_verify(self): + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + ct = cipher.encrypt(self.data) + ct += cipher.encrypt() + mac = cipher.digest() + + for method_name in "decrypt", "update": + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.decrypt(ct) + cipher.decrypt() + cipher.verify(mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + cipher = AES.new(self.key_128, AES.MODE_OCB, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, mac) + self.assertRaises(TypeError, getattr(cipher, method_name), + self.data) + + +def algo_rfc7253(keylen, taglen, noncelen): + """Implement the algorithm at page 18 of RFC 7253""" + + key = bchr(0) * (keylen // 8 - 1) + bchr(taglen) + C = b"" + + for i in range(128): + S = bchr(0) * i + + N = long_to_bytes(3 * i + 1, noncelen // 8) + cipher = AES.new(key, AES.MODE_OCB, nonce=N, mac_len=taglen // 8) + cipher.update(S) + C += cipher.encrypt(S) + cipher.encrypt() + cipher.digest() + + N = long_to_bytes(3 * i + 2, noncelen // 8) + cipher = AES.new(key, AES.MODE_OCB, nonce=N, mac_len=taglen // 8) + C += cipher.encrypt(S) + cipher.encrypt() + cipher.digest() + + N = long_to_bytes(3 * i + 3, noncelen // 8) + cipher = AES.new(key, AES.MODE_OCB, nonce=N, mac_len=taglen // 8) + cipher.update(S) + C += cipher.encrypt() + cipher.digest() + + N = long_to_bytes(385, noncelen // 8) + cipher = AES.new(key, AES.MODE_OCB, nonce=N, mac_len=taglen // 8) + cipher.update(C) + return cipher.encrypt() + cipher.digest() + + +class OcbRfc7253Test(unittest.TestCase): + + # Tuple with + # - nonce + # - authenticated data + # - plaintext + # - ciphertext and 16 byte MAC tag + tv1_key = "000102030405060708090A0B0C0D0E0F" + tv1 = ( + ( + "BBAA99887766554433221100", + "", + "", + "785407BFFFC8AD9EDCC5520AC9111EE6" + ), + ( + "BBAA99887766554433221101", + "0001020304050607", + "0001020304050607", + "6820B3657B6F615A5725BDA0D3B4EB3A257C9AF1F8F03009" + ), + ( + "BBAA99887766554433221102", + "0001020304050607", + "", + "81017F8203F081277152FADE694A0A00" + ), + ( + "BBAA99887766554433221103", + "", + "0001020304050607", + "45DD69F8F5AAE72414054CD1F35D82760B2CD00D2F99BFA9" + ), + ( + "BBAA99887766554433221104", + "000102030405060708090A0B0C0D0E0F", + "000102030405060708090A0B0C0D0E0F", + "571D535B60B277188BE5147170A9A22C3AD7A4FF3835B8C5" + "701C1CCEC8FC3358" + ), + ( + "BBAA99887766554433221105", + "000102030405060708090A0B0C0D0E0F", + "", + "8CF761B6902EF764462AD86498CA6B97" + ), + ( + "BBAA99887766554433221106", + "", + "000102030405060708090A0B0C0D0E0F", + "5CE88EC2E0692706A915C00AEB8B2396F40E1C743F52436B" + "DF06D8FA1ECA343D" + ), + ( + "BBAA99887766554433221107", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "1CA2207308C87C010756104D8840CE1952F09673A448A122" + "C92C62241051F57356D7F3C90BB0E07F" + ), + ( + "BBAA99887766554433221108", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "", + "6DC225A071FC1B9F7C69F93B0F1E10DE" + ), + ( + "BBAA99887766554433221109", + "", + "000102030405060708090A0B0C0D0E0F1011121314151617", + "221BD0DE7FA6FE993ECCD769460A0AF2D6CDED0C395B1C3C" + "E725F32494B9F914D85C0B1EB38357FF" + ), + ( + "BBAA9988776655443322110A", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F", + "BD6F6C496201C69296C11EFD138A467ABD3C707924B964DE" + "AFFC40319AF5A48540FBBA186C5553C68AD9F592A79A4240" + ), + ( + "BBAA9988776655443322110B", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F", + "", + "FE80690BEE8A485D11F32965BC9D2A32" + ), + ( + "BBAA9988776655443322110C", + "", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F", + "2942BFC773BDA23CABC6ACFD9BFD5835BD300F0973792EF4" + "6040C53F1432BCDFB5E1DDE3BC18A5F840B52E653444D5DF" + ), + ( + "BBAA9988776655443322110D", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "D5CA91748410C1751FF8A2F618255B68A0A12E093FF45460" + "6E59F9C1D0DDC54B65E8628E568BAD7AED07BA06A4A69483" + "A7035490C5769E60" + ), + ( + "BBAA9988776655443322110E", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "", + "C5CD9D1850C141E358649994EE701B68" + ), + ( + "BBAA9988776655443322110F", + "", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "4412923493C57D5DE0D700F753CCE0D1D2D95060122E9F15" + "A5DDBFC5787E50B5CC55EE507BCB084E479AD363AC366B95" + "A98CA5F3000B1479" + ) + ) + + # Tuple with + # - key + # - nonce + # - authenticated data + # - plaintext + # - ciphertext and 12 byte MAC tag + tv2 = ( + "0F0E0D0C0B0A09080706050403020100", + "BBAA9988776655443322110D", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627", + "1792A4E31E0755FB03E31B22116E6C2DDF9EFD6E33D536F1" + "A0124B0A55BAE884ED93481529C76B6AD0C515F4D1CDD4FD" + "AC4F02AA" + ) + + # Tuple with + # - key length + # - MAC tag length + # - Expected output + tv3 = ( + (128, 128, "67E944D23256C5E0B6C61FA22FDF1EA2"), + (192, 128, "F673F2C3E7174AAE7BAE986CA9F29E17"), + (256, 128, "D90EB8E9C977C88B79DD793D7FFA161C"), + (128, 96, "77A3D8E73589158D25D01209"), + (192, 96, "05D56EAD2752C86BE6932C5E"), + (256, 96, "5458359AC23B0CBA9E6330DD"), + (128, 64, "192C9B7BD90BA06A"), + (192, 64, "0066BC6E0EF34E24"), + (256, 64, "7D4EA5D445501CBE"), + ) + + def test1(self): + key = unhexlify(b(self.tv1_key)) + for tv in self.tv1: + nonce, aad, pt, ct = [unhexlify(b(x)) for x in tv] + ct, mac_tag = ct[:-16], ct[-16:] + + cipher = AES.new(key, AES.MODE_OCB, nonce=nonce) + cipher.update(aad) + ct2 = cipher.encrypt(pt) + cipher.encrypt() + self.assertEqual(ct, ct2) + self.assertEqual(mac_tag, cipher.digest()) + + cipher = AES.new(key, AES.MODE_OCB, nonce=nonce) + cipher.update(aad) + pt2 = cipher.decrypt(ct) + cipher.decrypt() + self.assertEqual(pt, pt2) + cipher.verify(mac_tag) + + def test2(self): + + key, nonce, aad, pt, ct = [unhexlify(b(x)) for x in self.tv2] + ct, mac_tag = ct[:-12], ct[-12:] + + cipher = AES.new(key, AES.MODE_OCB, nonce=nonce, mac_len=12) + cipher.update(aad) + ct2 = cipher.encrypt(pt) + cipher.encrypt() + self.assertEqual(ct, ct2) + self.assertEqual(mac_tag, cipher.digest()) + + cipher = AES.new(key, AES.MODE_OCB, nonce=nonce, mac_len=12) + cipher.update(aad) + pt2 = cipher.decrypt(ct) + cipher.decrypt() + self.assertEqual(pt, pt2) + cipher.verify(mac_tag) + + def test3(self): + for keylen, taglen, result in self.tv3: + result2 = algo_rfc7253(keylen, taglen, 96) + self.assertEqual(unhexlify(b(result)), result2) + + +class OcbDkgTest(unittest.TestCase): + """Test vectors from https://gitlab.com/dkg/ocb-test-vectors""" + + def test_1_2(self): + tvs = [] + for fi in (1, 2): + for nb in (104, 112, 120): + tv_file = load_test_vectors(("Cipher", "AES"), + "test-vector-%d-nonce%d.txt" % (fi, nb), + "DKG tests, %d, %d bits" % (fi, nb), + {}) + if tv_file is None: + break + key = tv_file[0].k + for tv in tv_file[1:]: + tv.k = key + tvs.append(tv) + + for tv in tvs: + k, n, a, p, c = tv.k, tv.n, tv.a, tv.p, tv.c + mac_len = len(c) - len(p) + cipher = AES.new(k, AES.MODE_OCB, nonce=n, mac_len=mac_len) + cipher.update(a) + c_out, tag_out = cipher.encrypt_and_digest(p) + self.assertEqual(c, c_out + tag_out) + + def test_3(self): + + def check(keylen, taglen, noncelen, exp): + result = algo_rfc7253(keylen, taglen, noncelen) + self.assertEqual(result, unhexlify(exp)) + + # test-vector-3-nonce104.txt + check(128, 128, 104, "C47F5F0341E15326D4D1C46F47F05062") + check(192, 128, 104, "95B9167A38EB80495DFC561A8486E109") + check(256, 128, 104, "AFE1CDDB97028FD92F8FB3C8CFBA7D83") + check(128, 96, 104, "F471B4983BA80946DF217A54") + check(192, 96, 104, "5AE828BC51C24D85FA5CC7B2") + check(256, 96, 104, "8C8335982E2B734616CAD14C") + check(128, 64, 104, "B553F74B85FD1E5B") + check(192, 64, 104, "3B49D20E513531F9") + check(256, 64, 104, "ED6DA5B1216BF8BB") + + # test-vector-3-nonce112.txt + check(128, 128, 112, "CA8AFCA031BAC3F480A583BD6C50A547") + check(192, 128, 112, "D170C1DF356308079DA9A3F619147148") + check(256, 128, 112, "57F94381F2F9231EFB04AECD323757C3") + check(128, 96, 112, "3A618B2531ED39F260C750DC") + check(192, 96, 112, "9071EB89FEDBADDA88FD286E") + check(256, 96, 112, "FDF0EFB97F21A39AC4BAB5AC") + check(128, 64, 112, "FAB2FF3A8DD82A13") + check(192, 64, 112, "AC01D912BD0737D3") + check(256, 64, 112, "9D1FD0B500EA4ECF") + + # test-vector-3-nonce120.txt + check(128, 128, 120, "9E043A7140A25FB91F43BCC9DD7E0F46") + check(192, 128, 120, "680000E53908323A7F396B955B8EC641") + check(256, 128, 120, "8304B97FAACDA56E676602E1878A7E6F") + check(128, 96, 120, "81F978AC9867E825D339847D") + check(192, 96, 120, "EFCF2D60B24926ADA48CF5B1") + check(256, 96, 120, "84961DC56E917B165E58C174") + check(128, 64, 120, "227AEE6C9D905A61") + check(192, 64, 120, "541DE691B9E1A2F9") + check(256, 64, 120, "B0E761381C7129FC") + + def test_2_bugfix(self): + nonce = unhexlify("EEDDCCBBAA9988776655443322110D") + key = unhexlify("0F0E0D0C0B0A09080706050403020100") + A = unhexlify("000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627") + P = unhexlify("000102030405060708090A0B0C0D0E0F1011121314151617" + "18191A1B1C1D1E1F2021222324252627") + C = unhexlify("07E903BFC49552411ABC865F5ECE60F6FAD1F5A9F14D3070" + "FA2F1308A563207FFE14C1EEA44B22059C7484319D8A2C53" + "C236A7B3") + mac_len = len(C) - len(P) + + # Prior to version 3.17, a nonce of maximum length (15 bytes) + # was actually used as a 14 byte nonce. The last byte was erroneously + # ignored. + buggy_result = unhexlify("BA015C4E5AE54D76C890AE81BD40DC57" + "03EDC30E8AC2A58BC5D8FA4D61C5BAE6" + "C39BEAC435B2FD56A2A5085C1B135D77" + "0C8264B7") + cipher = AES.new(key, AES.MODE_OCB, nonce=nonce[:-1], mac_len=mac_len) + cipher.update(A) + C_out2, tag_out2 = cipher.encrypt_and_digest(P) + self.assertEqual(buggy_result, C_out2 + tag_out2) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(OcbTests) + tests += list_test_cases(OcbFSMTests) + tests += list_test_cases(OcbRfc7253Test) + tests += list_test_cases(OcbDkgTest) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py new file mode 100644 index 0000000..9a8ef0a --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py @@ -0,0 +1,238 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Cipher import AES, DES3, DES +from Cryptodome.Hash import SHAKE128 +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + +from Cryptodome.SelfTest.Cipher.test_CBC import BlockChainingTests + +class OfbTests(BlockChainingTests): + + aes_mode = AES.MODE_OFB + des3_mode = DES3.MODE_OFB + + # Redefine test_unaligned_data_128/64 + + def test_unaligned_data_128(self): + plaintexts = [ b"7777777" ] * 100 + + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=8) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=8) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=128) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_CFB, self.iv_128, segment_size=128) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_unaligned_data_64(self): + plaintexts = [ b"7777777" ] * 100 + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=8) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=8) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=64) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, DES3.MODE_CFB, self.iv_64, segment_size=64) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + +from Cryptodome.SelfTest.Cipher.test_CBC import NistBlockChainingVectors + +class NistOfbVectors(NistBlockChainingVectors): + aes_mode = AES.MODE_OFB + des_mode = DES.MODE_OFB + des3_mode = DES3.MODE_OFB + + +# Create one test method per file +nist_aes_kat_mmt_files = ( + # KAT + "OFBGFSbox128.rsp", + "OFBGFSbox192.rsp", + "OFBGFSbox256.rsp", + "OFBKeySbox128.rsp", + "OFBKeySbox192.rsp", + "OFBKeySbox256.rsp", + "OFBVarKey128.rsp", + "OFBVarKey192.rsp", + "OFBVarKey256.rsp", + "OFBVarTxt128.rsp", + "OFBVarTxt192.rsp", + "OFBVarTxt256.rsp", + # MMT + "OFBMMT128.rsp", + "OFBMMT192.rsp", + "OFBMMT256.rsp", + ) +nist_aes_mct_files = ( + "OFBMCT128.rsp", + "OFBMCT192.rsp", + "OFBMCT256.rsp", + ) + +for file_name in nist_aes_kat_mmt_files: + def new_func(self, file_name=file_name): + self._do_kat_aes_test(file_name) + setattr(NistOfbVectors, "test_AES_" + file_name, new_func) + +for file_name in nist_aes_mct_files: + def new_func(self, file_name=file_name): + self._do_mct_aes_test(file_name) + setattr(NistOfbVectors, "test_AES_" + file_name, new_func) +del file_name, new_func + +nist_tdes_files = ( + "TOFBMMT2.rsp", # 2TDES + "TOFBMMT3.rsp", # 3TDES + "TOFBinvperm.rsp", # Single DES + "TOFBpermop.rsp", + "TOFBsubtab.rsp", + "TOFBvarkey.rsp", + "TOFBvartext.rsp", + ) + +for file_name in nist_tdes_files: + def new_func(self, file_name=file_name): + self._do_tdes_test(file_name) + setattr(NistOfbVectors, "test_TDES_" + file_name, new_func) + +# END OF NIST OFB TEST VECTORS + + +class SP800TestVectors(unittest.TestCase): + """Class exercising the OFB test vectors found in Section F.4 + of NIST SP 800-3A""" + + def test_aes_128(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = '3b3fd92eb72dad20333449f8e83cfb4a' +\ + '7789508d16918f03f53c52dac54ed825' +\ + '9740051e9c5fecf64344f7a82260edcc' +\ + '304c6528f659c77866a510d9c1d6ae5e' + key = '2b7e151628aed2a6abf7158809cf4f3c' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext[:-8]), ciphertext[:-8]) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext[:-8]), plaintext[:-8]) + + def test_aes_192(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = 'cdc80d6fddf18cab34c25909c99a4174' +\ + 'fcc28b8d4c63837c09e81700c1100401' +\ + '8d9a9aeac0f6596f559c6d4daf59a5f2' +\ + '6d9f200857ca6c3e9cac524bd9acc92a' + key = '8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext[:-8]), ciphertext[:-8]) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext[:-8]), plaintext[:-8]) + + def test_aes_256(self): + plaintext = '6bc1bee22e409f96e93d7e117393172a' +\ + 'ae2d8a571e03ac9c9eb76fac45af8e51' +\ + '30c81c46a35ce411e5fbc1191a0a52ef' +\ + 'f69f2445df4f9b17ad2b417be66c3710' + ciphertext = 'dc7e84bfda79164b7ecd8486985d3860' +\ + '4febdc6740d20b3ac88f6ad82a4fb08d' +\ + '71ab47a086e86eedf39d1c5bba97c408' +\ + '0126141d67f37be8538f5a8be740e484' + key = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4' + iv = '000102030405060708090a0b0c0d0e0f' + + key = unhexlify(key) + iv = unhexlify(iv) + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext), ciphertext) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext), plaintext) + + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.encrypt(plaintext[:-8]), ciphertext[:-8]) + cipher = AES.new(key, AES.MODE_OFB, iv) + self.assertEqual(cipher.decrypt(ciphertext[:-8]), plaintext[:-8]) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(OfbTests) + if config.get('slow_tests'): + tests += list_test_cases(NistOfbVectors) + tests += list_test_cases(SP800TestVectors) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py new file mode 100644 index 0000000..4090a1a --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py @@ -0,0 +1,218 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Cipher import AES, DES3, DES +from Cryptodome.Hash import SHAKE128 + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +from Cryptodome.SelfTest.Cipher.test_CBC import BlockChainingTests + +class OpenPGPTests(BlockChainingTests): + + aes_mode = AES.MODE_OPENPGP + des3_mode = DES3.MODE_OPENPGP + + # Redefine test_unaligned_data_128/64 + + key_128 = get_tag_random("key_128", 16) + key_192 = get_tag_random("key_192", 24) + iv_128 = get_tag_random("iv_128", 16) + iv_64 = get_tag_random("iv_64", 8) + data_128 = get_tag_random("data_128", 16) + + def test_loopback_128(self): + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + pt = get_tag_random("plaintext", 16 * 100) + ct = cipher.encrypt(pt) + + eiv, ct = ct[:18], ct[18:] + + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, eiv) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_loopback_64(self): + cipher = DES3.new(self.key_192, DES3.MODE_OPENPGP, self.iv_64) + pt = get_tag_random("plaintext", 8 * 100) + ct = cipher.encrypt(pt) + + eiv, ct = ct[:10], ct[10:] + + cipher = DES3.new(self.key_192, DES3.MODE_OPENPGP, eiv) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def test_IV_iv_attributes(self): + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + eiv = cipher.encrypt(b"") + self.assertEqual(cipher.iv, self.iv_128) + + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, eiv) + self.assertEqual(cipher.iv, self.iv_128) + + def test_null_encryption_decryption(self): + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + eiv = cipher.encrypt(b"") + + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, eiv) + self.assertEqual(cipher.decrypt(b""), b"") + + def test_either_encrypt_or_decrypt(self): + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + eiv = cipher.encrypt(b"") + self.assertRaises(TypeError, cipher.decrypt, b"") + + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, eiv) + cipher.decrypt(b"") + self.assertRaises(TypeError, cipher.encrypt, b"") + + def test_unaligned_data_128(self): + plaintexts = [ b"7777777" ] * 100 + + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = AES.new(self.key_128, AES.MODE_OPENPGP, self.iv_128) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_unaligned_data_64(self): + plaintexts = [ b"7777777" ] * 100 + + cipher = DES3.new(self.key_192, DES3.MODE_OPENPGP, self.iv_64) + ciphertexts = [ cipher.encrypt(x) for x in plaintexts ] + cipher = DES3.new(self.key_192, DES3.MODE_OPENPGP, self.iv_64) + self.assertEqual(b"".join(ciphertexts), cipher.encrypt(b"".join(plaintexts))) + + def test_output_param(self): + pass + + def test_output_param_same_buffer(self): + pass + + def test_output_param_memoryview(self): + pass + + def test_output_param_neg(self): + pass + + +class TestVectors(unittest.TestCase): + + def test_aes(self): + # The following test vectors have been generated with gpg v1.4.0. + # The command line used was: + # + # gpg -c -z 0 --cipher-algo AES --passphrase secret_passphrase \ + # --disable-mdc --s2k-mode 0 --output ct pt + # + # As result, the content of the file 'pt' is encrypted with a key derived + # from 'secret_passphrase' and written to file 'ct'. + # Test vectors must be extracted from 'ct', which is a collection of + # TLVs (see RFC4880 for all details): + # - the encrypted data (with the encrypted IV as prefix) is the payload + # of the TLV with tag 9 (Symmetrical Encrypted Data Packet). + # This is the ciphertext in the test vector. + # - inside the encrypted part, there is a further layer of TLVs. One must + # look for tag 11 (Literal Data Packet); in its payload, after a short + # but time dependent header, there is the content of file 'pt'. + # In the test vector, the plaintext is the complete set of TLVs that gets + # encrypted. It is not just the content of 'pt'. + # - the key is the leftmost 16 bytes of the SHA1 digest of the password. + # The test vector contains such shortened digest. + # + # Note that encryption uses a clear IV, and decryption an encrypted IV + + plaintext = 'ac18620270744fb4f647426c61636b4361745768697465436174' + ciphertext = 'dc6b9e1f095de609765c59983db5956ae4f63aea7405389d2ebb' + key = '5baa61e4c9b93f3f0682250b6cf8331b' + iv = '3d7d3e62282add7eb203eeba5c800733' + encrypted_iv='fd934601ef49cb58b6d9aebca6056bdb96ef' + + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + key = unhexlify(key) + iv = unhexlify(iv) + encrypted_iv = unhexlify(encrypted_iv) + + cipher = AES.new(key, AES.MODE_OPENPGP, iv) + ct = cipher.encrypt(plaintext) + self.assertEqual(ct[:18], encrypted_iv) + self.assertEqual(ct[18:], ciphertext) + + cipher = AES.new(key, AES.MODE_OPENPGP, encrypted_iv) + pt = cipher.decrypt(ciphertext) + self.assertEqual(pt, plaintext) + + def test_des3(self): + # The following test vectors have been generated with gpg v1.4.0. + # The command line used was: + # gpg -c -z 0 --cipher-algo 3DES --passphrase secret_passphrase \ + # --disable-mdc --s2k-mode 0 --output ct pt + # For an explanation, see test_AES.py . + + plaintext = 'ac1762037074324fb53ba3596f73656d69746556616c6c6579' + ciphertext = '9979238528357b90e2e0be549cb0b2d5999b9a4a447e5c5c7d' + key = '7ade65b460f5ea9be35f9e14aa883a2048e3824aa616c0b2' + iv='cd47e2afb8b7e4b0' + encrypted_iv='6a7eef0b58050e8b904a' + + plaintext = unhexlify(plaintext) + ciphertext = unhexlify(ciphertext) + key = unhexlify(key) + iv = unhexlify(iv) + encrypted_iv = unhexlify(encrypted_iv) + + cipher = DES3.new(key, DES3.MODE_OPENPGP, iv) + ct = cipher.encrypt(plaintext) + self.assertEqual(ct[:10], encrypted_iv) + self.assertEqual(ct[10:], ciphertext) + + cipher = DES3.new(key, DES3.MODE_OPENPGP, encrypted_iv) + pt = cipher.decrypt(ciphertext) + self.assertEqual(pt, plaintext) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(OpenPGPTests) + tests += list_test_cases(TestVectors) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py new file mode 100644 index 0000000..d4bb5a9 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py @@ -0,0 +1,552 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import json +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof + +from Cryptodome.Util.py3compat import tobytes, bchr +from Cryptodome.Cipher import AES +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.Util.strxor import strxor + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class SivTests(unittest.TestCase): + + key_256 = get_tag_random("key_256", 32) + key_384 = get_tag_random("key_384", 48) + key_512 = get_tag_random("key_512", 64) + nonce_96 = get_tag_random("nonce_128", 12) + data = get_tag_random("data", 128) + + def test_loopback_128(self): + for key in self.key_256, self.key_384, self.key_512: + cipher = AES.new(key, AES.MODE_SIV, nonce=self.nonce_96) + pt = get_tag_random("plaintext", 16 * 100) + ct, mac = cipher.encrypt_and_digest(pt) + + cipher = AES.new(key, AES.MODE_SIV, nonce=self.nonce_96) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + def test_nonce(self): + # Deterministic encryption + AES.new(self.key_256, AES.MODE_SIV) + + cipher = AES.new(self.key_256, AES.MODE_SIV, self.nonce_96) + ct1, tag1 = cipher.encrypt_and_digest(self.data) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct2, tag2 = cipher.encrypt_and_digest(self.data) + self.assertEqual(ct1 + tag1, ct2 + tag2) + + def test_nonce_must_be_bytes(self): + self.assertRaises(TypeError, AES.new, self.key_256, AES.MODE_SIV, + nonce=u'test12345678') + + def test_nonce_length(self): + # nonce can be of any length (but not empty) + self.assertRaises(ValueError, AES.new, self.key_256, AES.MODE_SIV, + nonce=b"") + + for x in range(1, 128): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=bchr(1) * x) + cipher.encrypt_and_digest(b'\x01') + + def test_block_size_128(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertEqual(cipher.block_size, AES.block_size) + + def test_nonce_attribute(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertEqual(cipher.nonce, self.nonce_96) + + # By default, no nonce is randomly generated + self.assertFalse(hasattr(AES.new(self.key_256, AES.MODE_SIV), "nonce")) + + def test_unknown_parameters(self): + self.assertRaises(TypeError, AES.new, self.key_256, AES.MODE_SIV, + self.nonce_96, 7) + self.assertRaises(TypeError, AES.new, self.key_256, AES.MODE_SIV, + nonce=self.nonce_96, unknown=7) + + # But some are only known by the base cipher + # (e.g. use_aesni consumed by the AES module) + AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96, + use_aesni=False) + + def test_encrypt_excludes_decrypt(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data) + self.assertRaises(TypeError, cipher.decrypt, self.data) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.encrypt_and_digest(self.data) + self.assertRaises(TypeError, cipher.decrypt_and_verify, + self.data, self.data) + + def test_data_must_be_bytes(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, u'test1234567890-*') + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt_and_verify, + u'test1234567890-*', b"xxxx") + + def test_mac_len(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + _, mac = cipher.encrypt_and_digest(self.data) + self.assertEqual(len(mac), 16) + + def test_invalid_mac(self): + from Cryptodome.Util.strxor import strxor_c + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, mac = cipher.encrypt_and_digest(self.data) + + invalid_mac = strxor_c(mac, 0x01) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, + invalid_mac) + + def test_hex_mac(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + mac_hex = cipher.hexdigest() + self.assertEqual(cipher.digest(), unhexlify(mac_hex)) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.hexverify(mac_hex) + + def test_bytearray(self): + + # Encrypt + key = bytearray(self.key_256) + nonce = bytearray(self.nonce_96) + data = bytearray(self.data) + header = bytearray(self.data) + + cipher1 = AES.new(self.key_256, + AES.MODE_SIV, + nonce=self.nonce_96) + cipher1.update(self.data) + ct, tag = cipher1.encrypt_and_digest(self.data) + + cipher2 = AES.new(key, + AES.MODE_SIV, + nonce=nonce) + key[:3] = b'\xFF\xFF\xFF' + nonce[:3] = b'\xFF\xFF\xFF' + cipher2.update(header) + header[:3] = b'\xFF\xFF\xFF' + ct_test, tag_test = cipher2.encrypt_and_digest(data) + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key = bytearray(self.key_256) + nonce = bytearray(self.nonce_96) + header = bytearray(self.data) + ct_ba = bytearray(ct) + tag_ba = bytearray(tag) + + cipher3 = AES.new(key, + AES.MODE_SIV, + nonce=nonce) + key[:3] = b'\xFF\xFF\xFF' + nonce[:3] = b'\xFF\xFF\xFF' + cipher3.update(header) + header[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt_and_verify(ct_ba, tag_ba) + + self.assertEqual(self.data, pt_test) + + def test_memoryview(self): + + # Encrypt + key = memoryview(bytearray(self.key_256)) + nonce = memoryview(bytearray(self.nonce_96)) + data = memoryview(bytearray(self.data)) + header = memoryview(bytearray(self.data)) + + cipher1 = AES.new(self.key_256, + AES.MODE_SIV, + nonce=self.nonce_96) + cipher1.update(self.data) + ct, tag = cipher1.encrypt_and_digest(self.data) + + cipher2 = AES.new(key, + AES.MODE_SIV, + nonce=nonce) + key[:3] = b'\xFF\xFF\xFF' + nonce[:3] = b'\xFF\xFF\xFF' + cipher2.update(header) + header[:3] = b'\xFF\xFF\xFF' + ct_test, tag_test= cipher2.encrypt_and_digest(data) + + self.assertEqual(ct, ct_test) + self.assertEqual(tag, tag_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decrypt + key = memoryview(bytearray(self.key_256)) + nonce = memoryview(bytearray(self.nonce_96)) + header = memoryview(bytearray(self.data)) + ct_ba = memoryview(bytearray(ct)) + tag_ba = memoryview(bytearray(tag)) + + cipher3 = AES.new(key, + AES.MODE_SIV, + nonce=nonce) + key[:3] = b'\xFF\xFF\xFF' + nonce[:3] = b'\xFF\xFF\xFF' + cipher3.update(header) + header[:3] = b'\xFF\xFF\xFF' + pt_test = cipher3.decrypt_and_verify(ct_ba, tag_ba) + + self.assertEqual(self.data, pt_test) + + def test_output_param(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, tag = cipher.encrypt_and_digest(pt) + + output = bytearray(128) + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + res, tag_out = cipher.encrypt_and_digest(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + self.assertEqual(tag, tag_out) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + res = cipher.decrypt_and_verify(ct, tag, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + def test_output_param_memoryview(self): + + pt = b'5' * 128 + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, tag = cipher.encrypt_and_digest(pt) + + output = memoryview(bytearray(128)) + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.encrypt_and_digest(pt, output=output) + self.assertEqual(ct, output) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, tag, output=output) + self.assertEqual(pt, output) + + def test_output_param_neg(self): + LEN_PT = 128 + + pt = b'5' * LEN_PT + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, tag = cipher.encrypt_and_digest(pt) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt_and_digest, pt, output=b'0' * LEN_PT) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt_and_verify, ct, tag, output=b'0' * LEN_PT) + + shorter_output = bytearray(LEN_PT - 1) + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.encrypt_and_digest, pt, output=shorter_output) + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + self.assertRaises(ValueError, cipher.decrypt_and_verify, ct, tag, output=shorter_output) + + +class SivFSMTests(unittest.TestCase): + + key_256 = get_tag_random("key_256", 32) + nonce_96 = get_tag_random("nonce_96", 12) + data = get_tag_random("data", 128) + + def test_invalid_init_encrypt(self): + # Path INIT->ENCRYPT fails + cipher = AES.new(self.key_256, AES.MODE_SIV, + nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.encrypt, b"xxx") + + def test_invalid_init_decrypt(self): + # Path INIT->DECRYPT fails + cipher = AES.new(self.key_256, AES.MODE_SIV, + nonce=self.nonce_96) + self.assertRaises(TypeError, cipher.decrypt, b"xxx") + + def test_valid_init_update_digest_verify(self): + # No plaintext, fixed authenticated data + # Verify path INIT->UPDATE->DIGEST + cipher = AES.new(self.key_256, AES.MODE_SIV, + nonce=self.nonce_96) + cipher.update(self.data) + mac = cipher.digest() + + # Verify path INIT->UPDATE->VERIFY + cipher = AES.new(self.key_256, AES.MODE_SIV, + nonce=self.nonce_96) + cipher.update(self.data) + cipher.verify(mac) + + def test_valid_init_digest(self): + # Verify path INIT->DIGEST + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.digest() + + def test_valid_init_verify(self): + # Verify path INIT->VERIFY + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + mac = cipher.digest() + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.verify(mac) + + def test_valid_multiple_digest_or_verify(self): + # Multiple calls to digest + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.update(self.data) + first_mac = cipher.digest() + for x in range(4): + self.assertEqual(first_mac, cipher.digest()) + + # Multiple calls to verify + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.update(self.data) + for x in range(5): + cipher.verify(first_mac) + + def test_valid_encrypt_and_digest_decrypt_and_verify(self): + # encrypt_and_digest + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.update(self.data) + ct, mac = cipher.encrypt_and_digest(self.data) + + # decrypt_and_verify + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.update(self.data) + pt = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(self.data, pt) + + def test_invalid_multiple_encrypt_and_digest(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, tag = cipher.encrypt_and_digest(self.data) + self.assertRaises(TypeError, cipher.encrypt_and_digest, b'') + + def test_invalid_multiple_decrypt_and_verify(self): + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + ct, tag = cipher.encrypt_and_digest(self.data) + + cipher = AES.new(self.key_256, AES.MODE_SIV, nonce=self.nonce_96) + cipher.decrypt_and_verify(ct, tag) + self.assertRaises(TypeError, cipher.decrypt_and_verify, ct, tag) + + +def transform(tv): + new_tv = [[unhexlify(x) for x in tv[0].split("-")]] + new_tv += [ unhexlify(x) for x in tv[1:5]] + if tv[5]: + nonce = unhexlify(tv[5]) + else: + nonce = None + new_tv += [ nonce ] + return new_tv + + +class TestVectors(unittest.TestCase): + """Class exercising the SIV test vectors found in RFC5297""" + + # This is a list of tuples with 5 items: + # + # 1. Header + '|' + plaintext + # 2. Header + '|' + ciphertext + '|' + MAC + # 3. AES-128 key + # 4. Description + # 5. Dictionary of parameters to be passed to AES.new(). + # It must include the nonce. + # + # A "Header" is a dash ('-') separated sequece of components. + # + test_vectors_hex = [ + ( + '101112131415161718191a1b1c1d1e1f2021222324252627', + '112233445566778899aabbccddee', + '40c02b9690c4dc04daef7f6afe5c', + '85632d07c6e8f37f950acd320a2ecc93', + 'fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff', + None + ), + ( + '00112233445566778899aabbccddeeffdeaddadadeaddadaffeeddccbbaa9988' + + '7766554433221100-102030405060708090a0', + '7468697320697320736f6d6520706c61696e7465787420746f20656e63727970' + + '74207573696e67205349562d414553', + 'cb900f2fddbe404326601965c889bf17dba77ceb094fa663b7a3f748ba8af829' + + 'ea64ad544a272e9c485b62a3fd5c0d', + '7bdb6e3b432667eb06f4d14bff2fbd0f', + '7f7e7d7c7b7a79787776757473727170404142434445464748494a4b4c4d4e4f', + '09f911029d74e35bd84156c5635688c0' + ), + ] + + test_vectors = [ transform(tv) for tv in test_vectors_hex ] + + def runTest(self): + for assoc_data, pt, ct, mac, key, nonce in self.test_vectors: + + # Encrypt + cipher = AES.new(key, AES.MODE_SIV, nonce=nonce) + for x in assoc_data: + cipher.update(x) + ct2, mac2 = cipher.encrypt_and_digest(pt) + self.assertEqual(ct, ct2) + self.assertEqual(mac, mac2) + + # Decrypt + cipher = AES.new(key, AES.MODE_SIV, nonce=nonce) + for x in assoc_data: + cipher.update(x) + pt2 = cipher.decrypt_and_verify(ct, mac) + self.assertEqual(pt, pt2) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self): + unittest.TestCase.__init__(self) + self._id = "None" + + def setUp(self): + self.tv = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + "aes_siv_cmac_test.json", + "Wycheproof AES SIV") + + def shortDescription(self): + return self._id + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt AES-SIV Test #" + str(tv.id) + + cipher = AES.new(tv.key, AES.MODE_SIV) + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(tag + ct, tv.ct) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt AES_SIV Test #" + str(tv.id) + + cipher = AES.new(tv.key, AES.MODE_SIV) + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct[16:], tv.ct[:16]) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + + +class TestVectorsWycheproof2(unittest.TestCase): + + def __init__(self): + unittest.TestCase.__init__(self) + self._id = "None" + + def setUp(self): + self.tv = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + "aead_aes_siv_cmac_test.json", + "Wycheproof AEAD SIV") + + def shortDescription(self): + return self._id + + def test_encrypt(self, tv): + self._id = "Wycheproof Encrypt AEAD-AES-SIV Test #" + str(tv.id) + + cipher = AES.new(tv.key, AES.MODE_SIV, nonce=tv.iv) + cipher.update(tv.aad) + ct, tag = cipher.encrypt_and_digest(tv.msg) + if tv.valid: + self.assertEqual(ct, tv.ct) + self.assertEqual(tag, tv.tag) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt AEAD-AES-SIV Test #" + str(tv.id) + + cipher = AES.new(tv.key, AES.MODE_SIV, nonce=tv.iv) + cipher.update(tv.aad) + try: + pt = cipher.decrypt_and_verify(tv.ct, tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + + def runTest(self): + + for tv in self.tv: + self.test_encrypt(tv) + self.test_decrypt(tv) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(SivTests) + tests += list_test_cases(SivFSMTests) + tests += [ TestVectors() ] + tests += [ TestVectorsWycheproof() ] + tests += [ TestVectorsWycheproof2() ] + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py new file mode 100644 index 0000000..a444906 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py @@ -0,0 +1,367 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/Salsa20.py: Self-test for the Salsa20 stream cipher +# +# Written in 2013 by Fabrizio Tarizzo +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Cipher.Salsa20""" + +import unittest + +from Cryptodome.Util.py3compat import bchr + +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Cipher import Salsa20 + +from .common import make_stream_tests + +# This is a list of (plaintext, ciphertext, key[, description[, params]]) +# tuples. +test_data = [ + # Test vectors are taken from + # http://www.ecrypt.eu.org/stream/svn/viewcvs.cgi/ecrypt/trunk/submissions/salsa20/full/verified.test-vectors + ( '00' * 512, + '4dfa5e481da23ea09a31022050859936da52fcee218005164f267cb65f5cfd7f' + + '2b4f97e0ff16924a52df269515110a07f9e460bc65ef95da58f740b7d1dbb0aa' + + 'd64cec189c7eb8c6bbf3d7376c80a481d43e628701f6a27afb9fe23919f24114' + + '8db44f70d7063efcc3dd55a0893a613c3c6fe1c127bd6f59910589293bb6ef9e' + + 'e24819066dee1a64f49b0bbad5988635272b169af861f85df881939f29ada6fd' + + '0241410e8d332ae4798d929434a2630de451ec4e0169694cbaa7ebb121ea6a2b' + + 'da9c1581f429e0a00f7d67e23b730676783b262e8eb43a25f55fb90b3e753aef' + + '8c6713ec66c51881111593ccb3e8cb8f8de124080501eeeb389c4bcb6977cf95' + + '7d5789631eb4554400e1e025935dfa7b3e9039d61bdc58a8697d36815bf1985c' + + 'efdf7ae112e5bb81e37ecf0616ce7147fc08a93a367e08631f23c03b00a8da2f' + + 'aa5024e5c8d30aca43fc2d5082067b21b234bc741d68fb292c6012c3764ccee3' + + '1e364a5403e00cfee338a21a01e7d3cefd5a770ca0ab48c435ea6116435f7ad8' + + '30b217b49f978a68e207ed9f462af7fb195b2115fe8f24f152e4ddc32202d6f2' + + 'b52fafbcfbc202d8a259a611e901d3f62d065eb13f09bbc45cd45119b843efaa' + + 'b375703739daced4dd4059fd71c3c47fc2f9939670fad4a46066adcc6a564578' + + '3308b90ffb72be04a6b147cbe38cc0c3b9267c296a92a7c69873f9f263be9703', + '80000000000000000000000000000000', + '128 bits key, set 1, vector 0', + dict (iv='00'*8)), + + ( '00' * 512, + 'e3be8fdd8beca2e3ea8ef9475b29a6e7003951e1097a5c38d23b7a5fad9f6844' + + 'b22c97559e2723c7cbbd3fe4fc8d9a0744652a83e72a9c461876af4d7ef1a117' + + '8da2b74eef1b6283e7e20166abcae538e9716e4669e2816b6b20c5c356802001' + + 'cc1403a9a117d12a2669f456366d6ebb0f1246f1265150f793cdb4b253e348ae' + + '203d89bc025e802a7e0e00621d70aa36b7e07cb1e7d5b38d5e222b8b0e4b8407' + + '0142b1e29504767d76824850320b5368129fdd74e861b498e3be8d16f2d7d169' + + '57be81f47b17d9ae7c4ff15429a73e10acf250ed3a90a93c711308a74c6216a9' + + 'ed84cd126da7f28e8abf8bb63517e1ca98e712f4fb2e1a6aed9fdc73291faa17' + + '958211c4ba2ebd5838c635edb81f513a91a294e194f1c039aeec657dce40aa7e' + + '7c0af57cacefa40c9f14b71a4b3456a63e162ec7d8d10b8ffb1810d71001b618' + + '2f9f73da53b85405c11f7b2d890fa8ae0c7f2e926d8a98c7ec4e91b65120e988' + + '349631a700c6facec3471cb0413656e75e309456584084d7e12c5b43a41c43ed' + + '9a048abd9b880da65f6a665a20fe7b77cd292fe62cae644b7f7df69f32bdb331' + + '903e6505ce44fdc293920c6a9ec7057e23df7dad298f82ddf4efb7fdc7bfc622' + + '696afcfd0cddcc83c7e77f11a649d79acdc3354e9635ff137e929933a0bd6f53' + + '77efa105a3a4266b7c0d089d08f1e855cc32b15b93784a36e56a76cc64bc8477', + '8000000000000000000000000000000000000000000000000000000000000000', + '256 bits key, set 1, vector 0', + dict (iv='00'*8)), + + ( '00' * 512, + '169060ccb42bea7bee4d8012a02f3635eb7bca12859fa159cd559094b3507db8' + + '01735d1a1300102a9c9415546829cbd2021ba217b39b81d89c55b13d0c603359' + + '3f84159a3c84f4b4f4a0edcd9d38ff261a737909e0b66d68b5cac496f3a5be99' + + 'cb12c321ab711afaab36cc0947955e1a9bb952ed54425e7711279fbc81bb83f5' + + '6e55cea44e6daddb05858a153ea6213b3350c12aa1a83ef2726f09485fa71790' + + 'f9b9f922c7dda1113b1f9d56658ed3402803f511bc1f122601d5e7f0ff036e23' + + '23ef24bb24195b9fd574823cd8a40c29d86bd35c191e2038779ff696c712b6d8' + + '2e7014dbe1ac5d527af076c088c4a8d44317958189f6ef54933a7e0816b5b916' + + 'd8f12ed8afe9422b85e5cc9b8adec9d6cfabe8dbc1082bccc02f5a7266aa074c' + + 'a284e583a35837798cc0e69d4ce937653b8cdd65ce414b89138615ccb165ad19' + + '3c6b9c3d05eef4be921a10ea811fe61d11c6867600188e065daff90b509ec56b' + + 'd41e7e8968c478c78d590c2d2ee24ea009c8f49bc3d81672cfc47895a9e21c9a' + + '471ebf8e294bee5d2de436ac8d052bf31111b345f1da23c3a4d13b9fc5f0900a' + + 'a298f98f538973b8fad40d4d159777de2cfe2a3dead1645ddb49794827dba040' + + 'f70a0ff4ecd155e0f033604693a51e2363880e2ecf98699e7174af7c2c6b0fc6' + + '59ae329599a3949272a37b9b2183a0910922a3f325ae124dcbdd735364055ceb', + '09090909090909090909090909090909', + '128 bits key, set 2, vector 9', + dict (iv='00'*8)), + + ( '00' * 512, + '7041e747ceb22ed7812985465f50333124f971da1c5d6efe5ca201b886f31046' + + 'e757e5c3ec914f60ed1f6bce2819b6810953f12b8ba1199bf82d746a8b8a88f1' + + '142002978ec4c35b95dc2c82990f9e847a0ab45f2ca72625f5190c820f29f3aa' + + 'f5f0b5572b06b70a144f2a240c3b3098d4831fa1ce1459f8d1df226a6a79b0ab' + + '41e91799ef31b5ff3d756c19126b19025858ee70fbd69f2be955cb011c005e31' + + '32b271b378f39b0cb594e95c99ce6ff17735a541891845bbf0450afcb4a850b9' + + '4ee90afb713ae7e01295c74381180a3816d7020d5a396c0d97aaa783eaabb6ec' + + '44d5111157f2212d1b1b8fca7893e8b520cd482418c272ab119b569a2b9598eb' + + '355624d12e79adab81153b58cd22eaf1b2a32395dedc4a1c66f4d274070b9800' + + 'ea95766f0245a8295f8aadb36ddbbdfa936417c8dbc6235d19494036964d3e70' + + 'b125b0f800c3d53881d9d11e7970f827c2f9556935cd29e927b0aceb8cae5fd4' + + '0fd88a8854010a33db94c96c98735858f1c5df6844f864feaca8f41539313e7f' + + '3c0610214912cd5e6362197646207e2d64cd5b26c9dfe0822629dcbeb16662e8' + + '9ff5bf5cf2e499138a5e27bd5027329d0e68ddf53103e9e409523662e27f61f6' + + '5cf38c1232023e6a6ef66c315bcb2a4328642faabb7ca1e889e039e7c444b34b' + + 'b3443f596ac730f3df3dfcdb343c307c80f76e43e8898c5e8f43dc3bb280add0', + '0909090909090909090909090909090909090909090909090909090909090909', + '256 bits key, set 2, vector 9', + dict (iv='00'*8)), + + ( '00' * 1024, + '71daee5142d0728b41b6597933ebf467e43279e30978677078941602629cbf68' + + 'b73d6bd2c95f118d2b3e6ec955dabb6dc61c4143bc9a9b32b99dbe6866166dc0' + + '8631b7d6553050303d7252c264d3a90d26c853634813e09ad7545a6ce7e84a5d' + + 'fc75ec43431207d5319970b0faadb0e1510625bb54372c8515e28e2accf0a993' + + '0ad15f431874923d2a59e20d9f2a5367dba6051564f150287debb1db536ff9b0' + + '9ad981f25e5010d85d76ee0c305f755b25e6f09341e0812f95c94f42eead346e' + + '81f39c58c5faa2c88953dc0cac90469db2063cb5cdb22c9eae22afbf0506fca4' + + '1dc710b846fbdfe3c46883dd118f3a5e8b11b6afd9e71680d8666557301a2daa' + + 'fb9496c559784d35a035360885f9b17bd7191977deea932b981ebdb29057ae3c' + + '92cfeff5e6c5d0cb62f209ce342d4e35c69646ccd14e53350e488bb310a32f8b' + + '0248e70acc5b473df537ced3f81a014d4083932bedd62ed0e447b6766cd2604b' + + '706e9b346c4468beb46a34ecf1610ebd38331d52bf33346afec15eefb2a7699e' + + '8759db5a1f636a48a039688e39de34d995df9f27ed9edc8dd795e39e53d9d925' + + 'b278010565ff665269042f05096d94da3433d957ec13d2fd82a0066283d0d1ee' + + 'b81bf0ef133b7fd90248b8ffb499b2414cd4fa003093ff0864575a43749bf596' + + '02f26c717fa96b1d057697db08ebc3fa664a016a67dcef8807577cc3a09385d3' + + 'f4dc79b34364bb3b166ce65fe1dd28e3950fe6fa81063f7b16ce1c0e6daac1f8' + + '188455b77752045e863c9b256ad92bc6e2d08314c5bba191c274f42dfbb3d652' + + 'bb771956555e880f84cd8b827a4c5a52f3a099fa0259bd4aac3efd541f191170' + + '4412d6e85fbcc628b335875b9fef24807f6e1bc66c3186159e1e7f5a13913e02' + + 'd241ce2efdbcaa275039fb14eac5923d17ffbc7f1abd3b45e92127575bfbabf9' + + '3a257ebef0aa1437b326e41b585af572f7239c33b32981a1577a4f629b027e1e' + + 'b49d58cc497e944d79cef44357c2bf25442ab779651e991147bf79d6fd3a8868' + + '0cd3b1748e07fd10d78aceef6db8a5e563570d40127f754146c34a440f2a991a' + + '23fa39d365141f255041f2135c5cba4373452c114da1801bacca38610e3a6524' + + '2b822d32de4ab5a7d3cf9b61b37493c863bd12e2cae10530cddcda2cb7a5436b' + + 'ef8988d4d24e8cdc31b2d2a3586340bc5141f8f6632d0dd543bfed81eb471ba1' + + 'f3dc2225a15ffddcc03eb48f44e27e2aa390598adf83f15c6608a5f18d4dfcf0' + + 'f547d467a4d70b281c83a595d7660d0b62de78b9cca023cca89d7b1f83484638' + + '0e228c25f049184a612ef5bb3d37454e6cfa5b10dceda619d898a699b3c8981a' + + '173407844bb89b4287bf57dd6600c79e352c681d74b03fa7ea0d7bf6ad69f8a6' + + '8ecb001963bd2dd8a2baa0083ec09751cd9742402ad716be16d5c052304cfca1', + '0F62B5085BAE0154A7FA4DA0F34699EC', + '128 bits key, Set 6, vector# 3', + dict (iv='288FF65DC42B92F9')), + + ( '00' * 1024, + '5e5e71f90199340304abb22a37b6625bf883fb89ce3b21f54a10b81066ef87da' + + '30b77699aa7379da595c77dd59542da208e5954f89e40eb7aa80a84a6176663f' + + 'd910cde567cf1ff60f7040548d8f376bfd1f44c4774aac37410ede7d5c3463fc' + + '4508a603201d8495ad257894e5eb1914b53e8da5e4bf2bc83ac87ce55cc67df7' + + '093d9853d2a83a9c8be969175df7c807a17156df768445dd0874a9271c6537f5' + + 'ce0466473582375f067fa4fcdaf65dbc0139cd75e8c21a482f28c0fb8c3d9f94' + + '22606cc8e88fe28fe73ec3cb10ff0e8cc5f2a49e540f007265c65b7130bfdb98' + + '795b1df9522da46e48b30e55d9f0d787955ece720205b29c85f3ad9be33b4459' + + '7d21b54d06c9a60b04b8e640c64e566e51566730e86cf128ab14174f91bd8981' + + 'a6fb00fe587bbd6c38b5a1dfdb04ea7e61536fd229f957aa9b070ca931358e85' + + '11b92c53c523cb54828fb1513c5636fa9a0645b4a3c922c0db94986d92f314ff' + + '7852c03b231e4dceea5dd8cced621869cff818daf3c270ff3c8be2e5c74be767' + + 'a4e1fdf3327a934fe31e46df5a74ae2021cee021d958c4f615263d99a5ddae7f' + + 'eab45e6eccbafefe4761c57750847b7e75ee2e2f14333c0779ce4678f47b1e1b' + + '760a03a5f17d6e91d4b42313b3f1077ee270e432fe04917ed1fc8babebf7c941' + + '42b80dfb44a28a2a3e59093027606f6860bfb8c2e5897078cfccda7314c70035' + + 'f137de6f05daa035891d5f6f76e1df0fce1112a2ff0ac2bd3534b5d1bf4c7165' + + 'fb40a1b6eacb7f295711c4907ae457514a7010f3a342b4427593d61ba993bc59' + + '8bd09c56b9ee53aac5dd861fa4b4bb53888952a4aa9d8ca8671582de716270e1' + + '97375b3ee49e51fa2bf4ef32015dd9a764d966aa2ae541592d0aa650849e99ca' + + '5c6c39beebf516457cc32fe4c105bff314a12f1ec94bdf4d626f5d9b1cbbde42' + + 'e5733f0885765ba29e2e82c829d312f5fc7e180679ac84826c08d0a644b326d0' + + '44da0fdcc75fa53cfe4ced0437fa4df5a7ecbca8b4cb7c4a9ecf9a60d00a56eb' + + '81da52adc21f508dbb60a9503a3cc94a896616d86020d5b0e5c637329b6d396a' + + '41a21ba2c4a9493cf33fa2d4f10f77d5b12fdad7e478ccfe79b74851fc96a7ca' + + '6320c5efd561a222c0ab0fb44bbda0e42149611d2262bb7d1719150fa798718a' + + '0eec63ee297cad459869c8b0f06c4e2b56cbac03cd2605b2a924efedf85ec8f1' + + '9b0b6c90e7cbd933223ffeb1b3a3f9677657905829294c4c70acdb8b0891b47d' + + '0875d0cd6c0f4efe2917fc44b581ef0d1e4280197065d07da34ab33283364552' + + 'efad0bd9257b059acdd0a6f246812feb69e7e76065f27dbc2eee94da9cc41835' + + 'bf826e36e5cebe5d4d6a37a6a666246290ce51a0c082718ab0ec855668db1add' + + 'a658e5f257e0db39384d02e6145c4c00eaa079098f6d820d872de711b6ed08cf', + '0F62B5085BAE0154A7FA4DA0F34699EC3F92E5388BDE3184D72A7DD02376C91C', + '256 bits key, Set 6, vector# 3', + dict (iv='288FF65DC42B92F9')), + +] + + +class KeyLength(unittest.TestCase): + + def runTest(self): + + nonce = bchr(0) * 8 + for key_length in (15, 30, 33): + key = bchr(1) * key_length + self.assertRaises(ValueError, Salsa20.new, key, nonce) + + +class NonceTests(unittest.TestCase): + + def test_invalid_nonce_length(self): + key = bchr(1) * 16 + self.assertRaises(ValueError, Salsa20.new, key, bchr(0) * 7) + self.assertRaises(ValueError, Salsa20.new, key, bchr(0) * 9) + + def test_default_nonce(self): + + cipher1 = Salsa20.new(bchr(1) * 16) + cipher2 = Salsa20.new(bchr(1) * 16) + self.assertEqual(len(cipher1.nonce), 8) + self.assertNotEqual(cipher1.nonce, cipher2.nonce) + + +class ByteArrayTest(unittest.TestCase): + """Verify we can encrypt or decrypt bytearrays""" + + def runTest(self): + + data = b"0123" + key = b"9" * 32 + nonce = b"t" * 8 + + # Encryption + data_ba = bytearray(data) + key_ba = bytearray(key) + nonce_ba = bytearray(nonce) + + cipher1 = Salsa20.new(key=key, nonce=nonce) + ct = cipher1.encrypt(data) + + cipher2 = Salsa20.new(key=key_ba, nonce=nonce_ba) + key_ba[:1] = b'\xFF' + nonce_ba[:1] = b'\xFF' + ct_test = cipher2.encrypt(data_ba) + + self.assertEqual(ct, ct_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decryption + key_ba = bytearray(key) + nonce_ba = bytearray(nonce) + ct_ba = bytearray(ct) + + cipher3 = Salsa20.new(key=key_ba, nonce=nonce_ba) + key_ba[:1] = b'\xFF' + nonce_ba[:1] = b'\xFF' + pt_test = cipher3.decrypt(ct_ba) + + self.assertEqual(data, pt_test) + + +class MemoryviewTest(unittest.TestCase): + """Verify we can encrypt or decrypt bytearrays""" + + def runTest(self): + + data = b"0123" + key = b"9" * 32 + nonce = b"t" * 8 + + # Encryption + data_mv = memoryview(bytearray(data)) + key_mv = memoryview(bytearray(key)) + nonce_mv = memoryview(bytearray(nonce)) + + cipher1 = Salsa20.new(key=key, nonce=nonce) + ct = cipher1.encrypt(data) + + cipher2 = Salsa20.new(key=key_mv, nonce=nonce_mv) + key_mv[:1] = b'\xFF' + nonce_mv[:1] = b'\xFF' + ct_test = cipher2.encrypt(data_mv) + + self.assertEqual(ct, ct_test) + self.assertEqual(cipher1.nonce, cipher2.nonce) + + # Decryption + key_mv = memoryview(bytearray(key)) + nonce_mv = memoryview(bytearray(nonce)) + ct_mv = memoryview(bytearray(ct)) + + cipher3 = Salsa20.new(key=key_mv, nonce=nonce_mv) + key_mv[:1] = b'\xFF' + nonce_mv[:1] = b'\xFF' + pt_test = cipher3.decrypt(ct_mv) + + self.assertEqual(data, pt_test) + + +class TestOutput(unittest.TestCase): + + def runTest(self): + # Encrypt/Decrypt data and test output parameter + + key = b'4' * 32 + nonce = b'5' * 8 + cipher = Salsa20.new(key=key, nonce=nonce) + + pt = b'5' * 300 + ct = cipher.encrypt(pt) + + output = bytearray(len(pt)) + cipher = Salsa20.new(key=key, nonce=nonce) + res = cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + self.assertEqual(res, None) + + cipher = Salsa20.new(key=key, nonce=nonce) + res = cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + self.assertEqual(res, None) + + output = memoryview(bytearray(len(pt))) + cipher = Salsa20.new(key=key, nonce=nonce) + cipher.encrypt(pt, output=output) + self.assertEqual(ct, output) + + cipher = Salsa20.new(key=key, nonce=nonce) + cipher.decrypt(ct, output=output) + self.assertEqual(pt, output) + + cipher = Salsa20.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.encrypt, pt, output=b'0'*len(pt)) + + cipher = Salsa20.new(key=key, nonce=nonce) + self.assertRaises(TypeError, cipher.decrypt, ct, output=b'0'*len(ct)) + + shorter_output = bytearray(len(pt) - 1) + + cipher = Salsa20.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.encrypt, pt, output=shorter_output) + + cipher = Salsa20.new(key=key, nonce=nonce) + self.assertRaises(ValueError, cipher.decrypt, ct, output=shorter_output) + + +def get_tests(config={}): + tests = make_stream_tests(Salsa20, "Salsa20", test_data) + tests.append(KeyLength()) + tests += list_test_cases(NonceTests) + tests.append(ByteArrayTest()) + tests.append(MemoryviewTest()) + tests.append(TestOutput()) + + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py new file mode 100644 index 0000000..12c09dd --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py @@ -0,0 +1,283 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/test_pkcs1_15.py: Self-test for PKCS#1 v1.5 encryption +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from __future__ import print_function + +import unittest + +from Cryptodome.PublicKey import RSA +from Cryptodome.SelfTest.st_common import list_test_cases, a2b_hex +from Cryptodome import Random +from Cryptodome.Cipher import PKCS1_v1_5 as PKCS +from Cryptodome.Util.py3compat import b +from Cryptodome.Util.number import bytes_to_long, long_to_bytes +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof + + +def rws(t): + """Remove white spaces, tabs, and new lines from a string""" + for c in ['\n', '\t', ' ']: + t = t.replace(c, '') + return t + + +def t2b(t): + """Convert a text string with bytes in hex form to a byte string""" + clean = b(rws(t)) + if len(clean) % 2 == 1: + raise ValueError("Even number of characters expected") + return a2b_hex(clean) + + +class PKCS1_15_Tests(unittest.TestCase): + + def setUp(self): + self.rng = Random.new().read + self.key1024 = RSA.generate(1024, self.rng) + + # List of tuples with test data for PKCS#1 v1.5. + # Each tuple is made up by: + # Item #0: dictionary with RSA key component, or key to import + # Item #1: plaintext + # Item #2: ciphertext + # Item #3: random data + + _testData = ( + + # + # Generated with openssl 0.9.8o + # + ( + # Private key + '''-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQDAiAnvIAOvqVwJTaYzsKnefZftgtXGE2hPJppGsWl78yz9jeXY +W/FxX/gTPURArNhdnhP6n3p2ZaDIBrO2zizbgIXs0IsljTTcr4vnI8fMXzyNUOjA +zP3nzMqZDZK6757XQAobOssMkBFqRWwilT/3DsBhRpl3iMUhF+wvpTSHewIDAQAB +AoGAC4HV/inOrpgTvSab8Wj0riyZgQOZ3U3ZpSlsfR8ra9Ib9Uee3jCYnKscu6Gk +y6zI/cdt8EPJ4PuwAWSNJzbpbVaDvUq25OD+CX8/uRT08yBS4J8TzBitZJTD4lS7 +atdTnKT0Wmwk+u8tDbhvMKwnUHdJLcuIsycts9rwJVapUtkCQQDvDpx2JMun0YKG +uUttjmL8oJ3U0m3ZvMdVwBecA0eebZb1l2J5PvI3EJD97eKe91Nsw8T3lwpoN40k +IocSVDklAkEAzi1HLHE6EzVPOe5+Y0kGvrIYRRhncOb72vCvBZvD6wLZpQgqo6c4 +d3XHFBBQWA6xcvQb5w+VVEJZzw64y25sHwJBAMYReRl6SzL0qA0wIYrYWrOt8JeQ +8mthulcWHXmqTgC6FEXP9Es5GD7/fuKl4wqLKZgIbH4nqvvGay7xXLCXD/ECQH9a +1JYNMtRen5unSAbIOxRcKkWz92F0LKpm9ZW/S9vFHO+mBcClMGoKJHiuQxLBsLbT +NtEZfSJZAeS2sUtn3/0CQDb2M2zNBTF8LlM0nxmh0k9VGm5TVIyBEMcipmvOgqIs +HKukWBcq9f/UOmS0oEhai/6g+Uf7VHJdWaeO5LzuvwU= +-----END RSA PRIVATE KEY-----''', + # Plaintext + '''THIS IS PLAINTEXT\x0A''', + # Ciphertext + '''3f dc fd 3c cd 5c 9b 12 af 65 32 e3 f7 d0 da 36 + 8f 8f d9 e3 13 1c 7f c8 b3 f9 c1 08 e4 eb 79 9c + 91 89 1f 96 3b 94 77 61 99 a4 b1 ee 5d e6 17 c9 + 5d 0a b5 63 52 0a eb 00 45 38 2a fb b0 71 3d 11 + f7 a1 9e a7 69 b3 af 61 c0 bb 04 5b 5d 4b 27 44 + 1f 5b 97 89 ba 6a 08 95 ee 4f a2 eb 56 64 e5 0f + da 7c f9 9a 61 61 06 62 ed a0 bc 5f aa 6c 31 78 + 70 28 1a bb 98 3c e3 6a 60 3c d1 0b 0f 5a f4 75''', + # Random data + '''eb d7 7d 86 a4 35 23 a3 54 7e 02 0b 42 1d + 61 6c af 67 b8 4e 17 56 80 66 36 04 64 34 26 8a + 47 dd 44 b3 1a b2 17 60 f4 91 2e e2 b5 95 64 cc + f9 da c8 70 94 54 86 4c ef 5b 08 7d 18 c4 ab 8d + 04 06 33 8f ca 15 5f 52 60 8a a1 0c f5 08 b5 4c + bb 99 b8 94 25 04 9c e6 01 75 e6 f9 63 7a 65 61 + 13 8a a7 47 77 81 ae 0d b8 2c 4d 50 a5''' + ), + ) + + def testEncrypt1(self): + for test in self._testData: + # Build the key + key = RSA.importKey(test[0]) + # RNG that takes its random numbers from a pool given + # at initialization + class randGen: + def __init__(self, data): + self.data = data + self.idx = 0 + def __call__(self, N): + r = self.data[self.idx:self.idx+N] + self.idx += N + return r + # The real test + cipher = PKCS.new(key, randfunc=randGen(t2b(test[3]))) + ct = cipher.encrypt(b(test[1])) + self.assertEqual(ct, t2b(test[2])) + + def testEncrypt2(self): + # Verify that encryption fail if plaintext is too long + pt = '\x00'*(128-11+1) + cipher = PKCS.new(self.key1024) + self.assertRaises(ValueError, cipher.encrypt, pt) + + def testVerify1(self): + for test in self._testData: + key = RSA.importKey(test[0]) + expected_pt = b(test[1]) + ct = t2b(test[2]) + cipher = PKCS.new(key) + + # The real test + pt = cipher.decrypt(ct, None) + self.assertEqual(pt, expected_pt) + + pt = cipher.decrypt(ct, b'\xFF' * len(expected_pt)) + self.assertEqual(pt, expected_pt) + + def testVerify2(self): + # Verify that decryption fails if ciphertext is not as long as + # RSA modulus + cipher = PKCS.new(self.key1024) + self.assertRaises(ValueError, cipher.decrypt, '\x00'*127, "---") + self.assertRaises(ValueError, cipher.decrypt, '\x00'*129, "---") + + # Verify that decryption fails if there are less then 8 non-zero padding + # bytes + pt = b('\x00\x02' + '\xFF'*7 + '\x00' + '\x45'*118) + pt_int = bytes_to_long(pt) + ct_int = self.key1024._encrypt(pt_int) + ct = long_to_bytes(ct_int, 128) + self.assertEqual(b"---", cipher.decrypt(ct, b"---")) + + def testEncryptVerify1(self): + # Encrypt/Verify messages of length [0..RSAlen-11] + # and therefore padding [8..117] + for pt_len in range(0, 128 - 11 + 1): + pt = self.rng(pt_len) + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(pt) + pt2 = cipher.decrypt(ct, b'\xAA' * pt_len) + self.assertEqual(pt, pt2) + + def test_encrypt_verify_exp_pt_len(self): + + cipher = PKCS.new(self.key1024) + pt = b'5' * 16 + ct = cipher.encrypt(pt) + sentinel = b'\xAA' * 16 + + pt_A = cipher.decrypt(ct, sentinel, 16) + self.assertEqual(pt, pt_A) + + pt_B = cipher.decrypt(ct, sentinel, 15) + self.assertEqual(sentinel, pt_B) + + pt_C = cipher.decrypt(ct, sentinel, 17) + self.assertEqual(sentinel, pt_C) + + def testByteArray(self): + pt = b"XER" + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(bytearray(pt)) + pt2 = cipher.decrypt(bytearray(ct), '\xFF' * len(pt)) + self.assertEqual(pt, pt2) + + def testMemoryview(self): + pt = b"XER" + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(memoryview(bytearray(pt))) + pt2 = cipher.decrypt(memoryview(bytearray(ct)), b'\xFF' * len(pt)) + self.assertEqual(pt, pt2) + + def test_return_type(self): + pt = b"XYZ" + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(pt) + self.assertTrue(isinstance(ct, bytes)) + pt2 = cipher.decrypt(ct, b'\xAA' * 3) + self.assertTrue(isinstance(pt2, bytes)) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, skip_slow_tests): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._skip_slow_tests = skip_slow_tests + self._id = "None" + + def load_tests(self, filename): + + def filter_rsa(group): + return RSA.import_key(group['privateKeyPem']) + + result = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + filename, + "Wycheproof PKCS#1v1.5 (%s)" % filename, + group_tag={'rsa_key': filter_rsa} + ) + return result + + def setUp(self): + self.tv = [] + self.tv.extend(self.load_tests("rsa_pkcs1_2048_test.json")) + if not self._skip_slow_tests: + self.tv.extend(self.load_tests("rsa_pkcs1_3072_test.json")) + self.tv.extend(self.load_tests("rsa_pkcs1_4096_test.json")) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt PKCS#1v1.5 Test #%s" % tv.id + sentinel = b'\xAA' * max(3, len(tv.msg)) + cipher = PKCS.new(tv.rsa_key) + try: + pt = cipher.decrypt(tv.ct, sentinel=sentinel) + except ValueError: + assert not tv.valid + else: + if pt == sentinel: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def runTest(self): + + for tv in self.tv: + self.test_decrypt(tv) + + +def get_tests(config={}): + skip_slow_tests = not config.get('slow_tests') + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(PKCS1_15_Tests) + tests += [TestVectorsWycheproof(wycheproof_warnings, skip_slow_tests)] + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py new file mode 100644 index 0000000..aa00c9c --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py @@ -0,0 +1,506 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Cipher/test_pkcs1_oaep.py: Self-test for PKCS#1 OAEP encryption +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +import unittest + +from Cryptodome.SelfTest.st_common import list_test_cases, a2b_hex +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof + +from Cryptodome.PublicKey import RSA +from Cryptodome.Cipher import PKCS1_OAEP as PKCS +from Cryptodome.Hash import MD2, MD5, SHA1, SHA256, RIPEMD160, SHA224, SHA384, SHA512 +from Cryptodome import Random +from Cryptodome.Signature.pss import MGF1 + +from Cryptodome.Util.py3compat import b, bchr + + +def rws(t): + """Remove white spaces, tabs, and new lines from a string""" + for c in ['\n', '\t', ' ']: + t = t.replace(c, '') + return t + + +def t2b(t): + """Convert a text string with bytes in hex form to a byte string""" + clean = rws(t) + if len(clean) % 2 == 1: + raise ValueError("Even number of characters expected") + return a2b_hex(clean) + + +class PKCS1_OAEP_Tests(unittest.TestCase): + + def setUp(self): + self.rng = Random.new().read + self.key1024 = RSA.generate(1024, self.rng) + + # List of tuples with test data for PKCS#1 OAEP + # Each tuple is made up by: + # Item #0: dictionary with RSA key component + # Item #1: plaintext + # Item #2: ciphertext + # Item #3: random data (=seed) + # Item #4: hash object + + _testData = ( + + # + # From in oaep-int.txt to be found in + # ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip + # + ( + # Private key + { + 'n':'''bb f8 2f 09 06 82 ce 9c 23 38 ac 2b 9d a8 71 f7 + 36 8d 07 ee d4 10 43 a4 40 d6 b6 f0 74 54 f5 1f + b8 df ba af 03 5c 02 ab 61 ea 48 ce eb 6f cd 48 + 76 ed 52 0d 60 e1 ec 46 19 71 9d 8a 5b 8b 80 7f + af b8 e0 a3 df c7 37 72 3e e6 b4 b7 d9 3a 25 84 + ee 6a 64 9d 06 09 53 74 88 34 b2 45 45 98 39 4e + e0 aa b1 2d 7b 61 a5 1f 52 7a 9a 41 f6 c1 68 7f + e2 53 72 98 ca 2a 8f 59 46 f8 e5 fd 09 1d bd cb''', + # Public key + 'e':'11', + # In the test vector, only p and q were given... + # d is computed offline as e^{-1} mod (p-1)(q-1) + 'd':'''a5dafc5341faf289c4b988db30c1cdf83f31251e0 + 668b42784813801579641b29410b3c7998d6bc465745e5c3 + 92669d6870da2c082a939e37fdcb82ec93edac97ff3ad595 + 0accfbc111c76f1a9529444e56aaf68c56c092cd38dc3bef + 5d20a939926ed4f74a13eddfbe1a1cecc4894af9428c2b7b + 8883fe4463a4bc85b1cb3c1''' + } + , + # Plaintext + '''d4 36 e9 95 69 fd 32 a7 c8 a0 5b bc 90 d3 2c 49''', + # Ciphertext + '''12 53 e0 4d c0 a5 39 7b b4 4a 7a b8 7e 9b f2 a0 + 39 a3 3d 1e 99 6f c8 2a 94 cc d3 00 74 c9 5d f7 + 63 72 20 17 06 9e 52 68 da 5d 1c 0b 4f 87 2c f6 + 53 c1 1d f8 23 14 a6 79 68 df ea e2 8d ef 04 bb + 6d 84 b1 c3 1d 65 4a 19 70 e5 78 3b d6 eb 96 a0 + 24 c2 ca 2f 4a 90 fe 9f 2e f5 c9 c1 40 e5 bb 48 + da 95 36 ad 87 00 c8 4f c9 13 0a de a7 4e 55 8d + 51 a7 4d df 85 d8 b5 0d e9 68 38 d6 06 3e 09 55''', + # Random + '''aa fd 12 f6 59 ca e6 34 89 b4 79 e5 07 6d de c2 + f0 6c b5 8f''', + # Hash + SHA1, + ), + + # + # From in oaep-vect.txt to be found in Example 1.1 + # ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip + # + ( + # Private key + { + 'n':'''a8 b3 b2 84 af 8e b5 0b 38 70 34 a8 60 f1 46 c4 + 91 9f 31 87 63 cd 6c 55 98 c8 ae 48 11 a1 e0 ab + c4 c7 e0 b0 82 d6 93 a5 e7 fc ed 67 5c f4 66 85 + 12 77 2c 0c bc 64 a7 42 c6 c6 30 f5 33 c8 cc 72 + f6 2a e8 33 c4 0b f2 58 42 e9 84 bb 78 bd bf 97 + c0 10 7d 55 bd b6 62 f5 c4 e0 fa b9 84 5c b5 14 + 8e f7 39 2d d3 aa ff 93 ae 1e 6b 66 7b b3 d4 24 + 76 16 d4 f5 ba 10 d4 cf d2 26 de 88 d3 9f 16 fb''', + 'e':'''01 00 01''', + 'd':'''53 33 9c fd b7 9f c8 46 6a 65 5c 73 16 ac a8 5c + 55 fd 8f 6d d8 98 fd af 11 95 17 ef 4f 52 e8 fd + 8e 25 8d f9 3f ee 18 0f a0 e4 ab 29 69 3c d8 3b + 15 2a 55 3d 4a c4 d1 81 2b 8b 9f a5 af 0e 7f 55 + fe 73 04 df 41 57 09 26 f3 31 1f 15 c4 d6 5a 73 + 2c 48 31 16 ee 3d 3d 2d 0a f3 54 9a d9 bf 7c bf + b7 8a d8 84 f8 4d 5b eb 04 72 4d c7 36 9b 31 de + f3 7d 0c f5 39 e9 cf cd d3 de 65 37 29 ea d5 d1 ''' + } + , + # Plaintext + '''66 28 19 4e 12 07 3d b0 3b a9 4c da 9e f9 53 23 + 97 d5 0d ba 79 b9 87 00 4a fe fe 34''', + # Ciphertext + '''35 4f e6 7b 4a 12 6d 5d 35 fe 36 c7 77 79 1a 3f + 7b a1 3d ef 48 4e 2d 39 08 af f7 22 fa d4 68 fb + 21 69 6d e9 5d 0b e9 11 c2 d3 17 4f 8a fc c2 01 + 03 5f 7b 6d 8e 69 40 2d e5 45 16 18 c2 1a 53 5f + a9 d7 bf c5 b8 dd 9f c2 43 f8 cf 92 7d b3 13 22 + d6 e8 81 ea a9 1a 99 61 70 e6 57 a0 5a 26 64 26 + d9 8c 88 00 3f 84 77 c1 22 70 94 a0 d9 fa 1e 8c + 40 24 30 9c e1 ec cc b5 21 00 35 d4 7a c7 2e 8a''', + # Random + '''18 b7 76 ea 21 06 9d 69 77 6a 33 e9 6b ad 48 e1 + dd a0 a5 ef''', + SHA1 + ), + + # + # From in oaep-vect.txt to be found in Example 2.1 + # ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip + # + ( + # Private key + { + 'n':'''01 94 7c 7f ce 90 42 5f 47 27 9e 70 85 1f 25 d5 + e6 23 16 fe 8a 1d f1 93 71 e3 e6 28 e2 60 54 3e + 49 01 ef 60 81 f6 8c 0b 81 41 19 0d 2a e8 da ba + 7d 12 50 ec 6d b6 36 e9 44 ec 37 22 87 7c 7c 1d + 0a 67 f1 4b 16 94 c5 f0 37 94 51 a4 3e 49 a3 2d + de 83 67 0b 73 da 91 a1 c9 9b c2 3b 43 6a 60 05 + 5c 61 0f 0b af 99 c1 a0 79 56 5b 95 a3 f1 52 66 + 32 d1 d4 da 60 f2 0e da 25 e6 53 c4 f0 02 76 6f + 45''', + 'e':'''01 00 01''', + 'd':'''08 23 f2 0f ad b5 da 89 08 8a 9d 00 89 3e 21 fa + 4a 1b 11 fb c9 3c 64 a3 be 0b aa ea 97 fb 3b 93 + c3 ff 71 37 04 c1 9c 96 3c 1d 10 7a ae 99 05 47 + 39 f7 9e 02 e1 86 de 86 f8 7a 6d de fe a6 d8 cc + d1 d3 c8 1a 47 bf a7 25 5b e2 06 01 a4 a4 b2 f0 + 8a 16 7b 5e 27 9d 71 5b 1b 45 5b dd 7e ab 24 59 + 41 d9 76 8b 9a ce fb 3c cd a5 95 2d a3 ce e7 25 + 25 b4 50 16 63 a8 ee 15 c9 e9 92 d9 24 62 fe 39''' + }, + # Plaintext + '''8f f0 0c aa 60 5c 70 28 30 63 4d 9a 6c 3d 42 c6 + 52 b5 8c f1 d9 2f ec 57 0b ee e7''', + # Ciphertext + '''01 81 af 89 22 b9 fc b4 d7 9d 92 eb e1 98 15 99 + 2f c0 c1 43 9d 8b cd 49 13 98 a0 f4 ad 3a 32 9a + 5b d9 38 55 60 db 53 26 83 c8 b7 da 04 e4 b1 2a + ed 6a ac df 47 1c 34 c9 cd a8 91 ad dc c2 df 34 + 56 65 3a a6 38 2e 9a e5 9b 54 45 52 57 eb 09 9d + 56 2b be 10 45 3f 2b 6d 13 c5 9c 02 e1 0f 1f 8a + bb 5d a0 d0 57 09 32 da cf 2d 09 01 db 72 9d 0f + ef cc 05 4e 70 96 8e a5 40 c8 1b 04 bc ae fe 72 + 0e''', + # Random + '''8c 40 7b 5e c2 89 9e 50 99 c5 3e 8c e7 93 bf 94 + e7 1b 17 82''', + SHA1 + ), + + # + # From in oaep-vect.txt to be found in Example 10.1 + # ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip + # + ( + # Private key + { + 'n':'''ae 45 ed 56 01 ce c6 b8 cc 05 f8 03 93 5c 67 4d + db e0 d7 5c 4c 09 fd 79 51 fc 6b 0c ae c3 13 a8 + df 39 97 0c 51 8b ff ba 5e d6 8f 3f 0d 7f 22 a4 + 02 9d 41 3f 1a e0 7e 4e be 9e 41 77 ce 23 e7 f5 + 40 4b 56 9e 4e e1 bd cf 3c 1f b0 3e f1 13 80 2d + 4f 85 5e b9 b5 13 4b 5a 7c 80 85 ad ca e6 fa 2f + a1 41 7e c3 76 3b e1 71 b0 c6 2b 76 0e de 23 c1 + 2a d9 2b 98 08 84 c6 41 f5 a8 fa c2 6b da d4 a0 + 33 81 a2 2f e1 b7 54 88 50 94 c8 25 06 d4 01 9a + 53 5a 28 6a fe b2 71 bb 9b a5 92 de 18 dc f6 00 + c2 ae ea e5 6e 02 f7 cf 79 fc 14 cf 3b dc 7c d8 + 4f eb bb f9 50 ca 90 30 4b 22 19 a7 aa 06 3a ef + a2 c3 c1 98 0e 56 0c d6 4a fe 77 95 85 b6 10 76 + 57 b9 57 85 7e fd e6 01 09 88 ab 7d e4 17 fc 88 + d8 f3 84 c4 e6 e7 2c 3f 94 3e 0c 31 c0 c4 a5 cc + 36 f8 79 d8 a3 ac 9d 7d 59 86 0e aa da 6b 83 bb''', + 'e':'''01 00 01''', + 'd':'''05 6b 04 21 6f e5 f3 54 ac 77 25 0a 4b 6b 0c 85 + 25 a8 5c 59 b0 bd 80 c5 64 50 a2 2d 5f 43 8e 59 + 6a 33 3a a8 75 e2 91 dd 43 f4 8c b8 8b 9d 5f c0 + d4 99 f9 fc d1 c3 97 f9 af c0 70 cd 9e 39 8c 8d + 19 e6 1d b7 c7 41 0a 6b 26 75 df bf 5d 34 5b 80 + 4d 20 1a dd 50 2d 5c e2 df cb 09 1c e9 99 7b be + be 57 30 6f 38 3e 4d 58 81 03 f0 36 f7 e8 5d 19 + 34 d1 52 a3 23 e4 a8 db 45 1d 6f 4a 5b 1b 0f 10 + 2c c1 50 e0 2f ee e2 b8 8d ea 4a d4 c1 ba cc b2 + 4d 84 07 2d 14 e1 d2 4a 67 71 f7 40 8e e3 05 64 + fb 86 d4 39 3a 34 bc f0 b7 88 50 1d 19 33 03 f1 + 3a 22 84 b0 01 f0 f6 49 ea f7 93 28 d4 ac 5c 43 + 0a b4 41 49 20 a9 46 0e d1 b7 bc 40 ec 65 3e 87 + 6d 09 ab c5 09 ae 45 b5 25 19 01 16 a0 c2 61 01 + 84 82 98 50 9c 1c 3b f3 a4 83 e7 27 40 54 e1 5e + 97 07 50 36 e9 89 f6 09 32 80 7b 52 57 75 1e 79''' + }, + # Plaintext + '''8b ba 6b f8 2a 6c 0f 86 d5 f1 75 6e 97 95 68 70 + b0 89 53 b0 6b 4e b2 05 bc 16 94 ee''', + # Ciphertext + '''53 ea 5d c0 8c d2 60 fb 3b 85 85 67 28 7f a9 15 + 52 c3 0b 2f eb fb a2 13 f0 ae 87 70 2d 06 8d 19 + ba b0 7f e5 74 52 3d fb 42 13 9d 68 c3 c5 af ee + e0 bf e4 cb 79 69 cb f3 82 b8 04 d6 e6 13 96 14 + 4e 2d 0e 60 74 1f 89 93 c3 01 4b 58 b9 b1 95 7a + 8b ab cd 23 af 85 4f 4c 35 6f b1 66 2a a7 2b fc + c7 e5 86 55 9d c4 28 0d 16 0c 12 67 85 a7 23 eb + ee be ff 71 f1 15 94 44 0a ae f8 7d 10 79 3a 87 + 74 a2 39 d4 a0 4c 87 fe 14 67 b9 da f8 52 08 ec + 6c 72 55 79 4a 96 cc 29 14 2f 9a 8b d4 18 e3 c1 + fd 67 34 4b 0c d0 82 9d f3 b2 be c6 02 53 19 62 + 93 c6 b3 4d 3f 75 d3 2f 21 3d d4 5c 62 73 d5 05 + ad f4 cc ed 10 57 cb 75 8f c2 6a ee fa 44 12 55 + ed 4e 64 c1 99 ee 07 5e 7f 16 64 61 82 fd b4 64 + 73 9b 68 ab 5d af f0 e6 3e 95 52 01 68 24 f0 54 + bf 4d 3c 8c 90 a9 7b b6 b6 55 32 84 eb 42 9f cc''', + # Random + '''47 e1 ab 71 19 fe e5 6c 95 ee 5e aa d8 6f 40 d0 + aa 63 bd 33''', + SHA1 + ), + ) + + def testEncrypt1(self): + # Verify encryption using all test vectors + for test in self._testData: + # Build the key + comps = [int(rws(test[0][x]), 16) for x in ('n', 'e')] + key = RSA.construct(comps) + + # RNG that takes its random numbers from a pool given + # at initialization + class randGen: + + def __init__(self, data): + self.data = data + self.idx = 0 + + def __call__(self, N): + r = self.data[self.idx:N] + self.idx += N + return r + + # The real test + cipher = PKCS.new(key, test[4], randfunc=randGen(t2b(test[3]))) + ct = cipher.encrypt(t2b(test[1])) + self.assertEqual(ct, t2b(test[2])) + + def testEncrypt2(self): + # Verify that encryption fails if plaintext is too long + pt = '\x00'*(128-2*20-2+1) + cipher = PKCS.new(self.key1024) + self.assertRaises(ValueError, cipher.encrypt, pt) + + def testDecrypt1(self): + # Verify decryption using all test vectors + for test in self._testData: + # Build the key + comps = [int(rws(test[0][x]),16) for x in ('n', 'e', 'd')] + key = RSA.construct(comps) + # The real test + cipher = PKCS.new(key, test[4]) + pt = cipher.decrypt(t2b(test[2])) + self.assertEqual(pt, t2b(test[1])) + + def testDecrypt2(self): + # Simplest possible negative tests + for ct_size in (127, 128, 129): + cipher = PKCS.new(self.key1024) + self.assertRaises(ValueError, cipher.decrypt, bchr(0x00)*ct_size) + + def testEncryptDecrypt1(self): + # Encrypt/Decrypt messages of length [0..128-2*20-2] + for pt_len in range(0, 128-2*20-2): + pt = self.rng(pt_len) + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(pt) + pt2 = cipher.decrypt(ct) + self.assertEqual(pt, pt2) + + def testEncryptDecrypt2(self): + # Helper function to monitor what's requested from RNG + global asked + + def localRng(N): + global asked + asked += N + return self.rng(N) + + # Verify that OAEP is friendly to all hashes + for hashmod in (MD2, MD5, SHA1, SHA256, RIPEMD160): + # Verify that encrypt() asks for as many random bytes + # as the hash output size + asked = 0 + pt = self.rng(40) + cipher = PKCS.new(self.key1024, hashmod, randfunc=localRng) + ct = cipher.encrypt(pt) + self.assertEqual(cipher.decrypt(ct), pt) + self.assertEqual(asked, hashmod.digest_size) + + def testEncryptDecrypt3(self): + # Verify that OAEP supports labels + pt = self.rng(35) + xlabel = self.rng(22) + cipher = PKCS.new(self.key1024, label=xlabel) + ct = cipher.encrypt(pt) + self.assertEqual(cipher.decrypt(ct), pt) + + def testEncryptDecrypt4(self): + # Verify that encrypt() uses the custom MGF + global mgfcalls + # Helper function to monitor what's requested from MGF + + def newMGF(seed, maskLen): + global mgfcalls + mgfcalls += 1 + return b'\x00' * maskLen + + mgfcalls = 0 + pt = self.rng(32) + cipher = PKCS.new(self.key1024, mgfunc=newMGF) + ct = cipher.encrypt(pt) + self.assertEqual(mgfcalls, 2) + self.assertEqual(cipher.decrypt(ct), pt) + + def testByteArray(self): + pt = b("XER") + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(bytearray(pt)) + pt2 = cipher.decrypt(bytearray(ct)) + self.assertEqual(pt, pt2) + + def testMemoryview(self): + pt = b("XER") + cipher = PKCS.new(self.key1024) + ct = cipher.encrypt(memoryview(bytearray(pt))) + pt2 = cipher.decrypt(memoryview(bytearray(ct))) + self.assertEqual(pt, pt2) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, skip_slow_tests): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._skip_slow_tests = skip_slow_tests + self._id = "None" + + def load_tests(self, filename): + + def filter_rsa(group): + return RSA.import_key(group['privateKeyPem']) + + def filter_sha(group): + if group['sha'] == "SHA-1": + return SHA1 + elif group['sha'] == "SHA-224": + return SHA224 + elif group['sha'] == "SHA-256": + return SHA256 + elif group['sha'] == "SHA-384": + return SHA384 + elif group['sha'] == "SHA-512": + return SHA512 + else: + raise ValueError("Unknown sha " + group['sha']) + + def filter_mgf(group): + if group['mgfSha'] == "SHA-1": + return lambda x, y: MGF1(x, y, SHA1) + elif group['mgfSha'] == "SHA-224": + return lambda x, y: MGF1(x, y, SHA224) + elif group['mgfSha'] == "SHA-256": + return lambda x, y: MGF1(x, y, SHA256) + elif group['mgfSha'] == "SHA-384": + return lambda x, y: MGF1(x, y, SHA384) + elif group['mgfSha'] == "SHA-512": + return lambda x, y: MGF1(x, y, SHA512) + else: + raise ValueError("Unknown mgf/sha " + group['mgfSha']) + + def filter_algo(group): + return "%s with MGF1/%s" % (group['sha'], group['mgfSha']) + + result = load_test_vectors_wycheproof(("Cipher", "wycheproof"), + filename, + "Wycheproof PKCS#1 OAEP (%s)" % filename, + group_tag={'rsa_key': filter_rsa, + 'hash_mod': filter_sha, + 'mgf': filter_mgf, + 'algo': filter_algo} + ) + return result + + def setUp(self): + self.tv = [] + self.tv.extend(self.load_tests("rsa_oaep_2048_sha1_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha224_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha224_mgf1sha224_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha256_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha256_mgf1sha256_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha384_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha384_mgf1sha384_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha512_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_2048_sha512_mgf1sha512_test.json")) + if not self._skip_slow_tests: + self.tv.extend(self.load_tests("rsa_oaep_3072_sha256_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_3072_sha256_mgf1sha256_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_3072_sha512_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_3072_sha512_mgf1sha512_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_4096_sha256_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_4096_sha256_mgf1sha256_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_4096_sha512_mgf1sha1_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_4096_sha512_mgf1sha512_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_4096_sha512_mgf1sha512_test.json")) + self.tv.extend(self.load_tests("rsa_oaep_misc_test.json")) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_decrypt(self, tv): + self._id = "Wycheproof Decrypt %s Test #%s" % (tv.algo, tv.id) + + cipher = PKCS.new(tv.rsa_key, hashAlgo=tv.hash_mod, mgfunc=tv.mgf, label=tv.label) + try: + pt = cipher.decrypt(tv.ct) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.assertEqual(pt, tv.msg) + self.warn(tv) + + def runTest(self): + + for tv in self.tv: + self.test_decrypt(tv) + + +def get_tests(config={}): + skip_slow_tests = not config.get('slow_tests') + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(PKCS1_OAEP_Tests) + tests += [TestVectorsWycheproof(wycheproof_warnings, skip_slow_tests)] + return tests + + +if __name__ == '__main__': + def suite(): + unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/__init__.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/__init__.py new file mode 100644 index 0000000..d4d9f2e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/__init__.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/__init__.py: Self-test for hash modules +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test for hash modules""" + +__revision__ = "$Id$" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Hash import test_HMAC; tests += test_HMAC.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_CMAC; tests += test_CMAC.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_MD2; tests += test_MD2.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_MD4; tests += test_MD4.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_MD5; tests += test_MD5.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_RIPEMD160; tests += test_RIPEMD160.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA1; tests += test_SHA1.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA224; tests += test_SHA224.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA256; tests += test_SHA256.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA384; tests += test_SHA384.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA512; tests += test_SHA512.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA3_224; tests += test_SHA3_224.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA3_256; tests += test_SHA3_256.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA3_384; tests += test_SHA3_384.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHA3_512; tests += test_SHA3_512.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_keccak; tests += test_keccak.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_SHAKE; tests += test_SHAKE.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_BLAKE2; tests += test_BLAKE2.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_Poly1305; tests += test_Poly1305.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_cSHAKE; tests += test_cSHAKE.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_KMAC; tests += test_KMAC.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_TupleHash; tests += test_TupleHash.get_tests(config=config) + from Cryptodome.SelfTest.Hash import test_KangarooTwelve; tests += test_KangarooTwelve.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/common.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/common.py new file mode 100644 index 0000000..4ed9234 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/common.py @@ -0,0 +1,290 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/common.py: Common code for Cryptodome.SelfTest.Hash +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-testing for PyCryptodome hash modules""" + +import re +import sys +import unittest +import binascii +import Cryptodome.Hash +from binascii import hexlify, unhexlify +from Cryptodome.Util.py3compat import b, tobytes +from Cryptodome.Util.strxor import strxor_c + +def t2b(hex_string): + shorter = re.sub(br'\s+', b'', tobytes(hex_string)) + return unhexlify(shorter) + + +class HashDigestSizeSelfTest(unittest.TestCase): + + def __init__(self, hashmod, description, expected, extra_params): + unittest.TestCase.__init__(self) + self.hashmod = hashmod + self.expected = expected + self.description = description + self.extra_params = extra_params + + def shortDescription(self): + return self.description + + def runTest(self): + if "truncate" not in self.extra_params: + self.assertTrue(hasattr(self.hashmod, "digest_size")) + self.assertEqual(self.hashmod.digest_size, self.expected) + h = self.hashmod.new(**self.extra_params) + self.assertTrue(hasattr(h, "digest_size")) + self.assertEqual(h.digest_size, self.expected) + + +class HashSelfTest(unittest.TestCase): + + def __init__(self, hashmod, description, expected, input, extra_params): + unittest.TestCase.__init__(self) + self.hashmod = hashmod + self.expected = expected.lower() + self.input = input + self.description = description + self.extra_params = extra_params + + def shortDescription(self): + return self.description + + def runTest(self): + h = self.hashmod.new(**self.extra_params) + h.update(self.input) + + out1 = binascii.b2a_hex(h.digest()) + out2 = h.hexdigest() + + h = self.hashmod.new(self.input, **self.extra_params) + + out3 = h.hexdigest() + out4 = binascii.b2a_hex(h.digest()) + + # PY3K: hexdigest() should return str(), and digest() bytes + self.assertEqual(self.expected, out1) # h = .new(); h.update(data); h.digest() + if sys.version_info[0] == 2: + self.assertEqual(self.expected, out2) # h = .new(); h.update(data); h.hexdigest() + self.assertEqual(self.expected, out3) # h = .new(data); h.hexdigest() + else: + self.assertEqual(self.expected.decode(), out2) # h = .new(); h.update(data); h.hexdigest() + self.assertEqual(self.expected.decode(), out3) # h = .new(data); h.hexdigest() + self.assertEqual(self.expected, out4) # h = .new(data); h.digest() + + # Verify that the .new() method produces a fresh hash object, except + # for MD5 and SHA1, which are hashlib objects. (But test any .new() + # method that does exist.) + if self.hashmod.__name__ not in ('Cryptodome.Hash.MD5', 'Cryptodome.Hash.SHA1') or hasattr(h, 'new'): + h2 = h.new() + h2.update(self.input) + out5 = binascii.b2a_hex(h2.digest()) + self.assertEqual(self.expected, out5) + + +class HashTestOID(unittest.TestCase): + def __init__(self, hashmod, oid, extra_params): + unittest.TestCase.__init__(self) + self.hashmod = hashmod + self.oid = oid + self.extra_params = extra_params + + def runTest(self): + h = self.hashmod.new(**self.extra_params) + self.assertEqual(h.oid, self.oid) + + +class ByteArrayTest(unittest.TestCase): + + def __init__(self, module, extra_params): + unittest.TestCase.__init__(self) + self.module = module + self.extra_params = extra_params + + def runTest(self): + data = b("\x00\x01\x02") + + # Data can be a bytearray (during initialization) + ba = bytearray(data) + + h1 = self.module.new(data, **self.extra_params) + h2 = self.module.new(ba, **self.extra_params) + ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a bytearray (during operation) + ba = bytearray(data) + + h1 = self.module.new(**self.extra_params) + h2 = self.module.new(**self.extra_params) + + h1.update(data) + h2.update(ba) + + ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +class MemoryViewTest(unittest.TestCase): + + def __init__(self, module, extra_params): + unittest.TestCase.__init__(self) + self.module = module + self.extra_params = extra_params + + def runTest(self): + + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in get_mv_ro, get_mv_rw: + + # Data can be a memoryview (during initialization) + mv = get_mv(data) + + h1 = self.module.new(data, **self.extra_params) + h2 = self.module.new(mv, **self.extra_params) + if not mv.readonly: + mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + mv = get_mv(data) + + h1 = self.module.new(**self.extra_params) + h2 = self.module.new(**self.extra_params) + h1.update(data) + h2.update(mv) + if not mv.readonly: + mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +class MACSelfTest(unittest.TestCase): + + def __init__(self, module, description, result, data, key, params): + unittest.TestCase.__init__(self) + self.module = module + self.result = t2b(result) + self.data = t2b(data) + self.key = t2b(key) + self.params = params + self.description = description + + def shortDescription(self): + return self.description + + def runTest(self): + + result_hex = hexlify(self.result) + + # Verify result + h = self.module.new(self.key, **self.params) + h.update(self.data) + self.assertEqual(self.result, h.digest()) + self.assertEqual(hexlify(self.result).decode('ascii'), h.hexdigest()) + + # Verify that correct MAC does not raise any exception + h.verify(self.result) + h.hexverify(result_hex) + + # Verify that incorrect MAC does raise ValueError exception + wrong_mac = strxor_c(self.result, 255) + self.assertRaises(ValueError, h.verify, wrong_mac) + self.assertRaises(ValueError, h.hexverify, "4556") + + # Verify again, with data passed to new() + h = self.module.new(self.key, self.data, **self.params) + self.assertEqual(self.result, h.digest()) + self.assertEqual(hexlify(self.result).decode('ascii'), h.hexdigest()) + + # Test .copy() + try: + h = self.module.new(self.key, self.data, **self.params) + h2 = h.copy() + h3 = h.copy() + + # Verify that changing the copy does not change the original + h2.update(b"bla") + self.assertEqual(h3.digest(), self.result) + + # Verify that both can reach the same state + h.update(b"bla") + self.assertEqual(h.digest(), h2.digest()) + except NotImplementedError: + pass + + # PY3K: Check that hexdigest() returns str and digest() returns bytes + self.assertTrue(isinstance(h.digest(), type(b""))) + self.assertTrue(isinstance(h.hexdigest(), type(""))) + + # PY3K: Check that .hexverify() accepts bytes or str + h.hexverify(h.hexdigest()) + h.hexverify(h.hexdigest().encode('ascii')) + + +def make_hash_tests(module, module_name, test_data, digest_size, oid=None, + extra_params={}): + tests = [] + for i in range(len(test_data)): + row = test_data[i] + (expected, input) = map(tobytes,row[0:2]) + if len(row) < 3: + description = repr(input) + else: + description = row[2] + name = "%s #%d: %s" % (module_name, i+1, description) + tests.append(HashSelfTest(module, name, expected, input, extra_params)) + + name = "%s #%d: digest_size" % (module_name, len(test_data) + 1) + tests.append(HashDigestSizeSelfTest(module, name, digest_size, extra_params)) + + if oid is not None: + tests.append(HashTestOID(module, oid, extra_params)) + + tests.append(ByteArrayTest(module, extra_params)) + + tests.append(MemoryViewTest(module, extra_params)) + + return tests + + +def make_mac_tests(module, module_name, test_data): + tests = [] + for i, row in enumerate(test_data): + if len(row) == 4: + (key, data, results, description, params) = list(row) + [ {} ] + else: + (key, data, results, description, params) = row + name = "%s #%d: %s" % (module_name, i+1, description) + tests.append(MACSelfTest(module, name, results, data, key, params)) + return tests + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py new file mode 100644 index 0000000..e5ed63b --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py @@ -0,0 +1,482 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import os +import re +import unittest +import warnings +from binascii import unhexlify, hexlify + +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Util.strxor import strxor_c +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import BLAKE2b, BLAKE2s + + +class Blake2Test(unittest.TestCase): + + def test_new_positive(self): + + h = self.BLAKE2.new(digest_bits=self.max_bits) + for new_func in self.BLAKE2.new, h.new: + + for dbits in range(8, self.max_bits + 1, 8): + hobj = new_func(digest_bits=dbits) + self.assertEqual(hobj.digest_size, dbits // 8) + + for dbytes in range(1, self.max_bytes + 1): + hobj = new_func(digest_bytes=dbytes) + self.assertEqual(hobj.digest_size, dbytes) + + digest1 = new_func(data=b"\x90", digest_bytes=self.max_bytes).digest() + digest2 = new_func(digest_bytes=self.max_bytes).update(b"\x90").digest() + self.assertEqual(digest1, digest2) + + new_func(data=b"A", key=b"5", digest_bytes=self.max_bytes) + + hobj = h.new() + self.assertEqual(hobj.digest_size, self.max_bytes) + + def test_new_negative(self): + + h = self.BLAKE2.new(digest_bits=self.max_bits) + for new_func in self.BLAKE2.new, h.new: + self.assertRaises(TypeError, new_func, + digest_bytes=self.max_bytes, + digest_bits=self.max_bits) + self.assertRaises(ValueError, new_func, digest_bytes=0) + self.assertRaises(ValueError, new_func, + digest_bytes=self.max_bytes + 1) + self.assertRaises(ValueError, new_func, digest_bits=7) + self.assertRaises(ValueError, new_func, digest_bits=15) + self.assertRaises(ValueError, new_func, + digest_bits=self.max_bits + 1) + self.assertRaises(TypeError, new_func, + digest_bytes=self.max_bytes, + key=u"string") + self.assertRaises(TypeError, new_func, + digest_bytes=self.max_bytes, + data=u"string") + + def test_default_digest_size(self): + digest = self.BLAKE2.new(data=b'abc').digest() + self.assertEqual(len(digest), self.max_bytes) + + def test_update(self): + pieces = [b"\x0A" * 200, b"\x14" * 300] + h = self.BLAKE2.new(digest_bytes=self.max_bytes) + h.update(pieces[0]).update(pieces[1]) + digest = h.digest() + h = self.BLAKE2.new(digest_bytes=self.max_bytes) + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.digest(), digest) + + def test_update_negative(self): + h = self.BLAKE2.new(digest_bytes=self.max_bytes) + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = self.BLAKE2.new(digest_bytes=self.max_bytes) + digest = h.digest() + + # hexdigest does not change the state + self.assertEqual(h.digest(), digest) + # digest returns a byte string + self.assertTrue(isinstance(digest, type(b"digest"))) + + def test_update_after_digest(self): + msg = b"rrrrttt" + + # Normally, update() cannot be done after digest() + h = self.BLAKE2.new(digest_bits=256, data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = self.BLAKE2.new(digest_bits=256, data=msg).digest() + + # With the proper flag, it is allowed + h = self.BLAKE2.new(digest_bits=256, data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + def test_hex_digest(self): + mac = self.BLAKE2.new(digest_bits=self.max_bits) + digest = mac.digest() + hexdigest = mac.hexdigest() + + # hexdigest is equivalent to digest + self.assertEqual(hexlify(digest), tobytes(hexdigest)) + # hexdigest does not change the state + self.assertEqual(mac.hexdigest(), hexdigest) + # hexdigest returns a string + self.assertTrue(isinstance(hexdigest, type("digest"))) + + def test_verify(self): + h = self.BLAKE2.new(digest_bytes=self.max_bytes, key=b"4") + mac = h.digest() + h.verify(mac) + wrong_mac = strxor_c(mac, 255) + self.assertRaises(ValueError, h.verify, wrong_mac) + + def test_hexverify(self): + h = self.BLAKE2.new(digest_bytes=self.max_bytes, key=b"4") + mac = h.hexdigest() + h.hexverify(mac) + self.assertRaises(ValueError, h.hexverify, "4556") + + def test_oid(self): + + prefix = "1.3.6.1.4.1.1722.12.2." + self.oid_variant + "." + + for digest_bits in self.digest_bits_oid: + h = self.BLAKE2.new(digest_bits=digest_bits) + self.assertEqual(h.oid, prefix + str(digest_bits // 8)) + + h = self.BLAKE2.new(digest_bits=digest_bits, key=b"secret") + self.assertRaises(AttributeError, lambda: h.oid) + + for digest_bits in (8, self.max_bits): + if digest_bits in self.digest_bits_oid: + continue + self.assertRaises(AttributeError, lambda: h.oid) + + def test_bytearray(self): + + key = b'0' * 16 + data = b"\x00\x01\x02" + + # Data and key can be a bytearray (during initialization) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = self.BLAKE2.new(data=data, key=key) + h2 = self.BLAKE2.new(data=data_ba, key=key_ba) + key_ba[:1] = b'\xFF' + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a bytearray (during operation) + data_ba = bytearray(data) + + h1 = self.BLAKE2.new() + h2 = self.BLAKE2.new() + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + def test_memoryview(self): + + key = b'0' * 16 + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data and key can be a memoryview (during initialization) + key_mv = get_mv(key) + data_mv = get_mv(data) + + h1 = self.BLAKE2.new(data=data, key=key) + h2 = self.BLAKE2.new(data=data_mv, key=key_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + key_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = self.BLAKE2.new() + h2 = self.BLAKE2.new() + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + +class Blake2bTest(Blake2Test): + #: Module + BLAKE2 = BLAKE2b + #: Max output size (in bits) + max_bits = 512 + #: Max output size (in bytes) + max_bytes = 64 + #: Bit size of the digests for which an ASN OID exists + digest_bits_oid = (160, 256, 384, 512) + # http://tools.ietf.org/html/draft-saarinen-blake2-02 + oid_variant = "1" + + +class Blake2sTest(Blake2Test): + #: Module + BLAKE2 = BLAKE2s + #: Max output size (in bits) + max_bits = 256 + #: Max output size (in bytes) + max_bytes = 32 + #: Bit size of the digests for which an ASN OID exists + digest_bits_oid = (128, 160, 224, 256) + # http://tools.ietf.org/html/draft-saarinen-blake2-02 + oid_variant = "2" + + +class Blake2OfficialTestVector(unittest.TestCase): + + def _load_tests(self, test_vector_file): + expected = "in" + test_vectors = [] + with open(test_vector_file, "rt") as test_vector_fd: + for line_number, line in enumerate(test_vector_fd): + + if line.strip() == "" or line.startswith("#"): + continue + + res = re.match("%s:\t([0-9A-Fa-f]*)" % expected, line) + if not res: + raise ValueError("Incorrect test vector format (line %d)" + % line_number) + + if res.group(1): + bin_value = unhexlify(tobytes(res.group(1))) + else: + bin_value = b"" + if expected == "in": + input_data = bin_value + expected = "key" + elif expected == "key": + key = bin_value + expected = "hash" + else: + result = bin_value + expected = "in" + test_vectors.append((input_data, key, result)) + return test_vectors + + def setUp(self): + + dir_comps = ("Hash", self.name) + file_name = self.name.lower() + "-test.txt" + self.description = "%s tests" % self.name + + try: + import pycryptodome_test_vectors # type: ignore + except ImportError: + warnings.warn("Warning: skipping extended tests for %s" % self.name, + UserWarning) + self.test_vectors = [] + return + + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + self.test_vectors = self._load_tests(full_file_name) + + def runTest(self): + for (input_data, key, result) in self.test_vectors: + mac = self.BLAKE2.new(key=key, digest_bytes=self.max_bytes) + mac.update(input_data) + self.assertEqual(mac.digest(), result) + + +class Blake2bOfficialTestVector(Blake2OfficialTestVector): + #: Module + BLAKE2 = BLAKE2b + #: Hash name + name = "BLAKE2b" + #: Max digest size + max_bytes = 64 + + +class Blake2sOfficialTestVector(Blake2OfficialTestVector): + #: Module + BLAKE2 = BLAKE2s + #: Hash name + name = "BLAKE2s" + #: Max digest size + max_bytes = 32 + + +class Blake2TestVector1(unittest.TestCase): + + def _load_tests(self, test_vector_file): + test_vectors = [] + with open(test_vector_file, "rt") as test_vector_fd: + for line_number, line in enumerate(test_vector_fd): + if line.strip() == "" or line.startswith("#"): + continue + res = re.match("digest: ([0-9A-Fa-f]*)", line) + if not res: + raise ValueError("Incorrect test vector format (line %d)" + % line_number) + + test_vectors.append(unhexlify(tobytes(res.group(1)))) + return test_vectors + + def setUp(self): + dir_comps = ("Hash", self.name) + file_name = "tv1.txt" + self.description = "%s tests" % self.name + + try: + import pycryptodome_test_vectors + except ImportError: + warnings.warn("Warning: skipping extended tests for %s" % self.name, + UserWarning) + self.test_vectors = [] + return + + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + self.test_vectors = self._load_tests(full_file_name) + + def runTest(self): + + for tv in self.test_vectors: + digest_bytes = len(tv) + next_data = b"" + for _ in range(100): + h = self.BLAKE2.new(digest_bytes=digest_bytes) + h.update(next_data) + next_data = h.digest() + next_data + self.assertEqual(h.digest(), tv) + + +class Blake2bTestVector1(Blake2TestVector1): + #: Module + BLAKE2 = BLAKE2b + #: Hash name + name = "BLAKE2b" + + +class Blake2sTestVector1(Blake2TestVector1): + #: Module + BLAKE2 = BLAKE2s + #: Hash name + name = "BLAKE2s" + + +class Blake2TestVector2(unittest.TestCase): + + def _load_tests(self, test_vector_file): + test_vectors = [] + with open(test_vector_file, "rt") as test_vector_fd: + for line_number, line in enumerate(test_vector_fd): + if line.strip() == "" or line.startswith("#"): + continue + res = re.match(r"digest\(([0-9]+)\): ([0-9A-Fa-f]*)", line) + if not res: + raise ValueError("Incorrect test vector format (line %d)" + % line_number) + key_size = int(res.group(1)) + result = unhexlify(tobytes(res.group(2))) + test_vectors.append((key_size, result)) + return test_vectors + + def setUp(self): + dir_comps = ("Hash", self.name) + file_name = "tv2.txt" + self.description = "%s tests" % self.name + + try: + import pycryptodome_test_vectors # type: ignore + except ImportError: + warnings.warn("Warning: skipping extended tests for %s" % self.name, + UserWarning) + self.test_vectors = [] + return + + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + self.test_vectors = self._load_tests(full_file_name) + + def runTest(self): + + for key_size, result in self.test_vectors: + next_data = b"" + for _ in range(100): + h = self.BLAKE2.new(digest_bytes=self.max_bytes, + key=b"A" * key_size) + h.update(next_data) + next_data = h.digest() + next_data + self.assertEqual(h.digest(), result) + + +class Blake2bTestVector2(Blake2TestVector1): + #: Module + BLAKE2 = BLAKE2b + #: Hash name + name = "BLAKE2b" + #: Max digest size in bytes + max_bytes = 64 + + +class Blake2sTestVector2(Blake2TestVector1): + #: Module + BLAKE2 = BLAKE2s + #: Hash name + name = "BLAKE2s" + #: Max digest size in bytes + max_bytes = 32 + + +def get_tests(config={}): + tests = [] + + tests += list_test_cases(Blake2bTest) + tests.append(Blake2bOfficialTestVector()) + tests.append(Blake2bTestVector1()) + tests.append(Blake2bTestVector2()) + + tests += list_test_cases(Blake2sTest) + tests.append(Blake2sOfficialTestVector()) + tests.append(Blake2sTestVector1()) + tests.append(Blake2sTestVector2()) + + return tests + + +if __name__ == '__main__': + import unittest + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py new file mode 100644 index 0000000..f88f1cd --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py @@ -0,0 +1,448 @@ +# +# SelfTest/Hash/CMAC.py: Self-test for the CMAC module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.CMAC""" + +import json +import unittest +from binascii import unhexlify + +from Cryptodome.Util.py3compat import tobytes + +from Cryptodome.Hash import CMAC +from Cryptodome.Cipher import AES, DES3 +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.Util.strxor import strxor + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof + +# This is a list of (key, data, result, description, module) tuples. +test_data = [ + + ## Test vectors from RFC 4493 ## + ## The are also in NIST SP 800 38B D.2 ## + ( '2b7e151628aed2a6abf7158809cf4f3c', + '', + 'bb1d6929e95937287fa37d129b756746', + 'RFC 4493 #1', + AES + ), + + ( '2b7e151628aed2a6abf7158809cf4f3c', + '6bc1bee22e409f96e93d7e117393172a', + '070a16b46b4d4144f79bdd9dd04a287c', + 'RFC 4493 #2', + AES + ), + + ( '2b7e151628aed2a6abf7158809cf4f3c', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411', + 'dfa66747de9ae63030ca32611497c827', + 'RFC 4493 #3', + AES + ), + + ( '2b7e151628aed2a6abf7158809cf4f3c', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+ + 'f69f2445df4f9b17ad2b417be66c3710', + '51f0bebf7e3b9d92fc49741779363cfe', + 'RFC 4493 #4', + AES + ), + + ## The rest of Appendix D of NIST SP 800 38B + ## was not totally correct. + ## Values in Examples 14, 15, 18, and 19 were wrong. + ## The updated test values are published in: + ## http://csrc.nist.gov/publications/nistpubs/800-38B/Updated_CMAC_Examples.pdf + + ( '8e73b0f7da0e6452c810f32b809079e5'+ + '62f8ead2522c6b7b', + '', + 'd17ddf46adaacde531cac483de7a9367', + 'NIST SP 800 38B D.2 Example 5', + AES + ), + + ( '8e73b0f7da0e6452c810f32b809079e5'+ + '62f8ead2522c6b7b', + '6bc1bee22e409f96e93d7e117393172a', + '9e99a7bf31e710900662f65e617c5184', + 'NIST SP 800 38B D.2 Example 6', + AES + ), + + ( '8e73b0f7da0e6452c810f32b809079e5'+ + '62f8ead2522c6b7b', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411', + '8a1de5be2eb31aad089a82e6ee908b0e', + 'NIST SP 800 38B D.2 Example 7', + AES + ), + + ( '8e73b0f7da0e6452c810f32b809079e5'+ + '62f8ead2522c6b7b', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+ + 'f69f2445df4f9b17ad2b417be66c3710', + 'a1d5df0eed790f794d77589659f39a11', + 'NIST SP 800 38B D.2 Example 8', + AES + ), + + ( '603deb1015ca71be2b73aef0857d7781'+ + '1f352c073b6108d72d9810a30914dff4', + '', + '028962f61b7bf89efc6b551f4667d983', + 'NIST SP 800 38B D.3 Example 9', + AES + ), + + ( '603deb1015ca71be2b73aef0857d7781'+ + '1f352c073b6108d72d9810a30914dff4', + '6bc1bee22e409f96e93d7e117393172a', + '28a7023f452e8f82bd4bf28d8c37c35c', + 'NIST SP 800 38B D.3 Example 10', + AES + ), + + ( '603deb1015ca71be2b73aef0857d7781'+ + '1f352c073b6108d72d9810a30914dff4', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411', + 'aaf3d8f1de5640c232f5b169b9c911e6', + 'NIST SP 800 38B D.3 Example 11', + AES + ), + + ( '603deb1015ca71be2b73aef0857d7781'+ + '1f352c073b6108d72d9810a30914dff4', + '6bc1bee22e409f96e93d7e117393172a'+ + 'ae2d8a571e03ac9c9eb76fac45af8e51'+ + '30c81c46a35ce411e5fbc1191a0a52ef'+ + 'f69f2445df4f9b17ad2b417be66c3710', + 'e1992190549f6ed5696a2c056c315410', + 'NIST SP 800 38B D.3 Example 12', + AES + ), + + ( '8aa83bf8cbda1062'+ + '0bc1bf19fbb6cd58'+ + 'bc313d4a371ca8b5', + '', + 'b7a688e122ffaf95', + 'NIST SP 800 38B D.4 Example 13', + DES3 + ), + + ( '8aa83bf8cbda1062'+ + '0bc1bf19fbb6cd58'+ + 'bc313d4a371ca8b5', + '6bc1bee22e409f96', + '8e8f293136283797', + 'NIST SP 800 38B D.4 Example 14', + DES3 + ), + + ( '8aa83bf8cbda1062'+ + '0bc1bf19fbb6cd58'+ + 'bc313d4a371ca8b5', + '6bc1bee22e409f96'+ + 'e93d7e117393172a'+ + 'ae2d8a57', + '743ddbe0ce2dc2ed', + 'NIST SP 800 38B D.4 Example 15', + DES3 + ), + + ( '8aa83bf8cbda1062'+ + '0bc1bf19fbb6cd58'+ + 'bc313d4a371ca8b5', + '6bc1bee22e409f96'+ + 'e93d7e117393172a'+ + 'ae2d8a571e03ac9c'+ + '9eb76fac45af8e51', + '33e6b1092400eae5', + 'NIST SP 800 38B D.4 Example 16', + DES3 + ), + + ( '4cf15134a2850dd5'+ + '8a3d10ba80570d38', + '', + 'bd2ebf9a3ba00361', + 'NIST SP 800 38B D.7 Example 17', + DES3 + ), + + ( '4cf15134a2850dd5'+ + '8a3d10ba80570d38', + '6bc1bee22e409f96', + '4ff2ab813c53ce83', + 'NIST SP 800 38B D.7 Example 18', + DES3 + ), + + ( '4cf15134a2850dd5'+ + '8a3d10ba80570d38', + '6bc1bee22e409f96'+ + 'e93d7e117393172a'+ + 'ae2d8a57', + '62dd1b471902bd4e', + 'NIST SP 800 38B D.7 Example 19', + DES3 + ), + + ( '4cf15134a2850dd5'+ + '8a3d10ba80570d38', + '6bc1bee22e409f96'+ + 'e93d7e117393172a'+ + 'ae2d8a571e03ac9c'+ + '9eb76fac45af8e51', + '31b1e431dabc4eb8', + 'NIST SP 800 38B D.7 Example 20', + DES3 + ), + +] + + +def get_tag_random(tag, length): + return SHAKE128.new(data=tobytes(tag)).read(length) + + +class TestCMAC(unittest.TestCase): + + def test_internal_caching(self): + """Verify that internal caching is implemented correctly""" + + data_to_mac = get_tag_random("data_to_mac", 128) + key = get_tag_random("key", 16) + ref_mac = CMAC.new(key, msg=data_to_mac, ciphermod=AES).digest() + + # Break up in chunks of different length + # The result must always be the same + for chunk_length in 1, 2, 3, 7, 10, 13, 16, 40, 80, 128: + + chunks = [data_to_mac[i:i+chunk_length] for i in + range(0, len(data_to_mac), chunk_length)] + + mac = CMAC.new(key, ciphermod=AES) + for chunk in chunks: + mac.update(chunk) + self.assertEqual(ref_mac, mac.digest()) + + def test_update_after_digest(self): + msg = b"rrrrttt" + key = b"4" * 16 + + # Normally, update() cannot be done after digest() + h = CMAC.new(key, msg[:4], ciphermod=AES) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = CMAC.new(key, msg, ciphermod=AES).digest() + + # With the proper flag, it is allowed + h2 = CMAC.new(key, msg[:4], ciphermod=AES, update_after_digest=True) + self.assertEqual(h2.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h2.update(msg[4:]) + self.assertEqual(h2.digest(), dig2) + + +class ByteArrayTests(unittest.TestCase): + + def runTest(self): + + key = b"0" * 16 + data = b"\x00\x01\x02" + + # Data and key can be a bytearray (during initialization) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = CMAC.new(key, data, ciphermod=AES) + h2 = CMAC.new(key_ba, data_ba, ciphermod=AES) + key_ba[:1] = b'\xFF' + data_ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a bytearray (during operation) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = CMAC.new(key, ciphermod=AES) + h2 = CMAC.new(key, ciphermod=AES) + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +class MemoryViewTests(unittest.TestCase): + + def runTest(self): + + key = b"0" * 16 + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data and key can be a memoryview (during initialization) + key_mv = get_mv(key) + data_mv = get_mv(data) + + h1 = CMAC.new(key, data, ciphermod=AES) + h2 = CMAC.new(key_mv, data_mv, ciphermod=AES) + if not data_mv.readonly: + key_mv[:1] = b'\xFF' + data_mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = CMAC.new(key, ciphermod=AES) + h2 = CMAC.new(key, ciphermod=AES) + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def setUp(self): + + def filter_tag(group): + return group['tagSize'] // 8 + + self.tv = load_test_vectors_wycheproof(("Hash", "wycheproof"), + "aes_cmac_test.json", + "Wycheproof CMAC", + group_tag={'tag_size': filter_tag}) + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_create_mac(self, tv): + self._id = "Wycheproof MAC creation Test #" + str(tv.id) + + try: + tag = CMAC.new(tv.key, tv.msg, ciphermod=AES, mac_len=tv.tag_size).digest() + except ValueError as e: + if len(tv.key) not in (16, 24, 32) and "key length" in str(e): + return + raise e + if tv.valid: + self.assertEqual(tag, tv.tag) + self.warn(tv) + + def test_verify_mac(self, tv): + self._id = "Wycheproof MAC verification Test #" + str(tv.id) + + try: + mac = CMAC.new(tv.key, tv.msg, ciphermod=AES, mac_len=tv.tag_size) + except ValueError as e: + if len(tv.key) not in (16, 24, 32) and "key length" in str(e): + return + raise e + try: + mac.verify(tv.tag) + except ValueError: + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + + for tv in self.tv: + self.test_create_mac(tv) + self.test_verify_mac(tv) + + +def get_tests(config={}): + global test_data + import types + from .common import make_mac_tests + + wycheproof_warnings = config.get('wycheproof_warnings') + + # Add new() parameters to the back of each test vector + params_test_data = [] + for row in test_data: + t = list(row) + t[4] = dict(ciphermod=t[4]) + params_test_data.append(t) + + tests = make_mac_tests(CMAC, "CMAC", params_test_data) + tests.append(ByteArrayTests()) + tests.append(list_test_cases(TestCMAC)) + tests.append(MemoryViewTests()) + tests += [ TestVectorsWycheproof(wycheproof_warnings) ] + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py new file mode 100644 index 0000000..ecec1a8 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py @@ -0,0 +1,548 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/HMAC.py: Self-test for the HMAC module +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.HMAC""" + +import unittest +from binascii import hexlify +from Cryptodome.Util.py3compat import tostr, tobytes + +from Cryptodome.Hash import (HMAC, MD5, SHA1, SHA256, + SHA224, SHA384, SHA512, + RIPEMD160, + SHA3_224, SHA3_256, SHA3_384, SHA3_512) + + +hash_modules = dict(MD5=MD5, SHA1=SHA1, SHA256=SHA256, + SHA224=SHA224, SHA384=SHA384, SHA512=SHA512, + RIPEMD160=RIPEMD160, + SHA3_224=SHA3_224, SHA3_256=SHA3_256, + SHA3_384=SHA3_384, SHA3_512=SHA3_512) + +default_hash = None + +def xl(text): + return tostr(hexlify(tobytes(text))) + +# This is a list of (key, data, results, description) tuples. +test_data = [ + ## Test vectors from RFC 2202 ## + # Test that the default hashmod is MD5 + ('0b' * 16, + '4869205468657265', + dict(default_hash='9294727a3638bb1c13f48ef8158bfc9d'), + 'default-is-MD5'), + + # Test case 1 (MD5) + ('0b' * 16, + '4869205468657265', + dict(MD5='9294727a3638bb1c13f48ef8158bfc9d'), + 'RFC 2202 #1-MD5 (HMAC-MD5)'), + + # Test case 1 (SHA1) + ('0b' * 20, + '4869205468657265', + dict(SHA1='b617318655057264e28bc0b6fb378c8ef146be00'), + 'RFC 2202 #1-SHA1 (HMAC-SHA1)'), + + # Test case 2 + ('4a656665', + '7768617420646f2079612077616e7420666f72206e6f7468696e673f', + dict(MD5='750c783e6ab0b503eaa86e310a5db738', + SHA1='effcdf6ae5eb2fa2d27416d5f184df9c259a7c79'), + 'RFC 2202 #2 (HMAC-MD5/SHA1)'), + + # Test case 3 (MD5) + ('aa' * 16, + 'dd' * 50, + dict(MD5='56be34521d144c88dbb8c733f0e8b3f6'), + 'RFC 2202 #3-MD5 (HMAC-MD5)'), + + # Test case 3 (SHA1) + ('aa' * 20, + 'dd' * 50, + dict(SHA1='125d7342b9ac11cd91a39af48aa17b4f63f175d3'), + 'RFC 2202 #3-SHA1 (HMAC-SHA1)'), + + # Test case 4 + ('0102030405060708090a0b0c0d0e0f10111213141516171819', + 'cd' * 50, + dict(MD5='697eaf0aca3a3aea3a75164746ffaa79', + SHA1='4c9007f4026250c6bc8414f9bf50c86c2d7235da'), + 'RFC 2202 #4 (HMAC-MD5/SHA1)'), + + # Test case 5 (MD5) + ('0c' * 16, + '546573742057697468205472756e636174696f6e', + dict(MD5='56461ef2342edc00f9bab995690efd4c'), + 'RFC 2202 #5-MD5 (HMAC-MD5)'), + + # Test case 5 (SHA1) + # NB: We do not implement hash truncation, so we only test the full hash here. + ('0c' * 20, + '546573742057697468205472756e636174696f6e', + dict(SHA1='4c1a03424b55e07fe7f27be1d58bb9324a9a5a04'), + 'RFC 2202 #5-SHA1 (HMAC-SHA1)'), + + # Test case 6 + ('aa' * 80, + '54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a' + + '65204b6579202d2048617368204b6579204669727374', + dict(MD5='6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd', + SHA1='aa4ae5e15272d00e95705637ce8a3b55ed402112'), + 'RFC 2202 #6 (HMAC-MD5/SHA1)'), + + # Test case 7 + ('aa' * 80, + '54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a' + + '65204b657920616e64204c6172676572205468616e204f6e6520426c6f636b2d' + + '53697a652044617461', + dict(MD5='6f630fad67cda0ee1fb1f562db3aa53e', + SHA1='e8e99d0f45237d786d6bbaa7965c7808bbff1a91'), + 'RFC 2202 #7 (HMAC-MD5/SHA1)'), + + ## Test vectors from RFC 4231 ## + # 4.2. Test Case 1 + ('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', + '4869205468657265', + dict(SHA256=''' + b0344c61d8db38535ca8afceaf0bf12b + 881dc200c9833da726e9376c2e32cff7 + '''), + 'RFC 4231 #1 (HMAC-SHA256)'), + + # 4.3. Test Case 2 - Test with a key shorter than the length of the HMAC + # output. + ('4a656665', + '7768617420646f2079612077616e7420666f72206e6f7468696e673f', + dict(SHA256=''' + 5bdcc146bf60754e6a042426089575c7 + 5a003f089d2739839dec58b964ec3843 + '''), + 'RFC 4231 #2 (HMAC-SHA256)'), + + # 4.4. Test Case 3 - Test with a combined length of key and data that is + # larger than 64 bytes (= block-size of SHA-224 and SHA-256). + ('aa' * 20, + 'dd' * 50, + dict(SHA256=''' + 773ea91e36800e46854db8ebd09181a7 + 2959098b3ef8c122d9635514ced565fe + '''), + 'RFC 4231 #3 (HMAC-SHA256)'), + + # 4.5. Test Case 4 - Test with a combined length of key and data that is + # larger than 64 bytes (= block-size of SHA-224 and SHA-256). + ('0102030405060708090a0b0c0d0e0f10111213141516171819', + 'cd' * 50, + dict(SHA256=''' + 82558a389a443c0ea4cc819899f2083a + 85f0faa3e578f8077a2e3ff46729665b + '''), + 'RFC 4231 #4 (HMAC-SHA256)'), + + # 4.6. Test Case 5 - Test with a truncation of output to 128 bits. + # + # Not included because we do not implement hash truncation. + # + + # 4.7. Test Case 6 - Test with a key larger than 128 bytes (= block-size of + # SHA-384 and SHA-512). + ('aa' * 131, + '54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a' + + '65204b6579202d2048617368204b6579204669727374', + dict(SHA256=''' + 60e431591ee0b67f0d8a26aacbf5b77f + 8e0bc6213728c5140546040f0ee37f54 + '''), + 'RFC 4231 #6 (HMAC-SHA256)'), + + # 4.8. Test Case 7 - Test with a key and data that is larger than 128 bytes + # (= block-size of SHA-384 and SHA-512). + ('aa' * 131, + '5468697320697320612074657374207573696e672061206c6172676572207468' + + '616e20626c6f636b2d73697a65206b657920616e642061206c61726765722074' + + '68616e20626c6f636b2d73697a6520646174612e20546865206b6579206e6565' + + '647320746f20626520686173686564206265666f7265206265696e6720757365' + + '642062792074686520484d414320616c676f726974686d2e', + dict(SHA256=''' + 9b09ffa71b942fcb27635fbcd5b0e944 + bfdc63644f0713938a7f51535c3a35e2 + '''), + 'RFC 4231 #7 (HMAC-SHA256)'), + + # Test case 8 (SHA224) + ('4a656665', + '7768617420646f2079612077616e74' + + '20666f72206e6f7468696e673f', + dict(SHA224='a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44'), + 'RFC 4634 8.4 SHA224 (HMAC-SHA224)'), + + # Test case 9 (SHA384) + ('4a656665', + '7768617420646f2079612077616e74' + + '20666f72206e6f7468696e673f', + dict(SHA384='af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec3736322445e8e2240ca5e69e2c78b3239ecfab21649'), + 'RFC 4634 8.4 SHA384 (HMAC-SHA384)'), + + # Test case 10 (SHA512) + ('4a656665', + '7768617420646f2079612077616e74' + + '20666f72206e6f7468696e673f', + dict(SHA512='164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737'), + 'RFC 4634 8.4 SHA512 (HMAC-SHA512)'), + + # Test case 11 (RIPEMD) + ('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', + xl("Hi There"), + dict(RIPEMD160='24cb4bd67d20fc1a5d2ed7732dcc39377f0a5668'), + 'RFC 2286 #1 (HMAC-RIPEMD)'), + + # Test case 12 (RIPEMD) + (xl("Jefe"), + xl("what do ya want for nothing?"), + dict(RIPEMD160='dda6c0213a485a9e24f4742064a7f033b43c4069'), + 'RFC 2286 #2 (HMAC-RIPEMD)'), + + # Test case 13 (RIPEMD) + ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + 'dd' * 50, + dict(RIPEMD160='b0b105360de759960ab4f35298e116e295d8e7c1'), + 'RFC 2286 #3 (HMAC-RIPEMD)'), + + # Test case 14 (RIPEMD) + ('0102030405060708090a0b0c0d0e0f10111213141516171819', + 'cd' * 50, + dict(RIPEMD160='d5ca862f4d21d5e610e18b4cf1beb97a4365ecf4'), + 'RFC 2286 #4 (HMAC-RIPEMD)'), + + # Test case 15 (RIPEMD) + ('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', + xl("Test With Truncation"), + dict(RIPEMD160='7619693978f91d90539ae786500ff3d8e0518e39'), + 'RFC 2286 #5 (HMAC-RIPEMD)'), + + # Test case 16 (RIPEMD) + ('aa' * 80, + xl("Test Using Larger Than Block-Size Key - Hash Key First"), + dict(RIPEMD160='6466ca07ac5eac29e1bd523e5ada7605b791fd8b'), + 'RFC 2286 #6 (HMAC-RIPEMD)'), + + # Test case 17 (RIPEMD) + ('aa' * 80, + xl("Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data"), + dict(RIPEMD160='69ea60798d71616cce5fd0871e23754cd75d5a0a'), + 'RFC 2286 #7 (HMAC-RIPEMD)'), + + # From https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/HMAC_SHA3-224.pdf + ( + '000102030405060708090a0b0c0d0e0f' + '101112131415161718191a1b', + xl('Sample message for keylenblocklen'), + dict(SHA3_224='078695eecc227c636ad31d063a15dd05a7e819a66ec6d8de1e193e59'), + 'NIST CSRC Sample #3 (SHA3-224)' + ), + + # From https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/HMAC_SHA3-256.pdf + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f', + xl('Sample message for keylenblocklen'), + dict(SHA3_256='9bcf2c238e235c3ce88404e813bd2f3a97185ac6f238c63d6229a00b07974258'), + 'NIST CSRC Sample #3 (SHA3-256)' + ), + + # From https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/HMAC_SHA3-384.pdf + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f' + '202122232425262728292a2b2c2d2e2f', + xl('Sample message for keylenblocklen'), + dict(SHA3_384='e5ae4c739f455279368ebf36d4f5354c95aa184c899d3870e460ebc288ef1f9470053f73f7c6da2a71bcaec38ce7d6ac'), + 'NIST CSRC Sample #3 (SHA3-384)' + ), + + # From https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/HMAC_SHA3-512.pdf + ( + '000102030405060708090a0b0c0d0e0f'\ + '101112131415161718191a1b1c1d1e1f'\ + '202122232425262728292a2b2c2d2e2f'\ + '303132333435363738393a3b3c3d3e3f', + xl('Sample message for keylenblocklen'), + dict(SHA3_512='5f464f5e5b7848e3885e49b2c385f0694985d0e38966242dc4a5fe3fea4b37d46b65ceced5dcf59438dd840bab22269f0ba7febdb9fcf74602a35666b2a32915'), + 'NIST CSRC Sample #3 (SHA3-512)' + ), + +] + + +class HMAC_Module_and_Instance_Test(unittest.TestCase): + """Test the HMAC construction and verify that it does not + matter if you initialize it with a hash module or + with an hash instance. + + See https://bugs.launchpad.net/pycrypto/+bug/1209399 + """ + + def __init__(self, hashmods): + """Initialize the test with a dictionary of hash modules + indexed by their names""" + + unittest.TestCase.__init__(self) + self.hashmods = hashmods + self.description = "" + + def shortDescription(self): + return self.description + + def runTest(self): + key = b"\x90\x91\x92\x93" * 4 + payload = b"\x00" * 100 + + for hashname, hashmod in self.hashmods.items(): + if hashmod is None: + continue + self.description = "Test HMAC in combination with " + hashname + one = HMAC.new(key, payload, hashmod).digest() + two = HMAC.new(key, payload, hashmod.new()).digest() + self.assertEqual(one, two) + + +class HMAC_None(unittest.TestCase): + + def runTest(self): + + key = b"\x04" * 20 + one = HMAC.new(key, b"", SHA1).digest() + two = HMAC.new(key, None, SHA1).digest() + self.assertEqual(one, two) + + +class ByteArrayTests(unittest.TestCase): + + def runTest(self): + + key = b"0" * 16 + data = b"\x00\x01\x02" + + # Data and key can be a bytearray (during initialization) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = HMAC.new(key, data) + h2 = HMAC.new(key_ba, data_ba) + key_ba[:1] = b'\xFF' + data_ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a bytearray (during operation) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = HMAC.new(key) + h2 = HMAC.new(key) + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +class MemoryViewTests(unittest.TestCase): + + def runTest(self): + + key = b"0" * 16 + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data and key can be a memoryview (during initialization) + key_mv = get_mv(key) + data_mv = get_mv(data) + + h1 = HMAC.new(key, data) + h2 = HMAC.new(key_mv, data_mv) + if not data_mv.readonly: + key_mv[:1] = b'\xFF' + data_mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = HMAC.new(key) + h2 = HMAC.new(key) + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + self.assertEqual(h1.digest(), h2.digest()) + + +def get_tests(config={}): + global test_data + import types + from .common import make_mac_tests + + # A test vector contains multiple results, each one for a + # different hash algorithm. + # Here we expand each test vector into multiple ones, + # and add the relevant parameters that will be passed to new() + exp_test_data = [] + for row in test_data: + for modname in row[2].keys(): + t = list(row) + t[2] = row[2][modname] + t.append(dict(digestmod=globals()[modname])) + exp_test_data.append(t) + tests = make_mac_tests(HMAC, "HMAC", exp_test_data) + tests.append(HMAC_Module_and_Instance_Test(hash_modules)) + tests.append(HMAC_None()) + + tests.append(ByteArrayTests()) + tests.append(MemoryViewTests()) + + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py new file mode 100644 index 0000000..0543a4c --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py @@ -0,0 +1,346 @@ +import unittest +from binascii import unhexlify, hexlify + +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Util.strxor import strxor_c +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import KMAC128, KMAC256 + + +class KMACTest(unittest.TestCase): + + def new(self, *args, **kwargs): + return self.KMAC.new(key=b'X' * (self.minimum_key_bits // 8), *args, **kwargs) + + def test_new_positive(self): + + key = b'X' * 32 + + h = self.new() + for new_func in self.KMAC.new, h.new: + + for dbytes in range(self.minimum_bytes, 128 + 1): + hobj = new_func(key=key, mac_len=dbytes) + self.assertEqual(hobj.digest_size, dbytes) + + digest1 = new_func(key=key, data=b"\x90").digest() + digest2 = new_func(key=key).update(b"\x90").digest() + self.assertEqual(digest1, digest2) + + new_func(data=b"A", key=key, custom=b"g") + + hobj = h.new(key=key) + self.assertEqual(hobj.digest_size, self.default_bytes) + + def test_new_negative(self): + + h = self.new() + for new_func in self.KMAC.new, h.new: + self.assertRaises(ValueError, new_func, key=b'X'*32, + mac_len=0) + self.assertRaises(ValueError, new_func, key=b'X'*32, + mac_len=self.minimum_bytes - 1) + self.assertRaises(TypeError, new_func, + key=u"string") + self.assertRaises(TypeError, new_func, + data=u"string") + + def test_default_digest_size(self): + digest = self.new(data=b'abc').digest() + self.assertEqual(len(digest), self.default_bytes) + + def test_update(self): + pieces = [b"\x0A" * 200, b"\x14" * 300] + h = self.new() + h.update(pieces[0]).update(pieces[1]) + digest = h.digest() + h = self.new() + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.digest(), digest) + + def test_update_negative(self): + h = self.new() + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = self.new() + digest = h.digest() + + # hexdigest does not change the state + self.assertEqual(h.digest(), digest) + # digest returns a byte string + self.assertTrue(isinstance(digest, type(b"digest"))) + + def test_update_after_digest(self): + msg = b"rrrrttt" + + # Normally, update() cannot be done after digest() + h = self.new(mac_len=32, data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, dig1) + + def test_hex_digest(self): + mac = self.new() + digest = mac.digest() + hexdigest = mac.hexdigest() + + # hexdigest is equivalent to digest + self.assertEqual(hexlify(digest), tobytes(hexdigest)) + # hexdigest does not change the state + self.assertEqual(mac.hexdigest(), hexdigest) + # hexdigest returns a string + self.assertTrue(isinstance(hexdigest, type("digest"))) + + def test_verify(self): + h = self.new() + mac = h.digest() + h.verify(mac) + wrong_mac = strxor_c(mac, 255) + self.assertRaises(ValueError, h.verify, wrong_mac) + + def test_hexverify(self): + h = self.new() + mac = h.hexdigest() + h.hexverify(mac) + self.assertRaises(ValueError, h.hexverify, "4556") + + def test_oid(self): + + oid = "2.16.840.1.101.3.4.2." + self.oid_variant + h = self.new() + self.assertEqual(h.oid, oid) + + def test_bytearray(self): + + key = b'0' * 32 + data = b"\x00\x01\x02" + + # Data and key can be a bytearray (during initialization) + key_ba = bytearray(key) + data_ba = bytearray(data) + + h1 = self.KMAC.new(data=data, key=key) + h2 = self.KMAC.new(data=data_ba, key=key_ba) + key_ba[:1] = b'\xFF' + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a bytearray (during operation) + data_ba = bytearray(data) + + h1 = self.new() + h2 = self.new() + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + def test_memoryview(self): + + key = b'0' * 32 + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data and key can be a memoryview (during initialization) + key_mv = get_mv(key) + data_mv = get_mv(data) + + h1 = self.KMAC.new(data=data, key=key) + h2 = self.KMAC.new(data=data_mv, key=key_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + key_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = self.new() + h2 = self.new() + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + +class KMAC128Test(KMACTest): + + KMAC = KMAC128 + + minimum_key_bits = 128 + + minimum_bytes = 8 + default_bytes = 64 + + oid_variant = "19" + + +class KMAC256Test(KMACTest): + + KMAC = KMAC256 + + minimum_key_bits = 256 + + minimum_bytes = 8 + default_bytes = 64 + + oid_variant = "20" + + +class NISTExampleTestVectors(unittest.TestCase): + + # https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/KMAC_samples.pdf + test_data = [ + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03", + "", + "E5 78 0B 0D 3E A6 F7 D3 A4 29 C5 70 6A A4 3A 00" + "FA DB D7 D4 96 28 83 9E 31 87 24 3F 45 6E E1 4E", + "Sample #1 NIST", + KMAC128 + ), + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03", + "My Tagged Application", + "3B 1F BA 96 3C D8 B0 B5 9E 8C 1A 6D 71 88 8B 71" + "43 65 1A F8 BA 0A 70 70 C0 97 9E 28 11 32 4A A5", + "Sample #2 NIST", + KMAC128 + ), + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" + "10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F" + "20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F" + "30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F" + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F" + "60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F" + "70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F" + "80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F" + "90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F" + "A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF" + "B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF" + "C0 C1 C2 C3 C4 C5 C6 C7", + "My Tagged Application", + "1F 5B 4E 6C CA 02 20 9E 0D CB 5C A6 35 B8 9A 15" + "E2 71 EC C7 60 07 1D FD 80 5F AA 38 F9 72 92 30", + "Sample #3 NIST", + KMAC128 + ), + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03", + "My Tagged Application", + "20 C5 70 C3 13 46 F7 03 C9 AC 36 C6 1C 03 CB 64" + "C3 97 0D 0C FC 78 7E 9B 79 59 9D 27 3A 68 D2 F7" + "F6 9D 4C C3 DE 9D 10 4A 35 16 89 F2 7C F6 F5 95" + "1F 01 03 F3 3F 4F 24 87 10 24 D9 C2 77 73 A8 DD", + "Sample #4 NIST", + KMAC256 + ), + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" + "10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F" + "20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F" + "30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F" + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F" + "60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F" + "70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F" + "80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F" + "90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F" + "A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF" + "B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF" + "C0 C1 C2 C3 C4 C5 C6 C7", + "", + "75 35 8C F3 9E 41 49 4E 94 97 07 92 7C EE 0A F2" + "0A 3F F5 53 90 4C 86 B0 8F 21 CC 41 4B CF D6 91" + "58 9D 27 CF 5E 15 36 9C BB FF 8B 9A 4C 2E B1 78" + "00 85 5D 02 35 FF 63 5D A8 25 33 EC 6B 75 9B 69", + "Sample #5 NIST", + KMAC256 + ), + ( + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F", + "00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" + "10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F" + "20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F" + "30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F" + "40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F" + "50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F" + "60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F" + "70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F" + "80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F" + "90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F" + "A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF" + "B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF" + "C0 C1 C2 C3 C4 C5 C6 C7", + "My Tagged Application", + "B5 86 18 F7 1F 92 E1 D5 6C 1B 8C 55 DD D7 CD 18" + "8B 97 B4 CA 4D 99 83 1E B2 69 9A 83 7D A2 E4 D9" + "70 FB AC FD E5 00 33 AE A5 85 F1 A2 70 85 10 C3" + "2D 07 88 08 01 BD 18 28 98 FE 47 68 76 FC 89 65", + "Sample #6 NIST", + KMAC256 + ), + ] + + def setUp(self): + td = [] + for key, data, custom, mac, text, module in self.test_data: + ni = ( + unhexlify(key.replace(" ", "")), + unhexlify(data.replace(" ", "")), + custom.encode(), + unhexlify(mac.replace(" ", "")), + text, + module + ) + td.append(ni) + self.test_data = td + + def runTest(self): + + for key, data, custom, mac, text, module in self.test_data: + h = module.new(data=data, key=key, custom=custom, mac_len=len(mac)) + mac_tag = h.digest() + self.assertEqual(mac_tag, mac, msg=text) + + +def get_tests(config={}): + tests = [] + + tests += list_test_cases(KMAC128Test) + tests += list_test_cases(KMAC256Test) + tests.append(NISTExampleTestVectors()) + + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py new file mode 100644 index 0000000..d247217 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py @@ -0,0 +1,324 @@ +# =================================================================== +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.KangarooTwelve""" + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import KangarooTwelve as K12 +from Cryptodome.Util.py3compat import b, bchr + + +class KangarooTwelveTest(unittest.TestCase): + + def test_length_encode(self): + self.assertEqual(K12._length_encode(0), b'\x00') + self.assertEqual(K12._length_encode(12), b'\x0C\x01') + self.assertEqual(K12._length_encode(65538), b'\x01\x00\x02\x03') + + def test_new_positive(self): + + xof1 = K12.new() + xof2 = K12.new(data=b("90")) + xof3 = K12.new().update(b("90")) + + self.assertNotEqual(xof1.read(10), xof2.read(10)) + xof3.read(10) + self.assertEqual(xof2.read(10), xof3.read(10)) + + xof1 = K12.new() + ref = xof1.read(10) + xof2 = K12.new(custom=b("")) + xof3 = K12.new(custom=b("foo")) + + self.assertEqual(ref, xof2.read(10)) + self.assertNotEqual(ref, xof3.read(10)) + + xof1 = K12.new(custom=b("foo")) + xof2 = K12.new(custom=b("foo"), data=b("90")) + xof3 = K12.new(custom=b("foo")).update(b("90")) + + self.assertNotEqual(xof1.read(10), xof2.read(10)) + xof3.read(10) + self.assertEqual(xof2.read(10), xof3.read(10)) + + def test_update(self): + pieces = [bchr(10) * 200, bchr(20) * 300] + h = K12.new() + h.update(pieces[0]).update(pieces[1]) + digest = h.read(10) + h = K12.new() + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.read(10), digest) + + def test_update_negative(self): + h = K12.new() + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = K12.new() + digest = h.read(90) + + # read returns a byte string of the right length + self.assertTrue(isinstance(digest, type(b("digest")))) + self.assertEqual(len(digest), 90) + + def test_update_after_read(self): + mac = K12.new() + mac.update(b("rrrr")) + mac.read(90) + self.assertRaises(TypeError, mac.update, b("ttt")) + + +def txt2bin(txt): + clean = txt.replace(" ", "").replace("\n", "").replace("\r", "") + return unhexlify(clean) + + +def ptn(n): + res = bytearray(n) + pattern = b"".join([bchr(x) for x in range(0, 0xFB)]) + for base in range(0, n - 0xFB, 0xFB): + res[base:base + 0xFB] = pattern + remain = n % 0xFB + if remain: + base = (n // 0xFB) * 0xFB + res[base:] = pattern[:remain] + assert(len(res) == n) + return res + + +def chunked(source, size): + for i in range(0, len(source), size): + yield source[i:i+size] + + +# https://github.com/XKCP/XKCP/blob/master/tests/TestVectors/KangarooTwelve.txt +class KangarooTwelveTV(unittest.TestCase): + + def test_zero_1(self): + tv = """1A C2 D4 50 FC 3B 42 05 D1 9D A7 BF CA 1B 37 51 + 3C 08 03 57 7A C7 16 7F 06 FE 2C E1 F0 EF 39 E5""" + + btv = txt2bin(tv) + res = K12.new().read(32) + self.assertEqual(res, btv) + + def test_zero_2(self): + tv = """1A C2 D4 50 FC 3B 42 05 D1 9D A7 BF CA 1B 37 51 + 3C 08 03 57 7A C7 16 7F 06 FE 2C E1 F0 EF 39 E5 + 42 69 C0 56 B8 C8 2E 48 27 60 38 B6 D2 92 96 6C + C0 7A 3D 46 45 27 2E 31 FF 38 50 81 39 EB 0A 71""" + + btv = txt2bin(tv) + res = K12.new().read(64) + self.assertEqual(res, btv) + + def test_zero_3(self): + tv = """E8 DC 56 36 42 F7 22 8C 84 68 4C 89 84 05 D3 A8 + 34 79 91 58 C0 79 B1 28 80 27 7A 1D 28 E2 FF 6D""" + + btv = txt2bin(tv) + res = K12.new().read(10032) + self.assertEqual(res[-32:], btv) + + def test_ptn_1(self): + tv = """2B DA 92 45 0E 8B 14 7F 8A 7C B6 29 E7 84 A0 58 + EF CA 7C F7 D8 21 8E 02 D3 45 DF AA 65 24 4A 1F""" + + btv = txt2bin(tv) + res = K12.new(data=ptn(1)).read(32) + self.assertEqual(res, btv) + + def test_ptn_17(self): + tv = """6B F7 5F A2 23 91 98 DB 47 72 E3 64 78 F8 E1 9B + 0F 37 12 05 F6 A9 A9 3A 27 3F 51 DF 37 12 28 88""" + + btv = txt2bin(tv) + res = K12.new(data=ptn(17)).read(32) + self.assertEqual(res, btv) + + def test_ptn_17_2(self): + tv = """0C 31 5E BC DE DB F6 14 26 DE 7D CF 8F B7 25 D1 + E7 46 75 D7 F5 32 7A 50 67 F3 67 B1 08 EC B6 7C""" + + btv = txt2bin(tv) + res = K12.new(data=ptn(17**2)).read(32) + self.assertEqual(res, btv) + + def test_ptn_17_3(self): + tv = """CB 55 2E 2E C7 7D 99 10 70 1D 57 8B 45 7D DF 77 + 2C 12 E3 22 E4 EE 7F E4 17 F9 2C 75 8F 0D 59 D0""" + + btv = txt2bin(tv) + res = K12.new(data=ptn(17**3)).read(32) + self.assertEqual(res, btv) + + def test_ptn_17_4(self): + tv = """87 01 04 5E 22 20 53 45 FF 4D DA 05 55 5C BB 5C + 3A F1 A7 71 C2 B8 9B AE F3 7D B4 3D 99 98 B9 FE""" + + btv = txt2bin(tv) + data = ptn(17**4) + + # All at once + res = K12.new(data=data).read(32) + self.assertEqual(res, btv) + + # Byte by byte + k12 = K12.new() + for x in data: + k12.update(bchr(x)) + res = k12.read(32) + self.assertEqual(res, btv) + + # Chunks of various prime sizes + for chunk_size in (13, 17, 19, 23, 31): + k12 = K12.new() + for x in chunked(data, chunk_size): + k12.update(x) + res = k12.read(32) + self.assertEqual(res, btv) + + def test_ptn_17_5(self): + tv = """84 4D 61 09 33 B1 B9 96 3C BD EB 5A E3 B6 B0 5C + C7 CB D6 7C EE DF 88 3E B6 78 A0 A8 E0 37 16 82""" + + btv = txt2bin(tv) + data = ptn(17**5) + + # All at once + res = K12.new(data=data).read(32) + self.assertEqual(res, btv) + + # Chunks + k12 = K12.new() + for chunk in chunked(data, 8192): + k12.update(chunk) + res = k12.read(32) + self.assertEqual(res, btv) + + def test_ptn_17_6(self): + tv = """3C 39 07 82 A8 A4 E8 9F A6 36 7F 72 FE AA F1 32 + 55 C8 D9 58 78 48 1D 3C D8 CE 85 F5 8E 88 0A F8""" + + btv = txt2bin(tv) + data = ptn(17**6) + + # All at once + res = K12.new(data=data).read(32) + self.assertEqual(res, btv) + + def test_ptn_c_1(self): + tv = """FA B6 58 DB 63 E9 4A 24 61 88 BF 7A F6 9A 13 30 + 45 F4 6E E9 84 C5 6E 3C 33 28 CA AF 1A A1 A5 83""" + + btv = txt2bin(tv) + custom = ptn(1) + + # All at once + res = K12.new(custom=custom).read(32) + self.assertEqual(res, btv) + + def test_ptn_c_41(self): + tv = """D8 48 C5 06 8C ED 73 6F 44 62 15 9B 98 67 FD 4C + 20 B8 08 AC C3 D5 BC 48 E0 B0 6B A0 A3 76 2E C4""" + + btv = txt2bin(tv) + custom = ptn(41) + + # All at once + res = K12.new(data=b'\xFF', custom=custom).read(32) + self.assertEqual(res, btv) + + def test_ptn_c_41_2(self): + tv = """C3 89 E5 00 9A E5 71 20 85 4C 2E 8C 64 67 0A C0 + 13 58 CF 4C 1B AF 89 44 7A 72 42 34 DC 7C ED 74""" + + btv = txt2bin(tv) + custom = ptn(41**2) + + # All at once + res = K12.new(data=b'\xFF' * 3, custom=custom).read(32) + self.assertEqual(res, btv) + + def test_ptn_c_41_3(self): + tv = """75 D2 F8 6A 2E 64 45 66 72 6B 4F BC FC 56 57 B9 + DB CF 07 0C 7B 0D CA 06 45 0A B2 91 D7 44 3B CF""" + + btv = txt2bin(tv) + custom = ptn(41**3) + + # All at once + res = K12.new(data=b'\xFF' * 7, custom=custom).read(32) + self.assertEqual(res, btv) + + ### + + def test_1(self): + tv = "fd608f91d81904a9916e78a18f65c157a78d63f93d8f6367db0524526a5ea2bb" + + btv = txt2bin(tv) + res = K12.new(data=b'', custom=ptn(100)).read(32) + self.assertEqual(res, btv) + + def test_2(self): + tv4 = "5a4ec9a649f81916d4ce1553492962f7868abf8dd1ceb2f0cb3682ea95cda6a6" + tv3 = "441688fe4fe4ae9425eb3105eb445eb2b3a6f67b66eff8e74ebfbc49371f6d4c" + tv2 = "17269a57759af0214c84a0fd9bc851f4d95f80554cfed4e7da8a6ee1ff080131" + tv1 = "33826990c09dc712ba7224f0d9be319e2720de95a4c1afbd2211507dae1c703a" + tv0 = "9f4d3aba908ddc096e4d3a71da954f917b9752f05052b9d26d916a6fbc75bf3e" + + res = K12.new(data=b'A' * (8192 - 4), custom=b'B').read(32) + self.assertEqual(res, txt2bin(tv4)) + + res = K12.new(data=b'A' * (8192 - 3), custom=b'B').read(32) + self.assertEqual(res, txt2bin(tv3)) + + res = K12.new(data=b'A' * (8192 - 2), custom=b'B').read(32) + self.assertEqual(res, txt2bin(tv2)) + + res = K12.new(data=b'A' * (8192 - 1), custom=b'B').read(32) + self.assertEqual(res, txt2bin(tv1)) + + res = K12.new(data=b'A' * (8192 - 0), custom=b'B').read(32) + self.assertEqual(res, txt2bin(tv0)) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(KangarooTwelveTest) + tests += list_test_cases(KangarooTwelveTV) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py new file mode 100644 index 0000000..beae38a --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/MD2.py: Self-test for the MD2 hash function +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.MD2""" + +from Cryptodome.Util.py3compat import * + +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + # Test vectors from RFC 1319 + ('8350e5a3e24c153df2275c9f80692773', '', "'' (empty string)"), + ('32ec01ec4a6dac72c0ab96fb34c0b5d1', 'a'), + ('da853b0d3f88d99b30283a69e6ded6bb', 'abc'), + ('ab4f496bfb2a530b219ff33031fe06b0', 'message digest'), + + ('4e8ddff3650292ab5a4108c3aa47940b', 'abcdefghijklmnopqrstuvwxyz', + 'a-z'), + + ('da33def2a42df13975352846c30338cd', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + 'A-Z, a-z, 0-9'), + + ('d5976f79d83d3a0dc9806c3c66f3efd8', + '1234567890123456789012345678901234567890123456' + + '7890123456789012345678901234567890', + "'1234567890' * 8"), +] + +def get_tests(config={}): + from Cryptodome.Hash import MD2 + from .common import make_hash_tests + return make_hash_tests(MD2, "MD2", test_data, + digest_size=16, + oid="1.2.840.113549.2.2") + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py new file mode 100644 index 0000000..41de977 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/MD4.py: Self-test for the MD4 hash function +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.MD4""" + +__revision__ = "$Id$" + +from Cryptodome.Util.py3compat import * + +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + # Test vectors from RFC 1320 + ('31d6cfe0d16ae931b73c59d7e0c089c0', '', "'' (empty string)"), + ('bde52cb31de33e46245e05fbdbd6fb24', 'a'), + ('a448017aaf21d8525fc10ae87aa6729d', 'abc'), + ('d9130a8164549fe818874806e1c7014b', 'message digest'), + + ('d79e1c308aa5bbcdeea8ed63df412da9', 'abcdefghijklmnopqrstuvwxyz', + 'a-z'), + + ('043f8582f241db351ce627e153e7f0e4', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + 'A-Z, a-z, 0-9'), + + ('e33b4ddc9c38f2199c3e7b164fcc0536', + '1234567890123456789012345678901234567890123456' + + '7890123456789012345678901234567890', + "'1234567890' * 8"), +] + +def get_tests(config={}): + from Cryptodome.Hash import MD4 + from .common import make_hash_tests + return make_hash_tests(MD4, "MD4", test_data, + digest_size=16, + oid="1.2.840.113549.2.4") + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py new file mode 100644 index 0000000..3f7a005 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/MD5.py: Self-test for the MD5 hash function +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.MD5""" + +from Cryptodome.Util.py3compat import * +from Cryptodome.Hash import MD5 +from binascii import unhexlify +import unittest +from Cryptodome.SelfTest.st_common import list_test_cases + + +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + # Test vectors from RFC 1321 + ('d41d8cd98f00b204e9800998ecf8427e', '', "'' (empty string)"), + ('0cc175b9c0f1b6a831c399e269772661', 'a'), + ('900150983cd24fb0d6963f7d28e17f72', 'abc'), + ('f96b697d7cb7938d525a2f31aaf161d0', 'message digest'), + + ('c3fcd3d76192e4007dfb496cca67e13b', 'abcdefghijklmnopqrstuvwxyz', + 'a-z'), + + ('d174ab98d277d9f5a5611c2c9f419d9f', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + 'A-Z, a-z, 0-9'), + + ('57edf4a22be3c955ac49da2e2107b67a', + '1234567890123456789012345678901234567890123456' + + '7890123456789012345678901234567890', + "'1234567890' * 8"), + + # https://www.cosic.esat.kuleuven.be/nessie/testvectors/hash/md5/Md5-128.unverified.test-vectors + ('57EDF4A22BE3C955AC49DA2E2107B67A', '1234567890' * 8, 'Set 1, vector #7'), + ('7707D6AE4E027C70EEA2A935C2296F21', 'a'*1000000, 'Set 1, vector #8'), +] + + +class Md5IterTest(unittest.TestCase): + + def runTest(self): + message = b("\x00") * 16 + result1 = "4AE71336E44BF9BF79D2752E234818A5".lower() + result2 = "1A83F51285E4D89403D00C46EF8508FE".lower() + + h = MD5.new(message) + message = h.digest() + self.assertEqual(h.hexdigest(), result1) + + for _ in range(99999): + h = MD5.new(message) + message = h.digest() + + self.assertEqual(h.hexdigest(), result2) + + +def get_tests(config={}): + from .common import make_hash_tests + + tests = make_hash_tests(MD5, "MD5", test_data, + digest_size=16, + oid="1.2.840.113549.2.5") + if config.get('slow_tests'): + tests += [ Md5IterTest() ] + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py new file mode 100644 index 0000000..19cacb4 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py @@ -0,0 +1,542 @@ +# +# SelfTest/Hash/test_Poly1305.py: Self-test for the Poly1305 module +# +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash._Poly1305""" + +import json +import unittest +from binascii import unhexlify, hexlify + +from .common import make_mac_tests +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import Poly1305 +from Cryptodome.Cipher import AES, ChaCha20 + +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.Util.strxor import strxor_c + +# This is a list of (r+s keypair, data, result, description, keywords) tuples. +test_data_basic = [ + ( + "85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b", + hexlify(b"Cryptographic Forum Research Group").decode(), + "a8061dc1305136c6c22b8baf0c0127a9", + "RFC7539" + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "0000000000000000000000000000000000000000000000000000000000000000", + "49ec78090e481ec6c26b33b91ccc0307", + "https://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-00#section-7 A", + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "48656c6c6f20776f726c6421", + "a6f745008f81c916a20dcc74eef2b2f0", + "https://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-00#section-7 B", + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "", + "6b657920666f7220506f6c7931333035", + "Generated with pure Python", + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "FF", + "f7e4e0ef4c46d106219da3d1bdaeb3ff", + "Generated with pure Python", + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "FF00", + "7471eceeb22988fc936da1d6e838b70e", + "Generated with pure Python", + ), + ( + "746869732069732033322d62797465206b657920666f7220506f6c7931333035", + "AA" * 17, + "32590bc07cb2afaccca3f67f122975fe", + "Generated with pure Python", + ), + ( + "00" * 32, + "00" * 64, + "00" * 16, + "RFC7539 A.3 #1", + ), + ( + "0000000000000000000000000000000036e5f6b5c5e06070f0efca96227a863e", + hexlify( + b"Any submission t" + b"o the IETF inten" + b"ded by the Contr" + b"ibutor for publi" + b"cation as all or" + b" part of an IETF" + b" Internet-Draft " + b"or RFC and any s" + b"tatement made wi" + b"thin the context" + b" of an IETF acti" + b"vity is consider" + b"ed an \"IETF Cont" + b"ribution\". Such " + b"statements inclu" + b"de oral statemen" + b"ts in IETF sessi" + b"ons, as well as " + b"written and elec" + b"tronic communica" + b"tions made at an" + b"y time or place," + b" which are addre" + b"ssed to").decode(), + "36e5f6b5c5e06070f0efca96227a863e", + "RFC7539 A.3 #2", + ), + ( + "36e5f6b5c5e06070f0efca96227a863e00000000000000000000000000000000", + hexlify( + b"Any submission t" + b"o the IETF inten" + b"ded by the Contr" + b"ibutor for publi" + b"cation as all or" + b" part of an IETF" + b" Internet-Draft " + b"or RFC and any s" + b"tatement made wi" + b"thin the context" + b" of an IETF acti" + b"vity is consider" + b"ed an \"IETF Cont" + b"ribution\". Such " + b"statements inclu" + b"de oral statemen" + b"ts in IETF sessi" + b"ons, as well as " + b"written and elec" + b"tronic communica" + b"tions made at an" + b"y time or place," + b" which are addre" + b"ssed to").decode(), + "f3477e7cd95417af89a6b8794c310cf0", + "RFC7539 A.3 #3", + ), + ( + "1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0", + "2754776173206272696c6c69672c2061" + "6e642074686520736c6974687920746f" + "7665730a446964206779726520616e64" + "2067696d626c6520696e207468652077" + "6162653a0a416c6c206d696d73792077" + "6572652074686520626f726f676f7665" + "732c0a416e6420746865206d6f6d6520" + "7261746873206f757467726162652e", + "4541669a7eaaee61e708dc7cbcc5eb62", + "RFC7539 A.3 #4", + ), + ( + "02" + "00" * 31, + "FF" * 16, + "03" + "00" * 15, + "RFC7539 A.3 #5", + ), + ( + "02" + "00" * 15 + "FF" * 16, + "02" + "00" * 15, + "03" + "00" * 15, + "RFC7539 A.3 #6", + ), + ( + "01" + "00" * 31, + "FF" * 16 + "F0" + "FF" * 15 + "11" + "00" * 15, + "05" + "00" * 15, + "RFC7539 A.3 #7", + ), + ( + "01" + "00" * 31, + "FF" * 16 + "FB" + "FE" * 15 + "01" * 16, + "00" * 16, + "RFC7539 A.3 #8", + ), + ( + "02" + "00" * 31, + "FD" + "FF" * 15, + "FA" + "FF" * 15, + "RFC7539 A.3 #9", + ), + ( + "01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00" + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "E3 35 94 D7 50 5E 43 B9 00 00 00 00 00 00 00 00" + "33 94 D7 50 5E 43 79 CD 01 00 00 00 00 00 00 00" + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" + "01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "14 00 00 00 00 00 00 00 55 00 00 00 00 00 00 00", + "RFC7539 A.3 #10", + ), + ( + "01 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00" + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "E3 35 94 D7 50 5E 43 B9 00 00 00 00 00 00 00 00" + "33 94 D7 50 5E 43 79 CD 01 00 00 00 00 00 00 00" + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", + "13" + "00" * 15, + "RFC7539 A.3 #11", + ), +] + +# This is a list of (key(k+r), data, result, description, keywords) tuples. +test_data_aes = [ + ( + "ec074c835580741701425b623235add6851fc40c3467ac0be05cc20404f3f700", + "f3f6", + "f4c633c3044fc145f84f335cb81953de", + "http://cr.yp.to/mac/poly1305-20050329.pdf", + { 'cipher':AES, 'nonce':unhexlify("fb447350c4e868c52ac3275cf9d4327e") } + ), + ( + "75deaa25c09f208e1dc4ce6b5cad3fbfa0f3080000f46400d0c7e9076c834403", + "", + "dd3fab2251f11ac759f0887129cc2ee7", + "http://cr.yp.to/mac/poly1305-20050329.pdf", + { 'cipher':AES, 'nonce':unhexlify("61ee09218d29b0aaed7e154a2c5509cc") } + ), + ( + "6acb5f61a7176dd320c5c1eb2edcdc7448443d0bb0d21109c89a100b5ce2c208", + "663cea190ffb83d89593f3f476b6bc24" + "d7e679107ea26adb8caf6652d0656136", + "0ee1c16bb73f0f4fd19881753c01cdbe", + "http://cr.yp.to/mac/poly1305-20050329.pdf", + { 'cipher':AES, 'nonce':unhexlify("ae212a55399729595dea458bc621ff0e") } + ), + ( + "e1a5668a4d5b66a5f68cc5424ed5982d12976a08c4426d0ce8a82407c4f48207", + "ab0812724a7f1e342742cbed374d94d1" + "36c6b8795d45b3819830f2c04491faf0" + "990c62e48b8018b2c3e4a0fa3134cb67" + "fa83e158c994d961c4cb21095c1bf9", + "5154ad0d2cb26e01274fc51148491f1b", + "http://cr.yp.to/mac/poly1305-20050329.pdf", + { 'cipher':AES, 'nonce':unhexlify("9ae831e743978d3a23527c7128149e3a") } + ), +] + +test_data_chacha20 = [ + ( + "00" * 32, + "FF" * 15, + "13cc5bbadc36b03a5163928f0bcb65aa", + "RFC7539 A.4 #1", + { 'cipher':ChaCha20, 'nonce':unhexlify("00" * 12) } + ), + ( + "00" * 31 + "01", + "FF" * 15, + "0baf33c1d6df211bdd50a6767e98e00a", + "RFC7539 A.4 #2", + { 'cipher':ChaCha20, 'nonce':unhexlify("00" * 11 + "02") } + ), + ( + "1c 92 40 a5 eb 55 d3 8a f3 33 88 86 04 f6 b5 f0" + "47 39 17 c1 40 2b 80 09 9d ca 5c bc 20 70 75 c0", + "FF" * 15, + "e8b4c6db226cd8939e65e02eebf834ce", + "RFC7539 A.4 #3", + { 'cipher':ChaCha20, 'nonce':unhexlify("00" * 11 + "02") } + ), + ( + "1c 92 40 a5 eb 55 d3 8a f3 33 88 86 04 f6 b5 f0" + "47 39 17 c1 40 2b 80 09 9d ca 5c bc 20 70 75 c0", + "f3 33 88 86 00 00 00 00 00 00 4e 91 00 00 00 00" + "64 a0 86 15 75 86 1a f4 60 f0 62 c7 9b e6 43 bd" + "5e 80 5c fd 34 5c f3 89 f1 08 67 0a c7 6c 8c b2" + "4c 6c fc 18 75 5d 43 ee a0 9e e9 4e 38 2d 26 b0" + "bd b7 b7 3c 32 1b 01 00 d4 f0 3b 7f 35 58 94 cf" + "33 2f 83 0e 71 0b 97 ce 98 c8 a8 4a bd 0b 94 81" + "14 ad 17 6e 00 8d 33 bd 60 f9 82 b1 ff 37 c8 55" + "97 97 a0 6e f4 f0 ef 61 c1 86 32 4e 2b 35 06 38" + "36 06 90 7b 6a 7c 02 b0 f9 f6 15 7b 53 c8 67 e4" + "b9 16 6c 76 7b 80 4d 46 a5 9b 52 16 cd e7 a4 e9" + "90 40 c5 a4 04 33 22 5e e2 82 a1 b0 a0 6c 52 3e" + "af 45 34 d7 f8 3f a1 15 5b 00 47 71 8c bc 54 6a" + "0d 07 2b 04 b3 56 4e ea 1b 42 22 73 f5 48 27 1a" + "0b b2 31 60 53 fa 76 99 19 55 eb d6 31 59 43 4e" + "ce bb 4e 46 6d ae 5a 10 73 a6 72 76 27 09 7a 10" + "49 e6 17 d9 1d 36 10 94 fa 68 f0 ff 77 98 71 30" + "30 5b ea ba 2e da 04 df 99 7b 71 4d 6c 6f 2c 29" + "a6 ad 5c b4 02 2b 02 70 9b 00 00 00 00 00 00 00" + "0c 00 00 00 00 00 00 00 09 01 00 00 00 00 00 00", + "ee ad 9d 67 89 0c bb 22 39 23 36 fe a1 85 1f 38", + "RFC7539 A.5", + { 'cipher':ChaCha20, 'nonce':unhexlify("000000000102030405060708") } + ), +] + + +class Poly1305Test_AES(unittest.TestCase): + + key = b'\x11' * 32 + + def test_new_positive(self): + + data = b'r' * 100 + + h1 = Poly1305.new(key=self.key, cipher=AES) + self.assertEqual(h1.digest_size, 16) + self.assertEqual(len(h1.nonce), 16) + d1 = h1.update(data).digest() + self.assertEqual(len(d1), 16) + + h2 = Poly1305.new(key=self.key, nonce=h1.nonce, data=data, cipher=AES) + d2 = h2.digest() + self.assertEqual(h1.nonce, h2.nonce) + self.assertEqual(d1, d2) + + def test_new_negative(self): + from Cryptodome.Cipher import DES3 + + self.assertRaises(ValueError, Poly1305.new, key=self.key[:31], cipher=AES) + self.assertRaises(ValueError, Poly1305.new, key=self.key, cipher=DES3) + self.assertRaises(ValueError, Poly1305.new, key=self.key, nonce=b'1' * 15, cipher=AES) + self.assertRaises(TypeError, Poly1305.new, key=u"2" * 32, cipher=AES) + self.assertRaises(TypeError, Poly1305.new, key=self.key, data=u"2" * 100, cipher=AES) + + def test_update(self): + pieces = [b"\x0A" * 200, b"\x14" * 300] + h1 = Poly1305.new(key=self.key, cipher=AES) + h1.update(pieces[0]).update(pieces[1]) + d1 = h1.digest() + + h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce) + h2.update(pieces[0] + pieces[1]) + d2 = h2.digest() + self.assertEqual(d1, d2) + + def test_update_negative(self): + h = Poly1305.new(key=self.key, cipher=AES) + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = Poly1305.new(key=self.key, cipher=AES) + digest = h.digest() + + # hexdigest does not change the state + self.assertEqual(h.digest(), digest) + # digest returns a byte string + self.assertTrue(isinstance(digest, type(b"digest"))) + + def test_update_after_digest(self): + msg=b"rrrrttt" + + # Normally, update() cannot be done after digest() + h = Poly1305.new(key=self.key, data=msg[:4], cipher=AES) + h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + + def test_hex_digest(self): + mac = Poly1305.new(key=self.key, cipher=AES) + digest = mac.digest() + hexdigest = mac.hexdigest() + + # hexdigest is equivalent to digest + self.assertEqual(hexlify(digest), tobytes(hexdigest)) + # hexdigest does not change the state + self.assertEqual(mac.hexdigest(), hexdigest) + # hexdigest returns a string + self.assertTrue(isinstance(hexdigest, type("digest"))) + + def test_verify(self): + h = Poly1305.new(key=self.key, cipher=AES) + mac = h.digest() + h.verify(mac) + wrong_mac = strxor_c(mac, 255) + self.assertRaises(ValueError, h.verify, wrong_mac) + + def test_hexverify(self): + h = Poly1305.new(key=self.key, cipher=AES) + mac = h.hexdigest() + h.hexverify(mac) + self.assertRaises(ValueError, h.hexverify, "4556") + + def test_bytearray(self): + + data = b"\x00\x01\x02" + h0 = Poly1305.new(key=self.key, data=data, cipher=AES) + d_ref = h0.digest() + + # Data and key can be a bytearray (during initialization) + key_ba = bytearray(self.key) + data_ba = bytearray(data) + + h1 = Poly1305.new(key=self.key, data=data, cipher=AES, nonce=h0.nonce) + h2 = Poly1305.new(key=key_ba, data=data_ba, cipher=AES, nonce=h0.nonce) + key_ba[:1] = b'\xFF' + data_ba[:1] = b'\xEE' + + self.assertEqual(h1.digest(), d_ref) + self.assertEqual(h2.digest(), d_ref) + + # Data can be a bytearray (during operation) + data_ba = bytearray(data) + + h1 = Poly1305.new(key=self.key, cipher=AES) + h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce) + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + def test_memoryview(self): + + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data and key can be a memoryview (during initialization) + key_mv = get_mv(self.key) + data_mv = get_mv(data) + + h1 = Poly1305.new(key=self.key, data=data, cipher=AES) + h2 = Poly1305.new(key=key_mv, data=data_mv, cipher=AES, + nonce=h1.nonce) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + key_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = Poly1305.new(key=self.key, cipher=AES) + h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce) + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + +class Poly1305Test_ChaCha20(unittest.TestCase): + + key = b'\x11' * 32 + + def test_new_positive(self): + data = b'r' * 100 + + h1 = Poly1305.new(key=self.key, cipher=ChaCha20) + self.assertEqual(h1.digest_size, 16) + self.assertEqual(len(h1.nonce), 12) + + h2 = Poly1305.new(key=self.key, cipher=ChaCha20, nonce = b'8' * 8) + self.assertEqual(len(h2.nonce), 8) + self.assertEqual(h2.nonce, b'8' * 8) + + def test_new_negative(self): + + self.assertRaises(ValueError, Poly1305.new, key=self.key, nonce=b'1' * 7, cipher=ChaCha20) + + +# +# make_mac_tests() expect a new() function with signature new(key, data, +# **kwargs), and we need to adapt Poly1305's, as it only uses keywords +# +class Poly1305_New(object): + + @staticmethod + def new(key, *data, **kwds): + _kwds = dict(kwds) + if len(data) == 1: + _kwds['data'] = data[0] + _kwds['key'] = key + return Poly1305.new(**_kwds) + + +class Poly1305_Basic(object): + + @staticmethod + def new(key, *data, **kwds): + from Cryptodome.Hash.Poly1305 import Poly1305_MAC + + if len(data) == 1: + msg = data[0] + else: + msg = None + + return Poly1305_MAC(key[:16], key[16:], msg) + + +class Poly1305AES_MC(unittest.TestCase): + + def runTest(self): + tag = unhexlify(b"fb447350c4e868c52ac3275cf9d4327e") + + msg = b'' + for msg_len in range(5000 + 1): + key = tag + strxor_c(tag, 0xFF) + nonce = tag[::-1] + if msg_len > 0: + msg = msg + tobytes(tag[0]) + auth = Poly1305.new(key=key, nonce=nonce, cipher=AES, data=msg) + tag = auth.digest() + + # Compare against output of original DJB's poly1305aes-20050218 + self.assertEqual("CDFA436DDD629C7DC20E1128530BAED2", auth.hexdigest().upper()) + + +def get_tests(config={}): + tests = make_mac_tests(Poly1305_Basic, "Poly1305", test_data_basic) + tests += make_mac_tests(Poly1305_New, "Poly1305", test_data_aes) + tests += make_mac_tests(Poly1305_New, "Poly1305", test_data_chacha20) + tests += [ Poly1305AES_MC() ] + tests += list_test_cases(Poly1305Test_AES) + tests += list_test_cases(Poly1305Test_ChaCha20) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py new file mode 100644 index 0000000..c05a877 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_RIPEMD160.py: Self-test for the RIPEMD-160 hash function +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +#"""Self-test suite for Cryptodome.Hash.RIPEMD160""" + +from Cryptodome.Util.py3compat import * + +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + # Test vectors downloaded 2008-09-12 from + # http://homes.esat.kuleuven.be/~bosselae/ripemd160.html + ('9c1185a5c5e9fc54612808977ee8f548b2258d31', '', "'' (empty string)"), + ('0bdc9d2d256b3ee9daae347be6f4dc835a467ffe', 'a'), + ('8eb208f7e05d987a9b044a8e98c6b087f15a0bfc', 'abc'), + ('5d0689ef49d2fae572b881b123a85ffa21595f36', 'message digest'), + + ('f71c27109c692c1b56bbdceb5b9d2865b3708dbc', + 'abcdefghijklmnopqrstuvwxyz', + 'a-z'), + + ('12a053384a9c0c88e405a06c27dcf49ada62eb2b', + 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq', + 'abcdbcd...pnopq'), + + ('b0e20b6e3116640286ed3a87a5713079b21f5189', + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + 'A-Z, a-z, 0-9'), + + ('9b752e45573d4b39f4dbd3323cab82bf63326bfb', + '1234567890' * 8, + "'1234567890' * 8"), + + ('52783243c1697bdbe16d37f97f68f08325dc1528', + 'a' * 10**6, + '"a" * 10**6'), +] + +def get_tests(config={}): + from Cryptodome.Hash import RIPEMD160 + from .common import make_hash_tests + return make_hash_tests(RIPEMD160, "RIPEMD160", test_data, + digest_size=20, + oid="1.3.36.3.2.1") + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py new file mode 100644 index 0000000..a879e68 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/SHA1.py: Self-test for the SHA-1 hash function +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA""" + +from binascii import hexlify + +from Cryptodome.SelfTest.loader import load_test_vectors + +# Test vectors from various sources +# This is a list of (expected_result, input[, description]) tuples. +test_data_various = [ + # FIPS PUB 180-2, A.1 - "One-Block Message" + ('a9993e364706816aba3e25717850c26c9cd0d89d', 'abc'), + + # FIPS PUB 180-2, A.2 - "Multi-Block Message" + ('84983e441c3bd26ebaae4aa1f95129e5e54670f1', + 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'), + + # FIPS PUB 180-2, A.3 - "Long Message" +# ('34aa973cd4c4daa4f61eeb2bdbad27316534016f', +# 'a' * 10**6, +# '"a" * 10**6'), + + # RFC 3174: Section 7.3, "TEST4" (multiple of 512 bits) + ('dea356a2cddd90c7a7ecedc5ebb563934f460452', + '01234567' * 80, + '"01234567" * 80'), +] + +def get_tests(config={}): + from Cryptodome.Hash import SHA1 + from .common import make_hash_tests + + tests = [] + + test_vectors = load_test_vectors(("Hash", "SHA1"), + "SHA1ShortMsg.rsp", + "KAT SHA-1", + { "len" : lambda x: int(x) } ) or [] + + test_data = test_data_various[:] + for tv in test_vectors: + try: + if tv.startswith('['): + continue + except AttributeError: + pass + if tv.len == 0: + tv.msg = b"" + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests = make_hash_tests(SHA1, "SHA1", test_data, + digest_size=20, + oid="1.3.14.3.2.26") + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py new file mode 100644 index 0000000..da32423 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA224.py: Self-test for the SHA-224 hash function +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA224""" + +# Test vectors from various sources +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + + # RFC 3874: Section 3.1, "Test Vector #1 + ('23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7', 'abc'), + + # RFC 3874: Section 3.2, "Test Vector #2 + ('75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525', 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'), + + # RFC 3874: Section 3.3, "Test Vector #3 + ('20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67', 'a' * 10**6, "'a' * 10**6"), + + # Examples from http://de.wikipedia.org/wiki/Secure_Hash_Algorithm + ('d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f', ''), + + ('49b08defa65e644cbf8a2dd9270bdededabc741997d1dadd42026d7b', + 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'), + + ('58911e7fccf2971a7d07f93162d8bd13568e71aa8fc86fc1fe9043d1', + 'Frank jagt im komplett verwahrlosten Taxi quer durch Bayern'), + +] + +def get_tests(config={}): + from Cryptodome.Hash import SHA224 + from .common import make_hash_tests + return make_hash_tests(SHA224, "SHA224", test_data, + digest_size=28, + oid='2.16.840.1.101.3.4.2.4') + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py new file mode 100644 index 0000000..23d1145 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA256.py: Self-test for the SHA-256 hash function +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA256""" + +import unittest +from Cryptodome.Util.py3compat import * + +class LargeSHA256Test(unittest.TestCase): + def runTest(self): + """SHA256: 512/520 MiB test""" + from Cryptodome.Hash import SHA256 + zeros = bchr(0x00) * (1024*1024) + + h = SHA256.new(zeros) + for i in range(511): + h.update(zeros) + + # This test vector is from PyCrypto's old testdata.py file. + self.assertEqual('9acca8e8c22201155389f65abbf6bc9723edc7384ead80503839f49dcc56d767', h.hexdigest()) # 512 MiB + + for i in range(8): + h.update(zeros) + + # This test vector is from PyCrypto's old testdata.py file. + self.assertEqual('abf51ad954b246009dfe5a50ecd582fd5b8f1b8b27f30393853c3ef721e7fa6e', h.hexdigest()) # 520 MiB + +def get_tests(config={}): + # Test vectors from FIPS PUB 180-2 + # This is a list of (expected_result, input[, description]) tuples. + test_data = [ + # FIPS PUB 180-2, B.1 - "One-Block Message" + ('ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad', + 'abc'), + + # FIPS PUB 180-2, B.2 - "Multi-Block Message" + ('248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1', + 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'), + + # FIPS PUB 180-2, B.3 - "Long Message" + ('cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0', + 'a' * 10**6, + '"a" * 10**6'), + + # Test for an old PyCryptodome bug. + ('f7fd017a3c721ce7ff03f3552c0813adcc48b7f33f07e5e2ba71e23ea393d103', + 'This message is precisely 55 bytes long, to test a bug.', + 'Length = 55 (mod 64)'), + + # Example from http://de.wikipedia.org/wiki/Secure_Hash_Algorithm + ('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', ''), + + ('d32b568cd1b96d459e7291ebf4b25d007f275c9f13149beeb782fac0716613f8', + 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'), + ] + + from Cryptodome.Hash import SHA256 + from .common import make_hash_tests + tests = make_hash_tests(SHA256, "SHA256", test_data, + digest_size=32, + oid="2.16.840.1.101.3.4.2.1") + + if config.get('slow_tests'): + tests += [LargeSHA256Test()] + + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py new file mode 100644 index 0000000..5233d13 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA.py: Self-test for the SHA-384 hash function +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA384""" + +# Test vectors from various sources +# This is a list of (expected_result, input[, description]) tuples. +test_data = [ + + # RFC 4634: Section Page 8.4, "Test 1" + ('cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7', 'abc'), + + # RFC 4634: Section Page 8.4, "Test 2.2" + ('09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039', 'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'), + + # RFC 4634: Section Page 8.4, "Test 3" + ('9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985', 'a' * 10**6, "'a' * 10**6"), + + # Taken from http://de.wikipedia.org/wiki/Secure_Hash_Algorithm + ('38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b', ''), + + # Example from http://de.wikipedia.org/wiki/Secure_Hash_Algorithm + ('71e8383a4cea32d6fd6877495db2ee353542f46fa44bc23100bca48f3366b84e809f0708e81041f427c6d5219a286677', + 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'), + +] + +def get_tests(config={}): + from Cryptodome.Hash import SHA384 + from .common import make_hash_tests + return make_hash_tests(SHA384, "SHA384", test_data, + digest_size=48, + oid='2.16.840.1.101.3.4.2.2') + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py new file mode 100644 index 0000000..3141880 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA3_224.py: Self-test for the SHA-3/224 hash function +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA3_224""" + +import unittest +from binascii import hexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Hash import SHA3_224 as SHA3 +from Cryptodome.Util.py3compat import b + + +class APITest(unittest.TestCase): + + def test_update_after_digest(self): + msg=b("rrrrttt") + + # Normally, update() cannot be done after digest() + h = SHA3.new(data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = SHA3.new(data=msg).digest() + + # With the proper flag, it is allowed + h = SHA3.new(data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + +def get_tests(config={}): + from .common import make_hash_tests + + tests = [] + + test_vectors = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHA3-224.txt", + "KAT SHA-3 224", + { "len" : lambda x: int(x) } ) or [] + + test_data = [] + for tv in test_vectors: + if tv.len == 0: + tv.msg = b("") + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests += make_hash_tests(SHA3, "SHA3_224", test_data, + digest_size=SHA3.digest_size, + oid="2.16.840.1.101.3.4.2.7") + tests += list_test_cases(APITest) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py new file mode 100644 index 0000000..9dee551 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA3_256.py: Self-test for the SHA-3/256 hash function +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA3_256""" + +import unittest +from binascii import hexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Hash import SHA3_256 as SHA3 +from Cryptodome.Util.py3compat import b + + +class APITest(unittest.TestCase): + + def test_update_after_digest(self): + msg=b("rrrrttt") + + # Normally, update() cannot be done after digest() + h = SHA3.new(data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = SHA3.new(data=msg).digest() + + # With the proper flag, it is allowed + h = SHA3.new(data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + +def get_tests(config={}): + from .common import make_hash_tests + + tests = [] + + test_vectors = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHA3-256.txt", + "KAT SHA-3 256", + { "len" : lambda x: int(x) } ) or [] + + test_data = [] + for tv in test_vectors: + if tv.len == 0: + tv.msg = b("") + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + + tests += make_hash_tests(SHA3, "SHA3_256", test_data, + digest_size=SHA3.digest_size, + oid="2.16.840.1.101.3.4.2.8") + tests += list_test_cases(APITest) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py new file mode 100644 index 0000000..c5030b5 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA3_384.py: Self-test for the SHA-3/384 hash function +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA3_384""" + +import unittest +from binascii import hexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Hash import SHA3_384 as SHA3 +from Cryptodome.Util.py3compat import b + + +class APITest(unittest.TestCase): + + def test_update_after_digest(self): + msg=b("rrrrttt") + + # Normally, update() cannot be done after digest() + h = SHA3.new(data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = SHA3.new(data=msg).digest() + + # With the proper flag, it is allowed + h = SHA3.new(data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + +def get_tests(config={}): + from .common import make_hash_tests + + tests = [] + + test_vectors = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHA3-384.txt", + "KAT SHA-3 384", + { "len" : lambda x: int(x) } ) or [] + + test_data = [] + for tv in test_vectors: + if tv.len == 0: + tv.msg = b("") + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests += make_hash_tests(SHA3, "SHA3_384", test_data, + digest_size=SHA3.digest_size, + oid="2.16.840.1.101.3.4.2.9") + tests += list_test_cases(APITest) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py new file mode 100644 index 0000000..b7a57f8 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA3_512.py: Self-test for the SHA-3/512 hash function +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA3_512""" + +import unittest +from binascii import hexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Hash import SHA3_512 as SHA3 +from Cryptodome.Util.py3compat import b + + +class APITest(unittest.TestCase): + + def test_update_after_digest(self): + msg=b("rrrrttt") + + # Normally, update() cannot be done after digest() + h = SHA3.new(data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = SHA3.new(data=msg).digest() + + # With the proper flag, it is allowed + h = SHA3.new(data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + +def get_tests(config={}): + from .common import make_hash_tests + + tests = [] + + test_vectors = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHA3-512.txt", + "KAT SHA-3 512", + { "len" : lambda x: int(x) } ) or [] + + test_data = [] + for tv in test_vectors: + if tv.len == 0: + tv.msg = b("") + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests += make_hash_tests(SHA3, "SHA3_512", test_data, + digest_size=SHA3.digest_size, + oid="2.16.840.1.101.3.4.2.10") + tests += list_test_cases(APITest) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py new file mode 100644 index 0000000..e6c74b3 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Hash/test_SHA512.py: Self-test for the SHA-512 hash function +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHA512""" + +from binascii import hexlify + +from Cryptodome.Hash import SHA512 +from .common import make_hash_tests +from Cryptodome.SelfTest.loader import load_test_vectors + +# Test vectors from various sources +# This is a list of (expected_result, input[, description]) tuples. +test_data_512_other = [ + + # RFC 4634: Section Page 8.4, "Test 1" + ('ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f', 'abc'), + + # RFC 4634: Section Page 8.4, "Test 2.1" + ('8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909', 'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu'), + + # RFC 4634: Section Page 8.4, "Test 3" + ('e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b', 'a' * 10**6, "'a' * 10**6"), + + # Taken from http://de.wikipedia.org/wiki/Secure_Hash_Algorithm + ('cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e', ''), + + ('af9ed2de700433b803240a552b41b5a472a6ef3fe1431a722b2063c75e9f07451f67a28e37d09cde769424c96aea6f8971389db9e1993d6c565c3c71b855723c', 'Franz jagt im komplett verwahrlosten Taxi quer durch Bayern'), +] + + +def get_tests_SHA512(): + + test_vectors = load_test_vectors(("Hash", "SHA2"), + "SHA512ShortMsg.rsp", + "KAT SHA-512", + {"len": lambda x: int(x)}) or [] + + test_data = test_data_512_other[:] + for tv in test_vectors: + try: + if tv.startswith('['): + continue + except AttributeError: + pass + if tv.len == 0: + tv.msg = b"" + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests = make_hash_tests(SHA512, "SHA512", test_data, + digest_size=64, + oid="2.16.840.1.101.3.4.2.3") + return tests + + +def get_tests_SHA512_224(): + + test_vectors = load_test_vectors(("Hash", "SHA2"), + "SHA512_224ShortMsg.rsp", + "KAT SHA-512/224", + {"len": lambda x: int(x)}) or [] + + test_data = [] + for tv in test_vectors: + try: + if tv.startswith('['): + continue + except AttributeError: + pass + if tv.len == 0: + tv.msg = b"" + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests = make_hash_tests(SHA512, "SHA512/224", test_data, + digest_size=28, + oid="2.16.840.1.101.3.4.2.5", + extra_params={ "truncate" : "224" }) + return tests + + +def get_tests_SHA512_256(): + + test_vectors = load_test_vectors(("Hash", "SHA2"), + "SHA512_256ShortMsg.rsp", + "KAT SHA-512/256", + {"len": lambda x: int(x)}) or [] + + test_data = [] + for tv in test_vectors: + try: + if tv.startswith('['): + continue + except AttributeError: + pass + if tv.len == 0: + tv.msg = b"" + test_data.append((hexlify(tv.md), tv.msg, tv.desc)) + + tests = make_hash_tests(SHA512, "SHA512/256", test_data, + digest_size=32, + oid="2.16.840.1.101.3.4.2.6", + extra_params={ "truncate" : "256" }) + return tests + + +def get_tests(config={}): + + tests = [] + tests += get_tests_SHA512() + tests += get_tests_SHA512_224() + tests += get_tests_SHA512_256() + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py new file mode 100644 index 0000000..2283308 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py @@ -0,0 +1,143 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.SHAKE128 and SHAKE256""" + +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import SHAKE128, SHAKE256 +from Cryptodome.Util.py3compat import b, bchr, bord, tobytes + +class SHAKETest(unittest.TestCase): + + def test_new_positive(self): + + xof1 = self.shake.new() + xof2 = self.shake.new(data=b("90")) + xof3 = self.shake.new().update(b("90")) + + self.assertNotEqual(xof1.read(10), xof2.read(10)) + xof3.read(10) + self.assertEqual(xof2.read(10), xof3.read(10)) + + def test_update(self): + pieces = [bchr(10) * 200, bchr(20) * 300] + h = self.shake.new() + h.update(pieces[0]).update(pieces[1]) + digest = h.read(10) + h = self.shake.new() + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.read(10), digest) + + def test_update_negative(self): + h = self.shake.new() + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = self.shake.new() + digest = h.read(90) + + # read returns a byte string of the right length + self.assertTrue(isinstance(digest, type(b("digest")))) + self.assertEqual(len(digest), 90) + + def test_update_after_read(self): + mac = self.shake.new() + mac.update(b("rrrr")) + mac.read(90) + self.assertRaises(TypeError, mac.update, b("ttt")) + + +class SHAKE128Test(SHAKETest): + shake = SHAKE128 + + +class SHAKE256Test(SHAKETest): + shake = SHAKE256 + + +class SHAKEVectors(unittest.TestCase): + pass + + +test_vectors_128 = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHAKE128.txt", + "Short Messages KAT SHAKE128", + { "len" : lambda x: int(x) } ) or [] + +for idx, tv in enumerate(test_vectors_128): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = SHAKE128.new(data=data) + digest = hobj.read(len(result)) + self.assertEqual(digest, result) + + setattr(SHAKEVectors, "test_128_%d" % idx, new_test) + + +test_vectors_256 = load_test_vectors(("Hash", "SHA3"), + "ShortMsgKAT_SHAKE256.txt", + "Short Messages KAT SHAKE256", + { "len" : lambda x: int(x) } ) or [] + +for idx, tv in enumerate(test_vectors_256): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = SHAKE256.new(data=data) + digest = hobj.read(len(result)) + self.assertEqual(digest, result) + + setattr(SHAKEVectors, "test_256_%d" % idx, new_test) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(SHAKE128Test) + tests += list_test_cases(SHAKE256Test) + tests += list_test_cases(SHAKEVectors) + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py new file mode 100644 index 0000000..b5e6a0a --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py @@ -0,0 +1,286 @@ +import unittest +from binascii import unhexlify, hexlify + +from Cryptodome.Util.py3compat import tobytes +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import TupleHash128, TupleHash256 + + +class TupleHashTest(unittest.TestCase): + + def new(self, *args, **kwargs): + return self.TupleHash.new(*args, **kwargs) + + def test_new_positive(self): + + h = self.new() + for new_func in self.TupleHash.new, h.new: + + for dbits in range(64, 1024 + 1, 8): + hobj = new_func(digest_bits=dbits) + self.assertEqual(hobj.digest_size * 8, dbits) + + for dbytes in range(8, 128 + 1): + hobj = new_func(digest_bytes=dbytes) + self.assertEqual(hobj.digest_size, dbytes) + + hobj = h.new() + self.assertEqual(hobj.digest_size, self.default_bytes) + + def test_new_negative(self): + + h = self.new() + for new_func in self.TupleHash.new, h.new: + self.assertRaises(TypeError, new_func, + digest_bytes=self.minimum_bytes, + digest_bits=self.minimum_bits) + self.assertRaises(ValueError, new_func, digest_bytes=0) + self.assertRaises(ValueError, new_func, + digest_bits=self.minimum_bits + 7) + self.assertRaises(ValueError, new_func, + digest_bits=self.minimum_bits - 8) + self.assertRaises(ValueError, new_func, + digest_bits=self.minimum_bytes - 1) + + def test_default_digest_size(self): + digest = self.new().digest() + self.assertEqual(len(digest), self.default_bytes) + + def test_update(self): + h = self.new() + h.update(b'') + h.digest() + + h = self.new() + h.update(b'') + h.update(b'STRING1') + h.update(b'STRING2') + mac1 = h.digest() + + h = self.new() + h.update(b'STRING1') + h.update(b'STRING2') + mac2 = h.digest() + + self.assertNotEqual(mac1, mac2) + + def test_update_negative(self): + h = self.new() + self.assertRaises(TypeError, h.update, u"string") + self.assertRaises(TypeError, h.update, None) + + def test_digest(self): + h = self.new() + digest = h.digest() + + # hexdigest does not change the state + self.assertEqual(h.digest(), digest) + # digest returns a byte string + self.assertTrue(isinstance(digest, type(b"digest"))) + + def test_update_after_digest(self): + msg = b"rrrrttt" + + # Normally, update() cannot be done after digest() + h = self.new() + h.update(msg) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, dig1) + + def test_hex_digest(self): + mac = self.new() + digest = mac.digest() + hexdigest = mac.hexdigest() + + # hexdigest is equivalent to digest + self.assertEqual(hexlify(digest), tobytes(hexdigest)) + # hexdigest does not change the state + self.assertEqual(mac.hexdigest(), hexdigest) + # hexdigest returns a string + self.assertTrue(isinstance(hexdigest, type("digest"))) + + def test_bytearray(self): + + data = b"\x00\x01\x02" + + # Data can be a bytearray (during operation) + data_ba = bytearray(data) + + h1 = self.new() + h2 = self.new() + h1.update(data) + h2.update(data_ba) + data_ba[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + def test_memoryview(self): + + data = b"\x00\x01\x02" + + def get_mv_ro(data): + return memoryview(data) + + def get_mv_rw(data): + return memoryview(bytearray(data)) + + for get_mv in (get_mv_ro, get_mv_rw): + + # Data can be a memoryview (during operation) + data_mv = get_mv(data) + + h1 = self.new() + h2 = self.new() + h1.update(data) + h2.update(data_mv) + if not data_mv.readonly: + data_mv[:1] = b'\xFF' + + self.assertEqual(h1.digest(), h2.digest()) + + +class TupleHash128Test(TupleHashTest): + + TupleHash = TupleHash128 + + minimum_bytes = 8 + default_bytes = 64 + + minimum_bits = 64 + default_bits = 512 + + +class TupleHash256Test(TupleHashTest): + + TupleHash = TupleHash256 + + minimum_bytes = 8 + default_bytes = 64 + + minimum_bits = 64 + default_bits = 512 + + +class NISTExampleTestVectors(unittest.TestCase): + + # http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/TupleHash_samples.pdf + test_data = [ + ( + ( + "00 01 02", + "10 11 12 13 14 15", + ), + "", + "C5 D8 78 6C 1A FB 9B 82 11 1A B3 4B 65 B2 C0 04" + "8F A6 4E 6D 48 E2 63 26 4C E1 70 7D 3F FC 8E D1", + "KMAC128 Sample #1 NIST", + TupleHash128 + ), + ( + ( + "00 01 02", + "10 11 12 13 14 15", + ), + "My Tuple App", + "75 CD B2 0F F4 DB 11 54 E8 41 D7 58 E2 41 60 C5" + "4B AE 86 EB 8C 13 E7 F5 F4 0E B3 55 88 E9 6D FB", + "KMAC128 Sample #2 NIST", + TupleHash128 + ), + ( + ( + "00 01 02", + "10 11 12 13 14 15", + "20 21 22 23 24 25 26 27 28", + ), + "My Tuple App", + "E6 0F 20 2C 89 A2 63 1E DA 8D 4C 58 8C A5 FD 07" + "F3 9E 51 51 99 8D EC CF 97 3A DB 38 04 BB 6E 84", + "KMAC128 Sample #3 NIST", + TupleHash128 + ), + ( + ( + "00 01 02", + "10 11 12 13 14 15", + ), + "", + "CF B7 05 8C AC A5 E6 68 F8 1A 12 A2 0A 21 95 CE" + "97 A9 25 F1 DB A3 E7 44 9A 56 F8 22 01 EC 60 73" + "11 AC 26 96 B1 AB 5E A2 35 2D F1 42 3B DE 7B D4" + "BB 78 C9 AE D1 A8 53 C7 86 72 F9 EB 23 BB E1 94", + "KMAC256 Sample #4 NIST", + TupleHash256 + ), + ( + ( + "00 01 02", + "10 11 12 13 14 15", + ), + "My Tuple App", + "14 7C 21 91 D5 ED 7E FD 98 DB D9 6D 7A B5 A1 16" + "92 57 6F 5F E2 A5 06 5F 3E 33 DE 6B BA 9F 3A A1" + "C4 E9 A0 68 A2 89 C6 1C 95 AA B3 0A EE 1E 41 0B" + "0B 60 7D E3 62 0E 24 A4 E3 BF 98 52 A1 D4 36 7E", + "KMAC256 Sample #5 NIST", + TupleHash256 + ), + ( + ( + "00 01 02", + "10 11 12 13 14 15", + "20 21 22 23 24 25 26 27 28", + ), + "My Tuple App", + "45 00 0B E6 3F 9B 6B FD 89 F5 47 17 67 0F 69 A9" + "BC 76 35 91 A4 F0 5C 50 D6 88 91 A7 44 BC C6 E7" + "D6 D5 B5 E8 2C 01 8D A9 99 ED 35 B0 BB 49 C9 67" + "8E 52 6A BD 8E 85 C1 3E D2 54 02 1D B9 E7 90 CE", + "KMAC256 Sample #6 NIST", + TupleHash256 + ), + + + + ] + + def setUp(self): + td = [] + for tv_in in self.test_data: + tv_out = [None] * len(tv_in) + + tv_out[0] = [] + for string in tv_in[0]: + tv_out[0].append(unhexlify(string.replace(" ", ""))) + + tv_out[1] = tobytes(tv_in[1]) # Custom + tv_out[2] = unhexlify(tv_in[2].replace(" ", "")) + tv_out[3] = tv_in[3] + tv_out[4] = tv_in[4] + td.append(tv_out) + self.test_data = td + + def runTest(self): + + for data, custom, digest, text, module in self.test_data: + hd = module.new(custom=custom, digest_bytes=len(digest)) + for string in data: + hd.update(string) + self.assertEqual(hd.digest(), digest, msg=text) + + +def get_tests(config={}): + tests = [] + + tests += list_test_cases(TupleHash128Test) + tests += list_test_cases(TupleHash256Test) + tests.append(NISTExampleTestVectors()) + + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py new file mode 100644 index 0000000..6797160 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py @@ -0,0 +1,178 @@ +# =================================================================== +# 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. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.cSHAKE128 and cSHAKE256""" + +import unittest + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import cSHAKE128, cSHAKE256, SHAKE128, SHAKE256 +from Cryptodome.Util.py3compat import b, bchr, tobytes + + +class cSHAKETest(unittest.TestCase): + + def test_left_encode(self): + from Cryptodome.Hash.cSHAKE128 import _left_encode + self.assertEqual(_left_encode(0), b'\x01\x00') + self.assertEqual(_left_encode(1), b'\x01\x01') + self.assertEqual(_left_encode(256), b'\x02\x01\x00') + + def test_bytepad(self): + from Cryptodome.Hash.cSHAKE128 import _bytepad + self.assertEqual(_bytepad(b'', 4), b'\x01\x04\x00\x00') + self.assertEqual(_bytepad(b'A', 4), b'\x01\x04A\x00') + self.assertEqual(_bytepad(b'AA', 4), b'\x01\x04AA') + self.assertEqual(_bytepad(b'AAA', 4), b'\x01\x04AAA\x00\x00\x00') + self.assertEqual(_bytepad(b'AAAA', 4), b'\x01\x04AAAA\x00\x00') + self.assertEqual(_bytepad(b'AAAAA', 4), b'\x01\x04AAAAA\x00') + self.assertEqual(_bytepad(b'AAAAAA', 4), b'\x01\x04AAAAAA') + self.assertEqual(_bytepad(b'AAAAAAA', 4), b'\x01\x04AAAAAAA\x00\x00\x00') + + def test_new_positive(self): + + xof1 = self.cshake.new() + xof2 = self.cshake.new(data=b("90")) + xof3 = self.cshake.new().update(b("90")) + + self.assertNotEqual(xof1.read(10), xof2.read(10)) + xof3.read(10) + self.assertEqual(xof2.read(10), xof3.read(10)) + + xof1 = self.cshake.new() + ref = xof1.read(10) + xof2 = self.cshake.new(custom=b("")) + xof3 = self.cshake.new(custom=b("foo")) + + self.assertEqual(ref, xof2.read(10)) + self.assertNotEqual(ref, xof3.read(10)) + + xof1 = self.cshake.new(custom=b("foo")) + xof2 = self.cshake.new(custom=b("foo"), data=b("90")) + xof3 = self.cshake.new(custom=b("foo")).update(b("90")) + + self.assertNotEqual(xof1.read(10), xof2.read(10)) + xof3.read(10) + self.assertEqual(xof2.read(10), xof3.read(10)) + + def test_update(self): + pieces = [bchr(10) * 200, bchr(20) * 300] + h = self.cshake.new() + h.update(pieces[0]).update(pieces[1]) + digest = h.read(10) + h = self.cshake.new() + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.read(10), digest) + + def test_update_negative(self): + h = self.cshake.new() + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = self.cshake.new() + digest = h.read(90) + + # read returns a byte string of the right length + self.assertTrue(isinstance(digest, type(b("digest")))) + self.assertEqual(len(digest), 90) + + def test_update_after_read(self): + mac = self.cshake.new() + mac.update(b("rrrr")) + mac.read(90) + self.assertRaises(TypeError, mac.update, b("ttt")) + + def test_shake(self): + # When no customization string is passed, results must match SHAKE + for digest_len in range(64): + xof1 = self.cshake.new(b'TEST') + xof2 = self.shake.new(b'TEST') + self.assertEqual(xof1.read(digest_len), xof2.read(digest_len)) + + +class cSHAKE128Test(cSHAKETest): + cshake = cSHAKE128 + shake = SHAKE128 + + +class cSHAKE256Test(cSHAKETest): + cshake = cSHAKE256 + shake = SHAKE256 + + +class cSHAKEVectors(unittest.TestCase): + pass + + +vector_files = [("ShortMsgSamples_cSHAKE128.txt", "Short Message Samples cSHAKE128", "128_cshake", cSHAKE128), + ("ShortMsgSamples_cSHAKE256.txt", "Short Message Samples cSHAKE256", "256_cshake", cSHAKE256), + ("CustomMsgSamples_cSHAKE128.txt", "Custom Message Samples cSHAKE128", "custom_128_cshake", cSHAKE128), + ("CustomMsgSamples_cSHAKE256.txt", "Custom Message Samples cSHAKE256", "custom_256_cshake", cSHAKE256), + ] + +for file, descr, tag, test_class in vector_files: + + test_vectors = load_test_vectors(("Hash", "SHA3"), file, descr, + {"len": lambda x: int(x), + "nlen": lambda x: int(x), + "slen": lambda x: int(x)}) or [] + + for idx, tv in enumerate(test_vectors): + if getattr(tv, "len", 0) == 0: + data = b("") + else: + data = tobytes(tv.msg) + assert(tv.len == len(tv.msg)*8) + if getattr(tv, "nlen", 0) != 0: + raise ValueError("Unsupported cSHAKE test vector") + if getattr(tv, "slen", 0) == 0: + custom = b("") + else: + custom = tobytes(tv.s) + assert(tv.slen == len(tv.s)*8) + + def new_test(self, data=data, result=tv.md, custom=custom, test_class=test_class): + hobj = test_class.new(data=data, custom=custom) + digest = hobj.read(len(result)) + self.assertEqual(digest, result) + + setattr(cSHAKEVectors, "test_%s_%d" % (tag, idx), new_test) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(cSHAKE128Test) + tests += list_test_cases(cSHAKE256Test) + tests += list_test_cases(cSHAKEVectors) + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py new file mode 100644 index 0000000..dcc0d13 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py @@ -0,0 +1,250 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-test suite for Cryptodome.Hash.keccak""" + +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.SelfTest.loader import load_test_vectors +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Hash import keccak +from Cryptodome.Util.py3compat import b, tobytes, bchr + +class KeccakTest(unittest.TestCase): + + def test_new_positive(self): + + for digest_bits in (224, 256, 384, 512): + hobj = keccak.new(digest_bits=digest_bits) + self.assertEqual(hobj.digest_size, digest_bits // 8) + + hobj2 = hobj.new() + self.assertEqual(hobj2.digest_size, digest_bits // 8) + + for digest_bytes in (28, 32, 48, 64): + hobj = keccak.new(digest_bytes=digest_bytes) + self.assertEqual(hobj.digest_size, digest_bytes) + + hobj2 = hobj.new() + self.assertEqual(hobj2.digest_size, digest_bytes) + + def test_new_positive2(self): + + digest1 = keccak.new(data=b("\x90"), digest_bytes=64).digest() + digest2 = keccak.new(digest_bytes=64).update(b("\x90")).digest() + self.assertEqual(digest1, digest2) + + def test_new_negative(self): + + # keccak.new needs digest size + self.assertRaises(TypeError, keccak.new) + + h = keccak.new(digest_bits=512) + + # Either bits or bytes can be specified + self.assertRaises(TypeError, keccak.new, + digest_bytes=64, + digest_bits=512) + + # Range + self.assertRaises(ValueError, keccak.new, digest_bytes=0) + self.assertRaises(ValueError, keccak.new, digest_bytes=1) + self.assertRaises(ValueError, keccak.new, digest_bytes=65) + self.assertRaises(ValueError, keccak.new, digest_bits=0) + self.assertRaises(ValueError, keccak.new, digest_bits=1) + self.assertRaises(ValueError, keccak.new, digest_bits=513) + + def test_update(self): + pieces = [bchr(10) * 200, bchr(20) * 300] + h = keccak.new(digest_bytes=64) + h.update(pieces[0]).update(pieces[1]) + digest = h.digest() + h = keccak.new(digest_bytes=64) + h.update(pieces[0] + pieces[1]) + self.assertEqual(h.digest(), digest) + + def test_update_negative(self): + h = keccak.new(digest_bytes=64) + self.assertRaises(TypeError, h.update, u"string") + + def test_digest(self): + h = keccak.new(digest_bytes=64) + digest = h.digest() + + # hexdigest does not change the state + self.assertEqual(h.digest(), digest) + # digest returns a byte string + self.assertTrue(isinstance(digest, type(b("digest")))) + + def test_hex_digest(self): + mac = keccak.new(digest_bits=512) + digest = mac.digest() + hexdigest = mac.hexdigest() + + # hexdigest is equivalent to digest + self.assertEqual(hexlify(digest), tobytes(hexdigest)) + # hexdigest does not change the state + self.assertEqual(mac.hexdigest(), hexdigest) + # hexdigest returns a string + self.assertTrue(isinstance(hexdigest, type("digest"))) + + def test_update_after_digest(self): + msg=b("rrrrttt") + + # Normally, update() cannot be done after digest() + h = keccak.new(digest_bits=512, data=msg[:4]) + dig1 = h.digest() + self.assertRaises(TypeError, h.update, msg[4:]) + dig2 = keccak.new(digest_bits=512, data=msg).digest() + + # With the proper flag, it is allowed + h = keccak.new(digest_bits=512, data=msg[:4], update_after_digest=True) + self.assertEqual(h.digest(), dig1) + # ... and the subsequent digest applies to the entire message + # up to that point + h.update(msg[4:]) + self.assertEqual(h.digest(), dig2) + + +class KeccakVectors(unittest.TestCase): + pass + + # TODO: add ExtremelyLong tests + + +test_vectors_224 = load_test_vectors(("Hash", "keccak"), + "ShortMsgKAT_224.txt", + "Short Messages KAT 224", + {"len": lambda x: int(x)}) or [] + +test_vectors_224 += load_test_vectors(("Hash", "keccak"), + "LongMsgKAT_224.txt", + "Long Messages KAT 224", + {"len": lambda x: int(x)}) or [] + +for idx, tv in enumerate(test_vectors_224): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = keccak.new(digest_bits=224, data=data) + self.assertEqual(hobj.digest(), result) + + setattr(KeccakVectors, "test_224_%d" % idx, new_test) + +# --- + +test_vectors_256 = load_test_vectors(("Hash", "keccak"), + "ShortMsgKAT_256.txt", + "Short Messages KAT 256", + { "len" : lambda x: int(x) } ) or [] + +test_vectors_256 += load_test_vectors(("Hash", "keccak"), + "LongMsgKAT_256.txt", + "Long Messages KAT 256", + { "len" : lambda x: int(x) } ) or [] + +for idx, tv in enumerate(test_vectors_256): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = keccak.new(digest_bits=256, data=data) + self.assertEqual(hobj.digest(), result) + + setattr(KeccakVectors, "test_256_%d" % idx, new_test) + + +# --- + +test_vectors_384 = load_test_vectors(("Hash", "keccak"), + "ShortMsgKAT_384.txt", + "Short Messages KAT 384", + {"len": lambda x: int(x)}) or [] + +test_vectors_384 += load_test_vectors(("Hash", "keccak"), + "LongMsgKAT_384.txt", + "Long Messages KAT 384", + {"len": lambda x: int(x)}) or [] + +for idx, tv in enumerate(test_vectors_384): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = keccak.new(digest_bits=384, data=data) + self.assertEqual(hobj.digest(), result) + + setattr(KeccakVectors, "test_384_%d" % idx, new_test) + +# --- + +test_vectors_512 = load_test_vectors(("Hash", "keccak"), + "ShortMsgKAT_512.txt", + "Short Messages KAT 512", + {"len": lambda x: int(x)}) or [] + +test_vectors_512 += load_test_vectors(("Hash", "keccak"), + "LongMsgKAT_512.txt", + "Long Messages KAT 512", + {"len": lambda x: int(x)}) or [] + +for idx, tv in enumerate(test_vectors_512): + if tv.len == 0: + data = b("") + else: + data = tobytes(tv.msg) + + def new_test(self, data=data, result=tv.md): + hobj = keccak.new(digest_bits=512, data=data) + self.assertEqual(hobj.digest(), result) + + setattr(KeccakVectors, "test_512_%d" % idx, new_test) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(KeccakTest) + tests += list_test_cases(KeccakVectors) + return tests + + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/__init__.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/__init__.py new file mode 100644 index 0000000..f15f141 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/__init__.py @@ -0,0 +1,47 @@ +# +# SelfTest/IO/__init__.py: Self-test for input/output module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-test for I/O""" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.IO import test_PKCS8; tests += test_PKCS8.get_tests(config=config) + from Cryptodome.SelfTest.IO import test_PBES; tests += test_PBES.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + + diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PBES.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PBES.py new file mode 100644 index 0000000..bd055ab --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PBES.py @@ -0,0 +1,93 @@ +# +# SelfTest/IO/test_PBES.py: Self-test for the _PBES module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-tests for Cryptodome.IO._PBES module""" + +import unittest +from Cryptodome.Util.py3compat import * + +from Cryptodome.IO._PBES import PBES2 + + +class TestPBES2(unittest.TestCase): + + def setUp(self): + self.ref = b("Test data") + self.passphrase = b("Passphrase") + + def test1(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + def test2(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'PBKDF2WithHMAC-SHA1AndAES128-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + def test3(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'PBKDF2WithHMAC-SHA1AndAES192-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + def test4(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'scryptAndAES128-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + def test5(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'scryptAndAES192-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + def test6(self): + ct = PBES2.encrypt(self.ref, self.passphrase, + 'scryptAndAES256-CBC') + pt = PBES2.decrypt(ct, self.passphrase) + self.assertEqual(self.ref, pt) + + +def get_tests(config={}): + from Cryptodome.SelfTest.st_common import list_test_cases + listTests = [] + listTests += list_test_cases(TestPBES2) + return listTests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py new file mode 100644 index 0000000..3cef9bc --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py @@ -0,0 +1,425 @@ +# +# SelfTest/IO/test_PKCS8.py: Self-test for the PKCS8 module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-tests for Cryptodome.IO.PKCS8 module""" + +import unittest +from binascii import unhexlify + +from Cryptodome.Util.py3compat import * +from Cryptodome.IO import PKCS8 + +from Cryptodome.Util.asn1 import DerNull + +oid_key = '1.2.840.113549.1.1.1' + +# Original RSA key (in DER format) +# hexdump -v -e '32/1 "%02x" "\n"' key.der +clear_key=""" +308201ab020100025a00b94a7f7075ab9e79e8196f47be707781e80dd965cf16 +0c951a870b71783b6aaabbd550c0e65e5a3dfe15b8620009f6d7e5efec42a3f0 +6fe20faeebb0c356e79cdec6db4dd427e82d8ae4a5b90996227b8ba54ccfc4d2 +5c08050203010001025a00afa09c70d528299b7552fe766b5d20f9a221d66938 +c3b68371d48515359863ff96f0978d700e08cd6fd3d8a3f97066fc2e0d5f78eb +3a50b8e17ba297b24d1b8e9cdfd18d608668198d724ad15863ef0329195dee89 +3f039395022d0ebe0518df702a8b25954301ec60a97efdcec8eaa4f2e76ca7e8 +8dfbc3f7e0bb83f9a0e8dc47c0f8c746e9df6b022d0c9195de13f09b7be1fdd7 +1f56ae7d973e08bd9fd2c3dfd8936bb05be9cc67bd32d663c7f00d70932a0be3 +c24f022d0ac334eb6cabf1933633db007b763227b0d9971a9ea36aca8b669ec9 +4fcf16352f6b3dcae28e4bd6137db4ddd3022d0400a09f15ee7b351a2481cb03 +09920905c236d09c87afd3022f3afc2a19e3b746672b635238956ee7e6dd62d5 +022d0cd88ed14fcfbda5bbf0257f700147137bbab9c797af7df866704b889aa3 +7e2e93df3ff1a0fd3490111dcdbc4c +""" + +# Same key as above, wrapped in PKCS#8 but w/o password +# +# openssl pkcs8 -topk8 -inform DER -nocrypt -in key.der -outform DER -out keyp8.der +# hexdump -v -e '32/1 "%02x" "\n"' keyp8.der +wrapped_clear_key=""" +308201c5020100300d06092a864886f70d0101010500048201af308201ab0201 +00025a00b94a7f7075ab9e79e8196f47be707781e80dd965cf160c951a870b71 +783b6aaabbd550c0e65e5a3dfe15b8620009f6d7e5efec42a3f06fe20faeebb0 +c356e79cdec6db4dd427e82d8ae4a5b90996227b8ba54ccfc4d25c0805020301 +0001025a00afa09c70d528299b7552fe766b5d20f9a221d66938c3b68371d485 +15359863ff96f0978d700e08cd6fd3d8a3f97066fc2e0d5f78eb3a50b8e17ba2 +97b24d1b8e9cdfd18d608668198d724ad15863ef0329195dee893f039395022d +0ebe0518df702a8b25954301ec60a97efdcec8eaa4f2e76ca7e88dfbc3f7e0bb +83f9a0e8dc47c0f8c746e9df6b022d0c9195de13f09b7be1fdd71f56ae7d973e +08bd9fd2c3dfd8936bb05be9cc67bd32d663c7f00d70932a0be3c24f022d0ac3 +34eb6cabf1933633db007b763227b0d9971a9ea36aca8b669ec94fcf16352f6b +3dcae28e4bd6137db4ddd3022d0400a09f15ee7b351a2481cb0309920905c236 +d09c87afd3022f3afc2a19e3b746672b635238956ee7e6dd62d5022d0cd88ed1 +4fcfbda5bbf0257f700147137bbab9c797af7df866704b889aa37e2e93df3ff1 +a0fd3490111dcdbc4c +""" + +### +# +# The key above will now be encrypted with different algorithms. +# The password is always 'TestTest'. +# +# Each item in the wrapped_enc_keys list contains: +# * wrap algorithm +# * iteration count +# * Salt +# * IV +# * Expected result +### +wrapped_enc_keys = [] + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der -outform DER -out keyenc.der -v2 des3 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC', +2048, +"47EA7227D8B22E2F", # IV +"E3F7A838AB911A4D", # Salt +""" +30820216304006092a864886f70d01050d3033301b06092a864886f70d01050c +300e0408e3f7a838ab911a4d02020800301406082a864886f70d0307040847ea +7227d8b22e2f048201d0ea388b374d2d0e4ceb7a5139f850fdff274884a6e6c0 +64326e09d00dbba9018834edb5a51a6ae3d1806e6e91eebf33788ce71fee0637 +a2ebf58859dd32afc644110c390274a6128b50c39b8d907823810ec471bada86 +6f5b75d8ea04ad310fad2e73621696db8e426cd511ee93ec1714a1a7db45e036 +4bf20d178d1f16bbb250b32c2d200093169d588de65f7d99aad9ddd0104b44f1 +326962e1520dfac3c2a800e8a14f678dff2b3d0bb23f69da635bf2a643ac934e +219a447d2f4460b67149e860e54f365da130763deefa649c72b0dcd48966a2d3 +4a477444782e3e66df5a582b07bbb19778a79bd355074ce331f4a82eb966b0c4 +52a09eab6116f2722064d314ae433b3d6e81d2436e93fdf446112663cde93b87 +9c8be44beb45f18e2c78fee9b016033f01ecda51b9b142091fa69f65ab784d2c +5ad8d34be6f7f1464adfc1e0ef3f7848f40d3bdea4412758f2fcb655c93d8f4d +f6fa48fc5aa4b75dd1c017ab79ac9d737233a6d668f5364ccf47786debd37334 +9c10c9e6efbe78430a61f71c89948aa32cdc3cc7338cf994147819ce7ab23450 +c8f7d9b94c3bb377d17a3fa204b601526317824b142ff6bc843fa7815ece89c0 +839573f234dac8d80cc571a045353d61db904a4398d8ef3df5ac +""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der -outform DER -out keyenc.der +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'skip encryption', # pbeWithMD5AndDES-CBC, only decoding is supported +-1, +"", +"", +""" +308201f1301b06092a864886f70d010503300e0408f9b990c89af1d41b020208 +00048201d0c6267fe8592903891933d559e71a7ca68b2e39150f19daca0f7921 +52f97e249d72f670d5140e9150433310ed7c7ee51927693fd39884cb9551cea5 +a7b746f7edf199f8787d4787a35dad930d7db057b2118851211b645ac8b90fa6 +b0e7d49ac8567cbd5fff226e87aa9129a0f52c45e9307752e8575c3b0ff756b7 +31fda6942d15ecb6b27ea19370ccc79773f47891e80d22b440d81259c4c28eac +e0ca839524116bcf52d8c566e49a95ddb0e5493437279a770a39fd333f3fca91 +55884fad0ba5aaf273121f893059d37dd417da7dcfd0d6fa7494968f13b2cc95 +65633f2c891340193e5ec00e4ee0b0e90b3b93da362a4906360845771ade1754 +9df79140be5993f3424c012598eadd3e7c7c0b4db2c72cf103d7943a5cf61420 +93370b9702386c3dd4eb0a47f34b579624a46a108b2d13921fa1b367495fe345 +6aa128aa70f8ca80ae13eb301e96c380724ce67c54380bbea2316c1faf4d058e +b4ca2e23442047606b9bc4b3bf65b432cb271bea4eb35dd3eb360d3be8612a87 +a50e96a2264490aeabdc07c6e78e5dbf4fe3388726d0e2a228346bf3c2907d68 +2a6276b22ae883fb30fa611f4e4193e7a08480fcd7db48308bacbd72bf4807aa +11fd394859f97d22982f7fe890b2e2a0f7e7ffb693 +""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v1 PBE-SHA1-RC2-64 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'skip encryption', # pbeWithSHA1AndRC2-CBC, only decoding is supported +-1, +"", +"", +""" +308201f1301b06092a864886f70d01050b300e04083ee943bdae185008020208 +00048201d0e4614d9371d3ff10ceabc2f6a7a13a0f449f9a714144e46518ea55 +e3e6f0cde24031d01ef1f37ec40081449ef01914faf45983dde0d2bc496712de +8dd15a5527dff4721d9016c13f34fb93e3ce68577e30146266d71b539f854e56 +753a192cf126ed4812734d86f81884374f1100772f78d0646e9946407637c565 +d070acab413c55952f7237437f2e48cae7fa0ff8d370de2bf446dd08049a3663 +d9c813ac197468c02e2b687e7ca994cf7f03f01b6eca87dbfed94502c2094157 +ea39f73fe4e591df1a68b04d19d9adab90bb9898467c1464ad20bf2b8fb9a5ff +d3ec91847d1c67fd768a4b9cfb46572eccc83806601372b6fad0243f58f623b7 +1c5809dea0feb8278fe27e5560eed8448dc93f5612f546e5dd7c5f6404365eb2 +5bf3396814367ae8b15c5c432b57eaed1f882c05c7f6517ee9e42b87b7b8d071 +9d6125d1b52f7b2cca1f6bd5f584334bf90bce1a7d938274cafe27b68e629698 +b16e27ae528db28593af9adcfccbebb3b9e1f2af5cd5531b51968389caa6c091 +e7de1f1b96f0d258e54e540d961a7c0ef51fda45d6da5fddd33e9bbfd3a5f8d7 +d7ab2e971de495cddbc86d38444fee9f0ac097b00adaf7802dabe0cff5b43b45 +4f26b7b547016f89be52676866189911c53e2f2477""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v1 PBE-MD5-RC2-64 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'skip encryption', # pbeWithMD5AndRC2-CBC, only decoding is supported +-1, +"", +"", +""" +308201f1301b06092a864886f70d010506300e0408f5cd2fee56d9b4b8020208 +00048201d086454942d6166a19d6b108465bd111e7080911f573d54b1369c676 +df28600e84936bfec04f91023ff16499e2e07178c340904f12ffa6886ab66228 +32bf43c2bff5a0ed14e765918cf5fc543ad49566246f7eb3fc044fa5a9c25f40 +8fc8c8296b91658d3bb1067c0aba008c4fefd9e2bcdbbbd63fdc8085482bccf4 +f150cec9a084259ad441a017e5d81a1034ef2484696a7a50863836d0eeda45cd +8cee8ecabfed703f8d9d4bbdf3a767d32a0ccdc38550ee2928d7fe3fa27eda5b +5c7899e75ad55d076d2c2d3c37d6da3d95236081f9671dab9a99afdb1cbc890e +332d1a91105d9a8ce08b6027aa07367bd1daec3059cb51f5d896124da16971e4 +0ca4bcadb06c854bdf39f42dd24174011414e51626d198775eff3449a982df7b +ace874e77e045eb6d7c3faef0750792b29a068a6291f7275df1123fac5789c51 +27ace42836d81633faf9daf38f6787fff0394ea484bbcd465b57d4dbee3cf8df +b77d1db287b3a6264c466805be5a4fe85cfbca180699859280f2dd8e2c2c10b5 +7a7d2ac670c6039d41952fbb0e4f99b560ebe1d020e1b96d02403283819c00cc +529c51f0b0101555e4c58002ba3c6e3c12e3fde1aec94382792e96d9666a2b33 +3dc397b22ecab67ee38a552fec29a1d4ff8719c748""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v1 PBE-SHA1-DES +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'skip encryption', # pbeWithSHA1AndDES-CBC, only decoding is supported +-1, +"", +"", +""" +308201f1301b06092a864886f70d01050a300e04089bacc9cf1e8f734e020208 +00048201d03e502f3ceafe8fd19ab2939576bfdded26d719b2441db1459688f5 +9673218b41ec1f739edf1e460bd927bc28470c87b2d4fc8ea02ba17b47a63c49 +c5c1bee40529dadfd3ef8b4472c730bc136678c78abfb34670ec9d7dcd17ee3f +892f93f2629e6e0f4b24ecb9f954069bf722f466dece3913bb6abbd2c471d9a5 +c5eea89b14aaccda43d30b0dd0f6eb6e9850d9747aa8aa8414c383ad01c374ee +26d3552abec9ba22669cc9622ccf2921e3d0c8ecd1a70e861956de0bec6104b5 +b649ac994970c83f8a9e84b14a7dff7843d4ca3dd4af87cea43b5657e15ae0b5 +a940ce5047f006ab3596506600724764f23757205fe374fee04911336d655acc +03e159ec27789191d1517c4f3f9122f5242d44d25eab8f0658cafb928566ca0e +8f6589aa0c0ab13ca7a618008ae3eafd4671ee8fe0b562e70b3623b0e2a16eee +97fd388087d2e03530c9fe7db6e52eccc7c48fd701ede35e08922861a9508d12 +bc8bbf24f0c6bee6e63dbcb489b603d4c4a78ce45bf2eab1d5d10456c42a65a8 +3a606f4e4b9b46eb13b57f2624b651859d3d2d5192b45dbd5a2ead14ff20ca76 +48f321309aa56d8c0c4a192b580821cc6c70c75e6f19d1c5414da898ec4dd39d +b0eb93d6ba387a80702dfd2db610757ba340f63230 +""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v2 aes128 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'PBKDF2WithHMAC-SHA1AndAES128-CBC', +2048, +"4F66EE5D3BCD531FE6EBF4B4E73016B8", # IV +"479F25156176C53A", # Salt +""" +3082021f304906092a864886f70d01050d303c301b06092a864886f70d01050c +300e0408479f25156176c53a02020800301d060960864801650304010204104f +66ee5d3bcd531fe6ebf4b4e73016b8048201d0e33cfa560423f589d097d21533 +3b880a5ebac5b2ac58b4e73b0d787aee7764f034fe34ca1d1bd845c0a7c3316f +afbfb2129e03dcaf5a5031394206492828dacef1e04639bee5935e0f46114202 +10bc6c37182f4889be11c5d0486c398f4be952e5740f65de9d8edeb275e2b406 +e19bc29ad5ebb97fa536344fc3d84c7e755696f12b810898de4e6f069b8a81c8 +0aab0d45d7d062303aaa4a10c2ce84fdb5a03114039cfe138e38bb15b2ced717 +93549cdad85e730b14d9e2198b663dfdc8d04a4349eb3de59b076ad40b116d4a +25ed917c576bc7c883c95ef0f1180e28fc9981bea069594c309f1aa1b253ceab +a2f0313bb1372bcb51a745056be93d77a1f235a762a45e8856512d436b2ca0f7 +dd60fbed394ba28978d2a2b984b028529d0a58d93aba46c6bbd4ac1e4013cbaa +63b00988bc5f11ccc40141c346762d2b28f64435d4be98ec17c1884985e3807e +e550db606600993efccf6de0dfc2d2d70b5336a3b018fa415d6bdd59f5777118 +16806b7bc17c4c7e20ad7176ebfa5a1aa3f6bc10f04b77afd443944642ac9cca +d740e082b4a3bbb8bafdd34a0b3c5f2f3c2aceccccdccd092b78994b845bfa61 +706c3b9df5165ed1dbcbf1244fe41fc9bf993f52f7658e2f87e1baaeacb0f562 +9d905c +""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v2 aes192 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'PBKDF2WithHMAC-SHA1AndAES192-CBC', +2048, +"5CFC2A4FF7B63201A4A8A5B021148186", # IV +"D718541C264944CE", # Salt +""" +3082021f304906092a864886f70d01050d303c301b06092a864886f70d01050c +300e0408d718541c264944ce02020800301d060960864801650304011604105c +fc2a4ff7b63201a4a8a5b021148186048201d08e74aaa21b8bcfb15b9790fe95 +b0e09ddb0f189b6fb1682fdb9f122b804650ddec3c67a1df093a828b3e5fbcc6 +286abbcc5354c482fd796d972e919ca8a5eba1eaa2293af1d648013ddad72106 +75622264dfba55dafdda39e338f058f1bdb9846041ffff803797d3fdf3693135 +8a192729ea8346a7e5e58e925a2e2e4af0818581859e8215d87370eb4194a5ff +bae900857d4c591dbc651a241865a817eaede9987c9f9ae4f95c0bf930eea88c +4d7596e535ffb7ca369988aba75027a96b9d0bc9c8b0b75f359067fd145a378b +02aaa15e9db7a23176224da48a83249005460cc6e429168657f2efa8b1af7537 +d7d7042f2d683e8271b21d591090963eeb57aea6172f88da139e1614d6a7d1a2 +1002d5a7a93d6d21156e2b4777f6fc069287a85a1538c46b7722ccde591ab55c +630e1ceeb1ac42d1b41f3f654e9da86b5efced43775ea68b2594e50e4005e052 +0fe753c0898120c2c07265367ff157f6538a1e4080d6f9d1ca9eb51939c9574e +f2e4e1e87c1434affd5808563cddd376776dbbf790c6a40028f311a8b58dafa2 +0970ed34acd6e3e89d063987893b2b9570ddb8cc032b05a723bba9444933ebf3 +c624204be72f4190e0245197d0cb772bec933fd8442445f9a28bd042d5a3a1e9 +9a8a07 +""" +)) + +# +# openssl pkcs8 -topk8 -passin pass:TestTest -inform DER -in key.der +# -outform DER -out keyenc.der -v2 aes192 +# hexdump -v -e '32/1 "%02x" "\n"' keyenc.der +# +wrapped_enc_keys.append(( +'PBKDF2WithHMAC-SHA1AndAES256-CBC', +2048, +"323351F94462AC563E053A056252C2C4", # IV +"02A6CD0D12E727B5", # Salt +""" +3082021f304906092a864886f70d01050d303c301b06092a864886f70d01050c +300e040802a6cd0d12e727b502020800301d060960864801650304012a041032 +3351f94462ac563e053a056252c2c4048201d07f4ef1c7be21aae738a20c5632 +b8bdbbb9083b6e7f68822267b1f481fd27fdafd61a90660de6e4058790e4c912 +bf3f319a7c37e6eb3d956daaa143865020d554bf6215e8d7492359aaeef45d6e +d85a686ed26c0bf7c18d071d827a86f0b73e1db0c0e7f3d42201544093302a90 +551ad530692468c47ac15c69500b8ca67d4a17b64d15cecc035ae50b768a36cf +07c395afa091e9e6f86f665455fbdc1b21ad79c0908b73da5de75a9b43508d5d +44dc97a870cd3cd9f01ca24452e9b11c1b4982946702cfcbfda5b2fcc0203fb5 +0b52a115760bd635c94d4c95ac2c640ee9a04ffaf6ccff5a8d953dd5d88ca478 +c377811c521f2191639c643d657a9e364af88bb7c14a356c2b0b4870a23c2f54 +d41f8157afff731471dccc6058b15e1151bcf84b39b5e622a3a1d65859c912a5 +591b85e034a1f6af664f030a6bfc8c3d20c70f32b54bcf4da9c2da83cef49cf8 +e9a74f0e5d358fe50b88acdce6a9db9a7ad61536212fc5f877ebfc7957b8bda4 +b1582a0f10d515a20ee06cf768db9c977aa6fbdca7540d611ff953012d009dac +e8abd059f8e8ffea637c9c7721f817aaf0bb23403e26a0ef0ff0e2037da67d41 +af728481f53443551a9bff4cea023164e9622b5441a309e1f4bff98e5bf76677 +8d7cd9 +""" +)) + +def txt2bin(inputs): + s = b('').join([b(x) for x in inputs if not (x in '\n\r\t ')]) + return unhexlify(s) + +class Rng: + def __init__(self, output): + self.output=output + self.idx=0 + def __call__(self, n): + output = self.output[self.idx:self.idx+n] + self.idx += n + return output + +class PKCS8_Decrypt(unittest.TestCase): + + def setUp(self): + self.oid_key = oid_key + self.clear_key = txt2bin(clear_key) + self.wrapped_clear_key = txt2bin(wrapped_clear_key) + self.wrapped_enc_keys = [] + for t in wrapped_enc_keys: + self.wrapped_enc_keys.append(( + t[0], + t[1], + txt2bin(t[2]), + txt2bin(t[3]), + txt2bin(t[4]) + )) + + ### NO ENCRYTION + + def test1(self): + """Verify unwrapping w/o encryption""" + res1, res2, res3 = PKCS8.unwrap(self.wrapped_clear_key) + self.assertEqual(res1, self.oid_key) + self.assertEqual(res2, self.clear_key) + + def test2(self): + """Verify wrapping w/o encryption""" + wrapped = PKCS8.wrap(self.clear_key, self.oid_key) + res1, res2, res3 = PKCS8.unwrap(wrapped) + self.assertEqual(res1, self.oid_key) + self.assertEqual(res2, self.clear_key) + + ## ENCRYPTION + + def test3(self): + """Verify unwrapping with encryption""" + + for t in self.wrapped_enc_keys: + res1, res2, res3 = PKCS8.unwrap(t[4], b("TestTest")) + self.assertEqual(res1, self.oid_key) + self.assertEqual(res2, self.clear_key) + + def test4(self): + """Verify wrapping with encryption""" + + for t in self.wrapped_enc_keys: + if t[0] == 'skip encryption': + continue + rng = Rng(t[2]+t[3]) + params = { 'iteration_count':t[1] } + wrapped = PKCS8.wrap( + self.clear_key, + self.oid_key, + b("TestTest"), + protection=t[0], + prot_params=params, + key_params=DerNull(), + randfunc=rng) + self.assertEqual(wrapped, t[4]) + +def get_tests(config={}): + from Cryptodome.SelfTest.st_common import list_test_cases + listTests = [] + listTests += list_test_cases(PKCS8_Decrypt) + return listTests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/__init__.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/__init__.py new file mode 100644 index 0000000..f5aa3aa --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/__init__.py @@ -0,0 +1,49 @@ +# +# SelfTest/Math/__init__.py: Self-test for math module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-test for Math""" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Math import test_Numbers + from Cryptodome.SelfTest.Math import test_Primality + from Cryptodome.SelfTest.Math import test_modexp + tests += test_Numbers.get_tests(config=config) + tests += test_Primality.get_tests(config=config) + tests += test_modexp.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py new file mode 100644 index 0000000..9802570 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py @@ -0,0 +1,797 @@ +# +# SelfTest/Math/test_Numbers.py: Self-test for Numbers module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-test for Math.Numbers""" + +import sys +import unittest + +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Util.py3compat import * + +from Cryptodome.Math._IntegerNative import IntegerNative + + +class TestIntegerBase(unittest.TestCase): + + def setUp(self): + raise NotImplementedError("To be implemented") + + def Integers(self, *arg): + return map(self.Integer, arg) + + def test_init_and_equality(self): + Integer = self.Integer + + v1 = Integer(23) + v2 = Integer(v1) + v3 = Integer(-9) + self.assertRaises(ValueError, Integer, 1.0) + + v4 = Integer(10**10) + v5 = Integer(-10**10) + + v6 = Integer(0xFFFF) + v7 = Integer(0xFFFFFFFF) + v8 = Integer(0xFFFFFFFFFFFFFFFF) + + self.assertEqual(v1, v1) + self.assertEqual(v1, 23) + self.assertEqual(v1, v2) + self.assertEqual(v3, -9) + self.assertEqual(v4, 10 ** 10) + self.assertEqual(v5, -10 ** 10) + self.assertEqual(v6, 0xFFFF) + self.assertEqual(v7, 0xFFFFFFFF) + self.assertEqual(v8, 0xFFFFFFFFFFFFFFFF) + + self.assertFalse(v1 == v4) + + # Init and comparison between Integer's + v6 = Integer(v1) + self.assertEqual(v1, v6) + + self.assertFalse(Integer(0) == None) + + def test_conversion_to_int(self): + v1, v2 = self.Integers(-23, 2 ** 1000) + self.assertEqual(int(v1), -23) + self.assertEqual(int(v2), 2 ** 1000) + + def test_equality_with_ints(self): + v1, v2, v3 = self.Integers(23, -89, 2 ** 1000) + self.assertTrue(v1 == 23) + self.assertTrue(v2 == -89) + self.assertFalse(v1 == 24) + self.assertTrue(v3 == 2 ** 1000) + + def test_conversion_to_str(self): + v1, v2, v3, v4 = self.Integers(20, 0, -20, 2 ** 1000) + self.assertTrue(str(v1) == "20") + self.assertTrue(str(v2) == "0") + self.assertTrue(str(v3) == "-20") + self.assertTrue(str(v4) == "10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376") + + def test_repr(self): + v1, v2 = self.Integers(-1, 2**80) + self.assertEqual(repr(v1), "Integer(-1)") + self.assertEqual(repr(v2), "Integer(1208925819614629174706176)") + + def test_conversion_to_bytes(self): + Integer = self.Integer + + v1 = Integer(0x17) + self.assertEqual(b("\x17"), v1.to_bytes()) + + v2 = Integer(0xFFFE) + self.assertEqual(b("\xFF\xFE"), v2.to_bytes()) + self.assertEqual(b("\x00\xFF\xFE"), v2.to_bytes(3)) + self.assertRaises(ValueError, v2.to_bytes, 1) + + self.assertEqual(b("\xFE\xFF"), v2.to_bytes(byteorder='little')) + self.assertEqual(b("\xFE\xFF\x00"), v2.to_bytes(3, byteorder='little')) + + v3 = Integer(-90) + self.assertRaises(ValueError, v3.to_bytes) + self.assertRaises(ValueError, v3.to_bytes, byteorder='bittle') + + def test_conversion_from_bytes(self): + Integer = self.Integer + + v1 = Integer.from_bytes(b"\x00") + self.assertTrue(isinstance(v1, Integer)) + self.assertEqual(0, v1) + + v2 = Integer.from_bytes(b"\x00\x01") + self.assertEqual(1, v2) + + v3 = Integer.from_bytes(b"\xFF\xFF") + self.assertEqual(0xFFFF, v3) + + v4 = Integer.from_bytes(b"\x00\x01", 'big') + self.assertEqual(1, v4) + + v5 = Integer.from_bytes(b"\x00\x01", byteorder='big') + self.assertEqual(1, v5) + + v6 = Integer.from_bytes(b"\x00\x01", byteorder='little') + self.assertEqual(0x0100, v6) + + self.assertRaises(ValueError, Integer.from_bytes, b'\x09', 'bittle') + + def test_inequality(self): + # Test Integer!=Integer and Integer!=int + v1, v2, v3, v4 = self.Integers(89, 89, 90, -8) + self.assertTrue(v1 != v3) + self.assertTrue(v1 != 90) + self.assertFalse(v1 != v2) + self.assertFalse(v1 != 89) + self.assertTrue(v1 != v4) + self.assertTrue(v4 != v1) + self.assertTrue(self.Integer(0) != None) + + def test_less_than(self): + # Test IntegerInteger and Integer>int + v1, v2, v3, v4, v5 = self.Integers(13, 13, 14, -8, 2 ** 10) + self.assertTrue(v3 > v1) + self.assertTrue(v3 > 13) + self.assertFalse(v1 > v1) + self.assertFalse(v1 > v2) + self.assertFalse(v1 > 13) + self.assertTrue(v1 > v4) + self.assertFalse(v4 > v1) + self.assertTrue(v5 > v1) + self.assertFalse(v1 > v5) + + def test_more_than_or_equal(self): + # Test Integer>=Integer and Integer>=int + v1, v2, v3, v4 = self.Integers(13, 13, 14, -4) + self.assertTrue(v3 >= v1) + self.assertTrue(v3 >= 13) + self.assertTrue(v1 >= v2) + self.assertTrue(v1 >= v1) + self.assertTrue(v1 >= 13) + self.assertFalse(v4 >= v1) + + def test_bool(self): + v1, v2, v3, v4 = self.Integers(0, 10, -9, 2 ** 10) + self.assertFalse(v1) + self.assertFalse(bool(v1)) + self.assertTrue(v2) + self.assertTrue(bool(v2)) + self.assertTrue(v3) + self.assertTrue(v4) + + def test_is_negative(self): + v1, v2, v3, v4, v5 = self.Integers(-3 ** 100, -3, 0, 3, 3**100) + self.assertTrue(v1.is_negative()) + self.assertTrue(v2.is_negative()) + self.assertFalse(v4.is_negative()) + self.assertFalse(v5.is_negative()) + + def test_addition(self): + # Test Integer+Integer and Integer+int + v1, v2, v3 = self.Integers(7, 90, -7) + self.assertTrue(isinstance(v1 + v2, self.Integer)) + self.assertEqual(v1 + v2, 97) + self.assertEqual(v1 + 90, 97) + self.assertEqual(v1 + v3, 0) + self.assertEqual(v1 + (-7), 0) + self.assertEqual(v1 + 2 ** 10, 2 ** 10 + 7) + + def test_subtraction(self): + # Test Integer-Integer and Integer-int + v1, v2, v3 = self.Integers(7, 90, -7) + self.assertTrue(isinstance(v1 - v2, self.Integer)) + self.assertEqual(v2 - v1, 83) + self.assertEqual(v2 - 7, 83) + self.assertEqual(v2 - v3, 97) + self.assertEqual(v1 - (-7), 14) + self.assertEqual(v1 - 2 ** 10, 7 - 2 ** 10) + + def test_multiplication(self): + # Test Integer-Integer and Integer-int + v1, v2, v3, v4 = self.Integers(4, 5, -2, 2 ** 10) + self.assertTrue(isinstance(v1 * v2, self.Integer)) + self.assertEqual(v1 * v2, 20) + self.assertEqual(v1 * 5, 20) + self.assertEqual(v1 * -2, -8) + self.assertEqual(v1 * 2 ** 10, 4 * (2 ** 10)) + + def test_floor_div(self): + v1, v2, v3 = self.Integers(3, 8, 2 ** 80) + self.assertTrue(isinstance(v1 // v2, self.Integer)) + self.assertEqual(v2 // v1, 2) + self.assertEqual(v2 // 3, 2) + self.assertEqual(v2 // -3, -3) + self.assertEqual(v3 // 2 ** 79, 2) + self.assertRaises(ZeroDivisionError, lambda: v1 // 0) + + def test_remainder(self): + # Test Integer%Integer and Integer%int + v1, v2, v3 = self.Integers(23, 5, -4) + self.assertTrue(isinstance(v1 % v2, self.Integer)) + self.assertEqual(v1 % v2, 3) + self.assertEqual(v1 % 5, 3) + self.assertEqual(v3 % 5, 1) + self.assertEqual(v1 % 2 ** 10, 23) + self.assertRaises(ZeroDivisionError, lambda: v1 % 0) + self.assertRaises(ValueError, lambda: v1 % -6) + + def test_simple_exponentiation(self): + v1, v2, v3 = self.Integers(4, 3, -2) + self.assertTrue(isinstance(v1 ** v2, self.Integer)) + self.assertEqual(v1 ** v2, 64) + self.assertEqual(pow(v1, v2), 64) + self.assertEqual(v1 ** 3, 64) + self.assertEqual(pow(v1, 3), 64) + self.assertEqual(v3 ** 2, 4) + self.assertEqual(v3 ** 3, -8) + + self.assertRaises(ValueError, pow, v1, -3) + + def test_modular_exponentiation(self): + v1, v2, v3 = self.Integers(23, 5, 17) + + self.assertTrue(isinstance(pow(v1, v2, v3), self.Integer)) + self.assertEqual(pow(v1, v2, v3), 7) + self.assertEqual(pow(v1, 5, v3), 7) + self.assertEqual(pow(v1, v2, 17), 7) + self.assertEqual(pow(v1, 5, 17), 7) + self.assertEqual(pow(v1, 0, 17), 1) + self.assertEqual(pow(v1, 1, 2 ** 80), 23) + self.assertEqual(pow(v1, 2 ** 80, 89298), 17689) + + self.assertRaises(ZeroDivisionError, pow, v1, 5, 0) + self.assertRaises(ValueError, pow, v1, 5, -4) + self.assertRaises(ValueError, pow, v1, -3, 8) + + def test_inplace_exponentiation(self): + v1 = self.Integer(4) + v1.inplace_pow(2) + self.assertEqual(v1, 16) + + v1 = self.Integer(4) + v1.inplace_pow(2, 15) + self.assertEqual(v1, 1) + + def test_abs(self): + v1, v2, v3, v4, v5 = self.Integers(-2 ** 100, -2, 0, 2, 2 ** 100) + self.assertEqual(abs(v1), 2 ** 100) + self.assertEqual(abs(v2), 2) + self.assertEqual(abs(v3), 0) + self.assertEqual(abs(v4), 2) + self.assertEqual(abs(v5), 2 ** 100) + + def test_sqrt(self): + v1, v2, v3, v4 = self.Integers(-2, 0, 49, 10**100) + + self.assertRaises(ValueError, v1.sqrt) + self.assertEqual(v2.sqrt(), 0) + self.assertEqual(v3.sqrt(), 7) + self.assertEqual(v4.sqrt(), 10**50) + + def test_sqrt_module(self): + + # Invalid modulus (non positive) + self.assertRaises(ValueError, self.Integer(5).sqrt, 0) + self.assertRaises(ValueError, self.Integer(5).sqrt, -1) + + # Simple cases + assert self.Integer(0).sqrt(5) == 0 + assert self.Integer(1).sqrt(5) in (1, 4) + + # Test with all quadratic residues in several fields + for p in (11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53): + for i in range(0, p): + square = i**2 % p + res = self.Integer(square).sqrt(p) + assert res in (i, p - i) + + # 2 is a non-quadratic reside in Z_11 + self.assertRaises(ValueError, self.Integer(2).sqrt, 11) + + # 10 is not a prime + self.assertRaises(ValueError, self.Integer(4).sqrt, 10) + + # 5 is square residue of 4 and 7 + assert self.Integer(5 - 11).sqrt(11) in (4, 7) + assert self.Integer(5 + 11).sqrt(11) in (4, 7) + + def test_in_place_add(self): + v1, v2 = self.Integers(10, 20) + + v1 += v2 + self.assertEqual(v1, 30) + v1 += 10 + self.assertEqual(v1, 40) + v1 += -1 + self.assertEqual(v1, 39) + v1 += 2 ** 1000 + self.assertEqual(v1, 39 + 2 ** 1000) + + def test_in_place_sub(self): + v1, v2 = self.Integers(10, 20) + + v1 -= v2 + self.assertEqual(v1, -10) + v1 -= -100 + self.assertEqual(v1, 90) + v1 -= 90000 + self.assertEqual(v1, -89910) + v1 -= -100000 + self.assertEqual(v1, 10090) + + def test_in_place_mul(self): + v1, v2 = self.Integers(3, 5) + + v1 *= v2 + self.assertEqual(v1, 15) + v1 *= 2 + self.assertEqual(v1, 30) + v1 *= -2 + self.assertEqual(v1, -60) + v1 *= 2 ** 1000 + self.assertEqual(v1, -60 * (2 ** 1000)) + + def test_in_place_modulus(self): + v1, v2 = self.Integers(20, 7) + + v1 %= v2 + self.assertEqual(v1, 6) + v1 %= 2 ** 1000 + self.assertEqual(v1, 6) + v1 %= 2 + self.assertEqual(v1, 0) + def t(): + v3 = self.Integer(9) + v3 %= 0 + self.assertRaises(ZeroDivisionError, t) + + def test_and(self): + v1, v2, v3 = self.Integers(0xF4, 0x31, -0xF) + self.assertTrue(isinstance(v1 & v2, self.Integer)) + self.assertEqual(v1 & v2, 0x30) + self.assertEqual(v1 & 0x31, 0x30) + self.assertEqual(v1 & v3, 0xF0) + self.assertEqual(v1 & -0xF, 0xF0) + self.assertEqual(v3 & -0xF, -0xF) + self.assertEqual(v2 & (2 ** 1000 + 0x31), 0x31) + + def test_or(self): + v1, v2, v3 = self.Integers(0x40, 0x82, -0xF) + self.assertTrue(isinstance(v1 | v2, self.Integer)) + self.assertEqual(v1 | v2, 0xC2) + self.assertEqual(v1 | 0x82, 0xC2) + self.assertEqual(v2 | v3, -0xD) + self.assertEqual(v2 | 2 ** 1000, 2 ** 1000 + 0x82) + + def test_right_shift(self): + v1, v2, v3 = self.Integers(0x10, 1, -0x10) + self.assertEqual(v1 >> 0, v1) + self.assertTrue(isinstance(v1 >> v2, self.Integer)) + self.assertEqual(v1 >> v2, 0x08) + self.assertEqual(v1 >> 1, 0x08) + self.assertRaises(ValueError, lambda: v1 >> -1) + self.assertEqual(v1 >> (2 ** 1000), 0) + + self.assertEqual(v3 >> 1, -0x08) + self.assertEqual(v3 >> (2 ** 1000), -1) + + def test_in_place_right_shift(self): + v1, v2, v3 = self.Integers(0x10, 1, -0x10) + v1 >>= 0 + self.assertEqual(v1, 0x10) + v1 >>= 1 + self.assertEqual(v1, 0x08) + v1 >>= v2 + self.assertEqual(v1, 0x04) + v3 >>= 1 + self.assertEqual(v3, -0x08) + def l(): + v4 = self.Integer(0x90) + v4 >>= -1 + self.assertRaises(ValueError, l) + def m1(): + v4 = self.Integer(0x90) + v4 >>= 2 ** 1000 + return v4 + self.assertEqual(0, m1()) + def m2(): + v4 = self.Integer(-1) + v4 >>= 2 ** 1000 + return v4 + self.assertEqual(-1, m2()) + + def _test_left_shift(self): + v1, v2, v3 = self.Integers(0x10, 1, -0x10) + self.assertEqual(v1 << 0, v1) + self.assertTrue(isinstance(v1 << v2, self.Integer)) + self.assertEqual(v1 << v2, 0x20) + self.assertEqual(v1 << 1, 0x20) + self.assertEqual(v3 << 1, -0x20) + self.assertRaises(ValueError, lambda: v1 << -1) + self.assertRaises(ValueError, lambda: v1 << (2 ** 1000)) + + def test_in_place_left_shift(self): + v1, v2, v3 = self.Integers(0x10, 1, -0x10) + v1 <<= 0 + self.assertEqual(v1, 0x10) + v1 <<= 1 + self.assertEqual(v1, 0x20) + v1 <<= v2 + self.assertEqual(v1, 0x40) + v3 <<= 1 + self.assertEqual(v3, -0x20) + def l(): + v4 = self.Integer(0x90) + v4 <<= -1 + self.assertRaises(ValueError, l) + def m(): + v4 = self.Integer(0x90) + v4 <<= 2 ** 1000 + self.assertRaises(ValueError, m) + + + def test_get_bit(self): + v1, v2, v3 = self.Integers(0x102, -3, 1) + self.assertEqual(v1.get_bit(0), 0) + self.assertEqual(v1.get_bit(1), 1) + self.assertEqual(v1.get_bit(v3), 1) + self.assertEqual(v1.get_bit(8), 1) + self.assertEqual(v1.get_bit(9), 0) + + self.assertRaises(ValueError, v1.get_bit, -1) + self.assertEqual(v1.get_bit(2 ** 1000), 0) + + self.assertRaises(ValueError, v2.get_bit, -1) + self.assertRaises(ValueError, v2.get_bit, 0) + self.assertRaises(ValueError, v2.get_bit, 1) + self.assertRaises(ValueError, v2.get_bit, 2 * 1000) + + def test_odd_even(self): + v1, v2, v3, v4, v5 = self.Integers(0, 4, 17, -4, -17) + + self.assertTrue(v1.is_even()) + self.assertTrue(v2.is_even()) + self.assertFalse(v3.is_even()) + self.assertTrue(v4.is_even()) + self.assertFalse(v5.is_even()) + + self.assertFalse(v1.is_odd()) + self.assertFalse(v2.is_odd()) + self.assertTrue(v3.is_odd()) + self.assertFalse(v4.is_odd()) + self.assertTrue(v5.is_odd()) + + def test_size_in_bits(self): + v1, v2, v3, v4 = self.Integers(0, 1, 0x100, -90) + self.assertEqual(v1.size_in_bits(), 1) + self.assertEqual(v2.size_in_bits(), 1) + self.assertEqual(v3.size_in_bits(), 9) + self.assertRaises(ValueError, v4.size_in_bits) + + def test_size_in_bytes(self): + v1, v2, v3, v4, v5, v6 = self.Integers(0, 1, 0xFF, 0x1FF, 0x10000, -9) + self.assertEqual(v1.size_in_bytes(), 1) + self.assertEqual(v2.size_in_bytes(), 1) + self.assertEqual(v3.size_in_bytes(), 1) + self.assertEqual(v4.size_in_bytes(), 2) + self.assertEqual(v5.size_in_bytes(), 3) + self.assertRaises(ValueError, v6.size_in_bits) + + def test_perfect_square(self): + + self.assertFalse(self.Integer(-9).is_perfect_square()) + self.assertTrue(self.Integer(0).is_perfect_square()) + self.assertTrue(self.Integer(1).is_perfect_square()) + self.assertFalse(self.Integer(2).is_perfect_square()) + self.assertFalse(self.Integer(3).is_perfect_square()) + self.assertTrue(self.Integer(4).is_perfect_square()) + self.assertTrue(self.Integer(39*39).is_perfect_square()) + self.assertFalse(self.Integer(39*39+1).is_perfect_square()) + + for x in range(100, 1000): + self.assertFalse(self.Integer(x**2+1).is_perfect_square()) + self.assertTrue(self.Integer(x**2).is_perfect_square()) + + def test_fail_if_divisible_by(self): + v1, v2, v3 = self.Integers(12, -12, 4) + + # No failure expected + v1.fail_if_divisible_by(7) + v2.fail_if_divisible_by(7) + v2.fail_if_divisible_by(2 ** 80) + + # Failure expected + self.assertRaises(ValueError, v1.fail_if_divisible_by, 4) + self.assertRaises(ValueError, v1.fail_if_divisible_by, v3) + + def test_multiply_accumulate(self): + v1, v2, v3 = self.Integers(4, 3, 2) + v1.multiply_accumulate(v2, v3) + self.assertEqual(v1, 10) + v1.multiply_accumulate(v2, 2) + self.assertEqual(v1, 16) + v1.multiply_accumulate(3, v3) + self.assertEqual(v1, 22) + v1.multiply_accumulate(1, -2) + self.assertEqual(v1, 20) + v1.multiply_accumulate(-2, 1) + self.assertEqual(v1, 18) + v1.multiply_accumulate(1, 2 ** 1000) + self.assertEqual(v1, 18 + 2 ** 1000) + v1.multiply_accumulate(2 ** 1000, 1) + self.assertEqual(v1, 18 + 2 ** 1001) + + def test_set(self): + v1, v2 = self.Integers(3, 6) + v1.set(v2) + self.assertEqual(v1, 6) + v1.set(9) + self.assertEqual(v1, 9) + v1.set(-2) + self.assertEqual(v1, -2) + v1.set(2 ** 1000) + self.assertEqual(v1, 2 ** 1000) + + def test_inverse(self): + v1, v2, v3, v4, v5, v6 = self.Integers(2, 5, -3, 0, 723872, 3433) + + self.assertTrue(isinstance(v1.inverse(v2), self.Integer)) + self.assertEqual(v1.inverse(v2), 3) + self.assertEqual(v1.inverse(5), 3) + self.assertEqual(v3.inverse(5), 3) + self.assertEqual(v5.inverse(92929921), 58610507) + self.assertEqual(v6.inverse(9912), 5353) + + self.assertRaises(ValueError, v2.inverse, 10) + self.assertRaises(ValueError, v1.inverse, -3) + self.assertRaises(ValueError, v4.inverse, 10) + self.assertRaises(ZeroDivisionError, v2.inverse, 0) + + def test_inplace_inverse(self): + v1, v2 = self.Integers(2, 5) + + v1.inplace_inverse(v2) + self.assertEqual(v1, 3) + + def test_gcd(self): + v1, v2, v3, v4 = self.Integers(6, 10, 17, -2) + self.assertTrue(isinstance(v1.gcd(v2), self.Integer)) + self.assertEqual(v1.gcd(v2), 2) + self.assertEqual(v1.gcd(10), 2) + self.assertEqual(v1.gcd(v3), 1) + self.assertEqual(v1.gcd(-2), 2) + self.assertEqual(v4.gcd(6), 2) + + def test_lcm(self): + v1, v2, v3, v4, v5 = self.Integers(6, 10, 17, -2, 0) + self.assertTrue(isinstance(v1.lcm(v2), self.Integer)) + self.assertEqual(v1.lcm(v2), 30) + self.assertEqual(v1.lcm(10), 30) + self.assertEqual(v1.lcm(v3), 102) + self.assertEqual(v1.lcm(-2), 6) + self.assertEqual(v4.lcm(6), 6) + self.assertEqual(v1.lcm(0), 0) + self.assertEqual(v5.lcm(0), 0) + + def test_jacobi_symbol(self): + + data = ( + (1001, 1, 1), + (19, 45, 1), + (8, 21, -1), + (5, 21, 1), + (610, 987, -1), + (1001, 9907, -1), + (5, 3439601197, -1) + ) + + js = self.Integer.jacobi_symbol + + # Jacobi symbol is always 1 for k==1 or n==1 + for k in range(1, 30): + self.assertEqual(js(k, 1), 1) + for n in range(1, 30, 2): + self.assertEqual(js(1, n), 1) + + # Fail if n is not positive odd + self.assertRaises(ValueError, js, 6, -2) + self.assertRaises(ValueError, js, 6, -1) + self.assertRaises(ValueError, js, 6, 0) + self.assertRaises(ValueError, js, 0, 0) + self.assertRaises(ValueError, js, 6, 2) + self.assertRaises(ValueError, js, 6, 4) + self.assertRaises(ValueError, js, 6, 6) + self.assertRaises(ValueError, js, 6, 8) + + for tv in data: + self.assertEqual(js(tv[0], tv[1]), tv[2]) + self.assertEqual(js(self.Integer(tv[0]), tv[1]), tv[2]) + self.assertEqual(js(tv[0], self.Integer(tv[1])), tv[2]) + + def test_jacobi_symbol_wikipedia(self): + + # Test vectors from https://en.wikipedia.org/wiki/Jacobi_symbol + tv = [ + (3, [(1, 1), (2, -1), (3, 0), (4, 1), (5, -1), (6, 0), (7, 1), (8, -1), (9, 0), (10, 1), (11, -1), (12, 0), (13, 1), (14, -1), (15, 0), (16, 1), (17, -1), (18, 0), (19, 1), (20, -1), (21, 0), (22, 1), (23, -1), (24, 0), (25, 1), (26, -1), (27, 0), (28, 1), (29, -1), (30, 0)]), + (5, [(1, 1), (2, -1), (3, -1), (4, 1), (5, 0), (6, 1), (7, -1), (8, -1), (9, 1), (10, 0), (11, 1), (12, -1), (13, -1), (14, 1), (15, 0), (16, 1), (17, -1), (18, -1), (19, 1), (20, 0), (21, 1), (22, -1), (23, -1), (24, 1), (25, 0), (26, 1), (27, -1), (28, -1), (29, 1), (30, 0)]), + (7, [(1, 1), (2, 1), (3, -1), (4, 1), (5, -1), (6, -1), (7, 0), (8, 1), (9, 1), (10, -1), (11, 1), (12, -1), (13, -1), (14, 0), (15, 1), (16, 1), (17, -1), (18, 1), (19, -1), (20, -1), (21, 0), (22, 1), (23, 1), (24, -1), (25, 1), (26, -1), (27, -1), (28, 0), (29, 1), (30, 1)]), + (9, [(1, 1), (2, 1), (3, 0), (4, 1), (5, 1), (6, 0), (7, 1), (8, 1), (9, 0), (10, 1), (11, 1), (12, 0), (13, 1), (14, 1), (15, 0), (16, 1), (17, 1), (18, 0), (19, 1), (20, 1), (21, 0), (22, 1), (23, 1), (24, 0), (25, 1), (26, 1), (27, 0), (28, 1), (29, 1), (30, 0)]), + (11, [(1, 1), (2, -1), (3, 1), (4, 1), (5, 1), (6, -1), (7, -1), (8, -1), (9, 1), (10, -1), (11, 0), (12, 1), (13, -1), (14, 1), (15, 1), (16, 1), (17, -1), (18, -1), (19, -1), (20, 1), (21, -1), (22, 0), (23, 1), (24, -1), (25, 1), (26, 1), (27, 1), (28, -1), (29, -1), (30, -1)]), + (13, [(1, 1), (2, -1), (3, 1), (4, 1), (5, -1), (6, -1), (7, -1), (8, -1), (9, 1), (10, 1), (11, -1), (12, 1), (13, 0), (14, 1), (15, -1), (16, 1), (17, 1), (18, -1), (19, -1), (20, -1), (21, -1), (22, 1), (23, 1), (24, -1), (25, 1), (26, 0), (27, 1), (28, -1), (29, 1), (30, 1)]), + (15, [(1, 1), (2, 1), (3, 0), (4, 1), (5, 0), (6, 0), (7, -1), (8, 1), (9, 0), (10, 0), (11, -1), (12, 0), (13, -1), (14, -1), (15, 0), (16, 1), (17, 1), (18, 0), (19, 1), (20, 0), (21, 0), (22, -1), (23, 1), (24, 0), (25, 0), (26, -1), (27, 0), (28, -1), (29, -1), (30, 0)]), + (17, [(1, 1), (2, 1), (3, -1), (4, 1), (5, -1), (6, -1), (7, -1), (8, 1), (9, 1), (10, -1), (11, -1), (12, -1), (13, 1), (14, -1), (15, 1), (16, 1), (17, 0), (18, 1), (19, 1), (20, -1), (21, 1), (22, -1), (23, -1), (24, -1), (25, 1), (26, 1), (27, -1), (28, -1), (29, -1), (30, 1)]), + (19, [(1, 1), (2, -1), (3, -1), (4, 1), (5, 1), (6, 1), (7, 1), (8, -1), (9, 1), (10, -1), (11, 1), (12, -1), (13, -1), (14, -1), (15, -1), (16, 1), (17, 1), (18, -1), (19, 0), (20, 1), (21, -1), (22, -1), (23, 1), (24, 1), (25, 1), (26, 1), (27, -1), (28, 1), (29, -1), (30, 1)]), + (21, [(1, 1), (2, -1), (3, 0), (4, 1), (5, 1), (6, 0), (7, 0), (8, -1), (9, 0), (10, -1), (11, -1), (12, 0), (13, -1), (14, 0), (15, 0), (16, 1), (17, 1), (18, 0), (19, -1), (20, 1), (21, 0), (22, 1), (23, -1), (24, 0), (25, 1), (26, 1), (27, 0), (28, 0), (29, -1), (30, 0)]), + (23, [(1, 1), (2, 1), (3, 1), (4, 1), (5, -1), (6, 1), (7, -1), (8, 1), (9, 1), (10, -1), (11, -1), (12, 1), (13, 1), (14, -1), (15, -1), (16, 1), (17, -1), (18, 1), (19, -1), (20, -1), (21, -1), (22, -1), (23, 0), (24, 1), (25, 1), (26, 1), (27, 1), (28, -1), (29, 1), (30, -1)]), + (25, [(1, 1), (2, 1), (3, 1), (4, 1), (5, 0), (6, 1), (7, 1), (8, 1), (9, 1), (10, 0), (11, 1), (12, 1), (13, 1), (14, 1), (15, 0), (16, 1), (17, 1), (18, 1), (19, 1), (20, 0), (21, 1), (22, 1), (23, 1), (24, 1), (25, 0), (26, 1), (27, 1), (28, 1), (29, 1), (30, 0)]), + (27, [(1, 1), (2, -1), (3, 0), (4, 1), (5, -1), (6, 0), (7, 1), (8, -1), (9, 0), (10, 1), (11, -1), (12, 0), (13, 1), (14, -1), (15, 0), (16, 1), (17, -1), (18, 0), (19, 1), (20, -1), (21, 0), (22, 1), (23, -1), (24, 0), (25, 1), (26, -1), (27, 0), (28, 1), (29, -1), (30, 0)]), + (29, [(1, 1), (2, -1), (3, -1), (4, 1), (5, 1), (6, 1), (7, 1), (8, -1), (9, 1), (10, -1), (11, -1), (12, -1), (13, 1), (14, -1), (15, -1), (16, 1), (17, -1), (18, -1), (19, -1), (20, 1), (21, -1), (22, 1), (23, 1), (24, 1), (25, 1), (26, -1), (27, -1), (28, 1), (29, 0), (30, 1)]), + ] + + js = self.Integer.jacobi_symbol + + for n, kj in tv: + for k, j in kj: + self.assertEqual(js(k, n), j) + + def test_hex(self): + v1, = self.Integers(0x10) + self.assertEqual(hex(v1), "0x10") + + +class TestIntegerInt(TestIntegerBase): + + def setUp(self): + self.Integer = IntegerNative + + +class testIntegerRandom(unittest.TestCase): + + def test_random_exact_bits(self): + + for _ in range(1000): + a = IntegerNative.random(exact_bits=8) + self.assertFalse(a < 128) + self.assertFalse(a >= 256) + + for bits_value in range(1024, 1024 + 8): + a = IntegerNative.random(exact_bits=bits_value) + self.assertFalse(a < 2**(bits_value - 1)) + self.assertFalse(a >= 2**bits_value) + + def test_random_max_bits(self): + + flag = False + for _ in range(1000): + a = IntegerNative.random(max_bits=8) + flag = flag or a < 128 + self.assertFalse(a>=256) + self.assertTrue(flag) + + for bits_value in range(1024, 1024 + 8): + a = IntegerNative.random(max_bits=bits_value) + self.assertFalse(a >= 2**bits_value) + + def test_random_bits_custom_rng(self): + + class CustomRNG(object): + def __init__(self): + self.counter = 0 + + def __call__(self, size): + self.counter += size + return bchr(0) * size + + custom_rng = CustomRNG() + a = IntegerNative.random(exact_bits=32, randfunc=custom_rng) + self.assertEqual(custom_rng.counter, 4) + + def test_random_range(self): + + func = IntegerNative.random_range + + for x in range(200): + a = func(min_inclusive=1, max_inclusive=15) + self.assertTrue(1 <= a <= 15) + + for x in range(200): + a = func(min_inclusive=1, max_exclusive=15) + self.assertTrue(1 <= a < 15) + + self.assertRaises(ValueError, func, min_inclusive=1, max_inclusive=2, + max_exclusive=3) + self.assertRaises(ValueError, func, max_inclusive=2, max_exclusive=3) + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestIntegerInt) + + try: + from Cryptodome.Math._IntegerGMP import IntegerGMP + + class TestIntegerGMP(TestIntegerBase): + def setUp(self): + self.Integer = IntegerGMP + + tests += list_test_cases(TestIntegerGMP) + except (ImportError, OSError) as e: + if sys.platform == "win32": + sys.stdout.write("Skipping GMP tests on Windows\n") + else: + sys.stdout.write("Skipping GMP tests (%s)\n" % str(e) ) + + try: + from Cryptodome.Math._IntegerCustom import IntegerCustom + + class TestIntegerCustomModexp(TestIntegerBase): + def setUp(self): + self.Integer = IntegerCustom + + tests += list_test_cases(TestIntegerCustomModexp) + except (ImportError, OSError) as e: + sys.stdout.write("Skipping custom modexp tests (%s)\n" % str(e) ) + + tests += list_test_cases(testIntegerRandom) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Primality.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Primality.py new file mode 100644 index 0000000..475d1d4 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_Primality.py @@ -0,0 +1,118 @@ +# +# SelfTest/Math/test_Primality.py: Self-test for Primality module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-test for Math.Numbers""" + +import unittest + +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Util.py3compat import * + +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Math.Primality import ( + PROBABLY_PRIME, COMPOSITE, + miller_rabin_test, lucas_test, + test_probable_prime, + generate_probable_prime, + generate_probable_safe_prime, + ) + + +class TestPrimality(unittest.TestCase): + + primes = (1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 2**127-1, 175637383534939453397801320455508570374088202376942372758907369518414308188137781042871856139027160010343454418881888953150175357127346872102307696660678617989191485418582475696230580407111841072614783095326672517315988762029036079794994990250662362650625650262324085116467511357592728695033227611029693067539) + composites = (0, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 7*23, (2**19-1)*(2**67-1), 9746347772161,) + + def test_miller_rabin(self): + for prime in self.primes: + self.assertEqual(miller_rabin_test(prime, 3), PROBABLY_PRIME) + for composite in self.composites: + self.assertEqual(miller_rabin_test(composite, 3), COMPOSITE) + self.assertRaises(ValueError, miller_rabin_test, -1, 3) + + def test_lucas(self): + for prime in self.primes: + res = lucas_test(prime) + self.assertEqual(res, PROBABLY_PRIME) + for composite in self.composites: + res = lucas_test(composite) + self.assertEqual(res, COMPOSITE) + self.assertRaises(ValueError, lucas_test, -1) + + def test_is_prime(self): + primes = (170141183460469231731687303715884105727, + 19175002942688032928599, + 1363005552434666078217421284621279933627102780881053358473, + 2 ** 521 - 1) + for p in primes: + self.assertEqual(test_probable_prime(p), PROBABLY_PRIME) + + not_primes = ( + 4754868377601046732119933839981363081972014948522510826417784001, + 1334733877147062382486934807105197899496002201113849920496510541601, + 260849323075371835669784094383812120359260783810157225730623388382401, + ) + for np in not_primes: + self.assertEqual(test_probable_prime(np), COMPOSITE) + + from Cryptodome.Util.number import sieve_base + for p in sieve_base[:100]: + res = test_probable_prime(p) + self.assertEqual(res, PROBABLY_PRIME) + + def test_generate_prime_bit_size(self): + p = generate_probable_prime(exact_bits=512) + self.assertEqual(p.size_in_bits(), 512) + + def test_generate_prime_filter(self): + def ending_with_one(number): + return number % 10 == 1 + + for x in range(20): + q = generate_probable_prime(exact_bits=160, + prime_filter=ending_with_one) + self.assertEqual(q % 10, 1) + + def test_generate_safe_prime(self): + p = generate_probable_safe_prime(exact_bits=161) + self.assertEqual(p.size_in_bits(), 161) + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestPrimality) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_modexp.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_modexp.py new file mode 100644 index 0000000..d63f43c --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Math/test_modexp.py @@ -0,0 +1,201 @@ +# +# SelfTest/Math/test_modexp.py: Self-test for module exponentiation +# +# =================================================================== +# +# Copyright (c) 2017, Helder Eijs +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-test for the custom module exponentiation""" + +import unittest + +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long + +from Cryptodome.Util.py3compat import * + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, + c_size_t, + c_ulonglong) + +from Cryptodome.Hash import SHAKE128 +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Math._IntegerCustom import _raw_montgomery + +from Cryptodome.Random.random import StrongRandom + + +def create_rng(tag): + rng = StrongRandom(SHAKE128.new(data=tag)) + return rng + +class ExceptionModulus(ValueError): + pass + +def monty_pow(base, exp, modulus): + max_len = len(long_to_bytes(max(base, exp, modulus))) + + base_b, exp_b, modulus_b = [ long_to_bytes(x, max_len) for x in + (base, exp, modulus) ] + + out = create_string_buffer(max_len) + error = _raw_montgomery.monty_pow( + out, + base_b, + exp_b, + modulus_b, + c_size_t(max_len), + c_ulonglong(32) + ) + + if error == 17: + raise ExceptionModulus() + if error: + raise ValueError("monty_pow failed with error: %d" % error) + + result = bytes_to_long(get_raw_buffer(out)) + return result + +exponent1 = 0x2ce0af628901460a419a08ef950d498b9fd6f271a1a52ac293b86fe5c60efe8e8ba93fa1ebe1eb3d614d2e7b328cb60a2591440e163441a190ecf101ceec245f600fffdcf3f5b3a17a7baeacb96a424db1d7ec985e8ec998bb479fecfffed6a75f9a90fc97062fd973303bce855ad7b8d8272a94025e8532be9aabd54a183f303538d2a7e621b4131d59e823a4625f39bd7d518d7784f7c3a8f19061da74974ff42fa1c063dec2db97d461e291a7d6e721708a5229de166c1246363372854e27f3f08ae274bc16bfd205b028a4d81386494433d516dfbb35f495acba5e4e1d1843cb3c3129b6642a85fc7244ce5845fac071c7f622e4ee12ac43fabeeaa0cd01 +modulus1 = 0xd66691b20071be4d66d4b71032b37fa007cfabf579fcb91e50bfc2753b3f0ce7be74e216aef7e26d4ae180bc20d7bd3ea88a6cbf6f87380e613c8979b5b043b200a8ff8856a3b12875e36e98a7569f3852d028e967551000b02c19e9fa52e83115b89309aabb1e1cf1e2cb6369d637d46775ce4523ea31f64ad2794cbc365dd8a35e007ed3b57695877fbf102dbeb8b3212491398e494314e93726926e1383f8abb5889bea954eb8c0ca1c62c8e9d83f41888095c5e645ed6d32515fe0c58c1368cad84694e18da43668c6f43e61d7c9bca633ddcda7aef5b79bc396d4a9f48e2a9abe0836cc455e435305357228e93d25aaed46b952defae0f57339bf26f5a9 + + +class TestModExp(unittest.TestCase): + + def test_small(self): + self.assertEqual(1, monty_pow(11,12,19)) + + def test_large_1(self): + base = 0xfffffffffffffffffffffffffffffffffffffffffffffffffff + expected = pow(base, exponent1, modulus1) + result = monty_pow(base, exponent1, modulus1) + self.assertEqual(result, expected) + + def test_zero_exp(self): + base = 0xfffffffffffffffffffffffffffffffffffffffffffffffffff + result = monty_pow(base, 0, modulus1) + self.assertEqual(result, 1) + + def test_zero_base(self): + result = monty_pow(0, exponent1, modulus1) + self.assertEqual(result, 0) + + def test_zero_modulus(self): + base = 0xfffffffffffffffffffffffffffffffffffffffffffffffff + self.assertRaises(ExceptionModulus, monty_pow, base, exponent1, 0) + self.assertRaises(ExceptionModulus, monty_pow, 0, 0, 0) + + def test_larger_exponent(self): + base = modulus1 - 0xFFFFFFF + expected = pow(base, modulus1<<64, modulus1) + result = monty_pow(base, modulus1<<64, modulus1) + self.assertEqual(result, expected) + + def test_even_modulus(self): + base = modulus1 >> 4 + self.assertRaises(ExceptionModulus, monty_pow, base, exponent1, modulus1-1) + + def test_several_lengths(self): + prng = SHAKE128.new().update(b('Test')) + for length in range(1, 100): + modulus2 = Integer.from_bytes(prng.read(length)) | 1 + base = Integer.from_bytes(prng.read(length)) % modulus2 + exponent2 = Integer.from_bytes(prng.read(length)) + + expected = pow(base, exponent2, modulus2) + result = monty_pow(base, exponent2, modulus2) + self.assertEqual(result, expected) + + def test_variable_exponent(self): + prng = create_rng(b('Test variable exponent')) + for i in range(20): + for j in range(7): + modulus = prng.getrandbits(8*30) | 1 + base = prng.getrandbits(8*30) % modulus + exponent = prng.getrandbits(i*8+j) + + expected = pow(base, exponent, modulus) + result = monty_pow(base, exponent, modulus) + self.assertEqual(result, expected) + + exponent ^= (1 << (i*8+j)) - 1 + + expected = pow(base, exponent, modulus) + result = monty_pow(base, exponent, modulus) + self.assertEqual(result, expected) + + def test_stress_63(self): + prng = create_rng(b('Test 63')) + length = 63 + for _ in range(2000): + modulus = prng.getrandbits(8*length) | 1 + base = prng.getrandbits(8*length) % modulus + exponent = prng.getrandbits(8*length) + + expected = pow(base, exponent, modulus) + result = monty_pow(base, exponent, modulus) + self.assertEqual(result, expected) + + def test_stress_64(self): + prng = create_rng(b('Test 64')) + length = 64 + for _ in range(2000): + modulus = prng.getrandbits(8*length) | 1 + base = prng.getrandbits(8*length) % modulus + exponent = prng.getrandbits(8*length) + + expected = pow(base, exponent, modulus) + result = monty_pow(base, exponent, modulus) + self.assertEqual(result, expected) + + def test_stress_65(self): + prng = create_rng(b('Test 65')) + length = 65 + for _ in range(2000): + modulus = prng.getrandbits(8*length) | 1 + base = prng.getrandbits(8*length) % modulus + exponent = prng.getrandbits(8*length) + + expected = pow(base, exponent, modulus) + result = monty_pow(base, exponent, modulus) + self.assertEqual(result, expected) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestModExp) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/__init__.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/__init__.py new file mode 100644 index 0000000..18cf8f5 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/__init__.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Protocol/__init__.py: Self-tests for Cryptodome.Protocol +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test for Cryptodome.Protocol""" + +__revision__ = "$Id$" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Protocol import test_rfc1751; tests += test_rfc1751.get_tests(config=config) + from Cryptodome.SelfTest.Protocol import test_KDF; tests += test_KDF.get_tests(config=config) + + from Cryptodome.SelfTest.Protocol import test_SecretSharing; + tests += test_SecretSharing.get_tests(config=config) + + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py new file mode 100644 index 0000000..f2c5b11 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py @@ -0,0 +1,807 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Protocol/test_KDF.py: Self-test for key derivation functions +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +import re +import unittest +from binascii import unhexlify + +from Cryptodome.Util.py3compat import b, bchr + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors, load_test_vectors_wycheproof +from Cryptodome.Hash import SHA1, HMAC, SHA256, MD5, SHA224, SHA384, SHA512 +from Cryptodome.Cipher import AES, DES3 + +from Cryptodome.Protocol.KDF import (PBKDF1, PBKDF2, _S2V, HKDF, scrypt, + bcrypt, bcrypt_check, + SP800_108_Counter) + +from Cryptodome.Protocol.KDF import _bcrypt_decode + + +def t2b(t): + if t is None: + return None + t2 = t.replace(" ", "").replace("\n", "") + return unhexlify(b(t2)) + + +class TestVector(object): + pass + + +class PBKDF1_Tests(unittest.TestCase): + + # List of tuples with test data. + # Each tuple is made up by: + # Item #0: a pass phrase + # Item #1: salt (8 bytes encoded in hex) + # Item #2: output key length + # Item #3: iterations to use + # Item #4: expected result (encoded in hex) + _testData = ( + # From http://www.di-mgt.com.au/cryptoKDFs.html#examplespbkdf + ("password", "78578E5A5D63CB06", 16, 1000, "DC19847E05C64D2FAF10EBFB4A3D2A20"), + ) + + def test1(self): + v = self._testData[0] + res = PBKDF1(v[0], t2b(v[1]), v[2], v[3], SHA1) + self.assertEqual(res, t2b(v[4])) + + +class PBKDF2_Tests(unittest.TestCase): + + # List of tuples with test data. + # Each tuple is made up by: + # Item #0: a pass phrase + # Item #1: salt (encoded in hex) + # Item #2: output key length + # Item #3: iterations to use + # Item #4: hash module + # Item #5: expected result (encoded in hex) + _testData = ( + # From http://www.di-mgt.com.au/cryptoKDFs.html#examplespbkdf + ("password","78578E5A5D63CB06",24,2048, SHA1, "BFDE6BE94DF7E11DD409BCE20A0255EC327CB936FFE93643"), + # From RFC 6050 + ("password","73616c74", 20, 1, SHA1, "0c60c80f961f0e71f3a9b524af6012062fe037a6"), + ("password","73616c74", 20, 2, SHA1, "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957"), + ("password","73616c74", 20, 4096, SHA1, "4b007901b765489abead49d926f721d065a429c1"), + ("passwordPASSWORDpassword","73616c7453414c5473616c7453414c5473616c7453414c5473616c7453414c5473616c74", + 25, 4096, SHA1, "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038"), + ( 'pass\x00word',"7361006c74",16,4096, SHA1, "56fa6aa75548099dcc37d7f03425e0c3"), + # From draft-josefsson-scrypt-kdf-01, Chapter 10 + ( 'passwd', '73616c74', 64, 1, SHA256, "55ac046e56e3089fec1691c22544b605f94185216dde0465e68b9d57c20dacbc49ca9cccf179b645991664b39d77ef317c71b845b1e30bd509112041d3a19783"), + ( 'Password', '4e61436c', 64, 80000, SHA256, "4ddcd8f60b98be21830cee5ef22701f9641a4418d04c0414aeff08876b34ab56a1d425a1225833549adb841b51c9b3176a272bdebba1d078478f62b397f33c8d"), + ) + + def test1(self): + # Test only for HMAC-SHA1 as PRF + + def prf_SHA1(p,s): + return HMAC.new(p,s,SHA1).digest() + + def prf_SHA256(p,s): + return HMAC.new(p,s,SHA256).digest() + + for i in range(len(self._testData)): + v = self._testData[i] + password = v[0] + salt = t2b(v[1]) + out_len = v[2] + iters = v[3] + hash_mod = v[4] + expected = t2b(v[5]) + + if hash_mod is SHA1: + res = PBKDF2(password, salt, out_len, iters) + self.assertEqual(res, expected) + + res = PBKDF2(password, salt, out_len, iters, prf_SHA1) + self.assertEqual(res, expected) + else: + res = PBKDF2(password, salt, out_len, iters, prf_SHA256) + self.assertEqual(res, expected) + + def test2(self): + # Verify that prf and hmac_hash_module are mutual exclusive + def prf_SHA1(p,s): + return HMAC.new(p,s,SHA1).digest() + + self.assertRaises(ValueError, PBKDF2, b("xxx"), b("yyy"), 16, 100, + prf=prf_SHA1, hmac_hash_module=SHA1) + + def test3(self): + # Verify that hmac_hash_module works like prf + + password = b("xxx") + salt = b("yyy") + + for hashmod in (MD5, SHA1, SHA224, SHA256, SHA384, SHA512): + + pr1 = PBKDF2(password, salt, 16, 100, + prf=lambda p, s: HMAC.new(p,s,hashmod).digest()) + pr2 = PBKDF2(password, salt, 16, 100, hmac_hash_module=hashmod) + + self.assertEqual(pr1, pr2) + + def test4(self): + # Verify that PBKDF2 can take bytes or strings as password or salt + k1 = PBKDF2("xxx", b("yyy"), 16, 10) + k2 = PBKDF2(b("xxx"), b("yyy"), 16, 10) + self.assertEqual(k1, k2) + + k1 = PBKDF2(b("xxx"), "yyy", 16, 10) + k2 = PBKDF2(b("xxx"), b("yyy"), 16, 10) + self.assertEqual(k1, k2) + + +class S2V_Tests(unittest.TestCase): + + # Sequence of test vectors. + # Each test vector is made up by: + # Item #0: a tuple of strings + # Item #1: an AES key + # Item #2: the result + # Item #3: the cipher module S2V is based on + # Everything is hex encoded + _testData = [ + + # RFC5297, A.1 + ( + ( '101112131415161718191a1b1c1d1e1f2021222324252627', + '112233445566778899aabbccddee' ), + 'fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0', + '85632d07c6e8f37f950acd320a2ecc93', + AES + ), + + # RFC5297, A.2 + ( + ( '00112233445566778899aabbccddeeffdeaddadadeaddadaffeeddcc'+ + 'bbaa99887766554433221100', + '102030405060708090a0', + '09f911029d74e35bd84156c5635688c0', + '7468697320697320736f6d6520706c61'+ + '696e7465787420746f20656e63727970'+ + '74207573696e67205349562d414553'), + '7f7e7d7c7b7a79787776757473727170', + '7bdb6e3b432667eb06f4d14bff2fbd0f', + AES + ), + + ] + + def test1(self): + """Verify correctness of test vector""" + for tv in self._testData: + s2v = _S2V.new(t2b(tv[1]), tv[3]) + for s in tv[0]: + s2v.update(t2b(s)) + result = s2v.derive() + self.assertEqual(result, t2b(tv[2])) + + def test2(self): + """Verify that no more than 127(AES) and 63(TDES) + components are accepted.""" + key = bchr(0) * 8 + bchr(255) * 8 + for module in (AES, DES3): + s2v = _S2V.new(key, module) + max_comps = module.block_size*8-1 + for i in range(max_comps): + s2v.update(b("XX")) + self.assertRaises(TypeError, s2v.update, b("YY")) + + +class HKDF_Tests(unittest.TestCase): + + # Test vectors from RFC5869, Appendix A + # Each tuple is made up by: + # Item #0: hash module + # Item #1: secret + # Item #2: salt + # Item #3: context + # Item #4: expected result + _test_vector = ( + ( + SHA256, + "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + "000102030405060708090a0b0c", + "f0f1f2f3f4f5f6f7f8f9", + 42, + "3cb25f25faacd57a90434f64d0362f2a" + + "2d2d0a90cf1a5a4c5db02d56ecc4c5bf" + + "34007208d5b887185865" + ), + ( + SHA256, + "000102030405060708090a0b0c0d0e0f" + + "101112131415161718191a1b1c1d1e1f" + + "202122232425262728292a2b2c2d2e2f" + + "303132333435363738393a3b3c3d3e3f" + + "404142434445464748494a4b4c4d4e4f", + "606162636465666768696a6b6c6d6e6f" + + "707172737475767778797a7b7c7d7e7f" + + "808182838485868788898a8b8c8d8e8f" + + "909192939495969798999a9b9c9d9e9f" + + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf", + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", + 82, + "b11e398dc80327a1c8e7f78c596a4934" + + "4f012eda2d4efad8a050cc4c19afa97c" + + "59045a99cac7827271cb41c65e590e09" + + "da3275600c2f09b8367793a9aca3db71" + + "cc30c58179ec3e87c14c01d5c1f3434f" + + "1d87" + ), + ( + SHA256, + "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + None, + None, + 42, + "8da4e775a563c18f715f802a063c5a31" + + "b8a11f5c5ee1879ec3454e5f3c738d2d" + + "9d201395faa4b61a96c8" + ), + ( + SHA1, + "0b0b0b0b0b0b0b0b0b0b0b", + "000102030405060708090a0b0c", + "f0f1f2f3f4f5f6f7f8f9", + 42, + "085a01ea1b10f36933068b56efa5ad81" + + "a4f14b822f5b091568a9cdd4f155fda2" + + "c22e422478d305f3f896" + ), + ( + SHA1, + "000102030405060708090a0b0c0d0e0f" + + "101112131415161718191a1b1c1d1e1f" + + "202122232425262728292a2b2c2d2e2f" + + "303132333435363738393a3b3c3d3e3f" + + "404142434445464748494a4b4c4d4e4f", + "606162636465666768696a6b6c6d6e6f" + + "707172737475767778797a7b7c7d7e7f" + + "808182838485868788898a8b8c8d8e8f" + + "909192939495969798999a9b9c9d9e9f" + + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf", + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", + 82, + "0bd770a74d1160f7c9f12cd5912a06eb" + + "ff6adcae899d92191fe4305673ba2ffe" + + "8fa3f1a4e5ad79f3f334b3b202b2173c" + + "486ea37ce3d397ed034c7f9dfeb15c5e" + + "927336d0441f4c4300e2cff0d0900b52" + + "d3b4" + ), + ( + SHA1, + "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", + "", + "", + 42, + "0ac1af7002b3d761d1e55298da9d0506" + + "b9ae52057220a306e07b6b87e8df21d0" + + "ea00033de03984d34918" + ), + ( + SHA1, + "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c", + None, + "", + 42, + "2c91117204d745f3500d636a62f64f0a" + + "b3bae548aa53d423b0d1f27ebba6f5e5" + + "673a081d70cce7acfc48" + ) + ) + + def test1(self): + for tv in self._test_vector: + secret, salt, info, exp = [ t2b(tv[x]) for x in (1,2,3,5) ] + key_len, hashmod = [ tv[x] for x in (4,0) ] + + output = HKDF(secret, key_len, salt, hashmod, 1, info) + self.assertEqual(output, exp) + + def test2(self): + ref = HKDF(b("XXXXXX"), 12, b("YYYY"), SHA1) + + # Same output, but this time split over 2 keys + key1, key2 = HKDF(b("XXXXXX"), 6, b("YYYY"), SHA1, 2) + self.assertEqual((ref[:6], ref[6:]), (key1, key2)) + + # Same output, but this time split over 3 keys + key1, key2, key3 = HKDF(b("XXXXXX"), 4, b("YYYY"), SHA1, 3) + self.assertEqual((ref[:4], ref[4:8], ref[8:]), (key1, key2, key3)) + + +class scrypt_Tests(unittest.TestCase): + + # Test vectors taken from + # https://tools.ietf.org/html/rfc7914 + # - password + # - salt + # - N + # - r + # - p + data = ( + ( + "", + "", + 16, # 2K + 1, + 1, + """ + 77 d6 57 62 38 65 7b 20 3b 19 ca 42 c1 8a 04 97 + f1 6b 48 44 e3 07 4a e8 df df fa 3f ed e2 14 42 + fc d0 06 9d ed 09 48 f8 32 6a 75 3a 0f c8 1f 17 + e8 d3 e0 fb 2e 0d 36 28 cf 35 e2 0c 38 d1 89 06 + """ + ), + ( + "password", + "NaCl", + 1024, # 1M + 8, + 16, + """ + fd ba be 1c 9d 34 72 00 78 56 e7 19 0d 01 e9 fe + 7c 6a d7 cb c8 23 78 30 e7 73 76 63 4b 37 31 62 + 2e af 30 d9 2e 22 a3 88 6f f1 09 27 9d 98 30 da + c7 27 af b9 4a 83 ee 6d 83 60 cb df a2 cc 06 40 + """ + ), + ( + "pleaseletmein", + "SodiumChloride", + 16384, # 16M + 8, + 1, + """ + 70 23 bd cb 3a fd 73 48 46 1c 06 cd 81 fd 38 eb + fd a8 fb ba 90 4f 8e 3e a9 b5 43 f6 54 5d a1 f2 + d5 43 29 55 61 3f 0f cf 62 d4 97 05 24 2a 9a f9 + e6 1e 85 dc 0d 65 1e 40 df cf 01 7b 45 57 58 87 + """ + ), + ( + "pleaseletmein", + "SodiumChloride", + 1048576, # 1G + 8, + 1, + """ + 21 01 cb 9b 6a 51 1a ae ad db be 09 cf 70 f8 81 + ec 56 8d 57 4a 2f fd 4d ab e5 ee 98 20 ad aa 47 + 8e 56 fd 8f 4b a5 d0 9f fa 1c 6d 92 7c 40 f4 c3 + 37 30 40 49 e8 a9 52 fb cb f4 5c 6f a7 7a 41 a4 + """ + ), + ) + + def setUp(self): + new_test_vectors = [] + for tv in self.data: + new_tv = TestVector() + new_tv.P = b(tv[0]) + new_tv.S = b(tv[1]) + new_tv.N = tv[2] + new_tv.r = tv[3] + new_tv.p = tv[4] + new_tv.output = t2b(tv[5]) + new_tv.dkLen = len(new_tv.output) + new_test_vectors.append(new_tv) + self.data = new_test_vectors + + def test2(self): + + for tv in self.data: + try: + output = scrypt(tv.P, tv.S, tv.dkLen, tv.N, tv.r, tv.p) + except ValueError as e: + if " 2 " in str(e) and tv.N >= 1048576: + import warnings + warnings.warn("Not enough memory to unit test scrypt() with N=1048576", RuntimeWarning) + continue + else: + raise e + self.assertEqual(output, tv.output) + + def test3(self): + ref = scrypt(b("password"), b("salt"), 12, 16, 1, 1) + + # Same output, but this time split over 2 keys + key1, key2 = scrypt(b("password"), b("salt"), 6, 16, 1, 1, 2) + self.assertEqual((ref[:6], ref[6:]), (key1, key2)) + + # Same output, but this time split over 3 keys + key1, key2, key3 = scrypt(b("password"), b("salt"), 4, 16, 1, 1, 3) + self.assertEqual((ref[:4], ref[4:8], ref[8:]), (key1, key2, key3)) + + +class bcrypt_Tests(unittest.TestCase): + + def test_negative_cases(self): + self.assertRaises(ValueError, bcrypt, b"1" * 73, 10) + self.assertRaises(ValueError, bcrypt, b"1" * 10, 3) + self.assertRaises(ValueError, bcrypt, b"1" * 10, 32) + self.assertRaises(ValueError, bcrypt, b"1" * 10, 4, salt=b"") + self.assertRaises(ValueError, bcrypt, b"1" * 10, 4, salt=b"1") + self.assertRaises(ValueError, bcrypt, b"1" * 10, 4, salt=b"1" * 17) + self.assertRaises(ValueError, bcrypt, b"1\x00" * 10, 4) + + def test_bytearray_mismatch(self): + ref = bcrypt("pwd", 4) + bcrypt_check("pwd", ref) + bref = bytearray(ref) + bcrypt_check("pwd", bref) + + wrong = ref[:-1] + bchr(bref[-1] ^ 0x01) + self.assertRaises(ValueError, bcrypt_check, "pwd", wrong) + + wrong = b"x" + ref[1:] + self.assertRaises(ValueError, bcrypt_check, "pwd", wrong) + + # https://github.com/patrickfav/bcrypt/wiki/Published-Test-Vectors + + def test_empty_password(self): + # password, cost, salt, bcrypt hash + tvs = [ + (b"", 4, b"zVHmKQtGGQob.b/Nc7l9NO", b"$2a$04$zVHmKQtGGQob.b/Nc7l9NO8UlrYcW05FiuCj/SxsFO/ZtiN9.mNzy"), + (b"", 5, b"zVHmKQtGGQob.b/Nc7l9NO", b"$2a$05$zVHmKQtGGQob.b/Nc7l9NOWES.1hkVBgy5IWImh9DOjKNU8atY4Iy"), + (b"", 6, b"zVHmKQtGGQob.b/Nc7l9NO", b"$2a$06$zVHmKQtGGQob.b/Nc7l9NOjOl7l4oz3WSh5fJ6414Uw8IXRAUoiaO"), + (b"", 7, b"zVHmKQtGGQob.b/Nc7l9NO", b"$2a$07$zVHmKQtGGQob.b/Nc7l9NOBsj1dQpBA1HYNGpIETIByoNX9jc.hOi"), + (b"", 8, b"zVHmKQtGGQob.b/Nc7l9NO", b"$2a$08$zVHmKQtGGQob.b/Nc7l9NOiLTUh/9MDpX86/DLyEzyiFjqjBFePgO"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_random_password_and_salt_short_pw(self): + # password, cost, salt, bcrypt hash + tvs = [ + (b"<.S.2K(Zq'", 4, b"VYAclAMpaXY/oqAo9yUpku", b"$2a$04$VYAclAMpaXY/oqAo9yUpkuWmoYywaPzyhu56HxXpVltnBIfmO9tgu"), + (b"5.rApO%5jA", 5, b"kVNDrnYKvbNr5AIcxNzeIu", b"$2a$05$kVNDrnYKvbNr5AIcxNzeIuRcyIF5cZk6UrwHGxENbxP5dVv.WQM/G"), + (b"oW++kSrQW^", 6, b"QLKkRMH9Am6irtPeSKN5sO", b"$2a$06$QLKkRMH9Am6irtPeSKN5sObJGr3j47cO6Pdf5JZ0AsJXuze0IbsNm"), + (b"ggJ\\KbTnDG", 7, b"4H896R09bzjhapgCPS/LYu", b"$2a$07$4H896R09bzjhapgCPS/LYuMzAQluVgR5iu/ALF8L8Aln6lzzYXwbq"), + (b"49b0:;VkH/", 8, b"hfvO2retKrSrx5f2RXikWe", b"$2a$08$hfvO2retKrSrx5f2RXikWeFWdtSesPlbj08t/uXxCeZoHRWDz/xFe"), + (b">9N^5jc##'", 9, b"XZLvl7rMB3EvM0c1.JHivu", b"$2a$09$XZLvl7rMB3EvM0c1.JHivuIDPJWeNJPTVrpjZIEVRYYB/mF6cYgJK"), + (b"\\$ch)s4WXp", 10, b"aIjpMOLK5qiS9zjhcHR5TO", b"$2a$10$aIjpMOLK5qiS9zjhcHR5TOU7v2NFDmcsBmSFDt5EHOgp/jeTF3O/q"), + (b"RYoj\\_>2P7", 12, b"esIAHiQAJNNBrsr5V13l7.", b"$2a$12$esIAHiQAJNNBrsr5V13l7.RFWWJI2BZFtQlkFyiWXjou05GyuREZa"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_random_password_and_salt_long_pw(self): + # password, cost, salt, bcrypt hash + tvs = [ + (b"^Q&\"]A`%/A(BVGt>QaX0M-#1ghq_+\":Y0CRmY", 5, b"YuQvhokOGVnevctykUYpKu", b"$2a$05$YuQvhokOGVnevctykUYpKutZD2pWeGGYn3auyLOasguMY3/0BbIyq"), + (b"F%uN/j>[GuB7-jB'_Yj!Tnb7Y!u^6)", 6, b"5L3vpQ0tG9O7k5gQ8nAHAe", b"$2a$06$5L3vpQ0tG9O7k5gQ8nAHAe9xxQiOcOLh8LGcI0PLWhIznsDt.S.C6"), + (b"Z>BobP32ub\"Cfe*Q<-q-=tRSjOBh8\\mLNW.", 9, b"nArqOfdCsD9kIbVnAixnwe", b"$2a$09$nArqOfdCsD9kIbVnAixnwe6s8QvyPYWtQBpEXKir2OJF9/oNBsEFe"), + (b"/MH51`!BP&0tj3%YCA;Xk%e3S`o\\EI", 10, b"ePiAc.s.yoBi3B6p1iQUCe", b"$2a$10$ePiAc.s.yoBi3B6p1iQUCezn3mraLwpVJ5XGelVyYFKyp5FZn/y.u"), + (b"ptAP\"mcg6oH.\";c0U2_oll.OKi5?Ui\"^ai#iQH7ZFtNMfs3AROnIncE9\"BNNoEgO[[*Yk8;RQ(#S,;I+aT", + 5, b"wgkOlGNXIVE2fWkT3gyRoO", b"$2a$05$wgkOlGNXIVE2fWkT3gyRoOqWi4gbi1Wv2Q2Jx3xVs3apl1w.Wtj8C"), + (b"M.E1=dt<.L0Q&p;94NfGm_Oo23+Kpl@M5?WIAL.[@/:'S)W96G8N^AWb7_smmC]>7#fGoB", + 6, b"W9zTCl35nEvUukhhFzkKMe", b"$2a$06$W9zTCl35nEvUukhhFzkKMekjT9/pj7M0lihRVEZrX3m8/SBNZRX7i"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_increasing_password_length(self): + # password, cost, salt, bcrypt hash + tvs = [ + (b"a", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.l4WvgHIVg17ZawDIrDM2IjlE64GDNQS"), + (b"aa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.AyUxBk.ThHlsLvRTH7IqcG7yVHJ3SXq"), + (b"aaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.BxOVac5xPB6XFdRc/ZrzM9FgZkqmvbW"), + (b"aaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.Qbr209bpCtfl5hN7UQlG/L4xiD3AKau"), + (b"aaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.oWszihPjDZI0ypReKsaDOW1jBl7oOii"), + (b"aaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ./k.Xxn9YiqtV/sxh3EHbnOHd0Qsq27K"), + (b"aaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.PYJqRFQbgRbIjMd5VNKmdKS4sBVOyDe"), + (b"aaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ..VMYfzaw1wP/SGxowpLeGf13fxCCt.q"), + (b"aaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.5B0p054nO5WgAD1n04XslDY/bqY9RJi"), + (b"aaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.INBTgqm7sdlBJDg.J5mLMSRK25ri04y"), + (b"aaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.s3y7CdFD0OR5p6rsZw/eZ.Dla40KLfm"), + (b"aaaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.Jx742Djra6Q7PqJWnTAS.85c28g.Siq"), + (b"aaaaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.oKMXW3EZcPHcUV0ib5vDBnh9HojXnLu"), + (b"aaaaaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.w6nIjWpDPNSH5pZUvLjC1q25ONEQpeS"), + (b"aaaaaaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.k1b2/r9A/hxdwKEKurg6OCn4MwMdiGq"), + (b"aaaaaaaaaaaaaaaa", 4, b"5DCebwootqWMCp59ISrMJ.", b"$2a$04$5DCebwootqWMCp59ISrMJ.3prCNHVX1Ws.7Hm2bJxFUnQOX9f7DFa"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_non_ascii_characters(self): + # password, cost, salt, bcrypt hash + tvs = [ + ("àèìòùÀÈÌÒÙáéíóúýÃÉÃÓÚÃðÃ", 4, b"D3qS2aoTVyqM7z8v8crLm.", b"$2a$04$D3qS2aoTVyqM7z8v8crLm.3nKt4CzBZJbyFB.ZebmfCvRw7BGs.Xm"), + ("àèìòùÀÈÌÒÙáéíóúýÃÉÃÓÚÃðÃ", 5, b"VA1FujiOCMPkUHQ8kF7IaO", b"$2a$05$VA1FujiOCMPkUHQ8kF7IaOg7NGaNvpxwWzSluQutxEVmbZItRTsAa"), + ("àèìòùÀÈÌÒÙáéíóúýÃÉÃÓÚÃðÃ", 6, b"TXiaNrPeBSz5ugiQlehRt.", b"$2a$06$TXiaNrPeBSz5ugiQlehRt.gwpeDQnXWteQL4z2FulouBr6G7D9KUi"), + ("âêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿ", 4, b"YTn1Qlvps8e1odqMn6G5x.", b"$2a$04$YTn1Qlvps8e1odqMn6G5x.85pqKql6w773EZJAExk7/BatYAI4tyO"), + ("âêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿ", 5, b"C.8k5vJKD2NtfrRI9o17DO", b"$2a$05$C.8k5vJKD2NtfrRI9o17DOfIW0XnwItA529vJnh2jzYTb1QdoY0py"), + ("âêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿ", 6, b"xqfRPj3RYAgwurrhcA6uRO", b"$2a$06$xqfRPj3RYAgwurrhcA6uROtGlXDp/U6/gkoDYHwlubtcVcNft5.vW"), + ("ÄËÃÖÜŸåÅæÆœŒßçÇøØ¢¿¡€", 4, b"y8vGgMmr9EdyxP9rmMKjH.", b"$2a$04$y8vGgMmr9EdyxP9rmMKjH.wv2y3r7yRD79gykQtmb3N3zrwjKsyay"), + ("ÄËÃÖÜŸåÅæÆœŒßçÇøØ¢¿¡€", 5, b"iYH4XIKAOOm/xPQs7xKP1u", b"$2a$05$iYH4XIKAOOm/xPQs7xKP1upD0cWyMn3Jf0ZWiizXbEkVpS41K1dcO"), + ("ÄËÃÖÜŸåÅæÆœŒßçÇøØ¢¿¡€", 6, b"wCOob.D0VV8twafNDB2ape", b"$2a$06$wCOob.D0VV8twafNDB2apegiGD5nqF6Y1e6K95q6Y.R8C4QGd265q"), + ("ΔημοσιεÏθηκεστηνΕφημεÏίδατης", 4, b"E5SQtS6P4568MDXW7cyUp.", b"$2a$04$E5SQtS6P4568MDXW7cyUp.18wfDisKZBxifnPZjAI1d/KTYMfHPYO"), + ("ÐБбВвГгДдЕеÐёЖжЗзИиЙйКкЛлМмÐ", 4, b"03e26gQFHhQwRNf81/ww9.", b"$2a$04$03e26gQFHhQwRNf81/ww9.p1UbrNwxpzWjLuT.zpTLH4t/w5WhAhC"), + ("нОоПпРрСÑТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭÑЮю", 4, b"PHNoJwpXCfe32nUtLv2Upu", b"$2a$04$PHNoJwpXCfe32nUtLv2UpuhJXOzd4k7IdFwnEpYwfJVCZ/f/.8Pje"), + ("電电電島岛島兔兔兎龜龟亀國国国å€åŒºåŒº", 4, b"wU4/0i1TmNl2u.1jIwBX.u", b"$2a$04$wU4/0i1TmNl2u.1jIwBX.uZUaOL3Rc5ID7nlQRloQh6q5wwhV/zLW"), + ("诶比伊艾弗豆è´å°”ç»´å¾è‰¾å°ºå¼€è‰¾ä¸ç»´è´¼å¾·", 4, b"P4kreGLhCd26d4WIy7DJXu", b"$2a$04$P4kreGLhCd26d4WIy7DJXusPkhxLvBouzV6OXkL5EB0jux0osjsry"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + def test_special_case_salt(self): + # password, cost, salt, bcrypt hash + tvs = [ + ("-O_=*N!2JP", 4, b"......................", b"$2a$04$......................JjuKLOX9OOwo5PceZZXSkaLDvdmgb82"), + ("7B[$Q<4b>U", 5, b"......................", b"$2a$05$......................DRiedDQZRL3xq5A5FL8y7/6NM8a2Y5W"), + (">d5-I_8^.h", 6, b"......................", b"$2a$06$......................5Mq1Ng8jgDY.uHNU4h5p/x6BedzNH2W"), + (")V`/UM/]1t", 4, b".OC/.OC/.OC/.OC/.OC/.O", b"$2a$04$.OC/.OC/.OC/.OC/.OC/.OQIvKRDAam.Hm5/IaV/.hc7P8gwwIbmi"), + (":@t2.bWuH]", 5, b".OC/.OC/.OC/.OC/.OC/.O", b"$2a$05$.OC/.OC/.OC/.OC/.OC/.ONDbUvdOchUiKmQORX6BlkPofa/QxW9e"), + ("b(#KljF5s\"", 6, b".OC/.OC/.OC/.OC/.OC/.O", b"$2a$06$.OC/.OC/.OC/.OC/.OC/.OHfTd9e7svOu34vi1PCvOcAEq07ST7.K"), + ("@3YaJ^Xs]*", 4, b"eGA.eGA.eGA.eGA.eGA.e.", b"$2a$04$eGA.eGA.eGA.eGA.eGA.e.stcmvh.R70m.0jbfSFVxlONdj1iws0C"), + ("'\"5\\!k*C(p", 5, b"eGA.eGA.eGA.eGA.eGA.e.", b"$2a$05$eGA.eGA.eGA.eGA.eGA.e.vR37mVSbfdHwu.F0sNMvgn8oruQRghy"), + ("edEu7C?$'W", 6, b"eGA.eGA.eGA.eGA.eGA.e.", b"$2a$06$eGA.eGA.eGA.eGA.eGA.e.tSq0FN8MWHQXJXNFnHTPQKtA.n2a..G"), + ("N7dHmg\\PI^", 4, b"999999999999999999999u", b"$2a$04$999999999999999999999uCZfA/pLrlyngNDMq89r1uUk.bQ9icOu"), + ("\"eJuHh!)7*", 5, b"999999999999999999999u", b"$2a$05$999999999999999999999uj8Pfx.ufrJFAoWFLjapYBS5vVEQQ/hK"), + ("ZeDRJ:_tu:", 6, b"999999999999999999999u", b"$2a$06$999999999999999999999u6RB0P9UmbdbQgjoQFEJsrvrKe.BoU6q"), + ] + + for (idx, (password, cost, salt64, result)) in enumerate(tvs): + x = bcrypt(password, cost, salt=_bcrypt_decode(salt64)) + self.assertEqual(x, result) + bcrypt_check(password, result) + + +class TestVectorsHKDFWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def add_tests(self, filename): + + def filter_algo(root): + algo_name = root['algorithm'] + if algo_name == "HKDF-SHA-1": + return SHA1 + elif algo_name == "HKDF-SHA-256": + return SHA256 + elif algo_name == "HKDF-SHA-384": + return SHA384 + elif algo_name == "HKDF-SHA-512": + return SHA512 + else: + raise ValueError("Unknown algorithm " + algo_name) + + def filter_size(unit): + return int(unit['size']) + + result = load_test_vectors_wycheproof(("Protocol", "wycheproof"), + filename, + "Wycheproof HMAC (%s)" % filename, + root_tag={'hash_module': filter_algo}, + unit_tag={'size': filter_size}) + return result + + def setUp(self): + self.tv = [] + self.add_tests("hkdf_sha1_test.json") + self.add_tests("hkdf_sha256_test.json") + self.add_tests("hkdf_sha384_test.json") + self.add_tests("hkdf_sha512_test.json") + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_verify(self, tv): + self._id = "Wycheproof HKDF Test #%d (%s, %s)" % (tv.id, tv.comment, tv.filename) + + try: + key = HKDF(tv.ikm, tv.size, tv.salt, tv.hash_module, 1, tv.info) + except ValueError: + assert not tv.valid + else: + if key != tv.okm: + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + for tv in self.tv: + self.test_verify(tv) + + +def load_hash_by_name(hash_name): + return __import__("Cryptodome.Hash." + hash_name, globals(), locals(), ["new"]) + + +class SP800_180_Counter_Tests(unittest.TestCase): + + def test_negative_zeroes(self): + def prf(s, x): + return HMAC.new(s, x, SHA256).digest() + + self.assertRaises(ValueError, SP800_108_Counter, b'0' * 16, 1, prf, + label=b'A\x00B') + self.assertRaises(ValueError, SP800_108_Counter, b'0' * 16, 1, prf, + context=b'A\x00B') + + def test_multiple_keys(self): + def prf(s, x): + return HMAC.new(s, x, SHA256).digest() + + key = b'0' * 16 + expected = SP800_108_Counter(key, 2*3*23, prf) + for r in (1, 2, 3, 23): + dks = SP800_108_Counter(key, r, prf, 138//r) + self.assertEqual(len(dks), 138//r) + self.assertEqual(len(dks[0]), r) + self.assertEqual(b''.join(dks), expected) + + +def add_tests_sp800_108_counter(cls): + + test_vectors_sp800_108_counter = load_test_vectors(("Protocol", ), + "KDF_SP800_108_COUNTER.txt", + "NIST SP 800 108 KDF Counter Mode", + {'count': lambda x: int(x)}, + ) or [] + + mac_type = None + for idx, tv in enumerate(test_vectors_sp800_108_counter): + + if isinstance(tv, str): + res = re.match(r"\[HMAC-(SHA-[0-9]+)\]", tv) + if res: + hash_name = res.group(1).replace("-", "") + hash_module = load_hash_by_name(hash_name) + mac_type = "hmac" + continue + res = re.match(r"\[CMAC-AES-128\]", tv) + if res: + mac_type = "cmac" + continue + assert res + + if mac_type == "hmac": + def prf(s, x, hash_module=hash_module): + return HMAC.new(s, x, hash_module).digest() + elif mac_type == "cmac": + def prf(s, x, hash_module=hash_module): + return CMAC.new(s, x, AES).digest() + continue + + def kdf_test(self, prf=prf, kin=tv.kin, label=tv.label, + context=tv.context, kout=tv.kout, count=tv.count): + result = SP800_108_Counter(kin, len(kout), prf, 1, label, context) + assert(len(result) == len(kout)) + self.assertEqual(result, kout) + + setattr(cls, "test_kdf_sp800_108_counter_%d" % idx, kdf_test) + + +add_tests_sp800_108_counter(SP800_180_Counter_Tests) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + if not config.get('slow_tests'): + PBKDF2_Tests._testData = PBKDF2_Tests._testData[:3] + scrypt_Tests.data = scrypt_Tests.data[:3] + + tests = [] + tests += list_test_cases(PBKDF1_Tests) + tests += list_test_cases(PBKDF2_Tests) + tests += list_test_cases(S2V_Tests) + tests += list_test_cases(HKDF_Tests) + tests += [TestVectorsHKDFWycheproof(wycheproof_warnings)] + tests += list_test_cases(scrypt_Tests) + tests += list_test_cases(bcrypt_Tests) + tests += list_test_cases(SP800_180_Counter_Tests) + + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py new file mode 100644 index 0000000..57d97df --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py @@ -0,0 +1,267 @@ +# +# SelfTest/Protocol/test_secret_sharing.py: Self-test for secret sharing protocols +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from unittest import main, TestCase, TestSuite +from binascii import unhexlify, hexlify + +from Cryptodome.Util.py3compat import * +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Protocol.SecretSharing import Shamir, _Element, \ + _mult_gf2, _div_gf2 + +class GF2_Tests(TestCase): + + def test_mult_gf2(self): + # Prove mult by zero + x = _mult_gf2(0,0) + self.assertEqual(x, 0) + + # Prove mult by unity + x = _mult_gf2(34, 1) + self.assertEqual(x, 34) + + z = 3 # (x+1) + y = _mult_gf2(z, z) + self.assertEqual(y, 5) # (x+1)^2 = x^2 + 1 + y = _mult_gf2(y, z) + self.assertEqual(y, 15) # (x+1)^3 = x^3 + x^2 + x + 1 + y = _mult_gf2(y, z) + self.assertEqual(y, 17) # (x+1)^4 = x^4 + 1 + + # Prove linearity works + comps = [1, 4, 128, 2**34] + sum_comps = 1+4+128+2**34 + y = 908 + z = _mult_gf2(sum_comps, y) + w = 0 + for x in comps: + w ^= _mult_gf2(x, y) + self.assertEqual(w, z) + + def test_div_gf2(self): + from Cryptodome.Util.number import size as deg + + x, y = _div_gf2(567, 7) + self.assertTrue(deg(y) < deg(7)) + + w = _mult_gf2(x, 7) ^ y + self.assertEqual(567, w) + + x, y = _div_gf2(7, 567) + self.assertEqual(x, 0) + self.assertEqual(y, 7) + +class Element_Tests(TestCase): + + def test1(self): + # Test encondings + e = _Element(256) + self.assertEqual(int(e), 256) + self.assertEqual(e.encode(), bchr(0)*14 + b("\x01\x00")) + + e = _Element(bchr(0)*14 + b("\x01\x10")) + self.assertEqual(int(e), 0x110) + self.assertEqual(e.encode(), bchr(0)*14 + b("\x01\x10")) + + # Only 16 byte string are a valid encoding + self.assertRaises(ValueError, _Element, bchr(0)) + + def test2(self): + # Test addition + e = _Element(0x10) + f = _Element(0x0A) + self.assertEqual(int(e+f), 0x1A) + + def test3(self): + # Test multiplication + zero = _Element(0) + one = _Element(1) + two = _Element(2) + + x = _Element(6) * zero + self.assertEqual(int(x), 0) + + x = _Element(6) * one + self.assertEqual(int(x), 6) + + x = _Element(2**127) * two + self.assertEqual(int(x), 1 + 2 + 4 + 128) + + def test4(self): + # Test inversion + one = _Element(1) + + x = one.inverse() + self.assertEqual(int(x), 1) + + x = _Element(82323923) + y = x.inverse() + self.assertEqual(int(x * y), 1) + +class Shamir_Tests(TestCase): + + def test1(self): + # Test splitting + shares = Shamir.split(2, 3, bchr(90)*16) + self.assertEqual(len(shares), 3) + for index in range(3): + self.assertEqual(shares[index][0], index+1) + self.assertEqual(len(shares[index][1]), 16) + + def test2(self): + # Test recombine + from itertools import permutations + + test_vectors = ( + (2, "d9fe73909bae28b3757854c0af7ad405", + "1-594ae8964294174d95c33756d2504170", + "2-d897459d29da574eb40e93ec552ffe6e", + "3-5823de9bf0e068b054b5f07a28056b1b", + "4-db2c1f8bff46d748f795da995bd080cb"), + (2, "bf4f902d9a7efafd1f3ffd9291fd5de9", + "1-557bd3b0748064b533469722d1cc7935", + "2-6b2717164783c66d47cd28f2119f14d0", + "3-8113548ba97d58256bb4424251ae300c", + "4-179e9e5a218483ddaeda57539139cf04"), + (3, "ec96aa5c14c9faa699354cf1da74e904", + "1-64579fbf1908d66f7239bf6e2b4e41e1", + "2-6cd9428df8017b52322561e8c672ae3e", + "3-e418776ef5c0579bd9299277374806dd", + "4-ab3f77a0107398d23b323e581bb43f5d", + "5-23fe42431db2b41bd03ecdc7ea8e97ac"), + (3, "44cf249b68b80fcdc27b47be60c2c145", + "1-d6515a3905cd755119b86e311c801e31", + "2-16693d9ac9f10c254036ced5f8917fa3", + "3-84f74338a48476b99bf5e75a84d3a0d1", + "4-3fe8878dc4a5d35811cf3cbcd33dbe52", + "5-ad76f92fa9d0a9c4ca0c1533af7f6132"), + (5, "5398717c982db935d968eebe53a47f5a", + "1-be7be2dd4c068e7ef576aaa1b1c11b01", + "2-f821f5848441cb98b3eb467e2733ee21", + "3-25ee52f53e203f6e29a0297b5ab486b5", + "4-fc9fb58ef74dab947fbf9acd9d5d83cd", + "5-b1949cce46d81552e65f248d3f74cc5c", + "6-d64797f59977c4d4a7956ad916da7699", + "7-ab608a6546a8b9af8820ff832b1135c7"), + (5, "4a78db90fbf35da5545d2fb728e87596", + "1-08daf9a25d8aa184cfbf02b30a0ed6a0", + "2-dda28261e36f0b14168c2cf153fb734e", + "3-e9fdec5505d674a57f9836c417c1ecaa", + "4-4dce5636ae06dee42d2c82e65f06c735", + "5-3963dc118afc2ba798fa1d452b28ef00", + "6-6dfe6ff5b09e94d2f84c382b12f42424", + "7-6faea9d4d4a4e201bf6c90b9000630c3"), + (10, "eccbf6d66d680b49b073c4f1ddf804aa", + "01-7d8ac32fe4ae209ead1f3220fda34466", + "02-f9144e76988aad647d2e61353a6e96d5", + "03-b14c3b80179203363922d60760271c98", + "04-770bb2a8c28f6cee89e00f4d5cc7f861", + "05-6e3d7073ea368334ef67467871c66799", + "06-248792bc74a98ce024477c13c8fb5f8d", + "07-fcea4640d2db820c0604851e293d2487", + "08-2776c36fb714bb1f8525a0be36fc7dba", + "09-6ee7ac8be773e473a4bf75ee5f065762", + "10-33657fc073354cf91d4a68c735aacfc8", + "11-7645c65094a5868bf225c516fdee2d0c", + "12-840485aacb8226631ecd9c70e3018086"), + (10, "377e63bdbb5f7d4dc58a483d035212bb", + "01-32c53260103be431c843b1a633afe3bd", + "02-0107eb16cb8695084d452d2cc50bc7d6", + "03-df1e5c66cd755287fb0446faccd72a06", + "04-361bbcd5d40797f49dfa1898652da197", + "05-160d3ad1512f7dec7fd9344aed318591", + "06-659af6d95df4f25beca4fb9bfee3b7e8", + "07-37f3b208977bad50b3724566b72bfa9d", + "08-6c1de2dfc69c2986142c26a8248eb316", + "09-5e19220837a396bd4bc8cd685ff314c3", + "10-86e7b864fb0f3d628e46d50c1ba92f1c", + "11-065d0082c80b1aea18f4abe0c49df72e", + "12-84a09430c1d20ea9f388f3123c3733a3"), + ) + + def get_share(p): + pos = p.find('-') + return int(p[:pos]), unhexlify(p[pos + 1:]) + + for tv in test_vectors: + k = tv[0] + secret = unhexlify(tv[1]) + max_perms = 10 + for perm, shares_idx in enumerate(permutations(range(2, len(tv)), k)): + if perm > max_perms: + break + shares = [ get_share(tv[x]) for x in shares_idx ] + result = Shamir.combine(shares, True) + self.assertEqual(secret, result) + + def test3(self): + # Loopback split/recombine + secret = unhexlify(b("000102030405060708090a0b0c0d0e0f")) + + shares = Shamir.split(2, 3, secret) + + secret2 = Shamir.combine(shares[:2]) + self.assertEqual(secret, secret2) + + secret3 = Shamir.combine([ shares[0], shares[2] ]) + self.assertEqual(secret, secret3) + + def test4(self): + # Loopback split/recombine (SSSS) + secret = unhexlify(b("000102030405060708090a0b0c0d0e0f")) + + shares = Shamir.split(2, 3, secret, ssss=True) + + secret2 = Shamir.combine(shares[:2], ssss=True) + self.assertEqual(secret, secret2) + + def test5(self): + # Detect duplicate shares + secret = unhexlify(b("000102030405060708090a0b0c0d0e0f")) + + shares = Shamir.split(2, 3, secret) + self.assertRaises(ValueError, Shamir.combine, (shares[0], shares[0])) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(GF2_Tests) + tests += list_test_cases(Element_Tests) + tests += list_test_cases(Shamir_Tests) + return tests + +if __name__ == '__main__': + suite = lambda: TestSuite(get_tests()) + main(defaultTest='suite') + diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py new file mode 100644 index 0000000..a79769c --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py @@ -0,0 +1,62 @@ +# +# Test script for Cryptodome.Util.RFC1751. +# +# Part of the Python Cryptography Toolkit +# +# Written by Andrew Kuchling and others +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +__revision__ = "$Id$" + +import binascii +import unittest +from Cryptodome.Util import RFC1751 +from Cryptodome.Util.py3compat import * + +test_data = [('EB33F77EE73D4053', 'TIDE ITCH SLOW REIN RULE MOT'), + ('CCAC2AED591056BE4F90FD441C534766', + 'RASH BUSH MILK LOOK BAD BRIM AVID GAFF BAIT ROT POD LOVE'), + ('EFF81F9BFBC65350920CDD7416DE8009', + 'TROD MUTE TAIL WARM CHAR KONG HAAG CITY BORE O TEAL AWL') + ] + +class RFC1751Test_k2e (unittest.TestCase): + + def runTest (self): + "Check converting keys to English" + for key, words in test_data: + key=binascii.a2b_hex(b(key)) + self.assertEqual(RFC1751.key_to_english(key), words) + +class RFC1751Test_e2k (unittest.TestCase): + + def runTest (self): + "Check converting English strings to keys" + for key, words in test_data: + key=binascii.a2b_hex(b(key)) + self.assertEqual(RFC1751.english_to_key(words), key) + +# class RFC1751Test + +def get_tests(config={}): + return [RFC1751Test_k2e(), RFC1751Test_e2k()] + +if __name__ == "__main__": + unittest.main() diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py new file mode 100644 index 0000000..7cdd320 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/PublicKey/__init__.py: Self-test for public key crypto +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test for public-key crypto""" + +import unittest +from Cryptodome.SelfTest.PublicKey import (test_DSA, test_RSA, + test_ECC_NIST, test_ECC_25519, test_ECC_448, + test_import_DSA, test_import_RSA, + test_import_ECC, test_ElGamal) + + +def get_tests(config={}): + tests = [] + tests += test_DSA.get_tests(config=config) + tests += test_RSA.get_tests(config=config) + tests += test_ECC_NIST.get_tests(config=config) + tests += test_ECC_25519.get_tests(config=config) + tests += test_ECC_448.get_tests(config=config) + + tests += test_import_DSA.get_tests(config=config) + tests += test_import_RSA.get_tests(config=config) + tests += test_import_ECC.get_tests(config=config) + + tests += test_ElGamal.get_tests(config=config) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py new file mode 100644 index 0000000..160d882 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py @@ -0,0 +1,247 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/PublicKey/test_DSA.py: Self-test for the DSA primitive +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.PublicKey.DSA""" + +import os +from Cryptodome.Util.py3compat import * + +import unittest +from Cryptodome.SelfTest.st_common import list_test_cases, a2b_hex, b2a_hex + +def _sws(s): + """Remove whitespace from a text or byte string""" + if isinstance(s,str): + return "".join(s.split()) + else: + return b("").join(s.split()) + +class DSATest(unittest.TestCase): + # Test vector from "Appendix 5. Example of the DSA" of + # "Digital Signature Standard (DSS)", + # U.S. Department of Commerce/National Institute of Standards and Technology + # FIPS 186-2 (+Change Notice), 2000 January 27. + # http://csrc.nist.gov/publications/fips/fips186-2/fips186-2-change1.pdf + + y = _sws("""19131871 d75b1612 a819f29d 78d1b0d7 346f7aa7 7bb62a85 + 9bfd6c56 75da9d21 2d3a36ef 1672ef66 0b8c7c25 5cc0ec74 + 858fba33 f44c0669 9630a76b 030ee333""") + + g = _sws("""626d0278 39ea0a13 413163a5 5b4cb500 299d5522 956cefcb + 3bff10f3 99ce2c2e 71cb9de5 fa24babf 58e5b795 21925c9c + c42e9f6f 464b088c c572af53 e6d78802""") + + p = _sws("""8df2a494 492276aa 3d25759b b06869cb eac0d83a fb8d0cf7 + cbb8324f 0d7882e5 d0762fc5 b7210eaf c2e9adac 32ab7aac + 49693dfb f83724c2 ec0736ee 31c80291""") + + q = _sws("""c773218c 737ec8ee 993b4f2d ed30f48e dace915f""") + + x = _sws("""2070b322 3dba372f de1c0ffc 7b2e3b49 8b260614""") + + k = _sws("""358dad57 1462710f 50e254cf 1a376b2b deaadfbf""") + k_inverse = _sws("""0d516729 8202e49b 4116ac10 4fc3f415 ae52f917""") + m = b2a_hex(b("abc")) + m_hash = _sws("""a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d""") + r = _sws("""8bac1ab6 6410435c b7181f95 b16ab97c 92b341c0""") + s = _sws("""41e2345f 1f56df24 58f426d1 55b4ba2d b6dcd8c8""") + + def setUp(self): + global DSA, Random, bytes_to_long, size + from Cryptodome.PublicKey import DSA + from Cryptodome import Random + from Cryptodome.Util.number import bytes_to_long, inverse, size + + self.dsa = DSA + + def test_generate_1arg(self): + """DSA (default implementation) generated key (1 argument)""" + dsaObj = self.dsa.generate(1024) + self._check_private_key(dsaObj) + pub = dsaObj.public_key() + self._check_public_key(pub) + + def test_generate_2arg(self): + """DSA (default implementation) generated key (2 arguments)""" + dsaObj = self.dsa.generate(1024, Random.new().read) + self._check_private_key(dsaObj) + pub = dsaObj.public_key() + self._check_public_key(pub) + + def test_construct_4tuple(self): + """DSA (default implementation) constructed key (4-tuple)""" + (y, g, p, q) = [bytes_to_long(a2b_hex(param)) for param in (self.y, self.g, self.p, self.q)] + dsaObj = self.dsa.construct((y, g, p, q)) + self._test_verification(dsaObj) + + def test_construct_5tuple(self): + """DSA (default implementation) constructed key (5-tuple)""" + (y, g, p, q, x) = [bytes_to_long(a2b_hex(param)) for param in (self.y, self.g, self.p, self.q, self.x)] + dsaObj = self.dsa.construct((y, g, p, q, x)) + self._test_signing(dsaObj) + self._test_verification(dsaObj) + + def test_construct_bad_key4(self): + (y, g, p, q) = [bytes_to_long(a2b_hex(param)) for param in (self.y, self.g, self.p, self.q)] + tup = (y, g, p+1, q) + self.assertRaises(ValueError, self.dsa.construct, tup) + + tup = (y, g, p, q+1) + self.assertRaises(ValueError, self.dsa.construct, tup) + + tup = (y, 1, p, q) + self.assertRaises(ValueError, self.dsa.construct, tup) + + def test_construct_bad_key5(self): + (y, g, p, q, x) = [bytes_to_long(a2b_hex(param)) for param in (self.y, self.g, self.p, self.q, self.x)] + tup = (y, g, p, q, x+1) + self.assertRaises(ValueError, self.dsa.construct, tup) + + tup = (y, g, p, q, q+10) + self.assertRaises(ValueError, self.dsa.construct, tup) + + def _check_private_key(self, dsaObj): + # Check capabilities + self.assertEqual(1, dsaObj.has_private()) + self.assertEqual(1, dsaObj.can_sign()) + self.assertEqual(0, dsaObj.can_encrypt()) + + # Sanity check key data + self.assertEqual(1, dsaObj.p > dsaObj.q) # p > q + self.assertEqual(160, size(dsaObj.q)) # size(q) == 160 bits + self.assertEqual(0, (dsaObj.p - 1) % dsaObj.q) # q is a divisor of p-1 + self.assertEqual(dsaObj.y, pow(dsaObj.g, dsaObj.x, dsaObj.p)) # y == g**x mod p + self.assertEqual(1, 0 < dsaObj.x < dsaObj.q) # 0 < x < q + + def _check_public_key(self, dsaObj): + k = bytes_to_long(a2b_hex(self.k)) + m_hash = bytes_to_long(a2b_hex(self.m_hash)) + + # Check capabilities + self.assertEqual(0, dsaObj.has_private()) + self.assertEqual(1, dsaObj.can_sign()) + self.assertEqual(0, dsaObj.can_encrypt()) + + # Check that private parameters are all missing + self.assertEqual(0, hasattr(dsaObj, 'x')) + + # Sanity check key data + self.assertEqual(1, dsaObj.p > dsaObj.q) # p > q + self.assertEqual(160, size(dsaObj.q)) # size(q) == 160 bits + self.assertEqual(0, (dsaObj.p - 1) % dsaObj.q) # q is a divisor of p-1 + + # Public-only key objects should raise an error when .sign() is called + self.assertRaises(TypeError, dsaObj._sign, m_hash, k) + + # Check __eq__ and __ne__ + self.assertEqual(dsaObj.public_key() == dsaObj.public_key(),True) # assert_ + self.assertEqual(dsaObj.public_key() != dsaObj.public_key(),False) # assertFalse + + self.assertEqual(dsaObj.public_key(), dsaObj.publickey()) + + def _test_signing(self, dsaObj): + k = bytes_to_long(a2b_hex(self.k)) + m_hash = bytes_to_long(a2b_hex(self.m_hash)) + r = bytes_to_long(a2b_hex(self.r)) + s = bytes_to_long(a2b_hex(self.s)) + (r_out, s_out) = dsaObj._sign(m_hash, k) + self.assertEqual((r, s), (r_out, s_out)) + + def _test_verification(self, dsaObj): + m_hash = bytes_to_long(a2b_hex(self.m_hash)) + r = bytes_to_long(a2b_hex(self.r)) + s = bytes_to_long(a2b_hex(self.s)) + self.assertTrue(dsaObj._verify(m_hash, (r, s))) + self.assertFalse(dsaObj._verify(m_hash + 1, (r, s))) + + def test_repr(self): + (y, g, p, q) = [bytes_to_long(a2b_hex(param)) for param in (self.y, self.g, self.p, self.q)] + dsaObj = self.dsa.construct((y, g, p, q)) + repr(dsaObj) + + +class DSADomainTest(unittest.TestCase): + + def test_domain1(self): + """Verify we can generate new keys in a given domain""" + dsa_key_1 = DSA.generate(1024) + domain_params = dsa_key_1.domain() + + dsa_key_2 = DSA.generate(1024, domain=domain_params) + self.assertEqual(dsa_key_1.p, dsa_key_2.p) + self.assertEqual(dsa_key_1.q, dsa_key_2.q) + self.assertEqual(dsa_key_1.g, dsa_key_2.g) + + self.assertEqual(dsa_key_1.domain(), dsa_key_2.domain()) + + def _get_weak_domain(self): + + from Cryptodome.Math.Numbers import Integer + from Cryptodome.Math import Primality + + p = Integer(4) + while p.size_in_bits() != 1024 or Primality.test_probable_prime(p) != Primality.PROBABLY_PRIME: + q1 = Integer.random(exact_bits=80) + q2 = Integer.random(exact_bits=80) + q = q1 * q2 + z = Integer.random(exact_bits=1024-160) + p = z * q + 1 + + h = Integer(2) + g = 1 + while g == 1: + g = pow(h, z, p) + h += 1 + + return (p, q, g) + + + def test_generate_error_weak_domain(self): + """Verify that domain parameters with composite q are rejected""" + + domain_params = self._get_weak_domain() + self.assertRaises(ValueError, DSA.generate, 1024, domain=domain_params) + + + def test_construct_error_weak_domain(self): + """Verify that domain parameters with composite q are rejected""" + + from Cryptodome.Math.Numbers import Integer + + p, q, g = self._get_weak_domain() + y = pow(g, 89, p) + self.assertRaises(ValueError, DSA.construct, (y, g, p, q)) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(DSATest) + tests += list_test_cases(DSADomainTest) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py new file mode 100644 index 0000000..1362e58 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_25519.py @@ -0,0 +1,333 @@ +# =================================================================== +# +# Copyright (c) 2022, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors + +from Cryptodome.PublicKey import ECC +from Cryptodome.PublicKey.ECC import EccPoint, _curves, EccKey + +from Cryptodome.Math.Numbers import Integer + +from Cryptodome.Hash import SHAKE128 + + +class TestEccPoint_Ed25519(unittest.TestCase): + + Gxy = {"x": 15112221349535400772501151409588531511454012693041857206046113283949847762202, + "y": 46316835694926478169428394003475163141307993866256225615783033603165251855960} + + G2xy = {"x": 24727413235106541002554574571675588834622768167397638456726423682521233608206, + "y": 15549675580280190176352668710449542251549572066445060580507079593062643049417} + + G3xy = {"x": 46896733464454938657123544595386787789046198280132665686241321779790909858396, + "y": 8324843778533443976490377120369201138301417226297555316741202210403726505172} + + pointG = EccPoint(Gxy['x'], Gxy['y'], curve="Ed25519") + pointG2 = EccPoint(G2xy['x'], G2xy['y'], curve="Ed25519") + pointG3 = EccPoint(G3xy['x'], G3xy['y'], curve="Ed25519") + + def test_init_xy(self): + EccPoint(self.Gxy['x'], self.Gxy['y'], curve="Ed25519") + + # Neutral point + pai = EccPoint(0, 1, curve="Ed25519") + self.assertEqual(pai.x, 0) + self.assertEqual(pai.y, 1) + self.assertEqual(pai.xy, (0, 1)) + + # G + bp = self.pointG.copy() + self.assertEqual(bp.x, 15112221349535400772501151409588531511454012693041857206046113283949847762202) + self.assertEqual(bp.y, 46316835694926478169428394003475163141307993866256225615783033603165251855960) + self.assertEqual(bp.xy, (bp.x, bp.y)) + + # 2G + bp2 = self.pointG2.copy() + self.assertEqual(bp2.x, 24727413235106541002554574571675588834622768167397638456726423682521233608206) + self.assertEqual(bp2.y, 15549675580280190176352668710449542251549572066445060580507079593062643049417) + self.assertEqual(bp2.xy, (bp2.x, bp2.y)) + + # 5G + EccPoint(x=33467004535436536005251147249499675200073690106659565782908757308821616914995, + y=43097193783671926753355113395909008640284023746042808659097434958891230611693, + curve="Ed25519") + + # Catch if point is not on the curve + self.assertRaises(ValueError, EccPoint, 34, 35, curve="Ed25519") + + def test_set(self): + pointW = EccPoint(0, 1, curve="Ed25519") + pointW.set(self.pointG) + self.assertEqual(pointW.x, self.pointG.x) + self.assertEqual(pointW.y, self.pointG.y) + + def test_copy(self): + pointW = self.pointG.copy() + self.assertEqual(pointW.x, self.pointG.x) + self.assertEqual(pointW.y, self.pointG.y) + + def test_equal(self): + pointH = self.pointG.copy() + pointI = self.pointG2.copy() + self.assertEqual(self.pointG, pointH) + self.assertNotEqual(self.pointG, pointI) + + def test_pai(self): + pai = EccPoint(0, 1, curve="Ed25519") + self.assertTrue(pai.is_point_at_infinity()) + self.assertEqual(pai, pai.point_at_infinity()) + + def test_negate(self): + negG = -self.pointG + sum = self.pointG + negG + self.assertTrue(sum.is_point_at_infinity()) + + def test_addition(self): + self.assertEqual(self.pointG + self.pointG2, self.pointG3) + self.assertEqual(self.pointG2 + self.pointG, self.pointG3) + self.assertEqual(self.pointG2 + self.pointG.point_at_infinity(), self.pointG2) + self.assertEqual(self.pointG.point_at_infinity() + self.pointG2, self.pointG2) + + G5 = self.pointG2 + self.pointG3 + self.assertEqual(G5.x, 33467004535436536005251147249499675200073690106659565782908757308821616914995) + self.assertEqual(G5.y, 43097193783671926753355113395909008640284023746042808659097434958891230611693) + + def test_inplace_addition(self): + pointH = self.pointG.copy() + pointH += self.pointG + self.assertEqual(pointH, self.pointG2) + pointH += self.pointG + self.assertEqual(pointH, self.pointG3) + pointH += self.pointG.point_at_infinity() + self.assertEqual(pointH, self.pointG3) + + def test_doubling(self): + pointH = self.pointG.copy() + pointH.double() + self.assertEqual(pointH.x, self.pointG2.x) + self.assertEqual(pointH.y, self.pointG2.y) + + # 2*0 + pai = self.pointG.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + def test_scalar_multiply(self): + d = 0 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0) + self.assertEqual(pointH.y, 1) + + d = 1 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG.x) + self.assertEqual(pointH.y, self.pointG.y) + + d = 2 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG2.x) + self.assertEqual(pointH.y, self.pointG2.y) + + d = 3 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG3.x) + self.assertEqual(pointH.y, self.pointG3.y) + + d = 4 + pointH = d * self.pointG + self.assertEqual(pointH.x, 14582954232372986451776170844943001818709880559417862259286374126315108956272) + self.assertEqual(pointH.y, 32483318716863467900234833297694612235682047836132991208333042722294373421359) + + d = 5 + pointH = d * self.pointG + self.assertEqual(pointH.x, 33467004535436536005251147249499675200073690106659565782908757308821616914995) + self.assertEqual(pointH.y, 43097193783671926753355113395909008640284023746042808659097434958891230611693) + + d = 10 + pointH = d * self.pointG + self.assertEqual(pointH.x, 43500613248243327786121022071801015118933854441360174117148262713429272820047) + self.assertEqual(pointH.y, 45005105423099817237495816771148012388779685712352441364231470781391834741548) + + d = 20 + pointH = d * self.pointG + self.assertEqual(pointH.x, 46694936775300686710656303283485882876784402425210400817529601134760286812591) + self.assertEqual(pointH.y, 8786390172762935853260670851718824721296437982862763585171334833968259029560) + + d = 255 + pointH = d * self.pointG + self.assertEqual(pointH.x, 36843863416400016952258312492144504209624961884991522125275155377549541182230) + self.assertEqual(pointH.y, 22327030283879720808995671630924669697661065034121040761798775626517750047180) + + d = 256 + pointH = d * self.pointG + self.assertEqual(pointH.x, 42740085206947573681423002599456489563927820004573071834350074001818321593686) + self.assertEqual(pointH.y, 6935684722522267618220753829624209639984359598320562595061366101608187623111) + + def test_sizes(self): + self.assertEqual(self.pointG.size_in_bits(), 255) + self.assertEqual(self.pointG.size_in_bytes(), 32) + + +class TestEccKey_Ed25519(unittest.TestCase): + + def test_private_key(self): + seed = unhexlify("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60") + Px = 38815646466658113194383306759739515082307681141926459231621296960732224964046 + Py = 11903303657706407974989296177215005343713679411332034699907763981919547054807 + + key = EccKey(curve="Ed25519", seed=seed) + self.assertEqual(key.seed, seed) + self.assertEqual(key.d, 36144925721603087658594284515452164870581325872720374094707712194495455132720) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, Px) + self.assertEqual(key.pointQ.y, Py) + + point = EccPoint(Px, Py, "ed25519") + key = EccKey(curve="Ed25519", seed=seed, point=point) + self.assertEqual(key.d, 36144925721603087658594284515452164870581325872720374094707712194495455132720) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="ed25519", seed=seed) + + # Must not accept d parameter + self.assertRaises(ValueError, EccKey, curve="ed25519", d=1) + + def test_public_key(self): + point = EccPoint(_curves['ed25519'].Gx, _curves['ed25519'].Gy, curve='ed25519') + key = EccKey(curve="ed25519", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + priv_key = EccKey(curve="ed25519", seed=b'H'*32) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_seed(self): + self.assertRaises(ValueError, lambda: EccKey(curve="ed25519", seed=b'H' * 31)) + + def test_equality(self): + private_key = ECC.construct(seed=b'H'*32, curve="Ed25519") + private_key2 = ECC.construct(seed=b'H'*32, curve="ed25519") + private_key3 = ECC.construct(seed=b'C'*32, curve="Ed25519") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='ed25519') + self.assertIn("curve='Ed25519'", repr(key)) + self.assertEqual(key.curve, 'Ed25519') + self.assertEqual(key.public_key().curve, 'Ed25519') + + +class TestEccModule_Ed25519(unittest.TestCase): + + def test_generate(self): + key = ECC.generate(curve="Ed25519") + self.assertTrue(key.has_private()) + point = EccPoint(_curves['Ed25519'].Gx, _curves['Ed25519'].Gy, curve="Ed25519") * key.d + self.assertEqual(key.pointQ, point) + + # Always random + key2 = ECC.generate(curve="Ed25519") + self.assertNotEqual(key, key2) + + # Other names + ECC.generate(curve="Ed25519") + + # Random source + key1 = ECC.generate(curve="Ed25519", randfunc=SHAKE128.new().read) + key2 = ECC.generate(curve="Ed25519", randfunc=SHAKE128.new().read) + self.assertEqual(key1, key2) + + def test_construct(self): + seed = unhexlify("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60") + Px = 38815646466658113194383306759739515082307681141926459231621296960732224964046 + Py = 11903303657706407974989296177215005343713679411332034699907763981919547054807 + d = 36144925721603087658594284515452164870581325872720374094707712194495455132720 + point = EccPoint(Px, Py, curve="Ed25519") + + # Private key only + key = ECC.construct(curve="Ed25519", seed=seed) + self.assertEqual(key.pointQ, point) + self.assertTrue(key.has_private()) + + # Public key only + key = ECC.construct(curve="Ed25519", point_x=Px, point_y=Py) + self.assertEqual(key.pointQ, point) + self.assertFalse(key.has_private()) + + # Private and public key + key = ECC.construct(curve="Ed25519", seed=seed, point_x=Px, point_y=Py) + self.assertEqual(key.pointQ, point) + self.assertTrue(key.has_private()) + + # Other names + key = ECC.construct(curve="ed25519", seed=seed) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['ed25519'].Gx, point_y=_curves['ed25519'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="Ed25519", **coord) + self.assertRaises(ValueError, ECC.construct, curve="Ed25519", d=2, **coordG) + self.assertRaises(ValueError, ECC.construct, curve="Ed25519", seed=b'H'*31) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestEccPoint_Ed25519) + tests += list_test_cases(TestEccKey_Ed25519) + tests += list_test_cases(TestEccModule_Ed25519) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py new file mode 100644 index 0000000..fbebaea --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_448.py @@ -0,0 +1,333 @@ +# =================================================================== +# +# Copyright (c) 2022, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors + +from Cryptodome.PublicKey import ECC +from Cryptodome.PublicKey.ECC import EccPoint, _curves, EccKey + +from Cryptodome.Math.Numbers import Integer + +from Cryptodome.Hash import SHAKE128 + + +class TestEccPoint_Ed448(unittest.TestCase): + + Gxy = {"x": 0x4f1970c66bed0ded221d15a622bf36da9e146570470f1767ea6de324a3d3a46412ae1af72ab66511433b80e18b00938e2626a82bc70cc05e, + "y": 0x693f46716eb6bc248876203756c9c7624bea73736ca3984087789c1e05a0c2d73ad3ff1ce67c39c4fdbd132c4ed7c8ad9808795bf230fa14} + + G2xy = {"x": 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa955555555555555555555555555555555555555555555555555555555, + "y": 0xae05e9634ad7048db359d6205086c2b0036ed7a035884dd7b7e36d728ad8c4b80d6565833a2a3098bbbcb2bed1cda06bdaeafbcdea9386ed} + + G3xy = {"x": 0x865886b9108af6455bd64316cb6943332241b8b8cda82c7e2ba077a4a3fcfe8daa9cbf7f6271fd6e862b769465da8575728173286ff2f8f, + "y": 0xe005a8dbd5125cf706cbda7ad43aa6449a4a8d952356c3b9fce43c82ec4e1d58bb3a331bdb6767f0bffa9a68fed02dafb822ac13588ed6fc} + + pointG = EccPoint(Gxy['x'], Gxy['y'], curve="Ed448") + pointG2 = EccPoint(G2xy['x'], G2xy['y'], curve="Ed448") + pointG3 = EccPoint(G3xy['x'], G3xy['y'], curve="Ed448") + + def test_init_xy(self): + EccPoint(self.Gxy['x'], self.Gxy['y'], curve="Ed448") + + # Neutral point + pai = EccPoint(0, 1, curve="Ed448") + self.assertEqual(pai.x, 0) + self.assertEqual(pai.y, 1) + self.assertEqual(pai.xy, (0, 1)) + + # G + bp = self.pointG.copy() + self.assertEqual(bp.x, 0x4f1970c66bed0ded221d15a622bf36da9e146570470f1767ea6de324a3d3a46412ae1af72ab66511433b80e18b00938e2626a82bc70cc05e) + self.assertEqual(bp.y, 0x693f46716eb6bc248876203756c9c7624bea73736ca3984087789c1e05a0c2d73ad3ff1ce67c39c4fdbd132c4ed7c8ad9808795bf230fa14) + self.assertEqual(bp.xy, (bp.x, bp.y)) + + # 2G + bp2 = self.pointG2.copy() + self.assertEqual(bp2.x, 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa955555555555555555555555555555555555555555555555555555555) + self.assertEqual(bp2.y, 0xae05e9634ad7048db359d6205086c2b0036ed7a035884dd7b7e36d728ad8c4b80d6565833a2a3098bbbcb2bed1cda06bdaeafbcdea9386ed) + self.assertEqual(bp2.xy, (bp2.x, bp2.y)) + + # 5G + EccPoint(x=0x7a9f9335a48dcb0e2ba7601eedb50def80cbcf728562ada756d761e8958812808bc0d57a920c3c96f07b2d8cefc6f950d0a99d1092030034, + y=0xadfd751a2517edd3b9109ce4fd580ade260ca1823ab18fced86551f7b698017127d7a4ee59d2b33c58405512881f225443b4731472f435eb, + curve="Ed448") + + # Catch if point is not on the curve + self.assertRaises(ValueError, EccPoint, 34, 35, curve="Ed448") + + def test_set(self): + pointW = EccPoint(0, 1, curve="Ed448") + pointW.set(self.pointG) + self.assertEqual(pointW.x, self.pointG.x) + self.assertEqual(pointW.y, self.pointG.y) + + def test_copy(self): + pointW = self.pointG.copy() + self.assertEqual(pointW.x, self.pointG.x) + self.assertEqual(pointW.y, self.pointG.y) + + def test_equal(self): + pointH = self.pointG.copy() + pointI = self.pointG2.copy() + self.assertEqual(self.pointG, pointH) + self.assertNotEqual(self.pointG, pointI) + + def test_pai(self): + pai = EccPoint(0, 1, curve="Ed448") + self.assertTrue(pai.is_point_at_infinity()) + self.assertEqual(pai, pai.point_at_infinity()) + + def test_negate(self): + negG = -self.pointG + sum = self.pointG + negG + self.assertTrue(sum.is_point_at_infinity()) + + def test_addition(self): + self.assertEqual(self.pointG + self.pointG2, self.pointG3) + self.assertEqual(self.pointG2 + self.pointG, self.pointG3) + self.assertEqual(self.pointG2 + self.pointG.point_at_infinity(), self.pointG2) + self.assertEqual(self.pointG.point_at_infinity() + self.pointG2, self.pointG2) + + G5 = self.pointG2 + self.pointG3 + self.assertEqual(G5.x, 0x7a9f9335a48dcb0e2ba7601eedb50def80cbcf728562ada756d761e8958812808bc0d57a920c3c96f07b2d8cefc6f950d0a99d1092030034) + self.assertEqual(G5.y, 0xadfd751a2517edd3b9109ce4fd580ade260ca1823ab18fced86551f7b698017127d7a4ee59d2b33c58405512881f225443b4731472f435eb) + + def test_inplace_addition(self): + pointH = self.pointG.copy() + pointH += self.pointG + self.assertEqual(pointH, self.pointG2) + pointH += self.pointG + self.assertEqual(pointH, self.pointG3) + pointH += self.pointG.point_at_infinity() + self.assertEqual(pointH, self.pointG3) + + def test_doubling(self): + pointH = self.pointG.copy() + pointH.double() + self.assertEqual(pointH.x, self.pointG2.x) + self.assertEqual(pointH.y, self.pointG2.y) + + # 2*0 + pai = self.pointG.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + def test_scalar_multiply(self): + d = 0 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0) + self.assertEqual(pointH.y, 1) + + d = 1 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG.x) + self.assertEqual(pointH.y, self.pointG.y) + + d = 2 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG2.x) + self.assertEqual(pointH.y, self.pointG2.y) + + d = 3 + pointH = d * self.pointG + self.assertEqual(pointH.x, self.pointG3.x) + self.assertEqual(pointH.y, self.pointG3.y) + + d = 4 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0x49dcbc5c6c0cce2c1419a17226f929ea255a09cf4e0891c693fda4be70c74cc301b7bdf1515dd8ba21aee1798949e120e2ce42ac48ba7f30) + self.assertEqual(pointH.y, 0xd49077e4accde527164b33a5de021b979cb7c02f0457d845c90dc3227b8a5bc1c0d8f97ea1ca9472b5d444285d0d4f5b32e236f86de51839) + + d = 5 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0x7a9f9335a48dcb0e2ba7601eedb50def80cbcf728562ada756d761e8958812808bc0d57a920c3c96f07b2d8cefc6f950d0a99d1092030034) + self.assertEqual(pointH.y, 0xadfd751a2517edd3b9109ce4fd580ade260ca1823ab18fced86551f7b698017127d7a4ee59d2b33c58405512881f225443b4731472f435eb) + + d = 10 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0x77486f9d19f6411cdd35d30d1c3235f71936452c787e5c034134d3e8172278aca61622bc805761ce3dab65118a0122d73b403165d0ed303d) + self.assertEqual(pointH.y, 0x4d2fea0b026be11024f1f0fe7e94e618e8ac17381ada1d1bf7ee293a68ff5d0bf93c1997dc1aabdc0c7e6381428d85b6b1954a89e4cddf67) + + d = 20 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0x3c236422354600fe6763defcc1503737e4ed89e262d0de3ec1e552020f2a56fe3b9e1e012d021072598c3c2821e18268bb8fb8339c0d1216) + self.assertEqual(pointH.y, 0xb555b9721f630ccb05fc466de4c74d3d2781e69eca88e1b040844f04cab39fd946f91c688fa42402bb38fb9c3e61231017020b219b4396e1) + + d = 255 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0xbeb7f8388b05cd9c1aa2e3c0dcf31e2b563659361826225390e7748654f627d5c36cbe627e9019936b56d15d4dad7c337c09bac64ff4197f) + self.assertEqual(pointH.y, 0x1e37312b2dd4e9440c43c6e7725fc4fa3d11e582d4863f1d018e28f50c0efdb1f53f9b01ada7c87fa162b1f0d72401015d57613d25f1ad53) + + d = 256 + pointH = d * self.pointG + self.assertEqual(pointH.x, 0xf19c34feb56730e3e2be761ac0a2a2b24853b281dda019fc35a5ab58e3696beb39609ae756b0d20fb7ccf0d79aaf5f3bca2e4fdb25bfac1c) + self.assertEqual(pointH.y, 0x3beb69cc9111bffcaddc61d363ce6fe5dd44da4aadce78f52e92e985d5442344ced72c4611ed0daac9f4f5661eab73d7a12d25ce8a30241e) + + def test_sizes(self): + self.assertEqual(self.pointG.size_in_bits(), 448) + self.assertEqual(self.pointG.size_in_bytes(), 56) + + +class TestEccKey_Ed448(unittest.TestCase): + + def test_private_key(self): + seed = unhexlify("4adf5d37ac6785e83e99a924f92676d366a78690af59c92b6bdf14f9cdbcf26fdad478109607583d633b60078d61d51d81b7509c5433b0d4c9") + Px = 0x72a01eea003a35f9ac44231dc4aae2a382f351d80bf32508175b0855edcf389aa2bbf308dd961ce361a6e7c2091bc78957f6ebcf3002a617 + Py = 0x9e0d08d84586e9aeefecacb41d049b831f1a3ee0c3eada63e34557b30702b50ab59fb372feff7c30b8cbb7dd51afbe88444ec56238722ec1 + + key = EccKey(curve="Ed448", seed=seed) + self.assertEqual(key.seed, seed) + self.assertEqual(key.d, 0xb07cf179604f83433186e5178760c759c15125ee54ff6f8dcde46e872b709ac82ed0bd0a4e036d774034dcb18a9fb11894657a1485895f80) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, Px) + self.assertEqual(key.pointQ.y, Py) + + point = EccPoint(Px, Py, "ed448") + key = EccKey(curve="Ed448", seed=seed, point=point) + self.assertEqual(key.d, 0xb07cf179604f83433186e5178760c759c15125ee54ff6f8dcde46e872b709ac82ed0bd0a4e036d774034dcb18a9fb11894657a1485895f80) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="ed448", seed=seed) + + # Must not accept d parameter + self.assertRaises(ValueError, EccKey, curve="ed448", d=1) + + def test_public_key(self): + point = EccPoint(_curves['ed448'].Gx, _curves['ed448'].Gy, curve='ed448') + key = EccKey(curve="ed448", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + priv_key = EccKey(curve="ed448", seed=b'H'*57) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_seed(self): + self.assertRaises(ValueError, lambda: EccKey(curve="ed448", seed=b'H' * 56)) + + def test_equality(self): + private_key = ECC.construct(seed=b'H'*57, curve="Ed448") + private_key2 = ECC.construct(seed=b'H'*57, curve="ed448") + private_key3 = ECC.construct(seed=b'C'*57, curve="Ed448") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='ed448') + self.assertIn("curve='Ed448'", repr(key)) + self.assertEqual(key.curve, 'Ed448') + self.assertEqual(key.public_key().curve, 'Ed448') + + +class TestEccModule_Ed448(unittest.TestCase): + + def test_generate(self): + key = ECC.generate(curve="Ed448") + self.assertTrue(key.has_private()) + point = EccPoint(_curves['Ed448'].Gx, _curves['Ed448'].Gy, curve="Ed448") * key.d + self.assertEqual(key.pointQ, point) + + # Always random + key2 = ECC.generate(curve="Ed448") + self.assertNotEqual(key, key2) + + # Other names + ECC.generate(curve="Ed448") + + # Random source + key1 = ECC.generate(curve="Ed448", randfunc=SHAKE128.new().read) + key2 = ECC.generate(curve="Ed448", randfunc=SHAKE128.new().read) + self.assertEqual(key1, key2) + + def test_construct(self): + seed = unhexlify("4adf5d37ac6785e83e99a924f92676d366a78690af59c92b6bdf14f9cdbcf26fdad478109607583d633b60078d61d51d81b7509c5433b0d4c9") + Px = 0x72a01eea003a35f9ac44231dc4aae2a382f351d80bf32508175b0855edcf389aa2bbf308dd961ce361a6e7c2091bc78957f6ebcf3002a617 + Py = 0x9e0d08d84586e9aeefecacb41d049b831f1a3ee0c3eada63e34557b30702b50ab59fb372feff7c30b8cbb7dd51afbe88444ec56238722ec1 + d = 0xb07cf179604f83433186e5178760c759c15125ee54ff6f8dcde46e872b709ac82ed0bd0a4e036d774034dcb18a9fb11894657a1485895f80 + point = EccPoint(Px, Py, curve="Ed448") + + # Private key only + key = ECC.construct(curve="Ed448", seed=seed) + self.assertEqual(key.pointQ, point) + self.assertTrue(key.has_private()) + + # Public key only + key = ECC.construct(curve="Ed448", point_x=Px, point_y=Py) + self.assertEqual(key.pointQ, point) + self.assertFalse(key.has_private()) + + # Private and public key + key = ECC.construct(curve="Ed448", seed=seed, point_x=Px, point_y=Py) + self.assertEqual(key.pointQ, point) + self.assertTrue(key.has_private()) + + # Other names + key = ECC.construct(curve="ed448", seed=seed) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['ed448'].Gx, point_y=_curves['ed448'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="Ed448", **coord) + self.assertRaises(ValueError, ECC.construct, curve="Ed448", d=2, **coordG) + self.assertRaises(ValueError, ECC.construct, curve="Ed448", seed=b'H'*58) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestEccPoint_Ed448) + tests += list_test_cases(TestEccKey_Ed448) + tests += list_test_cases(TestEccModule_Ed448) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py new file mode 100644 index 0000000..cadbd12 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py @@ -0,0 +1,1425 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors + +from Cryptodome.PublicKey import ECC +from Cryptodome.PublicKey.ECC import EccPoint, _curves, EccKey + +from Cryptodome.Math.Numbers import Integer + + +class TestEccPoint(unittest.TestCase): + + def test_mix(self): + + p1 = ECC.generate(curve='P-256').pointQ + p2 = ECC.generate(curve='P-384').pointQ + + try: + p1 + p2 + assert(False) + except ValueError as e: + assert "not on the same curve" in str(e) + + try: + p1 += p2 + assert(False) + except ValueError as e: + assert "not on the same curve" in str(e) + + class OtherKeyType: + pass + + self.assertFalse(p1 == OtherKeyType()) + self.assertTrue(p1 != OtherKeyType()) + + def test_repr(self): + p1 = ECC.construct(curve='P-256', + d=75467964919405407085864614198393977741148485328036093939970922195112333446269, + point_x=20573031766139722500939782666697015100983491952082159880539639074939225934381, + point_y=108863130203210779921520632367477406025152638284581252625277850513266505911389) + self.assertEqual(repr(p1), "EccKey(curve='NIST P-256', point_x=20573031766139722500939782666697015100983491952082159880539639074939225934381, point_y=108863130203210779921520632367477406025152638284581252625277850513266505911389, d=75467964919405407085864614198393977741148485328036093939970922195112333446269)") + + +class TestEccPoint_NIST_P192(unittest.TestCase): + """Tests defined in section 4.1 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdf""" + + pointS = EccPoint( + 0xd458e7d127ae671b0c330266d246769353a012073e97acf8, + 0x325930500d851f336bddc050cf7fb11b5673a1645086df3b, + curve='p192') + + pointT = EccPoint( + 0xf22c4395213e9ebe67ddecdd87fdbd01be16fb059b9753a4, + 0x264424096af2b3597796db48f8dfb41fa9cecc97691a9c79, + curve='p192') + + def test_set(self): + pointW = EccPoint(0, 0) + pointW.set(self.pointS) + self.assertEqual(pointW, self.pointS) + + def test_copy(self): + pointW = self.pointS.copy() + self.assertEqual(pointW, self.pointS) + pointW.set(self.pointT) + self.assertEqual(pointW, self.pointT) + self.assertNotEqual(self.pointS, self.pointT) + + def test_negate(self): + negS = -self.pointS + sum = self.pointS + negS + self.assertEqual(sum, self.pointS.point_at_infinity()) + + def test_addition(self): + pointRx = 0x48e1e4096b9b8e5ca9d0f1f077b8abf58e843894de4d0290 + pointRy = 0x408fa77c797cd7dbfb16aa48a3648d3d63c94117d7b6aa4b + + pointR = self.pointS + self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS + pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai + self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai + pai + self.assertEqual(pointR, pai) + + def test_inplace_addition(self): + pointRx = 0x48e1e4096b9b8e5ca9d0f1f077b8abf58e843894de4d0290 + pointRy = 0x408fa77c797cd7dbfb16aa48a3648d3d63c94117d7b6aa4b + + pointR = self.pointS.copy() + pointR += self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS.copy() + pointR += pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai.copy() + pointR += self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai.copy() + pointR += pai + self.assertEqual(pointR, pai) + + def test_doubling(self): + pointRx = 0x30c5bc6b8c7da25354b373dc14dd8a0eba42d25a3f6e6962 + pointRy = 0x0dde14bc4249a721c407aedbf011e2ddbbcb2968c9d889cf + + pointR = self.pointS.copy() + pointR.double() + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 2*0 + pai = self.pointS.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + # S + S + pointR = self.pointS.copy() + pointR += pointR + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_scalar_multiply(self): + d = 0xa78a236d60baec0c5dd41b33a542463a8255391af64c74ee + pointRx = 0x1faee4205a4f669d2d0a8f25e3bcec9a62a6952965bf6d31 + pointRy = 0x5ff2cdfa508a2581892367087c696f179e7a4d7e8260fb06 + + pointR = self.pointS * d + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 0*S + pai = self.pointS.point_at_infinity() + pointR = self.pointS * 0 + self.assertEqual(pointR, pai) + + # -1*S + self.assertRaises(ValueError, lambda: self.pointS * -1) + + # Reverse order + pointR = d * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pointR = Integer(d) * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_joint_scalar_multiply(self): + d = 0xa78a236d60baec0c5dd41b33a542463a8255391af64c74ee + e = 0xc4be3d53ec3089e71e4de8ceab7cce889bc393cd85b972bc + pointRx = 0x019f64eed8fa9b72b7dfea82c17c9bfa60ecb9e1778b5bde + pointRy = 0x16590c5fcd8655fa4ced33fb800e2a7e3c61f35d83503644 + + pointR = self.pointS * d + self.pointT * e + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_sizes(self): + self.assertEqual(self.pointS.size_in_bits(), 192) + self.assertEqual(self.pointS.size_in_bytes(), 24) + + +class TestEccPoint_NIST_P224(unittest.TestCase): + """Tests defined in section 4.2 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdf""" + + pointS = EccPoint( + 0x6eca814ba59a930843dc814edd6c97da95518df3c6fdf16e9a10bb5b, + 0xef4b497f0963bc8b6aec0ca0f259b89cd80994147e05dc6b64d7bf22, + curve='p224') + + pointT = EccPoint( + 0xb72b25aea5cb03fb88d7e842002969648e6ef23c5d39ac903826bd6d, + 0xc42a8a4d34984f0b71b5b4091af7dceb33ea729c1a2dc8b434f10c34, + curve='p224') + + def test_set(self): + pointW = EccPoint(0, 0) + pointW.set(self.pointS) + self.assertEqual(pointW, self.pointS) + + def test_copy(self): + pointW = self.pointS.copy() + self.assertEqual(pointW, self.pointS) + pointW.set(self.pointT) + self.assertEqual(pointW, self.pointT) + self.assertNotEqual(self.pointS, self.pointT) + + def test_negate(self): + negS = -self.pointS + sum = self.pointS + negS + self.assertEqual(sum, self.pointS.point_at_infinity()) + + def test_addition(self): + pointRx = 0x236f26d9e84c2f7d776b107bd478ee0a6d2bcfcaa2162afae8d2fd15 + pointRy = 0xe53cc0a7904ce6c3746f6a97471297a0b7d5cdf8d536ae25bb0fda70 + + pointR = self.pointS + self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS + pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai + self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai + pai + self.assertEqual(pointR, pai) + + def test_inplace_addition(self): + pointRx = 0x236f26d9e84c2f7d776b107bd478ee0a6d2bcfcaa2162afae8d2fd15 + pointRy = 0xe53cc0a7904ce6c3746f6a97471297a0b7d5cdf8d536ae25bb0fda70 + + pointR = self.pointS.copy() + pointR += self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS.copy() + pointR += pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai.copy() + pointR += self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai.copy() + pointR += pai + self.assertEqual(pointR, pai) + + def test_doubling(self): + pointRx = 0xa9c96f2117dee0f27ca56850ebb46efad8ee26852f165e29cb5cdfc7 + pointRy = 0xadf18c84cf77ced4d76d4930417d9579207840bf49bfbf5837dfdd7d + + pointR = self.pointS.copy() + pointR.double() + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 2*0 + pai = self.pointS.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + # S + S + pointR = self.pointS.copy() + pointR += pointR + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_scalar_multiply(self): + d = 0xa78ccc30eaca0fcc8e36b2dd6fbb03df06d37f52711e6363aaf1d73b + pointRx = 0x96a7625e92a8d72bff1113abdb95777e736a14c6fdaacc392702bca4 + pointRy = 0x0f8e5702942a3c5e13cd2fd5801915258b43dfadc70d15dbada3ed10 + + pointR = self.pointS * d + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 0*S + pai = self.pointS.point_at_infinity() + pointR = self.pointS * 0 + self.assertEqual(pointR, pai) + + # -1*S + self.assertRaises(ValueError, lambda: self.pointS * -1) + + # Reverse order + pointR = d * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pointR = Integer(d) * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_joing_scalar_multiply(self): + d = 0xa78ccc30eaca0fcc8e36b2dd6fbb03df06d37f52711e6363aaf1d73b + e = 0x54d549ffc08c96592519d73e71e8e0703fc8177fa88aa77a6ed35736 + pointRx = 0xdbfe2958c7b2cda1302a67ea3ffd94c918c5b350ab838d52e288c83e + pointRy = 0x2f521b83ac3b0549ff4895abcc7f0c5a861aacb87acbc5b8147bb18b + + pointR = self.pointS * d + self.pointT * e + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_sizes(self): + self.assertEqual(self.pointS.size_in_bits(), 224) + self.assertEqual(self.pointS.size_in_bytes(), 28) + + +class TestEccPoint_NIST_P256(unittest.TestCase): + """Tests defined in section 4.3 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdf""" + + pointS = EccPoint( + 0xde2444bebc8d36e682edd27e0f271508617519b3221a8fa0b77cab3989da97c9, + 0xc093ae7ff36e5380fc01a5aad1e66659702de80f53cec576b6350b243042a256) + + pointT = EccPoint( + 0x55a8b00f8da1d44e62f6b3b25316212e39540dc861c89575bb8cf92e35e0986b, + 0x5421c3209c2d6c704835d82ac4c3dd90f61a8a52598b9e7ab656e9d8c8b24316) + + def test_set(self): + pointW = EccPoint(0, 0) + pointW.set(self.pointS) + self.assertEqual(pointW, self.pointS) + + def test_copy(self): + pointW = self.pointS.copy() + self.assertEqual(pointW, self.pointS) + pointW.set(self.pointT) + self.assertEqual(pointW, self.pointT) + self.assertNotEqual(self.pointS, self.pointT) + + def test_negate(self): + negS = -self.pointS + sum = self.pointS + negS + self.assertEqual(sum, self.pointS.point_at_infinity()) + + def test_addition(self): + pointRx = 0x72b13dd4354b6b81745195e98cc5ba6970349191ac476bd4553cf35a545a067e + pointRy = 0x8d585cbb2e1327d75241a8a122d7620dc33b13315aa5c9d46d013011744ac264 + + pointR = self.pointS + self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS + pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai + self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai + pai + self.assertEqual(pointR, pai) + + def test_inplace_addition(self): + pointRx = 0x72b13dd4354b6b81745195e98cc5ba6970349191ac476bd4553cf35a545a067e + pointRy = 0x8d585cbb2e1327d75241a8a122d7620dc33b13315aa5c9d46d013011744ac264 + + pointR = self.pointS.copy() + pointR += self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS.copy() + pointR += pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai.copy() + pointR += self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai.copy() + pointR += pai + self.assertEqual(pointR, pai) + + def test_doubling(self): + pointRx = 0x7669e6901606ee3ba1a8eef1e0024c33df6c22f3b17481b82a860ffcdb6127b0 + pointRy = 0xfa878162187a54f6c39f6ee0072f33de389ef3eecd03023de10ca2c1db61d0c7 + + pointR = self.pointS.copy() + pointR.double() + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 2*0 + pai = self.pointS.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + # S + S + pointR = self.pointS.copy() + pointR += pointR + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_scalar_multiply(self): + d = 0xc51e4753afdec1e6b6c6a5b992f43f8dd0c7a8933072708b6522468b2ffb06fd + pointRx = 0x51d08d5f2d4278882946d88d83c97d11e62becc3cfc18bedacc89ba34eeca03f + pointRy = 0x75ee68eb8bf626aa5b673ab51f6e744e06f8fcf8a6c0cf3035beca956a7b41d5 + + pointR = self.pointS * d + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 0*S + pai = self.pointS.point_at_infinity() + pointR = self.pointS * 0 + self.assertEqual(pointR, pai) + + # -1*S + self.assertRaises(ValueError, lambda: self.pointS * -1) + + # Reverse order + pointR = d * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pointR = Integer(d) * self.pointS + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_joing_scalar_multiply(self): + d = 0xc51e4753afdec1e6b6c6a5b992f43f8dd0c7a8933072708b6522468b2ffb06fd + e = 0xd37f628ece72a462f0145cbefe3f0b355ee8332d37acdd83a358016aea029db7 + pointRx = 0xd867b4679221009234939221b8046245efcf58413daacbeff857b8588341f6b8 + pointRy = 0xf2504055c03cede12d22720dad69c745106b6607ec7e50dd35d54bd80f615275 + + pointR = self.pointS * d + self.pointT * e + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_sizes(self): + self.assertEqual(self.pointS.size_in_bits(), 256) + self.assertEqual(self.pointS.size_in_bytes(), 32) + + +class TestEccPoint_NIST_P384(unittest.TestCase): + """Tests defined in section 4.4 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdf""" + + pointS = EccPoint( + 0xfba203b81bbd23f2b3be971cc23997e1ae4d89e69cb6f92385dda82768ada415ebab4167459da98e62b1332d1e73cb0e, + 0x5ffedbaefdeba603e7923e06cdb5d0c65b22301429293376d5c6944e3fa6259f162b4788de6987fd59aed5e4b5285e45, + "p384") + + pointT = EccPoint( + 0xaacc05202e7fda6fc73d82f0a66220527da8117ee8f8330ead7d20ee6f255f582d8bd38c5a7f2b40bcdb68ba13d81051, + 0x84009a263fefba7c2c57cffa5db3634d286131afc0fca8d25afa22a7b5dce0d9470da89233cee178592f49b6fecb5092, + "p384") + + def test_set(self): + pointW = EccPoint(0, 0, "p384") + pointW.set(self.pointS) + self.assertEqual(pointW, self.pointS) + + def test_copy(self): + pointW = self.pointS.copy() + self.assertEqual(pointW, self.pointS) + pointW.set(self.pointT) + self.assertEqual(pointW, self.pointT) + self.assertNotEqual(self.pointS, self.pointT) + + def test_negate(self): + negS = -self.pointS + sum = self.pointS + negS + self.assertEqual(sum, self.pointS.point_at_infinity()) + + def test_addition(self): + pointRx = 0x12dc5ce7acdfc5844d939f40b4df012e68f865b89c3213ba97090a247a2fc009075cf471cd2e85c489979b65ee0b5eed + pointRy = 0x167312e58fe0c0afa248f2854e3cddcb557f983b3189b67f21eee01341e7e9fe67f6ee81b36988efa406945c8804a4b0 + + pointR = self.pointS + self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS + pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai + self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai + pai + self.assertEqual(pointR, pai) + + def _test_inplace_addition(self): + pointRx = 0x72b13dd4354b6b81745195e98cc5ba6970349191ac476bd4553cf35a545a067e + pointRy = 0x8d585cbb2e1327d75241a8a122d7620dc33b13315aa5c9d46d013011744ac264 + + pointR = self.pointS.copy() + pointR += self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS.copy() + pointR += pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai.copy() + pointR += self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai.copy() + pointR += pai + self.assertEqual(pointR, pai) + + def test_doubling(self): + pointRx = 0x2a2111b1e0aa8b2fc5a1975516bc4d58017ff96b25e1bdff3c229d5fac3bacc319dcbec29f9478f42dee597b4641504c + pointRy = 0xfa2e3d9dc84db8954ce8085ef28d7184fddfd1344b4d4797343af9b5f9d837520b450f726443e4114bd4e5bdb2f65ddd + + pointR = self.pointS.copy() + pointR.double() + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 2*0 + pai = self.pointS.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + # S + S + pointR = self.pointS.copy() + pointR += pointR + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_scalar_multiply(self): + d = 0xa4ebcae5a665983493ab3e626085a24c104311a761b5a8fdac052ed1f111a5c44f76f45659d2d111a61b5fdd97583480 + pointRx = 0xe4f77e7ffeb7f0958910e3a680d677a477191df166160ff7ef6bb5261f791aa7b45e3e653d151b95dad3d93ca0290ef2 + pointRy = 0xac7dee41d8c5f4a7d5836960a773cfc1376289d3373f8cf7417b0c6207ac32e913856612fc9ff2e357eb2ee05cf9667f + + pointR = self.pointS * d + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 0*S + pai = self.pointS.point_at_infinity() + pointR = self.pointS * 0 + self.assertEqual(pointR, pai) + + # -1*S + self.assertRaises(ValueError, lambda: self.pointS * -1) + + def test_joing_scalar_multiply(self): + d = 0xa4ebcae5a665983493ab3e626085a24c104311a761b5a8fdac052ed1f111a5c44f76f45659d2d111a61b5fdd97583480 + e = 0xafcf88119a3a76c87acbd6008e1349b29f4ba9aa0e12ce89bcfcae2180b38d81ab8cf15095301a182afbc6893e75385d + pointRx = 0x917ea28bcd641741ae5d18c2f1bd917ba68d34f0f0577387dc81260462aea60e2417b8bdc5d954fc729d211db23a02dc + pointRy = 0x1a29f7ce6d074654d77b40888c73e92546c8f16a5ff6bcbd307f758d4aee684beff26f6742f597e2585c86da908f7186 + + pointR = self.pointS * d + self.pointT * e + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_sizes(self): + self.assertEqual(self.pointS.size_in_bits(), 384) + self.assertEqual(self.pointS.size_in_bytes(), 48) + + +class TestEccPoint_NIST_P521(unittest.TestCase): + """Tests defined in section 4.5 of https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.204.9073&rep=rep1&type=pdf""" + + pointS = EccPoint( + 0x000001d5c693f66c08ed03ad0f031f937443458f601fd098d3d0227b4bf62873af50740b0bb84aa157fc847bcf8dc16a8b2b8bfd8e2d0a7d39af04b089930ef6dad5c1b4, + 0x00000144b7770963c63a39248865ff36b074151eac33549b224af5c8664c54012b818ed037b2b7c1a63ac89ebaa11e07db89fcee5b556e49764ee3fa66ea7ae61ac01823, + "p521") + + pointT = EccPoint( + 0x000000f411f2ac2eb971a267b80297ba67c322dba4bb21cec8b70073bf88fc1ca5fde3ba09e5df6d39acb2c0762c03d7bc224a3e197feaf760d6324006fe3be9a548c7d5, + 0x000001fdf842769c707c93c630df6d02eff399a06f1b36fb9684f0b373ed064889629abb92b1ae328fdb45534268384943f0e9222afe03259b32274d35d1b9584c65e305, + "p521") + + def test_set(self): + pointW = EccPoint(0, 0) + pointW.set(self.pointS) + self.assertEqual(pointW, self.pointS) + + def test_copy(self): + pointW = self.pointS.copy() + self.assertEqual(pointW, self.pointS) + pointW.set(self.pointT) + self.assertEqual(pointW, self.pointT) + self.assertNotEqual(self.pointS, self.pointT) + + def test_negate(self): + negS = -self.pointS + sum = self.pointS + negS + self.assertEqual(sum, self.pointS.point_at_infinity()) + + def test_addition(self): + pointRx = 0x000001264ae115ba9cbc2ee56e6f0059e24b52c8046321602c59a339cfb757c89a59c358a9a8e1f86d384b3f3b255ea3f73670c6dc9f45d46b6a196dc37bbe0f6b2dd9e9 + pointRy = 0x00000062a9c72b8f9f88a271690bfa017a6466c31b9cadc2fc544744aeb817072349cfddc5ad0e81b03f1897bd9c8c6efbdf68237dc3bb00445979fb373b20c9a967ac55 + + pointR = self.pointS + self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS + pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai + self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai + pai + self.assertEqual(pointR, pai) + + def test_inplace_addition(self): + pointRx = 0x000001264ae115ba9cbc2ee56e6f0059e24b52c8046321602c59a339cfb757c89a59c358a9a8e1f86d384b3f3b255ea3f73670c6dc9f45d46b6a196dc37bbe0f6b2dd9e9 + pointRy = 0x00000062a9c72b8f9f88a271690bfa017a6466c31b9cadc2fc544744aeb817072349cfddc5ad0e81b03f1897bd9c8c6efbdf68237dc3bb00445979fb373b20c9a967ac55 + + pointR = self.pointS.copy() + pointR += self.pointT + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + pai = pointR.point_at_infinity() + + # S + 0 + pointR = self.pointS.copy() + pointR += pai + self.assertEqual(pointR, self.pointS) + + # 0 + S + pointR = pai.copy() + pointR += self.pointS + self.assertEqual(pointR, self.pointS) + + # 0 + 0 + pointR = pai.copy() + pointR += pai + self.assertEqual(pointR, pai) + + def test_doubling(self): + pointRx = 0x0000012879442f2450c119e7119a5f738be1f1eba9e9d7c6cf41b325d9ce6d643106e9d61124a91a96bcf201305a9dee55fa79136dc700831e54c3ca4ff2646bd3c36bc6 + pointRy = 0x0000019864a8b8855c2479cbefe375ae553e2393271ed36fadfc4494fc0583f6bd03598896f39854abeae5f9a6515a021e2c0eef139e71de610143f53382f4104dccb543 + + pointR = self.pointS.copy() + pointR.double() + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 2*0 + pai = self.pointS.point_at_infinity() + pointR = pai.copy() + pointR.double() + self.assertEqual(pointR, pai) + + # S + S + pointR = self.pointS.copy() + pointR += pointR + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_scalar_multiply(self): + d = 0x000001eb7f81785c9629f136a7e8f8c674957109735554111a2a866fa5a166699419bfa9936c78b62653964df0d6da940a695c7294d41b2d6600de6dfcf0edcfc89fdcb1 + pointRx = 0x00000091b15d09d0ca0353f8f96b93cdb13497b0a4bb582ae9ebefa35eee61bf7b7d041b8ec34c6c00c0c0671c4ae063318fb75be87af4fe859608c95f0ab4774f8c95bb + pointRy = 0x00000130f8f8b5e1abb4dd94f6baaf654a2d5810411e77b7423965e0c7fd79ec1ae563c207bd255ee9828eb7a03fed565240d2cc80ddd2cecbb2eb50f0951f75ad87977f + + pointR = self.pointS * d + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + # 0*S + pai = self.pointS.point_at_infinity() + pointR = self.pointS * 0 + self.assertEqual(pointR, pai) + + # -1*S + self.assertRaises(ValueError, lambda: self.pointS * -1) + + def test_joing_scalar_multiply(self): + d = 0x000001eb7f81785c9629f136a7e8f8c674957109735554111a2a866fa5a166699419bfa9936c78b62653964df0d6da940a695c7294d41b2d6600de6dfcf0edcfc89fdcb1 + e = 0x00000137e6b73d38f153c3a7575615812608f2bab3229c92e21c0d1c83cfad9261dbb17bb77a63682000031b9122c2f0cdab2af72314be95254de4291a8f85f7c70412e3 + pointRx = 0x0000009d3802642b3bea152beb9e05fba247790f7fc168072d363340133402f2585588dc1385d40ebcb8552f8db02b23d687cae46185b27528adb1bf9729716e4eba653d + pointRy = 0x0000000fe44344e79da6f49d87c1063744e5957d9ac0a505bafa8281c9ce9ff25ad53f8da084a2deb0923e46501de5797850c61b229023dd9cf7fc7f04cd35ebb026d89d + + pointR = self.pointS * d + pointR += self.pointT * e + self.assertEqual(pointR.x, pointRx) + self.assertEqual(pointR.y, pointRy) + + def test_sizes(self): + self.assertEqual(self.pointS.size_in_bits(), 521) + self.assertEqual(self.pointS.size_in_bytes(), 66) + + +class TestEccPoint_PAI_P192(unittest.TestCase): + """Test vectors from http://point-at-infinity.org/ecc/nisttv""" + + curve = _curves['p192'] + pointG = EccPoint(curve.Gx, curve.Gy, "p192") + + +tv_pai = load_test_vectors(("PublicKey", "ECC"), + "point-at-infinity.org-P192.txt", + "P-192 tests from point-at-infinity.org", + {"k": lambda k: int(k), + "x": lambda x: int(x, 16), + "y": lambda y: int(y, 16)}) or [] +for tv in tv_pai: + def new_test(self, scalar=tv.k, x=tv.x, y=tv.y): + result = self.pointG * scalar + self.assertEqual(result.x, x) + self.assertEqual(result.y, y) + setattr(TestEccPoint_PAI_P192, "test_%d" % tv.count, new_test) + + +class TestEccPoint_PAI_P224(unittest.TestCase): + """Test vectors from http://point-at-infinity.org/ecc/nisttv""" + + curve = _curves['p224'] + pointG = EccPoint(curve.Gx, curve.Gy, "p224") + + +tv_pai = load_test_vectors(("PublicKey", "ECC"), + "point-at-infinity.org-P224.txt", + "P-224 tests from point-at-infinity.org", + {"k": lambda k: int(k), + "x": lambda x: int(x, 16), + "y": lambda y: int(y, 16)}) or [] +for tv in tv_pai: + def new_test(self, scalar=tv.k, x=tv.x, y=tv.y): + result = self.pointG * scalar + self.assertEqual(result.x, x) + self.assertEqual(result.y, y) + setattr(TestEccPoint_PAI_P224, "test_%d" % tv.count, new_test) + + +class TestEccPoint_PAI_P256(unittest.TestCase): + """Test vectors from http://point-at-infinity.org/ecc/nisttv""" + + curve = _curves['p256'] + pointG = EccPoint(curve.Gx, curve.Gy, "p256") + + +tv_pai = load_test_vectors(("PublicKey", "ECC"), + "point-at-infinity.org-P256.txt", + "P-256 tests from point-at-infinity.org", + {"k": lambda k: int(k), + "x": lambda x: int(x, 16), + "y": lambda y: int(y, 16)}) or [] +for tv in tv_pai: + def new_test(self, scalar=tv.k, x=tv.x, y=tv.y): + result = self.pointG * scalar + self.assertEqual(result.x, x) + self.assertEqual(result.y, y) + setattr(TestEccPoint_PAI_P256, "test_%d" % tv.count, new_test) + + +class TestEccPoint_PAI_P384(unittest.TestCase): + """Test vectors from http://point-at-infinity.org/ecc/nisttv""" + + curve = _curves['p384'] + pointG = EccPoint(curve.Gx, curve.Gy, "p384") + + +tv_pai = load_test_vectors(("PublicKey", "ECC"), + "point-at-infinity.org-P384.txt", + "P-384 tests from point-at-infinity.org", + {"k": lambda k: int(k), + "x": lambda x: int(x, 16), + "y": lambda y: int(y, 16)}) or [] +for tv in tv_pai: + def new_test(self, scalar=tv.k, x=tv.x, y=tv.y): + result = self.pointG * scalar + self.assertEqual(result.x, x) + self.assertEqual(result.y, y) + setattr(TestEccPoint_PAI_P384, "test_%d" % tv.count, new_test) + + +class TestEccPoint_PAI_P521(unittest.TestCase): + """Test vectors from http://point-at-infinity.org/ecc/nisttv""" + + curve = _curves['p521'] + pointG = EccPoint(curve.Gx, curve.Gy, "p521") + + +tv_pai = load_test_vectors(("PublicKey", "ECC"), + "point-at-infinity.org-P521.txt", + "P-521 tests from point-at-infinity.org", + {"k": lambda k: int(k), + "x": lambda x: int(x, 16), + "y": lambda y: int(y, 16)}) or [] +for tv in tv_pai: + def new_test(self, scalar=tv.k, x=tv.x, y=tv.y): + result = self.pointG * scalar + self.assertEqual(result.x, x) + self.assertEqual(result.y, y) + setattr(TestEccPoint_PAI_P521, "test_%d" % tv.count, new_test) + + +class TestEccKey_P192(unittest.TestCase): + + def test_private_key(self): + + key = EccKey(curve="P-192", d=1) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, _curves['p192'].Gx) + self.assertEqual(key.pointQ.y, _curves['p192'].Gy) + + point = EccPoint(_curves['p192'].Gx, _curves['p192'].Gy, curve='P-192') + key = EccKey(curve="P-192", d=1, point=point) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="secp192r1", d=1) + key = EccKey(curve="prime192v1", d=1) + + def test_public_key(self): + + point = EccPoint(_curves['p192'].Gx, _curves['p192'].Gy, curve='P-192') + key = EccKey(curve="P-192", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + + priv_key = EccKey(curve="P-192", d=3) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_curve(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-193", d=1)) + + def test_invalid_d(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-192", d=0)) + self.assertRaises(ValueError, lambda: EccKey(curve="P-192", + d=_curves['p192'].order)) + + def test_equality(self): + + private_key = ECC.construct(d=3, curve="P-192") + private_key2 = ECC.construct(d=3, curve="P-192") + private_key3 = ECC.construct(d=4, curve="P-192") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='p192') + self.assertIn("curve='NIST P-192'", repr(key)) + self.assertEqual(key.curve, 'NIST P-192') + self.assertEqual(key.public_key().curve, 'NIST P-192') + + +class TestEccKey_P224(unittest.TestCase): + + def test_private_key(self): + + key = EccKey(curve="P-224", d=1) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, _curves['p224'].Gx) + self.assertEqual(key.pointQ.y, _curves['p224'].Gy) + + point = EccPoint(_curves['p224'].Gx, _curves['p224'].Gy, curve='P-224') + key = EccKey(curve="P-224", d=1, point=point) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="secp224r1", d=1) + key = EccKey(curve="prime224v1", d=1) + + def test_public_key(self): + + point = EccPoint(_curves['p224'].Gx, _curves['p224'].Gy, curve='P-224') + key = EccKey(curve="P-224", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + + priv_key = EccKey(curve="P-224", d=3) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_curve(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-225", d=1)) + + def test_invalid_d(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-224", d=0)) + self.assertRaises(ValueError, lambda: EccKey(curve="P-224", + d=_curves['p224'].order)) + + def test_equality(self): + + private_key = ECC.construct(d=3, curve="P-224") + private_key2 = ECC.construct(d=3, curve="P-224") + private_key3 = ECC.construct(d=4, curve="P-224") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='p224') + self.assertIn("curve='NIST P-224'", repr(key)) + self.assertEqual(key.curve, 'NIST P-224') + self.assertEqual(key.public_key().curve, 'NIST P-224') + + +class TestEccKey_P256(unittest.TestCase): + + def test_private_key(self): + + key = EccKey(curve="P-256", d=1) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, _curves['p256'].Gx) + self.assertEqual(key.pointQ.y, _curves['p256'].Gy) + + point = EccPoint(_curves['p256'].Gx, _curves['p256'].Gy) + key = EccKey(curve="P-256", d=1, point=point) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="secp256r1", d=1) + key = EccKey(curve="prime256v1", d=1) + + # Must not accept d parameter + self.assertRaises(ValueError, EccKey, curve="p256", seed=b'H'*32) + + def test_public_key(self): + + point = EccPoint(_curves['p256'].Gx, _curves['p256'].Gy) + key = EccKey(curve="P-256", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + + priv_key = EccKey(curve="P-256", d=3) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_curve(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-257", d=1)) + + def test_invalid_d(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-256", d=0)) + self.assertRaises(ValueError, lambda: EccKey(curve="P-256", d=_curves['p256'].order)) + + def test_equality(self): + + private_key = ECC.construct(d=3, curve="P-256") + private_key2 = ECC.construct(d=3, curve="P-256") + private_key3 = ECC.construct(d=4, curve="P-256") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='p256') + self.assertIn("curve='NIST P-256'", repr(key)) + self.assertEqual(key.curve, 'NIST P-256') + self.assertEqual(key.public_key().curve, 'NIST P-256') + + +class TestEccKey_P384(unittest.TestCase): + + def test_private_key(self): + + p384 = _curves['p384'] + + key = EccKey(curve="P-384", d=1) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, p384.Gx) + self.assertEqual(key.pointQ.y, p384.Gy) + + point = EccPoint(p384.Gx, p384.Gy, "p384") + key = EccKey(curve="P-384", d=1, point=point) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="p384", d=1) + key = EccKey(curve="secp384r1", d=1) + key = EccKey(curve="prime384v1", d=1) + + def test_public_key(self): + + p384 = _curves['p384'] + point = EccPoint(p384.Gx, p384.Gy, 'p384') + key = EccKey(curve="P-384", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + + priv_key = EccKey(curve="P-384", d=3) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_curve(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-385", d=1)) + + def test_invalid_d(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-384", d=0)) + self.assertRaises(ValueError, lambda: EccKey(curve="P-384", + d=_curves['p384'].order)) + + def test_equality(self): + + private_key = ECC.construct(d=3, curve="P-384") + private_key2 = ECC.construct(d=3, curve="P-384") + private_key3 = ECC.construct(d=4, curve="P-384") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='p384') + self.assertIn("curve='NIST P-384'", repr(key)) + self.assertEqual(key.curve, 'NIST P-384') + self.assertEqual(key.public_key().curve, 'NIST P-384') + + +class TestEccKey_P521(unittest.TestCase): + + def test_private_key(self): + + p521 = _curves['p521'] + + key = EccKey(curve="P-521", d=1) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ.x, p521.Gx) + self.assertEqual(key.pointQ.y, p521.Gy) + + point = EccPoint(p521.Gx, p521.Gy, "p521") + key = EccKey(curve="P-521", d=1, point=point) + self.assertEqual(key.d, 1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, point) + + # Other names + key = EccKey(curve="p521", d=1) + key = EccKey(curve="secp521r1", d=1) + key = EccKey(curve="prime521v1", d=1) + + def test_public_key(self): + + p521 = _curves['p521'] + point = EccPoint(p521.Gx, p521.Gy, 'p521') + key = EccKey(curve="P-384", point=point) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, point) + + def test_public_key_derived(self): + + priv_key = EccKey(curve="P-521", d=3) + pub_key = priv_key.public_key() + self.assertFalse(pub_key.has_private()) + self.assertEqual(priv_key.pointQ, pub_key.pointQ) + + def test_invalid_curve(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-522", d=1)) + + def test_invalid_d(self): + self.assertRaises(ValueError, lambda: EccKey(curve="P-521", d=0)) + self.assertRaises(ValueError, lambda: EccKey(curve="P-521", + d=_curves['p521'].order)) + + def test_equality(self): + + private_key = ECC.construct(d=3, curve="P-521") + private_key2 = ECC.construct(d=3, curve="P-521") + private_key3 = ECC.construct(d=4, curve="P-521") + + public_key = private_key.public_key() + public_key2 = private_key2.public_key() + public_key3 = private_key3.public_key() + + self.assertEqual(private_key, private_key2) + self.assertNotEqual(private_key, private_key3) + + self.assertEqual(public_key, public_key2) + self.assertNotEqual(public_key, public_key3) + + self.assertNotEqual(public_key, private_key) + + def test_name_consistency(self): + key = ECC.generate(curve='p521') + self.assertIn("curve='NIST P-521'", repr(key)) + self.assertEqual(key.curve, 'NIST P-521') + self.assertEqual(key.public_key().curve, 'NIST P-521') + + +class TestEccModule_P192(unittest.TestCase): + + def test_generate(self): + + key = ECC.generate(curve="P-192") + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, EccPoint(_curves['p192'].Gx, + _curves['p192'].Gy, + "P-192") * key.d, + "p192") + + # Other names + ECC.generate(curve="secp192r1") + ECC.generate(curve="prime192v1") + + def test_construct(self): + + key = ECC.construct(curve="P-192", d=1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, _curves['p192'].G) + + key = ECC.construct(curve="P-192", point_x=_curves['p192'].Gx, + point_y=_curves['p192'].Gy) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, _curves['p192'].G) + + # Other names + ECC.construct(curve="p192", d=1) + ECC.construct(curve="secp192r1", d=1) + ECC.construct(curve="prime192v1", d=1) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['p192'].Gx, point_y=_curves['p192'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="P-192", **coord) + self.assertRaises(ValueError, ECC.construct, curve="P-192", d=2, **coordG) + + +class TestEccModule_P224(unittest.TestCase): + + def test_generate(self): + + key = ECC.generate(curve="P-224") + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, EccPoint(_curves['p224'].Gx, + _curves['p224'].Gy, + "P-224") * key.d, + "p224") + + # Other names + ECC.generate(curve="secp224r1") + ECC.generate(curve="prime224v1") + + def test_construct(self): + + key = ECC.construct(curve="P-224", d=1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, _curves['p224'].G) + + key = ECC.construct(curve="P-224", point_x=_curves['p224'].Gx, + point_y=_curves['p224'].Gy) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, _curves['p224'].G) + + # Other names + ECC.construct(curve="p224", d=1) + ECC.construct(curve="secp224r1", d=1) + ECC.construct(curve="prime224v1", d=1) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['p224'].Gx, point_y=_curves['p224'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="P-224", **coord) + self.assertRaises(ValueError, ECC.construct, curve="P-224", d=2, **coordG) + + +class TestEccModule_P256(unittest.TestCase): + + def test_generate(self): + + key = ECC.generate(curve="P-256") + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, EccPoint(_curves['p256'].Gx, + _curves['p256'].Gy) * key.d, + "p256") + + # Other names + ECC.generate(curve="secp256r1") + ECC.generate(curve="prime256v1") + + def test_construct(self): + + key = ECC.construct(curve="P-256", d=1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, _curves['p256'].G) + + key = ECC.construct(curve="P-256", point_x=_curves['p256'].Gx, + point_y=_curves['p256'].Gy) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, _curves['p256'].G) + + # Other names + ECC.construct(curve="p256", d=1) + ECC.construct(curve="secp256r1", d=1) + ECC.construct(curve="prime256v1", d=1) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['p256'].Gx, point_y=_curves['p256'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="P-256", **coord) + self.assertRaises(ValueError, ECC.construct, curve="P-256", d=2, **coordG) + + +class TestEccModule_P384(unittest.TestCase): + + def test_generate(self): + + curve = _curves['p384'] + key = ECC.generate(curve="P-384") + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, EccPoint(curve.Gx, curve.Gy, "p384") * key.d) + + # Other names + ECC.generate(curve="secp384r1") + ECC.generate(curve="prime384v1") + + def test_construct(self): + + curve = _curves['p384'] + key = ECC.construct(curve="P-384", d=1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, _curves['p384'].G) + + key = ECC.construct(curve="P-384", point_x=curve.Gx, point_y=curve.Gy) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, curve.G) + + # Other names + ECC.construct(curve="p384", d=1) + ECC.construct(curve="secp384r1", d=1) + ECC.construct(curve="prime384v1", d=1) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['p384'].Gx, point_y=_curves['p384'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="P-384", **coord) + self.assertRaises(ValueError, ECC.construct, curve="P-384", d=2, **coordG) + + +class TestEccModule_P521(unittest.TestCase): + + def test_generate(self): + + curve = _curves['p521'] + key = ECC.generate(curve="P-521") + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, EccPoint(curve.Gx, curve.Gy, "p521") * key.d) + + # Other names + ECC.generate(curve="secp521r1") + ECC.generate(curve="prime521v1") + + def test_construct(self): + + curve = _curves['p521'] + key = ECC.construct(curve="P-521", d=1) + self.assertTrue(key.has_private()) + self.assertEqual(key.pointQ, _curves['p521'].G) + + key = ECC.construct(curve="P-521", point_x=curve.Gx, point_y=curve.Gy) + self.assertFalse(key.has_private()) + self.assertEqual(key.pointQ, curve.G) + + # Other names + ECC.construct(curve="p521", d=1) + ECC.construct(curve="secp521r1", d=1) + ECC.construct(curve="prime521v1", d=1) + + def test_negative_construct(self): + coord = dict(point_x=10, point_y=4) + coordG = dict(point_x=_curves['p521'].Gx, point_y=_curves['p521'].Gy) + + self.assertRaises(ValueError, ECC.construct, curve="P-521", **coord) + self.assertRaises(ValueError, ECC.construct, curve="P-521", d=2, **coordG) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestEccPoint) + tests += list_test_cases(TestEccPoint_NIST_P192) + tests += list_test_cases(TestEccPoint_NIST_P224) + tests += list_test_cases(TestEccPoint_NIST_P256) + tests += list_test_cases(TestEccPoint_NIST_P384) + tests += list_test_cases(TestEccPoint_NIST_P521) + tests += list_test_cases(TestEccPoint_PAI_P192) + tests += list_test_cases(TestEccPoint_PAI_P224) + tests += list_test_cases(TestEccPoint_PAI_P256) + tests += list_test_cases(TestEccPoint_PAI_P384) + tests += list_test_cases(TestEccPoint_PAI_P521) + tests += list_test_cases(TestEccKey_P192) + tests += list_test_cases(TestEccKey_P224) + tests += list_test_cases(TestEccKey_P256) + tests += list_test_cases(TestEccKey_P384) + tests += list_test_cases(TestEccKey_P521) + tests += list_test_cases(TestEccModule_P192) + tests += list_test_cases(TestEccModule_P224) + tests += list_test_cases(TestEccModule_P256) + tests += list_test_cases(TestEccModule_P384) + tests += list_test_cases(TestEccModule_P521) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py new file mode 100644 index 0000000..67d2e0b --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py @@ -0,0 +1,217 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/PublicKey/test_ElGamal.py: Self-test for the ElGamal primitive +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.PublicKey.ElGamal""" + +__revision__ = "$Id$" + +import unittest +from Cryptodome.SelfTest.st_common import list_test_cases, a2b_hex, b2a_hex +from Cryptodome import Random +from Cryptodome.PublicKey import ElGamal +from Cryptodome.Util.number import bytes_to_long +from Cryptodome.Util.py3compat import * + +class ElGamalTest(unittest.TestCase): + + # + # Test vectors + # + # There seem to be no real ElGamal test vectors available in the + # public domain. The following test vectors have been generated + # with libgcrypt 1.5.0. + # + # Encryption + tve=[ + { + # 256 bits + 'p' :'BA4CAEAAED8CBE952AFD2126C63EB3B345D65C2A0A73D2A3AD4138B6D09BD933', + 'g' :'05', + 'y' :'60D063600ECED7C7C55146020E7A31C4476E9793BEAED420FEC9E77604CAE4EF', + 'x' :'1D391BA2EE3C37FE1BA175A69B2C73A11238AD77675932', + 'k' :'F5893C5BAB4131264066F57AB3D8AD89E391A0B68A68A1', + 'pt' :'48656C6C6F207468657265', + 'ct1':'32BFD5F487966CEA9E9356715788C491EC515E4ED48B58F0F00971E93AAA5EC7', + 'ct2':'7BE8FBFF317C93E82FCEF9BD515284BA506603FEA25D01C0CB874A31F315EE68' + }, + + { + # 512 bits + 'p' :'F1B18AE9F7B4E08FDA9A04832F4E919D89462FD31BF12F92791A93519F75076D6CE3942689CDFF2F344CAFF0F82D01864F69F3AECF566C774CBACF728B81A227', + 'g' :'07', + 'y' :'688628C676E4F05D630E1BE39D0066178CA7AA83836B645DE5ADD359B4825A12B02EF4252E4E6FA9BEC1DB0BE90F6D7C8629CABB6E531F472B2664868156E20C', + 'x' :'14E60B1BDFD33436C0DA8A22FDC14A2CCDBBED0627CE68', + 'k' :'38DBF14E1F319BDA9BAB33EEEADCAF6B2EA5250577ACE7', + 'pt' :'48656C6C6F207468657265', + 'ct1':'290F8530C2CC312EC46178724F196F308AD4C523CEABB001FACB0506BFED676083FE0F27AC688B5C749AB3CB8A80CD6F7094DBA421FB19442F5A413E06A9772B', + 'ct2':'1D69AAAD1DC50493FB1B8E8721D621D683F3BF1321BE21BC4A43E11B40C9D4D9C80DE3AAC2AB60D31782B16B61112E68220889D53C4C3136EE6F6CE61F8A23A0' + } + ] + + # Signature + tvs=[ + { + # 256 bits + 'p' :'D2F3C41EA66530838A704A48FFAC9334F4701ECE3A97CEE4C69DD01AE7129DD7', + 'g' :'05', + 'y' :'C3F9417DC0DAFEA6A05C1D2333B7A95E63B3F4F28CC962254B3256984D1012E7', + 'x' :'165E4A39BE44D5A2D8B1332D416BC559616F536BC735BB', + 'k' :'C7F0C794A7EAD726E25A47FF8928013680E73C51DD3D7D99BFDA8F492585928F', + 'h' :'48656C6C6F207468657265', + 'sig1':'35CA98133779E2073EF31165AFCDEB764DD54E96ADE851715495F9C635E1E7C2', + 'sig2':'0135B88B1151279FE5D8078D4FC685EE81177EE9802AB123A73925FC1CB059A7', + }, + { + # 512 bits + 'p' :'E24CF3A4B8A6AF749DCA6D714282FE4AABEEE44A53BB6ED15FBE32B5D3C3EF9CC4124A2ECA331F3C1C1B667ACA3766825217E7B5F9856648D95F05330C6A19CF', + 'g' :'0B', + 'y' :'2AD3A1049CA5D4ED207B2431C79A8719BB4073D4A94E450EA6CEE8A760EB07ADB67C0D52C275EE85D7B52789061EE45F2F37D9B2AE522A51C28329766BFE68AC', + 'x' :'16CBB4F46D9ECCF24FF9F7E63CAA3BD8936341555062AB', + 'k' :'8A3D89A4E429FD2476D7D717251FB79BF900FFE77444E6BB8299DC3F84D0DD57ABAB50732AE158EA52F5B9E7D8813E81FD9F79470AE22F8F1CF9AEC820A78C69', + 'h' :'48656C6C6F207468657265', + 'sig1':'BE001AABAFFF976EC9016198FBFEA14CBEF96B000CCC0063D3324016F9E91FE80D8F9325812ED24DDB2B4D4CF4430B169880B3CE88313B53255BD4EC0378586F', + 'sig2':'5E266F3F837BA204E3BBB6DBECC0611429D96F8C7CE8F4EFDF9D4CB681C2A954468A357BF4242CEC7418B51DFC081BCD21299EF5B5A0DDEF3A139A1817503DDE', + } + ] + + def test_generate_180(self): + self._test_random_key(180) + + def test_encryption(self): + for tv in self.tve: + d = self.convert_tv(tv, True) + key = ElGamal.construct(d['key']) + ct = key._encrypt(d['pt'], d['k']) + self.assertEqual(ct[0], d['ct1']) + self.assertEqual(ct[1], d['ct2']) + + def test_decryption(self): + for tv in self.tve: + d = self.convert_tv(tv, True) + key = ElGamal.construct(d['key']) + pt = key._decrypt((d['ct1'], d['ct2'])) + self.assertEqual(pt, d['pt']) + + def test_signing(self): + for tv in self.tvs: + d = self.convert_tv(tv, True) + key = ElGamal.construct(d['key']) + sig1, sig2 = key._sign(d['h'], d['k']) + self.assertEqual(sig1, d['sig1']) + self.assertEqual(sig2, d['sig2']) + + def test_verification(self): + for tv in self.tvs: + d = self.convert_tv(tv, True) + key = ElGamal.construct(d['key']) + # Positive test + res = key._verify( d['h'], (d['sig1'],d['sig2']) ) + self.assertTrue(res) + # Negative test + res = key._verify( d['h'], (d['sig1']+1,d['sig2']) ) + self.assertFalse(res) + + def test_bad_key3(self): + tup = tup0 = list(self.convert_tv(self.tvs[0], 1)['key'])[:3] + tup[0] += 1 # p += 1 (not prime) + self.assertRaises(ValueError, ElGamal.construct, tup) + + tup = tup0 + tup[1] = 1 # g = 1 + self.assertRaises(ValueError, ElGamal.construct, tup) + + tup = tup0 + tup[2] = tup[0]*2 # y = 2*p + self.assertRaises(ValueError, ElGamal.construct, tup) + + def test_bad_key4(self): + tup = tup0 = list(self.convert_tv(self.tvs[0], 1)['key']) + tup[3] += 1 # x += 1 + self.assertRaises(ValueError, ElGamal.construct, tup) + + def convert_tv(self, tv, as_longs=0): + """Convert a test vector from textual form (hexadecimal ascii + to either integers or byte strings.""" + key_comps = 'p','g','y','x' + tv2 = {} + for c in tv.keys(): + tv2[c] = a2b_hex(tv[c]) + if as_longs or c in key_comps or c in ('sig1','sig2'): + tv2[c] = bytes_to_long(tv2[c]) + tv2['key']=[] + for c in key_comps: + tv2['key'] += [tv2[c]] + del tv2[c] + return tv2 + + def _test_random_key(self, bits): + elgObj = ElGamal.generate(bits, Random.new().read) + self._check_private_key(elgObj) + self._exercise_primitive(elgObj) + pub = elgObj.publickey() + self._check_public_key(pub) + self._exercise_public_primitive(elgObj) + + def _check_private_key(self, elgObj): + + # Check capabilities + self.assertTrue(elgObj.has_private()) + + # Sanity check key data + self.assertTrue(1 +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.PublicKey.RSA""" + +__revision__ = "$Id$" + +import os +import pickle +from pickle import PicklingError +from Cryptodome.Util.py3compat import * + +import unittest +from Cryptodome.SelfTest.st_common import list_test_cases, a2b_hex, b2a_hex + +class RSATest(unittest.TestCase): + # Test vectors from "RSA-OAEP and RSA-PSS test vectors (.zip file)" + # ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip + # See RSADSI's PKCS#1 page at + # http://www.rsa.com/rsalabs/node.asp?id=2125 + + # from oaep-int.txt + + # TODO: PyCryptodome treats the message as starting *after* the leading "00" + # TODO: That behaviour should probably be changed in the future. + plaintext = """ + eb 7a 19 ac e9 e3 00 63 50 e3 29 50 4b 45 e2 + ca 82 31 0b 26 dc d8 7d 5c 68 f1 ee a8 f5 52 67 + c3 1b 2e 8b b4 25 1f 84 d7 e0 b2 c0 46 26 f5 af + f9 3e dc fb 25 c9 c2 b3 ff 8a e1 0e 83 9a 2d db + 4c dc fe 4f f4 77 28 b4 a1 b7 c1 36 2b aa d2 9a + b4 8d 28 69 d5 02 41 21 43 58 11 59 1b e3 92 f9 + 82 fb 3e 87 d0 95 ae b4 04 48 db 97 2f 3a c1 4f + 7b c2 75 19 52 81 ce 32 d2 f1 b7 6d 4d 35 3e 2d + """ + + ciphertext = """ + 12 53 e0 4d c0 a5 39 7b b4 4a 7a b8 7e 9b f2 a0 + 39 a3 3d 1e 99 6f c8 2a 94 cc d3 00 74 c9 5d f7 + 63 72 20 17 06 9e 52 68 da 5d 1c 0b 4f 87 2c f6 + 53 c1 1d f8 23 14 a6 79 68 df ea e2 8d ef 04 bb + 6d 84 b1 c3 1d 65 4a 19 70 e5 78 3b d6 eb 96 a0 + 24 c2 ca 2f 4a 90 fe 9f 2e f5 c9 c1 40 e5 bb 48 + da 95 36 ad 87 00 c8 4f c9 13 0a de a7 4e 55 8d + 51 a7 4d df 85 d8 b5 0d e9 68 38 d6 06 3e 09 55 + """ + + modulus = """ + bb f8 2f 09 06 82 ce 9c 23 38 ac 2b 9d a8 71 f7 + 36 8d 07 ee d4 10 43 a4 40 d6 b6 f0 74 54 f5 1f + b8 df ba af 03 5c 02 ab 61 ea 48 ce eb 6f cd 48 + 76 ed 52 0d 60 e1 ec 46 19 71 9d 8a 5b 8b 80 7f + af b8 e0 a3 df c7 37 72 3e e6 b4 b7 d9 3a 25 84 + ee 6a 64 9d 06 09 53 74 88 34 b2 45 45 98 39 4e + e0 aa b1 2d 7b 61 a5 1f 52 7a 9a 41 f6 c1 68 7f + e2 53 72 98 ca 2a 8f 59 46 f8 e5 fd 09 1d bd cb + """ + + e = 0x11 # public exponent + + prime_factor = """ + c9 7f b1 f0 27 f4 53 f6 34 12 33 ea aa d1 d9 35 + 3f 6c 42 d0 88 66 b1 d0 5a 0f 20 35 02 8b 9d 86 + 98 40 b4 16 66 b4 2e 92 ea 0d a3 b4 32 04 b5 cf + ce 33 52 52 4d 04 16 a5 a4 41 e7 00 af 46 15 03 + """ + + def setUp(self): + global RSA, Random, bytes_to_long + from Cryptodome.PublicKey import RSA + from Cryptodome import Random + from Cryptodome.Util.number import bytes_to_long, inverse + self.n = bytes_to_long(a2b_hex(self.modulus)) + self.p = bytes_to_long(a2b_hex(self.prime_factor)) + + # Compute q, d, and u from n, e, and p + self.q = self.n // self.p + self.d = inverse(self.e, (self.p-1)*(self.q-1)) + self.u = inverse(self.p, self.q) # u = e**-1 (mod q) + + self.rsa = RSA + + def test_generate_1arg(self): + """RSA (default implementation) generated key (1 argument)""" + rsaObj = self.rsa.generate(1024) + self._check_private_key(rsaObj) + self._exercise_primitive(rsaObj) + pub = rsaObj.public_key() + self._check_public_key(pub) + self._exercise_public_primitive(rsaObj) + + def test_generate_2arg(self): + """RSA (default implementation) generated key (2 arguments)""" + rsaObj = self.rsa.generate(1024, Random.new().read) + self._check_private_key(rsaObj) + self._exercise_primitive(rsaObj) + pub = rsaObj.public_key() + self._check_public_key(pub) + self._exercise_public_primitive(rsaObj) + + def test_generate_3args(self): + rsaObj = self.rsa.generate(1024, Random.new().read,e=65537) + self._check_private_key(rsaObj) + self._exercise_primitive(rsaObj) + pub = rsaObj.public_key() + self._check_public_key(pub) + self._exercise_public_primitive(rsaObj) + self.assertEqual(65537,rsaObj.e) + + def test_construct_2tuple(self): + """RSA (default implementation) constructed key (2-tuple)""" + pub = self.rsa.construct((self.n, self.e)) + self._check_public_key(pub) + self._check_encryption(pub) + + def test_construct_3tuple(self): + """RSA (default implementation) constructed key (3-tuple)""" + rsaObj = self.rsa.construct((self.n, self.e, self.d)) + self._check_encryption(rsaObj) + self._check_decryption(rsaObj) + + def test_construct_4tuple(self): + """RSA (default implementation) constructed key (4-tuple)""" + rsaObj = self.rsa.construct((self.n, self.e, self.d, self.p)) + self._check_encryption(rsaObj) + self._check_decryption(rsaObj) + + def test_construct_5tuple(self): + """RSA (default implementation) constructed key (5-tuple)""" + rsaObj = self.rsa.construct((self.n, self.e, self.d, self.p, self.q)) + self._check_private_key(rsaObj) + self._check_encryption(rsaObj) + self._check_decryption(rsaObj) + + def test_construct_6tuple(self): + """RSA (default implementation) constructed key (6-tuple)""" + rsaObj = self.rsa.construct((self.n, self.e, self.d, self.p, self.q, self.u)) + self._check_private_key(rsaObj) + self._check_encryption(rsaObj) + self._check_decryption(rsaObj) + + def test_construct_bad_key2(self): + tup = (self.n, 1) + self.assertRaises(ValueError, self.rsa.construct, tup) + + # An even modulus is wrong + tup = (self.n+1, self.e) + self.assertRaises(ValueError, self.rsa.construct, tup) + + def test_construct_bad_key3(self): + tup = (self.n, self.e, self.d+1) + self.assertRaises(ValueError, self.rsa.construct, tup) + + def test_construct_bad_key5(self): + tup = (self.n, self.e, self.d, self.p, self.p) + self.assertRaises(ValueError, self.rsa.construct, tup) + + tup = (self.p*self.p, self.e, self.p, self.p) + self.assertRaises(ValueError, self.rsa.construct, tup) + + tup = (self.p*self.p, 3, self.p, self.q) + self.assertRaises(ValueError, self.rsa.construct, tup) + + def test_construct_bad_key6(self): + tup = (self.n, self.e, self.d, self.p, self.q, 10) + self.assertRaises(ValueError, self.rsa.construct, tup) + + from Cryptodome.Util.number import inverse + tup = (self.n, self.e, self.d, self.p, self.q, inverse(self.q, self.p)) + self.assertRaises(ValueError, self.rsa.construct, tup) + + def test_factoring(self): + rsaObj = self.rsa.construct([self.n, self.e, self.d]) + self.assertTrue(rsaObj.p==self.p or rsaObj.p==self.q) + self.assertTrue(rsaObj.q==self.p or rsaObj.q==self.q) + self.assertTrue(rsaObj.q*rsaObj.p == self.n) + + self.assertRaises(ValueError, self.rsa.construct, [self.n, self.e, self.n-1]) + + def test_repr(self): + rsaObj = self.rsa.construct((self.n, self.e, self.d, self.p, self.q)) + repr(rsaObj) + + def test_serialization(self): + """RSA keys are unpickable""" + + rsa_key = self.rsa.generate(1024) + self.assertRaises(PicklingError, pickle.dumps, rsa_key) + + def test_raw_rsa_boundary(self): + # The argument of every RSA raw operation (encrypt/decrypt) must be + # non-negative and no larger than the modulus + rsa_obj = self.rsa.generate(1024) + + self.assertRaises(ValueError, rsa_obj._decrypt, rsa_obj.n) + self.assertRaises(ValueError, rsa_obj._encrypt, rsa_obj.n) + + self.assertRaises(ValueError, rsa_obj._decrypt, -1) + self.assertRaises(ValueError, rsa_obj._encrypt, -1) + + def test_size(self): + pub = self.rsa.construct((self.n, self.e)) + self.assertEqual(pub.size_in_bits(), 1024) + self.assertEqual(pub.size_in_bytes(), 128) + + def _check_private_key(self, rsaObj): + from Cryptodome.Math.Numbers import Integer + + # Check capabilities + self.assertEqual(1, rsaObj.has_private()) + + # Sanity check key data + self.assertEqual(rsaObj.n, rsaObj.p * rsaObj.q) # n = pq + lcm = int(Integer(rsaObj.p-1).lcm(rsaObj.q-1)) + self.assertEqual(1, rsaObj.d * rsaObj.e % lcm) # ed = 1 (mod LCM(p-1, q-1)) + self.assertEqual(1, rsaObj.p * rsaObj.u % rsaObj.q) # pu = 1 (mod q) + self.assertEqual(1, rsaObj.p > 1) # p > 1 + self.assertEqual(1, rsaObj.q > 1) # q > 1 + self.assertEqual(1, rsaObj.e > 1) # e > 1 + self.assertEqual(1, rsaObj.d > 1) # d > 1 + + self.assertEqual(rsaObj.u, rsaObj.invp) + self.assertEqual(1, rsaObj.q * rsaObj.invq % rsaObj.p) + + def _check_public_key(self, rsaObj): + ciphertext = a2b_hex(self.ciphertext) + + # Check capabilities + self.assertEqual(0, rsaObj.has_private()) + + # Check rsaObj.[ne] -> rsaObj.[ne] mapping + self.assertEqual(rsaObj.n, rsaObj.n) + self.assertEqual(rsaObj.e, rsaObj.e) + + # Check that private parameters are all missing + self.assertEqual(0, hasattr(rsaObj, 'd')) + self.assertEqual(0, hasattr(rsaObj, 'p')) + self.assertEqual(0, hasattr(rsaObj, 'q')) + self.assertEqual(0, hasattr(rsaObj, 'u')) + + # Sanity check key data + self.assertEqual(1, rsaObj.e > 1) # e > 1 + + # Public keys should not be able to sign or decrypt + self.assertRaises(TypeError, rsaObj._decrypt, + bytes_to_long(ciphertext)) + + # Check __eq__ and __ne__ + self.assertEqual(rsaObj.public_key() == rsaObj.public_key(),True) # assert_ + self.assertEqual(rsaObj.public_key() != rsaObj.public_key(),False) # assertFalse + + self.assertEqual(rsaObj.publickey(), rsaObj.public_key()) + + def _exercise_primitive(self, rsaObj): + # Since we're using a randomly-generated key, we can't check the test + # vector, but we can make sure encryption and decryption are inverse + # operations. + ciphertext = bytes_to_long(a2b_hex(self.ciphertext)) + + # Test decryption + plaintext = rsaObj._decrypt(ciphertext) + + # Test encryption (2 arguments) + new_ciphertext2 = rsaObj._encrypt(plaintext) + self.assertEqual(ciphertext, new_ciphertext2) + + def _exercise_public_primitive(self, rsaObj): + plaintext = a2b_hex(self.plaintext) + + # Test encryption (2 arguments) + new_ciphertext2 = rsaObj._encrypt(bytes_to_long(plaintext)) + + def _check_encryption(self, rsaObj): + plaintext = a2b_hex(self.plaintext) + ciphertext = a2b_hex(self.ciphertext) + + # Test encryption + new_ciphertext2 = rsaObj._encrypt(bytes_to_long(plaintext)) + self.assertEqual(bytes_to_long(ciphertext), new_ciphertext2) + + def _check_decryption(self, rsaObj): + plaintext = bytes_to_long(a2b_hex(self.plaintext)) + ciphertext = bytes_to_long(a2b_hex(self.ciphertext)) + + # Test plain decryption + new_plaintext = rsaObj._decrypt(ciphertext) + self.assertEqual(plaintext, new_plaintext) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(RSATest) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py new file mode 100644 index 0000000..5ff0113 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py @@ -0,0 +1,554 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/PublicKey/test_import_DSA.py: Self-test for importing DSA keys +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +import unittest +import re + +from Cryptodome.PublicKey import DSA +from Cryptodome.SelfTest.st_common import * +from Cryptodome.Util.py3compat import * + +from binascii import unhexlify + +class ImportKeyTests(unittest.TestCase): + + y = 92137165128186062214622779787483327510946462589285775188003362705875131352591574106484271700740858696583623951844732128165434284507709057439633739849986759064015013893156866539696757799934634945787496920169462601722830899660681779448742875054459716726855443681559131362852474817534616736104831095601710736729 + p = 162452170958135306109773853318304545923250830605675936228618290525164105310663722368377131295055868997377338797580997938253236213714988311430600065853662861806894003694743806769284131194035848116051021923956699231855223389086646903420682639786976554552864568460372266462812137447840653688476258666833303658691 + q = 988791743931120302950649732173330531512663554851 + g = 85583152299197514738065570254868711517748965097380456700369348466136657764813442044039878840094809620913085570225318356734366886985903212775602770761953571967834823306046501307810937486758039063386311593890777319935391363872375452381836756832784184928202587843258855704771836753434368484556809100537243908232 + x = 540873410045082450874416847965843801027716145253 + + def setUp(self): + + # It is easier to write test vectors in text form, + # and convert them to byte strigs dynamically here + for mname, mvalue in ImportKeyTests.__dict__.items(): + if mname[:4] in ('der_', 'pem_', 'ssh_'): + if mname[:4] == 'der_': + mvalue = unhexlify(tobytes(mvalue)) + mvalue = tobytes(mvalue) + setattr(self, mname, mvalue) + + # 1. SubjectPublicKeyInfo + der_public=\ + '308201b73082012b06072a8648ce3804013082011e02818100e756ee1717f4b6'+\ + '794c7c214724a19763742c45572b4b3f8ff3b44f3be9f44ce039a2757695ec91'+\ + '5697da74ef914fcd1b05660e2419c761d639f45d2d79b802dbd23e7ab8b81b47'+\ + '9a380e1f30932584ba2a0b955032342ebc83cb5ca906e7b0d7cd6fe656cecb4c'+\ + '8b5a77123a8c6750a481e3b06057aff6aa6eba620b832d60c3021500ad32f48c'+\ + 'd3ae0c45a198a61fa4b5e20320763b2302818079dfdc3d614fe635fceb7eaeae'+\ + '3718dc2efefb45282993ac6749dc83c223d8c1887296316b3b0b54466cf444f3'+\ + '4b82e3554d0b90a778faaf1306f025dae6a3e36c7f93dd5bac4052b92370040a'+\ + 'ca70b8d5820599711900efbc961812c355dd9beffe0981da85c5548074b41c56'+\ + 'ae43fd300d89262e4efd89943f99a651b03888038185000281810083352a69a1'+\ + '32f34843d2a0eb995bff4e2f083a73f0049d2c91ea2f0ce43d144abda48199e4'+\ + 'b003c570a8af83303d45105f606c5c48d925a40ed9c2630c2fa4cdbf838539de'+\ + 'b9a29f919085f2046369f627ca84b2cb1e2c7940564b670f963ab1164d4e2ca2'+\ + 'bf6ffd39f12f548928bf4d2d1b5e6980b4f1be4c92a91986fba559' + + def testImportKey1(self): + key_obj = DSA.importKey(self.der_public) + self.assertFalse(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + + def testExportKey1(self): + tup = (self.y, self.g, self.p, self.q) + key = DSA.construct(tup) + encoded = key.export_key('DER') + self.assertEqual(self.der_public, encoded) + + # 2. + pem_public="""\ +-----BEGIN PUBLIC KEY----- +MIIBtzCCASsGByqGSM44BAEwggEeAoGBAOdW7hcX9LZ5THwhRyShl2N0LEVXK0s/ +j/O0Tzvp9EzgOaJ1dpXskVaX2nTvkU/NGwVmDiQZx2HWOfRdLXm4AtvSPnq4uBtH +mjgOHzCTJYS6KguVUDI0LryDy1ypBuew181v5lbOy0yLWncSOoxnUKSB47BgV6/2 +qm66YguDLWDDAhUArTL0jNOuDEWhmKYfpLXiAyB2OyMCgYB539w9YU/mNfzrfq6u +NxjcLv77RSgpk6xnSdyDwiPYwYhyljFrOwtURmz0RPNLguNVTQuQp3j6rxMG8CXa +5qPjbH+T3VusQFK5I3AECspwuNWCBZlxGQDvvJYYEsNV3Zvv/gmB2oXFVIB0tBxW +rkP9MA2JJi5O/YmUP5mmUbA4iAOBhQACgYEAgzUqaaEy80hD0qDrmVv/Ti8IOnPw +BJ0skeovDOQ9FEq9pIGZ5LADxXCor4MwPUUQX2BsXEjZJaQO2cJjDC+kzb+DhTne +uaKfkZCF8gRjafYnyoSyyx4seUBWS2cPljqxFk1OLKK/b/058S9UiSi/TS0bXmmA +tPG+TJKpGYb7pVk= +-----END PUBLIC KEY-----""" + + def testImportKey2(self): + for pem in (self.pem_public, tostr(self.pem_public)): + key_obj = DSA.importKey(pem) + self.assertFalse(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + + def testExportKey2(self): + tup = (self.y, self.g, self.p, self.q) + key = DSA.construct(tup) + encoded = key.export_key('PEM') + self.assertEqual(self.pem_public, encoded) + + # 3. OpenSSL/OpenSSH format + der_private=\ + '308201bb02010002818100e756ee1717f4b6794c7c214724a19763742c45572b'+\ + '4b3f8ff3b44f3be9f44ce039a2757695ec915697da74ef914fcd1b05660e2419'+\ + 'c761d639f45d2d79b802dbd23e7ab8b81b479a380e1f30932584ba2a0b955032'+\ + '342ebc83cb5ca906e7b0d7cd6fe656cecb4c8b5a77123a8c6750a481e3b06057'+\ + 'aff6aa6eba620b832d60c3021500ad32f48cd3ae0c45a198a61fa4b5e2032076'+\ + '3b2302818079dfdc3d614fe635fceb7eaeae3718dc2efefb45282993ac6749dc'+\ + '83c223d8c1887296316b3b0b54466cf444f34b82e3554d0b90a778faaf1306f0'+\ + '25dae6a3e36c7f93dd5bac4052b92370040aca70b8d5820599711900efbc9618'+\ + '12c355dd9beffe0981da85c5548074b41c56ae43fd300d89262e4efd89943f99'+\ + 'a651b038880281810083352a69a132f34843d2a0eb995bff4e2f083a73f0049d'+\ + '2c91ea2f0ce43d144abda48199e4b003c570a8af83303d45105f606c5c48d925'+\ + 'a40ed9c2630c2fa4cdbf838539deb9a29f919085f2046369f627ca84b2cb1e2c'+\ + '7940564b670f963ab1164d4e2ca2bf6ffd39f12f548928bf4d2d1b5e6980b4f1'+\ + 'be4c92a91986fba55902145ebd9a3f0b82069d98420986b314215025756065' + + def testImportKey3(self): + key_obj = DSA.importKey(self.der_private) + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey3(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + encoded = key.export_key('DER', pkcs8=False) + self.assertEqual(self.der_private, encoded) + + # 4. + pem_private="""\ +-----BEGIN DSA PRIVATE KEY----- +MIIBuwIBAAKBgQDnVu4XF/S2eUx8IUckoZdjdCxFVytLP4/ztE876fRM4DmidXaV +7JFWl9p075FPzRsFZg4kGcdh1jn0XS15uALb0j56uLgbR5o4Dh8wkyWEuioLlVAy +NC68g8tcqQbnsNfNb+ZWzstMi1p3EjqMZ1CkgeOwYFev9qpuumILgy1gwwIVAK0y +9IzTrgxFoZimH6S14gMgdjsjAoGAed/cPWFP5jX8636urjcY3C7++0UoKZOsZ0nc +g8Ij2MGIcpYxazsLVEZs9ETzS4LjVU0LkKd4+q8TBvAl2uaj42x/k91brEBSuSNw +BArKcLjVggWZcRkA77yWGBLDVd2b7/4JgdqFxVSAdLQcVq5D/TANiSYuTv2JlD+Z +plGwOIgCgYEAgzUqaaEy80hD0qDrmVv/Ti8IOnPwBJ0skeovDOQ9FEq9pIGZ5LAD +xXCor4MwPUUQX2BsXEjZJaQO2cJjDC+kzb+DhTneuaKfkZCF8gRjafYnyoSyyx4s +eUBWS2cPljqxFk1OLKK/b/058S9UiSi/TS0bXmmAtPG+TJKpGYb7pVkCFF69mj8L +ggadmEIJhrMUIVAldWBl +-----END DSA PRIVATE KEY-----""" + + def testImportKey4(self): + for pem in (self.pem_private, tostr(self.pem_private)): + key_obj = DSA.importKey(pem) + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey4(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + encoded = key.export_key('PEM', pkcs8=False) + self.assertEqual(self.pem_private, encoded) + + # 5. PKCS8 (unencrypted) + der_pkcs8=\ + '3082014a0201003082012b06072a8648ce3804013082011e02818100e756ee17'+\ + '17f4b6794c7c214724a19763742c45572b4b3f8ff3b44f3be9f44ce039a27576'+\ + '95ec915697da74ef914fcd1b05660e2419c761d639f45d2d79b802dbd23e7ab8'+\ + 'b81b479a380e1f30932584ba2a0b955032342ebc83cb5ca906e7b0d7cd6fe656'+\ + 'cecb4c8b5a77123a8c6750a481e3b06057aff6aa6eba620b832d60c3021500ad'+\ + '32f48cd3ae0c45a198a61fa4b5e20320763b2302818079dfdc3d614fe635fceb'+\ + '7eaeae3718dc2efefb45282993ac6749dc83c223d8c1887296316b3b0b54466c'+\ + 'f444f34b82e3554d0b90a778faaf1306f025dae6a3e36c7f93dd5bac4052b923'+\ + '70040aca70b8d5820599711900efbc961812c355dd9beffe0981da85c5548074'+\ + 'b41c56ae43fd300d89262e4efd89943f99a651b03888041602145ebd9a3f0b82'+\ + '069d98420986b314215025756065' + + def testImportKey5(self): + key_obj = DSA.importKey(self.der_pkcs8) + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey5(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + encoded = key.export_key('DER') + self.assertEqual(self.der_pkcs8, encoded) + encoded = key.export_key('DER', pkcs8=True) + self.assertEqual(self.der_pkcs8, encoded) + + # 6. + pem_pkcs8="""\ +-----BEGIN PRIVATE KEY----- +MIIBSgIBADCCASsGByqGSM44BAEwggEeAoGBAOdW7hcX9LZ5THwhRyShl2N0LEVX +K0s/j/O0Tzvp9EzgOaJ1dpXskVaX2nTvkU/NGwVmDiQZx2HWOfRdLXm4AtvSPnq4 +uBtHmjgOHzCTJYS6KguVUDI0LryDy1ypBuew181v5lbOy0yLWncSOoxnUKSB47Bg +V6/2qm66YguDLWDDAhUArTL0jNOuDEWhmKYfpLXiAyB2OyMCgYB539w9YU/mNfzr +fq6uNxjcLv77RSgpk6xnSdyDwiPYwYhyljFrOwtURmz0RPNLguNVTQuQp3j6rxMG +8CXa5qPjbH+T3VusQFK5I3AECspwuNWCBZlxGQDvvJYYEsNV3Zvv/gmB2oXFVIB0 +tBxWrkP9MA2JJi5O/YmUP5mmUbA4iAQWAhRevZo/C4IGnZhCCYazFCFQJXVgZQ== +-----END PRIVATE KEY-----""" + + def testImportKey6(self): + for pem in (self.pem_pkcs8, tostr(self.pem_pkcs8)): + key_obj = DSA.importKey(pem) + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey6(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + encoded = key.export_key('PEM') + self.assertEqual(self.pem_pkcs8, encoded) + encoded = key.export_key('PEM', pkcs8=True) + self.assertEqual(self.pem_pkcs8, encoded) + + # 7. OpenSSH/RFC4253 + ssh_pub="""ssh-dss AAAAB3NzaC1kc3MAAACBAOdW7hcX9LZ5THwhRyShl2N0LEVXK0s/j/O0Tzvp9EzgOaJ1dpXskVaX2nTvkU/NGwVmDiQZx2HWOfRdLXm4AtvSPnq4uBtHmjgOHzCTJYS6KguVUDI0LryDy1ypBuew181v5lbOy0yLWncSOoxnUKSB47BgV6/2qm66YguDLWDDAAAAFQCtMvSM064MRaGYph+kteIDIHY7IwAAAIB539w9YU/mNfzrfq6uNxjcLv77RSgpk6xnSdyDwiPYwYhyljFrOwtURmz0RPNLguNVTQuQp3j6rxMG8CXa5qPjbH+T3VusQFK5I3AECspwuNWCBZlxGQDvvJYYEsNV3Zvv/gmB2oXFVIB0tBxWrkP9MA2JJi5O/YmUP5mmUbA4iAAAAIEAgzUqaaEy80hD0qDrmVv/Ti8IOnPwBJ0skeovDOQ9FEq9pIGZ5LADxXCor4MwPUUQX2BsXEjZJaQO2cJjDC+kzb+DhTneuaKfkZCF8gRjafYnyoSyyx4seUBWS2cPljqxFk1OLKK/b/058S9UiSi/TS0bXmmAtPG+TJKpGYb7pVk=""" + + def testImportKey7(self): + for ssh in (self.ssh_pub, tostr(self.ssh_pub)): + key_obj = DSA.importKey(ssh) + self.assertFalse(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + + def testExportKey7(self): + tup = (self.y, self.g, self.p, self.q) + key = DSA.construct(tup) + encoded = key.export_key('OpenSSH') + self.assertEqual(self.ssh_pub, encoded) + + # 8. Encrypted OpenSSL/OpenSSH + pem_private_encrypted="""\ +-----BEGIN DSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,70B6908939D65E9F2EB999E8729788CE + +4V6GHRDpCrdZ8MBjbyp5AlGUrjvr2Pn2e2zVxy5RBt4FBj9/pa0ae0nnyUPMLSUU +kKyOR0topRYTVRLElm4qVrb5uNZ3hRwfbklr+pSrB7O9eHz9V5sfOQxyODS07JxK +k1OdOs70/ouMXLF9EWfAZOmWUccZKHNblUwg1p1UrZIz5jXw4dUE/zqhvXh6d+iC +ADsICaBCjCrRQJKDp50h3+ndQjkYBKVH+pj8TiQ79U7lAvdp3+iMghQN6YXs9mdI +gFpWw/f97oWM4GHZFqHJ+VSMNFjBiFhAvYV587d7Lk4dhD8sCfbxj42PnfRgUItc +nnPqHxmhMQozBWzYM4mQuo3XbF2WlsNFbOzFVyGhw1Bx1s91qvXBVWJh2ozrW0s6 +HYDV7ZkcTml/4kjA/d+mve6LZ8kuuR1qCiZx6rkffhh1gDN/1Xz3HVvIy/dQ+h9s +5zp7PwUoWbhqp3WCOr156P6gR8qo7OlT6wMh33FSXK/mxikHK136fV2shwTKQVII +rJBvXpj8nACUmi7scKuTWGeUoXa+dwTZVVe+b+L2U1ZM7+h/neTJiXn7u99PFUwu +xVJtxaV37m3aXxtCsPnbBg== +-----END DSA PRIVATE KEY-----""" + + def testImportKey8(self): + for pem in (self.pem_private_encrypted, tostr(self.pem_private_encrypted)): + key_obj = DSA.importKey(pem, "PWDTEST") + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey8(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + encoded = key.export_key('PEM', pkcs8=False, passphrase="PWDTEST") + key = DSA.importKey(encoded, "PWDTEST") + self.assertEqual(self.y, key.y) + self.assertEqual(self.p, key.p) + self.assertEqual(self.q, key.q) + self.assertEqual(self.g, key.g) + self.assertEqual(self.x, key.x) + + # 9. Encrypted PKCS8 + # pbeWithMD5AndDES-CBC + pem_pkcs8_encrypted="""\ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIBcTAbBgkqhkiG9w0BBQMwDgQI0GC3BJ/jSw8CAggABIIBUHc1cXZpExIE9tC7 +7ryiW+5ihtF2Ekurq3e408GYSAu5smJjN2bvQXmzRFBz8W38K8eMf1sbWroZ4+zn +kZSbb9nSm5kAa8lR2+oF2k+WRswMR/PTC3f/D9STO2X0QxdrzKgIHEcSGSHp5jTx +aVvbkCDHo9vhBTl6S3ogZ48As/MEro76+9igUwJ1jNhIQZPJ7e20QH5qDpQFFJN4 +CKl2ENSEuwGiqBszItFy4dqH0g63ZGZV/xt9wSO9Rd7SK/EbA/dklOxBa5Y/VItM +gnIhs9XDMoGYyn6F023EicNJm6g/bVQk81BTTma4tm+12TKGdYm+QkeZvCOMZylr +Wv67cKwO3cAXt5C3QXMDgYR64XvuaT5h7C0igMp2afSXJlnbHEbFxQVJlv83T4FM +eZ4k+NQDbEL8GiHmFxzDWQAuPPZKJWEEEV2p/To+WOh+kSDHQw== +-----END ENCRYPTED PRIVATE KEY-----""" + + def testImportKey9(self): + for pem in (self.pem_pkcs8_encrypted, tostr(self.pem_pkcs8_encrypted)): + key_obj = DSA.importKey(pem, "PWDTEST") + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + # 10. Encrypted PKCS8 + # pkcs5PBES2 / + # pkcs5PBKDF2 (rounds=1000, salt=D725BF1B6B8239F4) / + # des-EDE3-CBC (iv=27A1C66C42AFEECE) + # + der_pkcs8_encrypted=\ + '30820196304006092a864886f70d01050d3033301b06092a864886f70d01050c'+\ + '300e0408d725bf1b6b8239f4020203e8301406082a864886f70d0307040827a1'+\ + 'c66c42afeece048201505cacfde7bf8edabb3e0d387950dc872662ea7e9b1ed4'+\ + '400d2e7e6186284b64668d8d0328c33a9d9397e6f03df7cb68268b0a06b4e22f'+\ + '7d132821449ecf998a8b696dbc6dd2b19e66d7eb2edfeb4153c1771d49702395'+\ + '4f36072868b5fcccf93413a5ac4b2eb47d4b3f681c6bd67ae363ed776f45ae47'+\ + '174a00098a7c930a50f820b227ddf50f9742d8e950d02586ff2dac0e3c372248'+\ + 'e5f9b6a7a02f4004f20c87913e0f7b52bccc209b95d478256a890b31d4c9adec'+\ + '21a4d157a179a93a3dad06f94f3ce486b46dfa7fc15fd852dd7680bbb2f17478'+\ + '7e71bd8dbaf81eca7518d76c1d26256e95424864ba45ca5d47d7c5a421be02fa'+\ + 'b94ab01e18593f66cf9094eb5c94b9ecf3aa08b854a195cf87612fbe5e96c426'+\ + '2b0d573e52dc71ba3f5e468c601e816c49b7d32c698b22175e89aaef0c443770'+\ + '5ef2f88a116d99d8e2869a4fd09a771b84b49e4ccb79aadcb1c9' + + def testImportKey10(self): + key_obj = DSA.importKey(self.der_pkcs8_encrypted, "PWDTEST") + self.assertTrue(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + self.assertEqual(self.x, key_obj.x) + + def testExportKey10(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + randfunc = BytesIO(unhexlify(b("27A1C66C42AFEECE") + b("D725BF1B6B8239F4"))).read + encoded = key.export_key('DER', pkcs8=True, passphrase="PWDTEST", randfunc=randfunc) + self.assertEqual(self.der_pkcs8_encrypted, encoded) + + # ---- + + def testImportError1(self): + self.assertRaises(ValueError, DSA.importKey, self.der_pkcs8_encrypted, "wrongpwd") + + def testExportError2(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + self.assertRaises(ValueError, key.export_key, 'DER', pkcs8=False, passphrase="PWDTEST") + + def test_import_key(self): + """Verify importKey is an alias to import_key""" + + key_obj = DSA.import_key(self.der_public) + self.assertFalse(key_obj.has_private()) + self.assertEqual(self.y, key_obj.y) + self.assertEqual(self.p, key_obj.p) + self.assertEqual(self.q, key_obj.q) + self.assertEqual(self.g, key_obj.g) + + def test_exportKey(self): + tup = (self.y, self.g, self.p, self.q, self.x) + key = DSA.construct(tup) + self.assertEqual(key.exportKey(), key.export_key()) + + + def test_import_empty(self): + self.assertRaises(ValueError, DSA.import_key, b'') + + +class ImportKeyFromX509Cert(unittest.TestCase): + + def test_x509v1(self): + + # Sample V1 certificate with a 1024 bit DSA key + x509_v1_cert = """ +-----BEGIN CERTIFICATE----- +MIIDUjCCArsCAQIwDQYJKoZIhvcNAQEFBQAwfjENMAsGA1UEChMEQWNtZTELMAkG +A1UECxMCUkQxHDAaBgkqhkiG9w0BCQEWDXNwYW1AYWNtZS5vcmcxEzARBgNVBAcT +Ck1ldHJvcG9saXMxETAPBgNVBAgTCE5ldyBZb3JrMQswCQYDVQQGEwJVUzENMAsG +A1UEAxMEdGVzdDAeFw0xNDA3MTEyMDM4NDNaFw0xNzA0MDYyMDM4NDNaME0xCzAJ +BgNVBAYTAlVTMREwDwYDVQQIEwhOZXcgWW9yazENMAsGA1UEChMEQWNtZTELMAkG +A1UECxMCUkQxDzANBgNVBAMTBnBvbGFuZDCCAbYwggErBgcqhkjOOAQBMIIBHgKB +gQDOrN4Ox4+t3T6wKeHfhzArhcrNEFMQ4Ss+4PIKyimDy9Bn64WPkL1B/9dvYIga +23GLu6tVJmXo6EdJnVOHEMhr99EeOwuDWWeP7Awq7RSlKEejokr4BEzMTW/tExSD +cO6/GI7xzh0eTH+VTTPDfyrJMYCkh0rJAfCP+5xrmPNetwIVALtXYOV1yoRrzJ2Q +M5uEjidH6GiZAoGAfUqA1SAm5g5U68SILMVX9l5rq0OpB0waBMpJQ31/R/yXNDqo +c3gGWZTOJFU4IzwNpGhrGNADUByz/lc1SAOAdEJIr0JVrhbGewQjB4pWqoLGbBKz +RoavTNDc/zD7SYa12evWDHADwvlXoeQg+lWop1zS8OqaDC7aLGKpWN3/m8kDgYQA +AoGAKoirPAfcp1rbbl4y2FFAIktfW8f4+T7d2iKSg73aiVfujhNOt1Zz1lfC0NI2 +eonLWO3tAM4XGKf1TLjb5UXngGn40okPsaA81YE6ZIKm20ywjlOY3QkAEdMaLVY3 +9PJvM8RGB9m7pLKxyHfGMfF40MVN4222zKeGp7xhM0CNiCUwDQYJKoZIhvcNAQEF +BQADgYEAfbNZfpYa2KlALEM1FZnwvQDvJHntHz8LdeJ4WM7CXDlKi67wY2HKM30w +s2xej75imkVOFd1kF2d0A8sjfriXLVIt1Hwq9ANZomhu4Edx0xpH8tqdh/bDtnM2 +TmduZNY9OWkb07h0CtWD6Zt8fhRllVsSSrlWd/2or7FXNC5weFQ= +-----END CERTIFICATE----- + """.strip() + + # DSA public key as dumped by openssl + y_str = """ +2a:88:ab:3c:07:dc:a7:5a:db:6e:5e:32:d8:51:40: +22:4b:5f:5b:c7:f8:f9:3e:dd:da:22:92:83:bd:da: +89:57:ee:8e:13:4e:b7:56:73:d6:57:c2:d0:d2:36: +7a:89:cb:58:ed:ed:00:ce:17:18:a7:f5:4c:b8:db: +e5:45:e7:80:69:f8:d2:89:0f:b1:a0:3c:d5:81:3a: +64:82:a6:db:4c:b0:8e:53:98:dd:09:00:11:d3:1a: +2d:56:37:f4:f2:6f:33:c4:46:07:d9:bb:a4:b2:b1: +c8:77:c6:31:f1:78:d0:c5:4d:e3:6d:b6:cc:a7:86: +a7:bc:61:33:40:8d:88:25 + """ + p_str = """ +00:ce:ac:de:0e:c7:8f:ad:dd:3e:b0:29:e1:df:87: +30:2b:85:ca:cd:10:53:10:e1:2b:3e:e0:f2:0a:ca: +29:83:cb:d0:67:eb:85:8f:90:bd:41:ff:d7:6f:60: +88:1a:db:71:8b:bb:ab:55:26:65:e8:e8:47:49:9d: +53:87:10:c8:6b:f7:d1:1e:3b:0b:83:59:67:8f:ec: +0c:2a:ed:14:a5:28:47:a3:a2:4a:f8:04:4c:cc:4d: +6f:ed:13:14:83:70:ee:bf:18:8e:f1:ce:1d:1e:4c: +7f:95:4d:33:c3:7f:2a:c9:31:80:a4:87:4a:c9:01: +f0:8f:fb:9c:6b:98:f3:5e:b7 + """ + q_str = """ +00:bb:57:60:e5:75:ca:84:6b:cc:9d:90:33:9b:84: +8e:27:47:e8:68:99 + """ + g_str = """ +7d:4a:80:d5:20:26:e6:0e:54:eb:c4:88:2c:c5:57: +f6:5e:6b:ab:43:a9:07:4c:1a:04:ca:49:43:7d:7f: +47:fc:97:34:3a:a8:73:78:06:59:94:ce:24:55:38: +23:3c:0d:a4:68:6b:18:d0:03:50:1c:b3:fe:57:35: +48:03:80:74:42:48:af:42:55:ae:16:c6:7b:04:23: +07:8a:56:aa:82:c6:6c:12:b3:46:86:af:4c:d0:dc: +ff:30:fb:49:86:b5:d9:eb:d6:0c:70:03:c2:f9:57: +a1:e4:20:fa:55:a8:a7:5c:d2:f0:ea:9a:0c:2e:da: +2c:62:a9:58:dd:ff:9b:c9 + """ + + key = DSA.importKey(x509_v1_cert) + for comp_name in ('y', 'p', 'q', 'g'): + comp_str = locals()[comp_name + "_str"] + comp = int(re.sub("[^0-9a-f]", "", comp_str), 16) + self.assertEqual(getattr(key, comp_name), comp) + self.assertFalse(key.has_private()) + + def test_x509v3(self): + + # Sample V3 certificate with a 1024 bit DSA key + x509_v3_cert = """ +-----BEGIN CERTIFICATE----- +MIIFhjCCA26gAwIBAgIBAzANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEL +MAkGA1UECAwCTUQxEjAQBgNVBAcMCUJhbHRpbW9yZTEQMA4GA1UEAwwHVGVzdCBD +QTEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbTAeFw0xNDA3MTMyMDUz +MjBaFw0xNzA0MDgyMDUzMjBaMEAxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJNRDES +MBAGA1UEBwwJQmFsdGltb3JlMRAwDgYDVQQDDAdhdXN0cmlhMIIBtjCCASsGByqG +SM44BAEwggEeAoGBALfd8gyEpVPA0ZI69Kp3nyJcu5N0ZZ3K1K9hleQLNqKEcZOh +7a/C2J1TPdmHTLJ0rAwBZ1nWxnARSgRphziGDFspKCYQwYcSMz8KoFgvXbXpuchy +oFACiQ2LqZnc5MakuLQtLcQciSYGYj3zmZdYMoa904F1aDWr+DxQI6DVC3/bAhUA +hqXMCJ6fQK3G2O9S3/CC/yVZXCsCgYBRXROl3R2khX7l10LQjDEgo3B1IzjXU/jP +McMBl6XO+nBJXxr/scbq8Ajiv7LTnGpSjgryHtvfj887kfvo8QbSS3kp3vq5uSqI +ui7E7r3jguWaLj616AG1HWOctXJUjqsiabZwsp2h09gHTzmHEXBOmiARu8xFxKAH +xsuo7onAbwOBhAACgYBylWjWSnKHE8mHx1A5m/0GQx6xnhWIe3+MJAnEhRGxA2J4 +SCsfWU0OwglIQToh1z5uUU9oDi9cYgNPBevOFRnDhc2yaJY6VAYnI+D+6J5IU6Yd +0iaG/iSc4sV4bFr0axcPpse3SN0XaQxiKeSFBfFnoMqL+dd9Gb3QPZSllBcVD6OB +1TCB0jAdBgNVHQ4EFgQUx5wN0Puotv388M9Tp/fsPbZpzAUwHwYDVR0jBBgwFoAU +a0hkif3RMaraiWtsOOZZlLu9wJwwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwSgYD +VR0RBEMwQYILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLmNvbYIQbWFpbC5leGFt +cGxlLmNvbYIPZnRwLmV4YW1wbGUuY29tMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NM +IEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAgEAyWf1TiJI +aNEIA9o/PG8/JiGASTS2/HBVTJbkq03k6NkJVk/GxC1DPziTUJ+CdWlHWcAi1EOW +Ach3QxNDRrVfCOfCMDgElIO1094/reJgdFYG00LRi8QkRJuxANV7YS4tLudhyHJC +kR2lhdMNmEuzWK+s2y+5cLrdm7qdvdENQCcV67uvGPx4sc+EaE7x13SczKjWBtbo +QCs6JTOW+EkPRl4Zo27K4OIZ43/J+GxvwU9QUVH3wPVdbbLNw+QeTFBYMTEcxyc4 +kv50HPBFaithziXBFyvdIs19FjkFzu0Uz/e0zb1+vMzQlJMD94HVOrMnIj5Sb2cL +KKdYXS4uhxFJmdV091Xur5JkYYwEzuaGav7J3zOzYutrIGTgDluLCvA+VQkRcTsy +jZ065SkY/v+38QHp+cmm8WRluupJTs8wYzVp6Fu0iFaaK7ztFmaZmHpiPIfDFjva +aCIgzzT5NweJd/b71A2SyzHXJ14zBXsr1PMylMp2TpHIidhuuNuQL6I0HaollB4M +Z3FsVBMhVDw4Z76qnFPr8mZE2tar33hSlJI/3pS/bBiukuBk8U7VB0X8OqaUnP3C +7b2Z4G8GtqDVcKGMzkvMjT4n9rKd/Le+qHSsQOGO9W/0LB7UDAZSwUsfAPnoBgdS +5t9tIomLCOstByXi+gGZue1TcdCa3Ph4kO0= +-----END CERTIFICATE----- + """.strip() + + # DSA public key as dumped by openssl + y_str = """ +72:95:68:d6:4a:72:87:13:c9:87:c7:50:39:9b:fd: +06:43:1e:b1:9e:15:88:7b:7f:8c:24:09:c4:85:11: +b1:03:62:78:48:2b:1f:59:4d:0e:c2:09:48:41:3a: +21:d7:3e:6e:51:4f:68:0e:2f:5c:62:03:4f:05:eb: +ce:15:19:c3:85:cd:b2:68:96:3a:54:06:27:23:e0: +fe:e8:9e:48:53:a6:1d:d2:26:86:fe:24:9c:e2:c5: +78:6c:5a:f4:6b:17:0f:a6:c7:b7:48:dd:17:69:0c: +62:29:e4:85:05:f1:67:a0:ca:8b:f9:d7:7d:19:bd: +d0:3d:94:a5:94:17:15:0f + """ + p_str = """ +00:b7:dd:f2:0c:84:a5:53:c0:d1:92:3a:f4:aa:77: +9f:22:5c:bb:93:74:65:9d:ca:d4:af:61:95:e4:0b: +36:a2:84:71:93:a1:ed:af:c2:d8:9d:53:3d:d9:87: +4c:b2:74:ac:0c:01:67:59:d6:c6:70:11:4a:04:69: +87:38:86:0c:5b:29:28:26:10:c1:87:12:33:3f:0a: +a0:58:2f:5d:b5:e9:b9:c8:72:a0:50:02:89:0d:8b: +a9:99:dc:e4:c6:a4:b8:b4:2d:2d:c4:1c:89:26:06: +62:3d:f3:99:97:58:32:86:bd:d3:81:75:68:35:ab: +f8:3c:50:23:a0:d5:0b:7f:db + """ + q_str = """ +00:86:a5:cc:08:9e:9f:40:ad:c6:d8:ef:52:df:f0: +82:ff:25:59:5c:2b + """ + g_str = """ +51:5d:13:a5:dd:1d:a4:85:7e:e5:d7:42:d0:8c:31: +20:a3:70:75:23:38:d7:53:f8:cf:31:c3:01:97:a5: +ce:fa:70:49:5f:1a:ff:b1:c6:ea:f0:08:e2:bf:b2: +d3:9c:6a:52:8e:0a:f2:1e:db:df:8f:cf:3b:91:fb: +e8:f1:06:d2:4b:79:29:de:fa:b9:b9:2a:88:ba:2e: +c4:ee:bd:e3:82:e5:9a:2e:3e:b5:e8:01:b5:1d:63: +9c:b5:72:54:8e:ab:22:69:b6:70:b2:9d:a1:d3:d8: +07:4f:39:87:11:70:4e:9a:20:11:bb:cc:45:c4:a0: +07:c6:cb:a8:ee:89:c0:6f + """ + + key = DSA.importKey(x509_v3_cert) + for comp_name in ('y', 'p', 'q', 'g'): + comp_str = locals()[comp_name + "_str"] + comp = int(re.sub("[^0-9a-f]", "", comp_str), 16) + self.assertEqual(getattr(key, comp_name), comp) + self.assertFalse(key.has_private()) + + +if __name__ == '__main__': + unittest.main() + +def get_tests(config={}): + tests = [] + tests += list_test_cases(ImportKeyTests) + tests += list_test_cases(ImportKeyFromX509Cert) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py new file mode 100644 index 0000000..9e3d6ad --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py @@ -0,0 +1,2653 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import os +import errno +import warnings +import unittest +from binascii import unhexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.py3compat import bord, tostr, FileNotFoundError +from Cryptodome.Util.asn1 import DerSequence, DerBitString +from Cryptodome.Util.number import bytes_to_long +from Cryptodome.Hash import SHAKE128 + +from Cryptodome.PublicKey import ECC + +try: + import pycryptodome_test_vectors # type: ignore + test_vectors_available = True +except ImportError: + test_vectors_available = False + + +class MissingTestVectorException(ValueError): + pass + + +def load_file(file_name, mode="rb"): + results = None + + try: + if not test_vectors_available: + raise FileNotFoundError(errno.ENOENT, + os.strerror(errno.ENOENT), + file_name) + + dir_comps = ("PublicKey", "ECC") + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + with open(full_file_name, mode) as file_in: + results = file_in.read() + + except FileNotFoundError: + warnings.warn("Warning: skipping extended tests for ECC", + UserWarning, + stacklevel=2) + + if results is None: + raise MissingTestVectorException("Missing %s" % file_name) + + return results + + +def compact(lines): + ext = b"".join(lines) + return unhexlify(tostr(ext).replace(" ", "").replace(":", "")) + + +def create_ref_keys_p192(): + key_len = 24 + key_lines = load_file("ecc_p192.txt").splitlines() + private_key_d = bytes_to_long(compact(key_lines[2:4])) + public_key_xy = compact(key_lines[5:9]) + assert bord(public_key_xy[0]) == 4 # Uncompressed + public_key_x = bytes_to_long(public_key_xy[1:key_len+1]) + public_key_y = bytes_to_long(public_key_xy[key_len+1:]) + + return (ECC.construct(curve="P-192", d=private_key_d), + ECC.construct(curve="P-192", point_x=public_key_x, point_y=public_key_y)) + + +def create_ref_keys_p224(): + key_len = 28 + key_lines = load_file("ecc_p224.txt").splitlines() + private_key_d = bytes_to_long(compact(key_lines[2:4])) + public_key_xy = compact(key_lines[5:9]) + assert bord(public_key_xy[0]) == 4 # Uncompressed + public_key_x = bytes_to_long(public_key_xy[1:key_len+1]) + public_key_y = bytes_to_long(public_key_xy[key_len+1:]) + + return (ECC.construct(curve="P-224", d=private_key_d), + ECC.construct(curve="P-224", point_x=public_key_x, point_y=public_key_y)) + + +def create_ref_keys_p256(): + key_len = 32 + key_lines = load_file("ecc_p256.txt").splitlines() + private_key_d = bytes_to_long(compact(key_lines[2:5])) + public_key_xy = compact(key_lines[6:11]) + assert bord(public_key_xy[0]) == 4 # Uncompressed + public_key_x = bytes_to_long(public_key_xy[1:key_len+1]) + public_key_y = bytes_to_long(public_key_xy[key_len+1:]) + + return (ECC.construct(curve="P-256", d=private_key_d), + ECC.construct(curve="P-256", point_x=public_key_x, point_y=public_key_y)) + + +def create_ref_keys_p384(): + key_len = 48 + key_lines = load_file("ecc_p384.txt").splitlines() + private_key_d = bytes_to_long(compact(key_lines[2:6])) + public_key_xy = compact(key_lines[7:14]) + assert bord(public_key_xy[0]) == 4 # Uncompressed + public_key_x = bytes_to_long(public_key_xy[1:key_len+1]) + public_key_y = bytes_to_long(public_key_xy[key_len+1:]) + + return (ECC.construct(curve="P-384", d=private_key_d), + ECC.construct(curve="P-384", point_x=public_key_x, point_y=public_key_y)) + + +def create_ref_keys_p521(): + key_len = 66 + key_lines = load_file("ecc_p521.txt").splitlines() + private_key_d = bytes_to_long(compact(key_lines[2:7])) + public_key_xy = compact(key_lines[8:17]) + assert bord(public_key_xy[0]) == 4 # Uncompressed + public_key_x = bytes_to_long(public_key_xy[1:key_len+1]) + public_key_y = bytes_to_long(public_key_xy[key_len+1:]) + + return (ECC.construct(curve="P-521", d=private_key_d), + ECC.construct(curve="P-521", point_x=public_key_x, point_y=public_key_y)) + + +def create_ref_keys_ed25519(): + key_lines = load_file("ecc_ed25519.txt").splitlines() + seed = compact(key_lines[5:8]) + key = ECC.construct(curve="Ed25519", seed=seed) + return (key, key.public_key()) + + +def create_ref_keys_ed448(): + key_lines = load_file("ecc_ed448.txt").splitlines() + seed = compact(key_lines[6:10]) + key = ECC.construct(curve="Ed448", seed=seed) + return (key, key.public_key()) + + +# Create reference key pair +# ref_private, ref_public = create_ref_keys_p521() + +def get_fixed_prng(): + return SHAKE128.new().update(b"SEED").read + + +def extract_bitstring_from_spki(data): + seq = DerSequence() + seq.decode(data) + bs = DerBitString() + bs.decode(seq[1]) + return bs.value + + +class TestImport(unittest.TestCase): + + def test_empty(self): + self.assertRaises(ValueError, ECC.import_key, b"") + + def test_mismatch(self): + # The private key does not match the public key + mismatch = """-----BEGIN PRIVATE KEY----- +MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJChZANiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXk= +-----END PRIVATE KEY-----""" + self.assertRaises(ValueError, ECC.import_key, mismatch) + + +class TestImport_P192(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_P192, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p192() + + def test_import_public_der(self): + key_file = load_file("ecc_p192_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_sec1_uncompressed(self): + key_file = load_file("ecc_p192_public.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P192') + self.assertEqual(self.ref_public, key) + + def test_import_sec1_compressed(self): + key_file = load_file("ecc_p192_public_compressed.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P192') + self.assertEqual(self.ref_public, key) + + def test_import_rfc5915_der(self): + key_file = load_file("ecc_p192_private.der") + + key = ECC._import_rfc5915_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_clear(self): + key_file = load_file("ecc_p192_private_p8_clear.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_in_pem_clear(self): + key_file = load_file("ecc_p192_private_p8_clear.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_p192_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_p192_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_p192_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_p192_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_p192_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256", "aes256_gcm": + key_file = load_file("ecc_p192_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_p192_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + +class TestImport_P224(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_P224, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p224() + + def test_import_public_der(self): + key_file = load_file("ecc_p224_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_sec1_uncompressed(self): + key_file = load_file("ecc_p224_public.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P224') + self.assertEqual(self.ref_public, key) + + def test_import_sec1_compressed(self): + key_file = load_file("ecc_p224_public_compressed.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P224') + self.assertEqual(self.ref_public, key) + + def test_import_rfc5915_der(self): + key_file = load_file("ecc_p224_private.der") + + key = ECC._import_rfc5915_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_clear(self): + key_file = load_file("ecc_p224_private_p8_clear.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_in_pem_clear(self): + key_file = load_file("ecc_p224_private_p8_clear.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_p224_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_p224_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_p224_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_p224_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_p224_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256", "aes256_gcm": + key_file = load_file("ecc_p224_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_p224_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + +class TestImport_P256(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_P256, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p256() + + def test_import_public_der(self): + key_file = load_file("ecc_p256_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_sec1_uncompressed(self): + key_file = load_file("ecc_p256_public.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P256') + self.assertEqual(self.ref_public, key) + + def test_import_sec1_compressed(self): + key_file = load_file("ecc_p256_public_compressed.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P256') + self.assertEqual(self.ref_public, key) + + def test_import_rfc5915_der(self): + key_file = load_file("ecc_p256_private.der") + + key = ECC._import_rfc5915_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_clear(self): + key_file = load_file("ecc_p256_private_p8_clear.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_in_pem_clear(self): + key_file = load_file("ecc_p256_private_p8_clear.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_p256_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_p256_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_p256_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_p256_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_p256_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_with_ecparams(self): + key_file = load_file("ecc_p256_private_ecparams.pem") + key = ECC.import_key(key_file) + # We just check if the import succeeds + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256", "aes256_gcm": + key_file = load_file("ecc_p256_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_p256_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_public(self): + key_file = load_file("ecc_p256_public_openssh.txt") + + key = ECC._import_openssh_public(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_private_clear(self): + key_file = load_file("ecc_p256_private_openssh.pem") + key_file_old = load_file("ecc_p256_private_openssh_old.pem") + + key = ECC.import_key(key_file) + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + def test_import_openssh_private_password(self): + key_file = load_file("ecc_p256_private_openssh_pwd.pem") + key_file_old = load_file("ecc_p256_private_openssh_pwd_old.pem") + + key = ECC.import_key(key_file, b"password") + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + +class TestImport_P384(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_P384, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p384() + + def test_import_public_der(self): + key_file = load_file("ecc_p384_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_sec1_uncompressed(self): + key_file = load_file("ecc_p384_public.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P384') + self.assertEqual(self.ref_public, key) + + def test_import_sec1_compressed(self): + key_file = load_file("ecc_p384_public_compressed.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P384') + self.assertEqual(self.ref_public, key) + + def test_import_rfc5915_der(self): + key_file = load_file("ecc_p384_private.der") + + key = ECC._import_rfc5915_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_clear(self): + key_file = load_file("ecc_p384_private_p8_clear.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_in_pem_clear(self): + key_file = load_file("ecc_p384_private_p8_clear.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_p384_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_p384_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_p384_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_p384_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_p384_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256", "aes256_gcm": + key_file = load_file("ecc_p384_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_p384_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_public(self): + key_file = load_file("ecc_p384_public_openssh.txt") + + key = ECC._import_openssh_public(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_private_clear(self): + key_file = load_file("ecc_p384_private_openssh.pem") + key_file_old = load_file("ecc_p384_private_openssh_old.pem") + + key = ECC.import_key(key_file) + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + def test_import_openssh_private_password(self): + key_file = load_file("ecc_p384_private_openssh_pwd.pem") + key_file_old = load_file("ecc_p384_private_openssh_pwd_old.pem") + + key = ECC.import_key(key_file, b"password") + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + +class TestImport_P521(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_P521, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p521() + + def test_import_public_der(self): + key_file = load_file("ecc_p521_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_sec1_uncompressed(self): + key_file = load_file("ecc_p521_public.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P521') + self.assertEqual(self.ref_public, key) + + def test_import_sec1_compressed(self): + key_file = load_file("ecc_p521_public_compressed.der") + value = extract_bitstring_from_spki(key_file) + key = ECC.import_key(key_file, curve_name='P521') + self.assertEqual(self.ref_public, key) + + def test_import_rfc5915_der(self): + key_file = load_file("ecc_p521_private.der") + + key = ECC._import_rfc5915_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_clear(self): + key_file = load_file("ecc_p521_private_p8_clear.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_in_pem_clear(self): + key_file = load_file("ecc_p521_private_p8_clear.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_p521_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_p521_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_p521_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_p521_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_p521_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256", "aes256_gcm": + key_file = load_file("ecc_p521_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_p521_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_public(self): + key_file = load_file("ecc_p521_public_openssh.txt") + + key = ECC._import_openssh_public(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_private_clear(self): + key_file = load_file("ecc_p521_private_openssh.pem") + key_file_old = load_file("ecc_p521_private_openssh_old.pem") + + key = ECC.import_key(key_file) + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + def test_import_openssh_private_password(self): + key_file = load_file("ecc_p521_private_openssh_pwd.pem") + key_file_old = load_file("ecc_p521_private_openssh_pwd_old.pem") + + key = ECC.import_key(key_file, b"password") + key_old = ECC.import_key(key_file_old) + self.assertEqual(key, key_old) + + +class TestExport_P192(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_P192, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p192() + + def test_export_public_der_uncompressed(self): + key_file = load_file("ecc_p192_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(False) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_der_compressed(self): + key_file = load_file("ecc_p192_public.der") + pub_key = ECC.import_key(key_file) + key_file_compressed = pub_key.export_key(format="DER", compress=True) + + key_file_compressed_ref = load_file("ecc_p192_public_compressed.der") + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_public_sec1_uncompressed(self): + key_file = load_file("ecc_p192_public.der") + value = extract_bitstring_from_spki(key_file) + + encoded = self.ref_public.export_key(format="SEC1") + self.assertEqual(value, encoded) + + def test_export_public_sec1_compressed(self): + key_file = load_file("ecc_p192_public.der") + encoded = self.ref_public.export_key(format="SEC1", compress=True) + + key_file_compressed_ref = load_file("ecc_p192_public_compressed.der") + value = extract_bitstring_from_spki(key_file_compressed_ref) + self.assertEqual(value, encoded) + + def test_export_rfc5915_private_der(self): + key_file = load_file("ecc_p192_private.der") + + encoded = self.ref_private._export_rfc5915_private_der() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_p192_private_p8_clear.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem_uncompressed(self): + key_file = load_file("ecc_p192_public.pem", "rt").strip() + + encoded = self.ref_private._export_public_pem(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="PEM", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_pem_compressed(self): + key_file = load_file("ecc_p192_public.pem", "rt").strip() + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="PEM", compress=True) + key_file_compressed_ref = load_file("ecc_p192_public_compressed.pem", "rt").strip() + + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_p192_private.pem", "rt").strip() + + encoded = self.ref_private._export_private_pem(None) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private._export_private_pem(passphrase=b"secret") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "EC PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + use_pkcs8=False) + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_private_pkcs8_and_pem_1(self): + # PKCS8 inside PEM with both unencrypted + key_file = load_file("ecc_p192_private_p8_clear.pem", "rt").strip() + + encoded = self.ref_private._export_private_clear_pkcs8_in_clear_pem() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_and_pem_2(self): + # PKCS8 inside PEM with PKCS8 encryption + encoded = self.ref_private._export_private_encrypted_pkcs8_in_clear_pem("secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + # --- + + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase=b"secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.ref_private.export_key(format="PEM", passphrase="secret", + use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # DER format but no PKCS#8 + self.assertRaises(ValueError, self.ref_private.export_key, format="DER", + passphrase="secret", + use_pkcs8=False, + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # Incorrect parameters for public keys + self.assertRaises(ValueError, self.ref_public.export_key, format="DER", + use_pkcs8=False) + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + def test_compressed_curve(self): + + # Compressed P-192 curve (Y-point is even) + pem1 = """-----BEGIN EC PRIVATE KEY----- + MF8CAQEEGHvhXmIW95JxZYfd4AUPu9BwknjuvS36aqAKBggqhkjOPQMBAaE0AzIA + BLJZCyTu35DQIlqvMlBynn3k1Ig+dWfg/brRhHecxptrbloqFSP8ITw0CwbGF+2X + 5g== + -----END EC PRIVATE KEY-----""" + + # Compressed P-192 curve (Y-point is odd) + pem2 = """-----BEGIN EC PRIVATE KEY----- + MF8CAQEEGA3rAotUaWl7d47eX6tz9JmLzOMJwl13XaAKBggqhkjOPQMBAaE0AzIA + BG4tHlTBBBGokcWmGm2xubVB0NvPC/Ou5AYwivs+3iCxmEjsymVAj6iiuX2Lxr6g + /Q== + -----END EC PRIVATE KEY-----""" + + key1 = ECC.import_key(pem1) + low16 = int(key1.pointQ.y % 65536) + self.assertEqual(low16, 0x97E6) + + key2 = ECC.import_key(pem2) + low16 = int(key2.pointQ.y % 65536) + self.assertEqual(low16, 0xA0FD) + + +class TestExport_P224(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_P224, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p224() + + def test_export_public_der_uncompressed(self): + key_file = load_file("ecc_p224_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(False) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_der_compressed(self): + key_file = load_file("ecc_p224_public.der") + pub_key = ECC.import_key(key_file) + key_file_compressed = pub_key.export_key(format="DER", compress=True) + + key_file_compressed_ref = load_file("ecc_p224_public_compressed.der") + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_public_sec1_uncompressed(self): + key_file = load_file("ecc_p224_public.der") + value = extract_bitstring_from_spki(key_file) + + encoded = self.ref_public.export_key(format="SEC1") + self.assertEqual(value, encoded) + + def test_export_public_sec1_compressed(self): + key_file = load_file("ecc_p224_public.der") + encoded = self.ref_public.export_key(format="SEC1", compress=True) + + key_file_compressed_ref = load_file("ecc_p224_public_compressed.der") + value = extract_bitstring_from_spki(key_file_compressed_ref) + self.assertEqual(value, encoded) + + def test_export_rfc5915_private_der(self): + key_file = load_file("ecc_p224_private.der") + + encoded = self.ref_private._export_rfc5915_private_der() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_p224_private_p8_clear.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem_uncompressed(self): + key_file = load_file("ecc_p224_public.pem", "rt").strip() + + encoded = self.ref_private._export_public_pem(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="PEM", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_pem_compressed(self): + key_file = load_file("ecc_p224_public.pem", "rt").strip() + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="PEM", compress=True) + key_file_compressed_ref = load_file("ecc_p224_public_compressed.pem", "rt").strip() + + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_p224_private.pem", "rt").strip() + + encoded = self.ref_private._export_private_pem(None) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private._export_private_pem(passphrase=b"secret") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "EC PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + use_pkcs8=False) + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_private_pkcs8_and_pem_1(self): + # PKCS8 inside PEM with both unencrypted + key_file = load_file("ecc_p224_private_p8_clear.pem", "rt").strip() + + encoded = self.ref_private._export_private_clear_pkcs8_in_clear_pem() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_and_pem_2(self): + # PKCS8 inside PEM with PKCS8 encryption + encoded = self.ref_private._export_private_encrypted_pkcs8_in_clear_pem("secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + # --- + + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase=b"secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.ref_private.export_key(format="PEM", passphrase="secret", + use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # DER format but no PKCS#8 + self.assertRaises(ValueError, self.ref_private.export_key, format="DER", + passphrase="secret", + use_pkcs8=False, + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # Incorrect parameters for public keys + self.assertRaises(ValueError, self.ref_public.export_key, format="DER", + use_pkcs8=False) + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + def test_compressed_curve(self): + + # Compressed P-224 curve (Y-point is even) + pem1 = """-----BEGIN EC PRIVATE KEY----- + MGgCAQEEHPYicBNI9nd6wDKAX2l+f3A0Q+KWUQeMqSt5GoOgBwYFK4EEACGhPAM6 + AATCL6rUIDT14zXKoS5GQUMDP/tpc+1iI/FyEZikt2roKDkhU5q08srmqaysbfJN + eUr7Xf1lnCVGag== + -----END EC PRIVATE KEY-----""" + + # Compressed P-224 curve (Y-point is odd) + pem2 = """-----BEGIN EC PRIVATE KEY----- + MGgCAQEEHEFjbaVPLJ3ngZyCibCvT0RLUqSlHjC5Z3e0FtugBwYFK4EEACGhPAM6 + AAT5IvL2V6m48y1JLMGr6ZbnOqNKP9hMf9mxyVkk6/SaRoBoJVkXrNIpYL0P7DS7 + QF8E/OGeZRwvow== + -----END EC PRIVATE KEY-----""" + + key1 = ECC.import_key(pem1) + low16 = int(key1.pointQ.y % 65536) + self.assertEqual(low16, 0x466A) + + key2 = ECC.import_key(pem2) + low16 = int(key2.pointQ.y % 65536) + self.assertEqual(low16, 0x2FA3) + + +class TestExport_P256(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_P256, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p256() + + def test_export_public_der_uncompressed(self): + key_file = load_file("ecc_p256_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(False) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_der_compressed(self): + key_file = load_file("ecc_p256_public.der") + pub_key = ECC.import_key(key_file) + key_file_compressed = pub_key.export_key(format="DER", compress=True) + + key_file_compressed_ref = load_file("ecc_p256_public_compressed.der") + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_public_sec1_uncompressed(self): + key_file = load_file("ecc_p256_public.der") + value = extract_bitstring_from_spki(key_file) + + encoded = self.ref_public.export_key(format="SEC1") + self.assertEqual(value, encoded) + + def test_export_public_sec1_compressed(self): + key_file = load_file("ecc_p256_public.der") + encoded = self.ref_public.export_key(format="SEC1", compress=True) + + key_file_compressed_ref = load_file("ecc_p256_public_compressed.der") + value = extract_bitstring_from_spki(key_file_compressed_ref) + self.assertEqual(value, encoded) + + def test_export_rfc5915_private_der(self): + key_file = load_file("ecc_p256_private.der") + + encoded = self.ref_private._export_rfc5915_private_der() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_p256_private_p8_clear.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem_uncompressed(self): + key_file = load_file("ecc_p256_public.pem", "rt").strip() + + encoded = self.ref_private._export_public_pem(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="PEM", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_pem_compressed(self): + key_file = load_file("ecc_p256_public.pem", "rt").strip() + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="PEM", compress=True) + key_file_compressed_ref = load_file("ecc_p256_public_compressed.pem", "rt").strip() + + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_p256_private.pem", "rt").strip() + + encoded = self.ref_private._export_private_pem(None) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private._export_private_pem(passphrase=b"secret") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "EC PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + use_pkcs8=False) + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_private_pkcs8_and_pem_1(self): + # PKCS8 inside PEM with both unencrypted + key_file = load_file("ecc_p256_private_p8_clear.pem", "rt").strip() + + encoded = self.ref_private._export_private_clear_pkcs8_in_clear_pem() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_and_pem_2(self): + # PKCS8 inside PEM with PKCS8 encryption + encoded = self.ref_private._export_private_encrypted_pkcs8_in_clear_pem("secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_openssh_uncompressed(self): + key_file = load_file("ecc_p256_public_openssh.txt", "rt") + + encoded = self.ref_public._export_openssh(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="OpenSSH") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="OpenSSH", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_openssh_compressed(self): + key_file = load_file("ecc_p256_public_openssh.txt", "rt") + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="OpenSSH", compress=True) + assert len(key_file) > len(key_file_compressed) + self.assertEqual(pub_key, ECC.import_key(key_file_compressed)) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + # --- + + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase=b"secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.ref_private.export_key(format="PEM", passphrase="secret", + use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # DER format but no PKCS#8 + self.assertRaises(ValueError, self.ref_private.export_key, format="DER", + passphrase="secret", + use_pkcs8=False, + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # Incorrect parameters for public keys + self.assertRaises(ValueError, self.ref_public.export_key, format="DER", + use_pkcs8=False) + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # No private keys with OpenSSH + self.assertRaises(ValueError, self.ref_private.export_key, format="OpenSSH", + passphrase="secret") + + + def test_compressed_curve(self): + + # Compressed P-256 curve (Y-point is even) + pem1 = """-----BEGIN EC PRIVATE KEY----- + MFcCAQEEIHTuc09jC51xXomV6MVCDN+DpAAvSmaJWZPTEHM6D5H1oAoGCCqGSM49 + AwEHoSQDIgACWFuGbHe8yJ43rir7PMTE9w8vHz0BSpXHq90Xi7/s+a0= + -----END EC PRIVATE KEY-----""" + + # Compressed P-256 curve (Y-point is odd) + pem2 = """-----BEGIN EC PRIVATE KEY----- + MFcCAQEEIFggiPN9SQP+FAPTCPp08fRUz7rHp2qNBRcBJ1DXhb3ZoAoGCCqGSM49 + AwEHoSQDIgADLpph1trTIlVfa8NJvlMUPyWvL+wP+pW3BJITUL/wj9A= + -----END EC PRIVATE KEY-----""" + + key1 = ECC.import_key(pem1) + low16 = int(key1.pointQ.y % 65536) + self.assertEqual(low16, 0xA6FC) + + key2 = ECC.import_key(pem2) + low16 = int(key2.pointQ.y % 65536) + self.assertEqual(low16, 0x6E57) + + +class TestExport_P384(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_P384, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p384() + + def test_export_public_der_uncompressed(self): + key_file = load_file("ecc_p384_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(False) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_der_compressed(self): + key_file = load_file("ecc_p384_public.der") + pub_key = ECC.import_key(key_file) + key_file_compressed = pub_key.export_key(format="DER", compress=True) + + key_file_compressed_ref = load_file("ecc_p384_public_compressed.der") + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_public_sec1_uncompressed(self): + key_file = load_file("ecc_p384_public.der") + value = extract_bitstring_from_spki(key_file) + + encoded = self.ref_public.export_key(format="SEC1") + self.assertEqual(value, encoded) + + def test_export_public_sec1_compressed(self): + key_file = load_file("ecc_p384_public.der") + encoded = self.ref_public.export_key(format="SEC1", compress=True) + + key_file_compressed_ref = load_file("ecc_p384_public_compressed.der") + value = extract_bitstring_from_spki(key_file_compressed_ref) + self.assertEqual(value, encoded) + + def test_export_rfc5915_private_der(self): + key_file = load_file("ecc_p384_private.der") + + encoded = self.ref_private._export_rfc5915_private_der() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_p384_private_p8_clear.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem_uncompressed(self): + key_file = load_file("ecc_p384_public.pem", "rt").strip() + + encoded = self.ref_private._export_public_pem(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="PEM", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_pem_compressed(self): + key_file = load_file("ecc_p384_public.pem", "rt").strip() + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="PEM", compress=True) + key_file_compressed_ref = load_file("ecc_p384_public_compressed.pem", "rt").strip() + + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_p384_private.pem", "rt").strip() + + encoded = self.ref_private._export_private_pem(None) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private._export_private_pem(passphrase=b"secret") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "EC PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + use_pkcs8=False) + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_private_pkcs8_and_pem_1(self): + # PKCS8 inside PEM with both unencrypted + key_file = load_file("ecc_p384_private_p8_clear.pem", "rt").strip() + + encoded = self.ref_private._export_private_clear_pkcs8_in_clear_pem() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_and_pem_2(self): + # PKCS8 inside PEM with PKCS8 encryption + encoded = self.ref_private._export_private_encrypted_pkcs8_in_clear_pem("secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_openssh_uncompressed(self): + key_file = load_file("ecc_p384_public_openssh.txt", "rt") + + encoded = self.ref_public._export_openssh(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="OpenSSH") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="OpenSSH", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_openssh_compressed(self): + key_file = load_file("ecc_p384_public_openssh.txt", "rt") + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="OpenSSH", compress=True) + assert len(key_file) > len(key_file_compressed) + self.assertEqual(pub_key, ECC.import_key(key_file_compressed)) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + # --- + + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase=b"secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.ref_private.export_key(format="PEM", passphrase="secret", + use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # DER format but no PKCS#8 + self.assertRaises(ValueError, self.ref_private.export_key, format="DER", + passphrase="secret", + use_pkcs8=False, + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # Incorrect parameters for public keys + self.assertRaises(ValueError, self.ref_public.export_key, format="DER", + use_pkcs8=False) + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # No private keys with OpenSSH + self.assertRaises(ValueError, self.ref_private.export_key, format="OpenSSH", + passphrase="secret") + + def test_compressed_curve(self): + + # Compressed P-384 curve (Y-point is even) + # openssl ecparam -name secp384p1 -genkey -noout -conv_form compressed -out /tmp/a.pem + # openssl ec -in /tmp/a.pem -text -noout + pem1 = """-----BEGIN EC PRIVATE KEY----- +MIGkAgEBBDAM0lEIhvXuekK2SWtdbgOcZtBaxa9TxfpO/GcDFZLCJ3JVXaTgwken +QT+C+XLtD6WgBwYFK4EEACKhZANiAATs0kZMhFDu8DoBC21jrSDPyAUn4aXZ/DM4 +ylhDfWmb4LEbeszXceIzfhIUaaGs5y1xXaqf5KXTiAAYx2pKUzAAM9lcGUHCGKJG +k4AgUmVJON29XoUilcFrzjDmuye3B6Q= +-----END EC PRIVATE KEY-----""" + + # Compressed P-384 curve (Y-point is odd) + pem2 = """-----BEGIN EC PRIVATE KEY----- +MIGkAgEBBDDHPFTslYLltE16fHdSDTtE/2HTmd3M8mqy5MttAm4wZ833KXiGS9oe +kFdx9sNV0KygBwYFK4EEACKhZANiAASLIE5RqVMtNhtBH/u/p/ifqOAlKnK/+RrQ +YC46ZRsnKNayw3wATdPjgja7L/DSII3nZK0G6KOOVwJBznT/e+zudUJYhZKaBLRx +/bgXyxUtYClOXxb1Y/5N7txLstYRyP0= +-----END EC PRIVATE KEY-----""" + + key1 = ECC.import_key(pem1) + low16 = int(key1.pointQ.y % 65536) + self.assertEqual(low16, 0x07a4) + + key2 = ECC.import_key(pem2) + low16 = int(key2.pointQ.y % 65536) + self.assertEqual(low16, 0xc8fd) + + +class TestExport_P521(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_P521, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_p521() + + def test_export_public_der_uncompressed(self): + key_file = load_file("ecc_p521_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(False) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_der_compressed(self): + key_file = load_file("ecc_p521_public.der") + pub_key = ECC.import_key(key_file) + key_file_compressed = pub_key.export_key(format="DER", compress=True) + + key_file_compressed_ref = load_file("ecc_p521_public_compressed.der") + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_public_sec1_uncompressed(self): + key_file = load_file("ecc_p521_public.der") + value = extract_bitstring_from_spki(key_file) + + encoded = self.ref_public.export_key(format="SEC1") + self.assertEqual(value, encoded) + + encoded = self.ref_public.export_key(format="raw") + self.assertEqual(value, encoded) + + def test_export_public_sec1_compressed(self): + key_file = load_file("ecc_p521_public.der") + encoded = self.ref_public.export_key(format="SEC1", compress=True) + + key_file_compressed_ref = load_file("ecc_p521_public_compressed.der") + value = extract_bitstring_from_spki(key_file_compressed_ref) + self.assertEqual(value, encoded) + + encoded = self.ref_public.export_key(format="raw", compress=True) + self.assertEqual(value, encoded) + + def test_export_rfc5915_private_der(self): + key_file = load_file("ecc_p521_private.der") + + encoded = self.ref_private._export_rfc5915_private_der() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_p521_private_p8_clear.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem_uncompressed(self): + key_file = load_file("ecc_p521_public.pem", "rt").strip() + + encoded = self.ref_private._export_public_pem(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="PEM", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_pem_compressed(self): + key_file = load_file("ecc_p521_public.pem", "rt").strip() + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="PEM", compress=True) + key_file_compressed_ref = load_file("ecc_p521_public_compressed.pem", "rt").strip() + + self.assertEqual(key_file_compressed, key_file_compressed_ref) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_p521_private.pem", "rt").strip() + + encoded = self.ref_private._export_private_pem(None) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", use_pkcs8=False) + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private._export_private_pem(passphrase=b"secret") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "EC PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + use_pkcs8=False) + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_private_pkcs8_and_pem_1(self): + # PKCS8 inside PEM with both unencrypted + key_file = load_file("ecc_p521_private_p8_clear.pem", "rt").strip() + + encoded = self.ref_private._export_private_clear_pkcs8_in_clear_pem() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM") + self.assertEqual(key_file, encoded) + + def test_export_private_pkcs8_and_pem_2(self): + # PKCS8 inside PEM with PKCS8 encryption + encoded = self.ref_private._export_private_encrypted_pkcs8_in_clear_pem("secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_openssh_uncompressed(self): + key_file = load_file("ecc_p521_public_openssh.txt", "rt") + + encoded = self.ref_public._export_openssh(False) + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_public.export_key(format="OpenSSH") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="OpenSSH", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_openssh_compressed(self): + key_file = load_file("ecc_p521_public_openssh.txt", "rt") + pub_key = ECC.import_key(key_file) + + key_file_compressed = pub_key.export_key(format="OpenSSH", compress=True) + assert len(key_file) > len(key_file_compressed) + self.assertEqual(pub_key, ECC.import_key(key_file_compressed)) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + # --- + + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase="secret", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + use_pkcs8=False, + passphrase=b"secret", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.ref_private.export_key(format="PEM", passphrase="secret", + use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # DER format but no PKCS#8 + self.assertRaises(ValueError, self.ref_private.export_key, format="DER", + passphrase="secret", + use_pkcs8=False, + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # Incorrect parameters for public keys + self.assertRaises(ValueError, self.ref_public.export_key, format="DER", + use_pkcs8=False) + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # No private keys with OpenSSH + self.assertRaises(ValueError, self.ref_private.export_key, format="OpenSSH", + passphrase="secret") + + def test_compressed_curve(self): + + # Compressed P-521 curve (Y-point is even) + # openssl ecparam -name secp521r1 -genkey -noout -conv_form compressed -out /tmp/a.pem + # openssl ec -in /tmp/a.pem -text -noout + pem1 = """-----BEGIN EC PRIVATE KEY----- +MIHcAgEBBEIAnm1CEjVjvNfXEN730p+D6su5l+mOztdc5XmTEoti+s2R4GQ4mAv3 +0zYLvyklvOHw0+yy8d0cyGEJGb8T3ZVKmg2gBwYFK4EEACOhgYkDgYYABAHzjTI1 +ckxQ3Togi0LAxiG0PucdBBBs5oIy3df95xv6SInp70z+4qQ2EltEmdNMssH8eOrl +M5CYdZ6nbcHMVaJUvQEzTrYxvFjOgJiOd+E9eBWbLkbMNqsh1UKVO6HbMbW0ohCI +uGxO8tM6r3w89/qzpG2SvFM/fvv3mIR30wSZDD84qA== +-----END EC PRIVATE KEY-----""" + + # Compressed P-521 curve (Y-point is odd) + pem2 = """-----BEGIN EC PRIVATE KEY----- +MIHcAgEBBEIB84OfhJluLBRLn3+cC/RQ37C2SfQVP/t0gQK2tCsTf5avRcWYRrOJ +PmX9lNnkC0Hobd75QFRmdxrB0Wd1/M4jZOWgBwYFK4EEACOhgYkDgYYABAAMZcdJ +1YLCGHt3bHCEzdidVy6+brlJIbv1aQ9fPQLF7WKNv4c8w3H8d5a2+SDZilBOsk5c +6cNJDMz2ExWQvxl4CwDJtJGt1+LHVKFGy73NANqVxMbRu+2F8lOxkNp/ziFTbVyV +vv6oYkMIIi7r5oQWAiQDrR2mlrrFDL9V7GH/r8SWQw== +-----END EC PRIVATE KEY-----""" + + key1 = ECC.import_key(pem1) + low16 = int(key1.pointQ.y % 65536) + self.assertEqual(low16, 0x38a8) + + key2 = ECC.import_key(pem2) + low16 = int(key2.pointQ.y % 65536) + self.assertEqual(low16, 0x9643) + + +class TestImport_Ed25519(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_Ed25519, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_ed25519() + + def test_import_public_der(self): + key_file = load_file("ecc_ed25519_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_pkcs8_der(self): + key_file = load_file("ecc_ed25519_private.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_ed25519_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_ed25519_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_ed25519_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_ed25519_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_ed25519_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256": + key_file = load_file("ecc_ed25519_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_ed25519_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_openssh_public(self): + key_file = load_file("ecc_ed25519_public_openssh.txt") + key = ECC._import_openssh_public(key_file) + self.failIf(key.has_private()) + key = ECC.import_key(key_file) + self.failIf(key.has_private()) + + def test_import_openssh_private_clear(self): + key_file = load_file("ecc_ed25519_private_openssh.pem") + key = ECC.import_key(key_file) + + def test_import_openssh_private_password(self): + key_file = load_file("ecc_ed25519_private_openssh_pwd.pem") + key = ECC.import_key(key_file, b"password") + + +class TestExport_Ed25519(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_Ed25519, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_ed25519() + + def test_export_public_der(self): + key_file = load_file("ecc_ed25519_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(True) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_sec1(self): + self.assertRaises(ValueError, self.ref_public.export_key, format="SEC1") + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_ed25519_private.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + self.assertRaises(ValueError, self.ref_private.export_key, + format="DER", use_pkcs8=False) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem(self): + key_file_ref = load_file("ecc_ed25519_public.pem", "rt").strip() + key_file = self.ref_public.export_key(format="PEM").strip() + self.assertEqual(key_file_ref, key_file) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_ed25519_private.pem", "rt").strip() + encoded = self.ref_private.export_key(format="PEM").strip() + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private.export_key(format="PEM", + passphrase=b"secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_openssh(self): + key_file = load_file("ecc_ed25519_public_openssh.txt", "rt") + public_key = ECC.import_key(key_file) + key_file = " ".join(key_file.split(' ')[:2]) # remove comment + + encoded = public_key._export_openssh(False) + self.assertEqual(key_file, encoded.strip()) + + encoded = public_key.export_key(format="OpenSSH") + self.assertEqual(key_file, encoded.strip()) + + def test_export_raw(self): + encoded = self.ref_public.export_key(format='raw') + self.assertEqual(encoded, unhexlify(b'bc85b8cf585d20a4de47e84d1cb6183f63d9ba96223fcbc886e363ffdea20cff')) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase=b"secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # No private keys with OpenSSH + self.assertRaises(ValueError, self.ref_private.export_key, format="OpenSSH", + passphrase="secret") + + +class TestImport_Ed448(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestImport_Ed448, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_ed448() + + def test_import_public_der(self): + key_file = load_file("ecc_ed448_public.der") + + key = ECC._import_subjectPublicKeyInfo(key_file) + self.assertEqual(self.ref_public, key) + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_pkcs8_der(self): + key_file = load_file("ecc_ed448_private.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_1(self): + key_file = load_file("ecc_ed448_private_p8.der") + + key = ECC._import_der(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_private_pkcs8_encrypted_2(self): + key_file = load_file("ecc_ed448_private_p8.pem") + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_der(self): + key_file = load_file("ecc_ed448_x509.der") + + key = ECC._import_der(key_file, None) + self.assertEqual(self.ref_public, key) + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_public_pem(self): + key_file = load_file("ecc_ed448_public.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + def test_import_private_pem(self): + key_file = load_file("ecc_ed448_private.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_private, key) + + def test_import_private_pem_encrypted(self): + for algo in "des3", "aes128", "aes192", "aes256": + key_file = load_file("ecc_ed448_private_enc_%s.pem" % algo) + + key = ECC.import_key(key_file, "secret") + self.assertEqual(self.ref_private, key) + + key = ECC.import_key(tostr(key_file), b"secret") + self.assertEqual(self.ref_private, key) + + def test_import_x509_pem(self): + key_file = load_file("ecc_ed448_x509.pem") + + key = ECC.import_key(key_file) + self.assertEqual(self.ref_public, key) + + +class TestExport_Ed448(unittest.TestCase): + + def __init__(self, *args, **kwargs): + super(TestExport_Ed448, self).__init__(*args, **kwargs) + self.ref_private, self.ref_public = create_ref_keys_ed448() + + def test_export_public_der(self): + key_file = load_file("ecc_ed448_public.der") + + encoded = self.ref_public._export_subjectPublicKeyInfo(True) + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER") + self.assertEqual(key_file, encoded) + + encoded = self.ref_public.export_key(format="DER", compress=False) + self.assertEqual(key_file, encoded) + + def test_export_public_sec1(self): + self.assertRaises(ValueError, self.ref_public.export_key, format="SEC1") + + def test_export_private_pkcs8_clear(self): + key_file = load_file("ecc_ed448_private.der") + + encoded = self.ref_private._export_pkcs8() + self.assertEqual(key_file, encoded) + + # --- + + encoded = self.ref_private.export_key(format="DER") + self.assertEqual(key_file, encoded) + + self.assertRaises(ValueError, self.ref_private.export_key, + format="DER", use_pkcs8=False) + + def test_export_private_pkcs8_encrypted(self): + encoded = self.ref_private._export_pkcs8(passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC._import_pkcs8, encoded, None) + + decoded = ECC._import_pkcs8(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + # --- + + encoded = self.ref_private.export_key(format="DER", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_public_pem(self): + key_file_ref = load_file("ecc_ed448_public.pem", "rt").strip() + key_file = self.ref_public.export_key(format="PEM").strip() + self.assertEqual(key_file_ref, key_file) + + def test_export_private_pem_clear(self): + key_file = load_file("ecc_ed448_private.pem", "rt").strip() + encoded = self.ref_private.export_key(format="PEM").strip() + self.assertEqual(key_file, encoded) + + def test_export_private_pem_encrypted(self): + encoded = self.ref_private.export_key(format="PEM", + passphrase=b"secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # This should prove that the output is password-protected + self.assertRaises(ValueError, ECC.import_key, encoded) + + assert "ENCRYPTED PRIVATE KEY" in encoded + + decoded = ECC.import_key(encoded, "secret") + self.assertEqual(self.ref_private, decoded) + + def test_export_openssh(self): + # Not supported + self.assertRaises(ValueError, self.ref_public.export_key, format="OpenSSH") + + def test_export_raw(self): + encoded = self.ref_public.export_key(format='raw') + self.assertEqual(encoded, unhexlify(b'899014ddc0a0e1260cfc1085afdf952019e9fd63372e3e366e26dad32b176624884330a14617237e3081febd9d1a15069e7499433d2f55dd80')) + + def test_prng(self): + # Test that password-protected containers use the provided PRNG + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_byte_or_string_passphrase(self): + encoded1 = self.ref_private.export_key(format="PEM", + passphrase="secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + encoded2 = self.ref_private.export_key(format="PEM", + passphrase=b"secret", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC", + randfunc=get_fixed_prng()) + self.assertEqual(encoded1, encoded2) + + def test_error_params1(self): + # Unknown format + self.assertRaises(ValueError, self.ref_private.export_key, format="XXX") + + # Missing 'protection' parameter when PKCS#8 is used + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="secret") + + # Empty password + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", use_pkcs8=False) + self.assertRaises(ValueError, self.ref_private.export_key, format="PEM", + passphrase="", + protection="PBKDF2WithHMAC-SHA1AndAES128-CBC") + + # No private keys with OpenSSH + self.assertRaises(ValueError, self.ref_private.export_key, format="OpenSSH", + passphrase="secret") + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(TestImport) + try: + tests += list_test_cases(TestImport_P192) + tests += list_test_cases(TestImport_P224) + tests += list_test_cases(TestImport_P256) + tests += list_test_cases(TestImport_P384) + tests += list_test_cases(TestImport_P521) + tests += list_test_cases(TestImport_Ed25519) + tests += list_test_cases(TestImport_Ed448) + + tests += list_test_cases(TestExport_P192) + tests += list_test_cases(TestExport_P224) + tests += list_test_cases(TestExport_P256) + tests += list_test_cases(TestExport_P384) + tests += list_test_cases(TestExport_P521) + tests += list_test_cases(TestExport_Ed25519) + tests += list_test_cases(TestExport_Ed448) + + except MissingTestVectorException: + pass + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py new file mode 100644 index 0000000..a1a2238 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py @@ -0,0 +1,590 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/PublicKey/test_importKey.py: Self-test for importing RSA keys +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +import os +import re +import errno +import warnings +import unittest + +from Cryptodome.PublicKey import RSA +from Cryptodome.SelfTest.st_common import a2b_hex, list_test_cases +from Cryptodome.Util.py3compat import b, tostr, FileNotFoundError +from Cryptodome.Util.number import inverse +from Cryptodome.Util import asn1 + +try: + import pycryptodome_test_vectors # type: ignore + test_vectors_available = True +except ImportError: + test_vectors_available = False + + +def load_file(file_name, mode="rb"): + results = None + + try: + if not test_vectors_available: + raise FileNotFoundError(errno.ENOENT, + os.strerror(errno.ENOENT), + file_name) + + dir_comps = ("PublicKey", "RSA") + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + with open(full_file_name, mode) as file_in: + results = file_in.read() + + except FileNotFoundError: + warnings.warn("Warning: skipping extended tests for RSA", + UserWarning, + stacklevel=2) + + return results + + +def der2pem(der, text='PUBLIC'): + import binascii + chunks = [binascii.b2a_base64(der[i:i+48]) for i in range(0, len(der), 48)] + pem = b('-----BEGIN %s KEY-----\n' % text) + pem += b('').join(chunks) + pem += b('-----END %s KEY-----' % text) + return pem + + +class ImportKeyTests(unittest.TestCase): + # 512-bit RSA key generated with openssl + rsaKeyPEM = u'''-----BEGIN RSA PRIVATE KEY----- +MIIBOwIBAAJBAL8eJ5AKoIsjURpcEoGubZMxLD7+kT+TLr7UkvEtFrRhDDKMtuII +q19FrL4pUIMymPMSLBn3hJLe30Dw48GQM4UCAwEAAQJACUSDEp8RTe32ftq8IwG8 +Wojl5mAd1wFiIOrZ/Uv8b963WJOJiuQcVN29vxU5+My9GPZ7RA3hrDBEAoHUDPrI +OQIhAPIPLz4dphiD9imAkivY31Rc5AfHJiQRA7XixTcjEkojAiEAyh/pJHks/Mlr ++rdPNEpotBjfV4M4BkgGAA/ipcmaAjcCIQCHvhwwKVBLzzTscT2HeUdEeBMoiXXK +JACAr3sJQJGxIQIgarRp+m1WSKV1MciwMaTOnbU7wxFs9DP1pva76lYBzgUCIQC9 +n0CnZCJ6IZYqSt0H5N7+Q+2Ro64nuwV/OSQfM6sBwQ== +-----END RSA PRIVATE KEY-----''' + + # As above, but this is actually an unencrypted PKCS#8 key + rsaKeyPEM8 = u'''-----BEGIN PRIVATE KEY----- +MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvx4nkAqgiyNRGlwS +ga5tkzEsPv6RP5MuvtSS8S0WtGEMMoy24girX0WsvilQgzKY8xIsGfeEkt7fQPDj +wZAzhQIDAQABAkAJRIMSnxFN7fZ+2rwjAbxaiOXmYB3XAWIg6tn9S/xv3rdYk4mK +5BxU3b2/FTn4zL0Y9ntEDeGsMEQCgdQM+sg5AiEA8g8vPh2mGIP2KYCSK9jfVFzk +B8cmJBEDteLFNyMSSiMCIQDKH+kkeSz8yWv6t080Smi0GN9XgzgGSAYAD+KlyZoC +NwIhAIe+HDApUEvPNOxxPYd5R0R4EyiJdcokAICvewlAkbEhAiBqtGn6bVZIpXUx +yLAxpM6dtTvDEWz0M/Wm9rvqVgHOBQIhAL2fQKdkInohlipK3Qfk3v5D7ZGjrie7 +BX85JB8zqwHB +-----END PRIVATE KEY-----''' + + # The same RSA private key as in rsaKeyPEM, but now encrypted + rsaKeyEncryptedPEM = ( + + # PEM encryption + # With DES and passphrase 'test' + ('test', u'''-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-CBC,AF8F9A40BD2FA2FC + +Ckl9ex1kaVEWhYC2QBmfaF+YPiR4NFkRXA7nj3dcnuFEzBnY5XULupqQpQI3qbfA +u8GYS7+b3toWWiHZivHbAAUBPDIZG9hKDyB9Sq2VMARGsX1yW1zhNvZLIiVJzUHs +C6NxQ1IJWOXzTew/xM2I26kPwHIvadq+/VaT8gLQdjdH0jOiVNaevjWnLgrn1mLP +BCNRMdcexozWtAFNNqSzfW58MJL2OdMi21ED184EFytIc1BlB+FZiGZduwKGuaKy +9bMbdb/1PSvsSzPsqW7KSSrTw6MgJAFJg6lzIYvR5F4poTVBxwBX3+EyEmShiaNY +IRX3TgQI0IjrVuLmvlZKbGWP18FXj7I7k9tSsNOOzllTTdq3ny5vgM3A+ynfAaxp +dysKznQ6P+IoqML1WxAID4aGRMWka+uArOJ148Rbj9s= +-----END RSA PRIVATE KEY-----'''), + + # PKCS8 encryption + ('winter', u'''-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIBpjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIeZIsbW3O+JcCAggA +MBQGCCqGSIb3DQMHBAgSM2p0D8FilgSCAWBhFyP2tiGKVpGj3mO8qIBzinU60ApR +3unvP+N6j7LVgnV2lFGaXbJ6a1PbQXe+2D6DUyBLo8EMXrKKVLqOMGkFMHc0UaV6 +R6MmrsRDrbOqdpTuVRW+NVd5J9kQQh4xnfU/QrcPPt7vpJvSf4GzG0n666Ki50OV +M/feuVlIiyGXY6UWdVDpcOV72cq02eNUs/1JWdh2uEBvA9fCL0c07RnMrdT+CbJQ +NjJ7f8ULtp7xvR9O3Al/yJ4Wv3i4VxF1f3MCXzhlUD4I0ONlr0kJWgeQ80q/cWhw +ntvgJwnCn2XR1h6LA8Wp+0ghDTsL2NhJpWd78zClGhyU4r3hqu1XDjoXa7YCXCix +jCV15+ViDJzlNCwg+W6lRg18sSLkCT7alviIE0U5tHc6UPbbHwT5QqAxAABaP+nZ +CGqJGyiwBzrKebjgSm/KRd4C91XqcsysyH2kKPfT51MLAoD4xelOURBP +-----END ENCRYPTED PRIVATE KEY-----''' + ), + ) + + rsaPublicKeyPEM = u'''-----BEGIN PUBLIC KEY----- +MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL8eJ5AKoIsjURpcEoGubZMxLD7+kT+T +Lr7UkvEtFrRhDDKMtuIIq19FrL4pUIMymPMSLBn3hJLe30Dw48GQM4UCAwEAAQ== +-----END PUBLIC KEY-----''' + + # Obtained using 'ssh-keygen -i -m PKCS8 -f rsaPublicKeyPEM' + rsaPublicKeyOpenSSH = b('''ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAQQC/HieQCqCLI1EaXBKBrm2TMSw+/pE/ky6+1JLxLRa0YQwyjLbiCKtfRay+KVCDMpjzEiwZ94SS3t9A8OPBkDOF comment\n''') + + # The private key, in PKCS#1 format encoded with DER + rsaKeyDER = a2b_hex( + '''3082013b020100024100bf1e27900aa08b23511a5c1281ae6d93312c3efe + 913f932ebed492f12d16b4610c328cb6e208ab5f45acbe2950833298f312 + 2c19f78492dedf40f0e3c190338502030100010240094483129f114dedf6 + 7edabc2301bc5a88e5e6601dd7016220ead9fd4bfc6fdeb75893898ae41c + 54ddbdbf1539f8ccbd18f67b440de1ac30440281d40cfac839022100f20f + 2f3e1da61883f62980922bd8df545ce407c726241103b5e2c53723124a23 + 022100ca1fe924792cfcc96bfab74f344a68b418df578338064806000fe2 + a5c99a023702210087be1c3029504bcf34ec713d877947447813288975ca + 240080af7b094091b12102206ab469fa6d5648a57531c8b031a4ce9db53b + c3116cf433f5a6f6bbea5601ce05022100bd9f40a764227a21962a4add07 + e4defe43ed91a3ae27bb057f39241f33ab01c1 + '''.replace(" ","")) + + # The private key, in unencrypted PKCS#8 format encoded with DER + rsaKeyDER8 = a2b_hex( + '''30820155020100300d06092a864886f70d01010105000482013f3082013 + b020100024100bf1e27900aa08b23511a5c1281ae6d93312c3efe913f932 + ebed492f12d16b4610c328cb6e208ab5f45acbe2950833298f3122c19f78 + 492dedf40f0e3c190338502030100010240094483129f114dedf67edabc2 + 301bc5a88e5e6601dd7016220ead9fd4bfc6fdeb75893898ae41c54ddbdb + f1539f8ccbd18f67b440de1ac30440281d40cfac839022100f20f2f3e1da + 61883f62980922bd8df545ce407c726241103b5e2c53723124a23022100c + a1fe924792cfcc96bfab74f344a68b418df578338064806000fe2a5c99a0 + 23702210087be1c3029504bcf34ec713d877947447813288975ca240080a + f7b094091b12102206ab469fa6d5648a57531c8b031a4ce9db53bc3116cf + 433f5a6f6bbea5601ce05022100bd9f40a764227a21962a4add07e4defe4 + 3ed91a3ae27bb057f39241f33ab01c1 + '''.replace(" ","")) + + rsaPublicKeyDER = a2b_hex( + '''305c300d06092a864886f70d0101010500034b003048024100bf1e27900a + a08b23511a5c1281ae6d93312c3efe913f932ebed492f12d16b4610c328c + b6e208ab5f45acbe2950833298f3122c19f78492dedf40f0e3c190338502 + 03010001 + '''.replace(" ","")) + + n = int('BF 1E 27 90 0A A0 8B 23 51 1A 5C 12 81 AE 6D 93 31 2C 3E FE 91 3F 93 2E BE D4 92 F1 2D 16 B4 61 0C 32 8C B6 E2 08 AB 5F 45 AC BE 29 50 83 32 98 F3 12 2C 19 F7 84 92 DE DF 40 F0 E3 C1 90 33 85'.replace(" ",""),16) + e = 65537 + d = int('09 44 83 12 9F 11 4D ED F6 7E DA BC 23 01 BC 5A 88 E5 E6 60 1D D7 01 62 20 EA D9 FD 4B FC 6F DE B7 58 93 89 8A E4 1C 54 DD BD BF 15 39 F8 CC BD 18 F6 7B 44 0D E1 AC 30 44 02 81 D4 0C FA C8 39'.replace(" ",""),16) + p = int('00 F2 0F 2F 3E 1D A6 18 83 F6 29 80 92 2B D8 DF 54 5C E4 07 C7 26 24 11 03 B5 E2 C5 37 23 12 4A 23'.replace(" ",""),16) + q = int('00 CA 1F E9 24 79 2C FC C9 6B FA B7 4F 34 4A 68 B4 18 DF 57 83 38 06 48 06 00 0F E2 A5 C9 9A 02 37'.replace(" ",""),16) + + # This is q^{-1} mod p). fastmath and slowmath use pInv (p^{-1} + # mod q) instead! + qInv = int('00 BD 9F 40 A7 64 22 7A 21 96 2A 4A DD 07 E4 DE FE 43 ED 91 A3 AE 27 BB 05 7F 39 24 1F 33 AB 01 C1'.replace(" ",""),16) + pInv = inverse(p,q) + + def testImportKey1(self): + """Verify import of RSAPrivateKey DER SEQUENCE""" + key = RSA.importKey(self.rsaKeyDER) + self.assertTrue(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey2(self): + """Verify import of SubjectPublicKeyInfo DER SEQUENCE""" + key = RSA.importKey(self.rsaPublicKeyDER) + self.assertFalse(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + + def testImportKey3unicode(self): + """Verify import of RSAPrivateKey DER SEQUENCE, encoded with PEM as unicode""" + key = RSA.importKey(self.rsaKeyPEM) + self.assertEqual(key.has_private(),True) # assert_ + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey3bytes(self): + """Verify import of RSAPrivateKey DER SEQUENCE, encoded with PEM as byte string""" + key = RSA.importKey(b(self.rsaKeyPEM)) + self.assertEqual(key.has_private(),True) # assert_ + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey4unicode(self): + """Verify import of RSAPrivateKey DER SEQUENCE, encoded with PEM as unicode""" + key = RSA.importKey(self.rsaPublicKeyPEM) + self.assertEqual(key.has_private(),False) # assertFalse + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + + def testImportKey4bytes(self): + """Verify import of SubjectPublicKeyInfo DER SEQUENCE, encoded with PEM as byte string""" + key = RSA.importKey(b(self.rsaPublicKeyPEM)) + self.assertEqual(key.has_private(),False) # assertFalse + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + + def testImportKey5(self): + """Verifies that the imported key is still a valid RSA pair""" + key = RSA.importKey(self.rsaKeyPEM) + idem = key._encrypt(key._decrypt(89)) + self.assertEqual(idem, 89) + + def testImportKey6(self): + """Verifies that the imported key is still a valid RSA pair""" + key = RSA.importKey(self.rsaKeyDER) + idem = key._encrypt(key._decrypt(65)) + self.assertEqual(idem, 65) + + def testImportKey7(self): + """Verify import of OpenSSH public key""" + key = RSA.importKey(self.rsaPublicKeyOpenSSH) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + + def testImportKey8(self): + """Verify import of encrypted PrivateKeyInfo DER SEQUENCE""" + for t in self.rsaKeyEncryptedPEM: + key = RSA.importKey(t[1], t[0]) + self.assertTrue(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey9(self): + """Verify import of unencrypted PrivateKeyInfo DER SEQUENCE""" + key = RSA.importKey(self.rsaKeyDER8) + self.assertTrue(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey10(self): + """Verify import of unencrypted PrivateKeyInfo DER SEQUENCE, encoded with PEM""" + key = RSA.importKey(self.rsaKeyPEM8) + self.assertTrue(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def testImportKey11(self): + """Verify import of RSAPublicKey DER SEQUENCE""" + der = asn1.DerSequence([17, 3]).encode() + key = RSA.importKey(der) + self.assertEqual(key.n, 17) + self.assertEqual(key.e, 3) + + def testImportKey12(self): + """Verify import of RSAPublicKey DER SEQUENCE, encoded with PEM""" + der = asn1.DerSequence([17, 3]).encode() + pem = der2pem(der) + key = RSA.importKey(pem) + self.assertEqual(key.n, 17) + self.assertEqual(key.e, 3) + + def test_import_key_windows_cr_lf(self): + pem_cr_lf = "\r\n".join(self.rsaKeyPEM.splitlines()) + key = RSA.importKey(pem_cr_lf) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + self.assertEqual(key.d, self.d) + self.assertEqual(key.p, self.p) + self.assertEqual(key.q, self.q) + + def test_import_empty(self): + self.assertRaises(ValueError, RSA.import_key, b"") + + ### + def testExportKey1(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + derKey = key.export_key("DER") + self.assertEqual(derKey, self.rsaKeyDER) + + def testExportKey2(self): + key = RSA.construct([self.n, self.e]) + derKey = key.export_key("DER") + self.assertEqual(derKey, self.rsaPublicKeyDER) + + def testExportKey3(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + pemKey = key.export_key("PEM") + self.assertEqual(pemKey, b(self.rsaKeyPEM)) + + def testExportKey4(self): + key = RSA.construct([self.n, self.e]) + pemKey = key.export_key("PEM") + self.assertEqual(pemKey, b(self.rsaPublicKeyPEM)) + + def testExportKey5(self): + key = RSA.construct([self.n, self.e]) + openssh_1 = key.export_key("OpenSSH").split() + openssh_2 = self.rsaPublicKeyOpenSSH.split() + self.assertEqual(openssh_1[0], openssh_2[0]) + self.assertEqual(openssh_1[1], openssh_2[1]) + + def testExportKey7(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + derKey = key.export_key("DER", pkcs=8) + self.assertEqual(derKey, self.rsaKeyDER8) + + def testExportKey8(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + pemKey = key.export_key("PEM", pkcs=8) + self.assertEqual(pemKey, b(self.rsaKeyPEM8)) + + def testExportKey9(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + self.assertRaises(ValueError, key.export_key, "invalid-format") + + def testExportKey10(self): + # Export and re-import the encrypted key. It must match. + # PEM envelope, PKCS#1, old PEM encryption + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + outkey = key.export_key('PEM', 'test') + self.assertTrue(tostr(outkey).find('4,ENCRYPTED')!=-1) + self.assertTrue(tostr(outkey).find('BEGIN RSA PRIVATE KEY')!=-1) + inkey = RSA.importKey(outkey, 'test') + self.assertEqual(key.n, inkey.n) + self.assertEqual(key.e, inkey.e) + self.assertEqual(key.d, inkey.d) + + def testExportKey11(self): + # Export and re-import the encrypted key. It must match. + # PEM envelope, PKCS#1, old PEM encryption + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + outkey = key.export_key('PEM', 'test', pkcs=1) + self.assertTrue(tostr(outkey).find('4,ENCRYPTED')!=-1) + self.assertTrue(tostr(outkey).find('BEGIN RSA PRIVATE KEY')!=-1) + inkey = RSA.importKey(outkey, 'test') + self.assertEqual(key.n, inkey.n) + self.assertEqual(key.e, inkey.e) + self.assertEqual(key.d, inkey.d) + + def testExportKey12(self): + # Export and re-import the encrypted key. It must match. + # PEM envelope, PKCS#8, old PEM encryption + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + outkey = key.export_key('PEM', 'test', pkcs=8) + self.assertTrue(tostr(outkey).find('4,ENCRYPTED')!=-1) + self.assertTrue(tostr(outkey).find('BEGIN PRIVATE KEY')!=-1) + inkey = RSA.importKey(outkey, 'test') + self.assertEqual(key.n, inkey.n) + self.assertEqual(key.e, inkey.e) + self.assertEqual(key.d, inkey.d) + + def testExportKey13(self): + # Export and re-import the encrypted key. It must match. + # PEM envelope, PKCS#8, PKCS#8 encryption + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + outkey = key.export_key('PEM', 'test', pkcs=8, + protection='PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC') + self.assertTrue(tostr(outkey).find('4,ENCRYPTED')==-1) + self.assertTrue(tostr(outkey).find('BEGIN ENCRYPTED PRIVATE KEY')!=-1) + inkey = RSA.importKey(outkey, 'test') + self.assertEqual(key.n, inkey.n) + self.assertEqual(key.e, inkey.e) + self.assertEqual(key.d, inkey.d) + + def testExportKey14(self): + # Export and re-import the encrypted key. It must match. + # DER envelope, PKCS#8, PKCS#8 encryption + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + outkey = key.export_key('DER', 'test', pkcs=8) + inkey = RSA.importKey(outkey, 'test') + self.assertEqual(key.n, inkey.n) + self.assertEqual(key.e, inkey.e) + self.assertEqual(key.d, inkey.d) + + def testExportKey15(self): + # Verify that that error an condition is detected when trying to + # use a password with DER encoding and PKCS#1. + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + self.assertRaises(ValueError, key.export_key, 'DER', 'test', 1) + + def test_import_key(self): + """Verify that import_key is an alias to importKey""" + key = RSA.import_key(self.rsaPublicKeyDER) + self.assertFalse(key.has_private()) + self.assertEqual(key.n, self.n) + self.assertEqual(key.e, self.e) + + def test_import_key_ba_mv(self): + """Verify that import_key can be used on bytearrays and memoryviews""" + key = RSA.import_key(bytearray(self.rsaPublicKeyDER)) + key = RSA.import_key(memoryview(self.rsaPublicKeyDER)) + + def test_exportKey(self): + key = RSA.construct([self.n, self.e, self.d, self.p, self.q, self.pInv]) + self.assertEqual(key.export_key(), key.exportKey()) + + +class ImportKeyFromX509Cert(unittest.TestCase): + + def test_x509v1(self): + + # Sample V1 certificate with a 1024 bit RSA key + x509_v1_cert = """ +-----BEGIN CERTIFICATE----- +MIICOjCCAaMCAQEwDQYJKoZIhvcNAQEEBQAwfjENMAsGA1UEChMEQWNtZTELMAkG +A1UECxMCUkQxHDAaBgkqhkiG9w0BCQEWDXNwYW1AYWNtZS5vcmcxEzARBgNVBAcT +Ck1ldHJvcG9saXMxETAPBgNVBAgTCE5ldyBZb3JrMQswCQYDVQQGEwJVUzENMAsG +A1UEAxMEdGVzdDAeFw0xNDA3MTExOTU3MjRaFw0xNzA0MDYxOTU3MjRaME0xCzAJ +BgNVBAYTAlVTMREwDwYDVQQIEwhOZXcgWW9yazENMAsGA1UEChMEQWNtZTELMAkG +A1UECxMCUkQxDzANBgNVBAMTBmxhdHZpYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAyG+kytdRj3TFbRmHDYp3TXugVQ81chew0qeOxZWOz80IjtWpgdOaCvKW +NCuc8wUR9BWrEQW+39SaRMLiQfQtyFSQZijc3nsEBu/Lo4uWZ0W/FHDRVSvkJA/V +Ex5NL5ikI+wbUeCV5KajGNDalZ8F1pk32+CBs8h1xNx5DyxuEHUCAwEAATANBgkq +hkiG9w0BAQQFAAOBgQCVQF9Y//Q4Psy+umEM38pIlbZ2hxC5xNz/MbVPwuCkNcGn +KYNpQJP+JyVTsPpO8RLZsAQDzRueMI3S7fbbwTzAflN0z19wvblvu93xkaBytVok +9VBAH28olVhy9b1MMeg2WOt5sUEQaFNPnwwsyiY9+HsRpvpRnPSQF+kyYVsshQ== +-----END CERTIFICATE----- + """.strip() + + # RSA public key as dumped by openssl + exponent = 65537 + modulus_str = """ +00:c8:6f:a4:ca:d7:51:8f:74:c5:6d:19:87:0d:8a: +77:4d:7b:a0:55:0f:35:72:17:b0:d2:a7:8e:c5:95: +8e:cf:cd:08:8e:d5:a9:81:d3:9a:0a:f2:96:34:2b: +9c:f3:05:11:f4:15:ab:11:05:be:df:d4:9a:44:c2: +e2:41:f4:2d:c8:54:90:66:28:dc:de:7b:04:06:ef: +cb:a3:8b:96:67:45:bf:14:70:d1:55:2b:e4:24:0f: +d5:13:1e:4d:2f:98:a4:23:ec:1b:51:e0:95:e4:a6: +a3:18:d0:da:95:9f:05:d6:99:37:db:e0:81:b3:c8: +75:c4:dc:79:0f:2c:6e:10:75 + """ + modulus = int(re.sub("[^0-9a-f]","", modulus_str), 16) + + key = RSA.importKey(x509_v1_cert) + self.assertEqual(key.e, exponent) + self.assertEqual(key.n, modulus) + self.assertFalse(key.has_private()) + + def test_x509v3(self): + + # Sample V3 certificate with a 1024 bit RSA key + x509_v3_cert = """ +-----BEGIN CERTIFICATE----- +MIIEcjCCAlqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEL +MAkGA1UECAwCTUQxEjAQBgNVBAcMCUJhbHRpbW9yZTEQMA4GA1UEAwwHVGVzdCBD +QTEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxlLmNvbTAeFw0xNDA3MTIwOTM1 +MTJaFw0xNzA0MDcwOTM1MTJaMEQxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJNRDES +MBAGA1UEBwwJQmFsdGltb3JlMRQwEgYDVQQDDAtUZXN0IFNlcnZlcjCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA/S7GJV2OcFdyNMQ4K75KrYFtMEn3VnEFdPHa +jyS37XlMxSh0oS4GeTGVUCJInl5Cpsv8WQdh03FfeOdvzp5IZ46OcjeOPiWnmjgl +2G5j7e2bDH7RSchGV+OD6Fb1Agvuu2/9iy8fdf3rPQ/7eAddzKUrzwacVbnW+tg2 +QtSXKRcCAwEAAaOB1TCB0jAdBgNVHQ4EFgQU/WwCX7FfWMIPDFfJ+I8a2COG+l8w +HwYDVR0jBBgwFoAUa0hkif3RMaraiWtsOOZZlLu9wJwwCQYDVR0TBAIwADALBgNV +HQ8EBAMCBeAwSgYDVR0RBEMwQYILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLmNv +bYIQbWFpbC5leGFtcGxlLmNvbYIPZnRwLmV4YW1wbGUuY29tMCwGCWCGSAGG+EIB +DQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsF +AAOCAgEAvO6xfdsGbnoK4My3eJthodTAjMjPwFVY133LH04QLcCv54TxKhtUg1fi +PgdjVe1HpTytPBfXy2bSZbXAN0abZCtw1rYrnn7o1g2pN8iypVq3zVn0iMTzQzxs +zEPO3bpR/UhNSf90PmCsS5rqZpAAnXSaAy1ClwHWk/0eG2pYkhE1m1ABVMN2lsAW +e9WxGk6IFqaI9O37NYQwmEypMs4DC+ECJEvbPFiqi3n0gbXCZJJ6omDA5xJldaYK +Oa7KR3s/qjBsu9UAiWpLBuFoSTHIF2aeRKRFmUdmzwo43eVPep65pY6eQ4AdL2RF +rqEuINbGlzI5oQyYhu71IwB+iPZXaZZPlwjLgOsuad/p2hOgDb5WxUi8FnDPursQ +ujfpIpmrOP/zpvvQWnwePI3lI+5n41kTBSbefXEdv6rXpHk3QRzB90uPxnXPdxSC +16ASA8bQT5an/1AgoE3k9CrcD2K0EmgaX0YI0HUhkyzbkg34EhpWJ6vvRUbRiNRo +9cIbt/ya9Y9u0Ja8GLXv6dwX0l0IdJMkL8KifXUFAVCujp1FBrr/gdmwQn8itANy ++qbnWSxmOvtaY0zcaFAcONuHva0h51/WqXOMO1eb8PhR4HIIYU8p1oBwQp7dSni8 +THDi1F+GG5PsymMDj5cWK42f+QzjVw5PrVmFqqrrEoMlx8DWh5Y= +-----END CERTIFICATE----- +""".strip() + + # RSA public key as dumped by openssl + exponent = 65537 + modulus_str = """ +00:fd:2e:c6:25:5d:8e:70:57:72:34:c4:38:2b:be: +4a:ad:81:6d:30:49:f7:56:71:05:74:f1:da:8f:24: +b7:ed:79:4c:c5:28:74:a1:2e:06:79:31:95:50:22: +48:9e:5e:42:a6:cb:fc:59:07:61:d3:71:5f:78:e7: +6f:ce:9e:48:67:8e:8e:72:37:8e:3e:25:a7:9a:38: +25:d8:6e:63:ed:ed:9b:0c:7e:d1:49:c8:46:57:e3: +83:e8:56:f5:02:0b:ee:bb:6f:fd:8b:2f:1f:75:fd: +eb:3d:0f:fb:78:07:5d:cc:a5:2b:cf:06:9c:55:b9: +d6:fa:d8:36:42:d4:97:29:17 + """ + modulus = int(re.sub("[^0-9a-f]","", modulus_str), 16) + + key = RSA.importKey(x509_v3_cert) + self.assertEqual(key.e, exponent) + self.assertEqual(key.n, modulus) + self.assertFalse(key.has_private()) + + +class TestImport_2048(unittest.TestCase): + + def test_import_openssh_public(self): + key_file_ref = load_file("rsa2048_private.pem") + key_file = load_file("rsa2048_public_openssh.txt") + + # Skip test if test vectors are not installed + if None in (key_file_ref, key_file): + return + + key_ref = RSA.import_key(key_file_ref).public_key() + key = RSA.import_key(key_file) + self.assertEqual(key_ref, key) + + def test_import_openssh_private_clear(self): + key_file = load_file("rsa2048_private_openssh.pem") + key_file_old = load_file("rsa2048_private_openssh_old.pem") + + # Skip test if test vectors are not installed + if None in (key_file_old, key_file): + return + + key = RSA.import_key(key_file) + key_old = RSA.import_key(key_file_old) + + self.assertEqual(key, key_old) + + def test_import_openssh_private_password(self): + key_file = load_file("rsa2048_private_openssh_pwd.pem") + key_file_old = load_file("rsa2048_private_openssh_pwd_old.pem") + + # Skip test if test vectors are not installed + if None in (key_file_old, key_file): + return + + key = RSA.import_key(key_file, b"password") + key_old = RSA.import_key(key_file_old) + self.assertEqual(key, key_old) + + +if __name__ == '__main__': + unittest.main() + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(ImportKeyTests) + tests += list_test_cases(ImportKeyFromX509Cert) + tests += list_test_cases(TestImport_2048) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/__init__.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/__init__.py new file mode 100644 index 0000000..763ee9c --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/__init__.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Random/__init__.py: Self-test for random number generation modules +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test for random number generators""" + +__revision__ = "$Id$" + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Random import test_random; tests += test_random.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/test_random.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/test_random.py new file mode 100644 index 0000000..30e9194 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Random/test_random.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Util/test_generic.py: Self-test for the Cryptodome.Random.new() function +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test suite for Cryptodome.Random.new()""" + +import sys +import unittest +from Cryptodome.Util.py3compat import b + +class SimpleTest(unittest.TestCase): + def runTest(self): + """Cryptodome.Random.new()""" + # Import the Random module and try to use it + from Cryptodome import Random + randobj = Random.new() + x = randobj.read(16) + y = randobj.read(16) + self.assertNotEqual(x, y) + z = Random.get_random_bytes(16) + self.assertNotEqual(x, z) + self.assertNotEqual(y, z) + # Test the Random.random module, which + # implements a subset of Python's random API + # Not implemented: + # seed(), getstate(), setstate(), jumpahead() + # random(), uniform(), triangular(), betavariate() + # expovariate(), gammavariate(), gauss(), + # longnormvariate(), normalvariate(), + # vonmisesvariate(), paretovariate() + # weibullvariate() + # WichmannHill(), whseed(), SystemRandom() + from Cryptodome.Random import random + x = random.getrandbits(16*8) + y = random.getrandbits(16*8) + self.assertNotEqual(x, y) + # Test randrange + if x>y: + start = y + stop = x + else: + start = x + stop = y + for step in range(1,10): + x = random.randrange(start,stop,step) + y = random.randrange(start,stop,step) + self.assertNotEqual(x, y) + self.assertEqual(start <= x < stop, True) + self.assertEqual(start <= y < stop, True) + self.assertEqual((x - start) % step, 0) + self.assertEqual((y - start) % step, 0) + for i in range(10): + self.assertEqual(random.randrange(1,2), 1) + self.assertRaises(ValueError, random.randrange, start, start) + self.assertRaises(ValueError, random.randrange, stop, start, step) + self.assertRaises(TypeError, random.randrange, start, stop, step, step) + self.assertRaises(TypeError, random.randrange, start, stop, "1") + self.assertRaises(TypeError, random.randrange, "1", stop, step) + self.assertRaises(TypeError, random.randrange, 1, "2", step) + self.assertRaises(ValueError, random.randrange, start, stop, 0) + # Test randint + x = random.randint(start,stop) + y = random.randint(start,stop) + self.assertNotEqual(x, y) + self.assertEqual(start <= x <= stop, True) + self.assertEqual(start <= y <= stop, True) + for i in range(10): + self.assertEqual(random.randint(1,1), 1) + self.assertRaises(ValueError, random.randint, stop, start) + self.assertRaises(TypeError, random.randint, start, stop, step) + self.assertRaises(TypeError, random.randint, "1", stop) + self.assertRaises(TypeError, random.randint, 1, "2") + # Test choice + seq = range(10000) + x = random.choice(seq) + y = random.choice(seq) + self.assertNotEqual(x, y) + self.assertEqual(x in seq, True) + self.assertEqual(y in seq, True) + for i in range(10): + self.assertEqual(random.choice((1,2,3)) in (1,2,3), True) + self.assertEqual(random.choice([1,2,3]) in [1,2,3], True) + if sys.version_info[0] == 3: + self.assertEqual(random.choice(bytearray(b('123'))) in bytearray(b('123')), True) + self.assertEqual(1, random.choice([1])) + self.assertRaises(IndexError, random.choice, []) + self.assertRaises(TypeError, random.choice, 1) + # Test shuffle. Lacks random parameter to specify function. + # Make copies of seq + seq = range(500) + x = list(seq) + y = list(seq) + random.shuffle(x) + random.shuffle(y) + self.assertNotEqual(x, y) + self.assertEqual(len(seq), len(x)) + self.assertEqual(len(seq), len(y)) + for i in range(len(seq)): + self.assertEqual(x[i] in seq, True) + self.assertEqual(y[i] in seq, True) + self.assertEqual(seq[i] in x, True) + self.assertEqual(seq[i] in y, True) + z = [1] + random.shuffle(z) + self.assertEqual(z, [1]) + if sys.version_info[0] == 3: + z = bytearray(b('12')) + random.shuffle(z) + self.assertEqual(b('1') in z, True) + self.assertRaises(TypeError, random.shuffle, b('12')) + self.assertRaises(TypeError, random.shuffle, 1) + self.assertRaises(TypeError, random.shuffle, "11") + self.assertRaises(TypeError, random.shuffle, (1,2)) + # 2to3 wraps a list() around it, alas - but I want to shoot + # myself in the foot here! :D + # if sys.version_info[0] == 3: + # self.assertRaises(TypeError, random.shuffle, range(3)) + # Test sample + x = random.sample(seq, 20) + y = random.sample(seq, 20) + self.assertNotEqual(x, y) + for i in range(20): + self.assertEqual(x[i] in seq, True) + self.assertEqual(y[i] in seq, True) + z = random.sample([1], 1) + self.assertEqual(z, [1]) + z = random.sample((1,2,3), 1) + self.assertEqual(z[0] in (1,2,3), True) + z = random.sample("123", 1) + self.assertEqual(z[0] in "123", True) + z = random.sample(range(3), 1) + self.assertEqual(z[0] in range(3), True) + if sys.version_info[0] == 3: + z = random.sample(b("123"), 1) + self.assertEqual(z[0] in b("123"), True) + z = random.sample(bytearray(b("123")), 1) + self.assertEqual(z[0] in bytearray(b("123")), True) + self.assertRaises(TypeError, random.sample, 1) + +def get_tests(config={}): + return [SimpleTest()] + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/__init__.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/__init__.py new file mode 100644 index 0000000..83cf0f3 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/__init__.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Signature/__init__.py: Self-test for signature modules +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test for signature modules""" + +import unittest +from . import test_pkcs1_15, test_pss, test_dss, test_eddsa + + +def get_tests(config={}): + tests = [] + tests += test_pkcs1_15.get_tests(config=config) + tests += test_pss.get_tests(config=config) + tests += test_dss.get_tests(config=config) + tests += test_eddsa.get_tests(config=config) + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_dss.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_dss.py new file mode 100644 index 0000000..156ee67 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_dss.py @@ -0,0 +1,1369 @@ +# +# SelfTest/Signature/test_dss.py: Self-test for DSS signatures +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import re +import unittest +from binascii import hexlify, unhexlify + +from Cryptodome.Util.py3compat import tobytes, bord, bchr + +from Cryptodome.Hash import (SHA1, SHA224, SHA256, SHA384, SHA512, + SHA3_224, SHA3_256, SHA3_384, SHA3_512) +from Cryptodome.Signature import DSS +from Cryptodome.PublicKey import DSA, ECC +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors, load_test_vectors_wycheproof +from Cryptodome.Util.number import bytes_to_long, long_to_bytes + + +def t2b(hexstring): + ws = hexstring.replace(" ", "").replace("\n", "") + return unhexlify(tobytes(ws)) + + +def t2l(hexstring): + ws = hexstring.replace(" ", "").replace("\n", "") + return int(ws, 16) + + +def load_hash_by_name(hash_name): + return __import__("Cryptodome.Hash." + hash_name, globals(), locals(), ["new"]) + + +class StrRNG: + + def __init__(self, randomness): + length = len(randomness) + self._idx = 0 + # Fix required to get the right K (see how randint() works!) + self._randomness = long_to_bytes(bytes_to_long(randomness) - 1, length) + + def __call__(self, n): + out = self._randomness[self._idx:self._idx + n] + self._idx += n + return out + + +class FIPS_DSA_Tests(unittest.TestCase): + + # 1st 1024 bit key from SigGen.txt + P = 0xa8f9cd201e5e35d892f85f80e4db2599a5676a3b1d4f190330ed3256b26d0e80a0e49a8fffaaad2a24f472d2573241d4d6d6c7480c80b4c67bb4479c15ada7ea8424d2502fa01472e760241713dab025ae1b02e1703a1435f62ddf4ee4c1b664066eb22f2e3bf28bb70a2a76e4fd5ebe2d1229681b5b06439ac9c7e9d8bde283 + Q = 0xf85f0f83ac4df7ea0cdf8f469bfeeaea14156495 + G = 0x2b3152ff6c62f14622b8f48e59f8af46883b38e79b8c74deeae9df131f8b856e3ad6c8455dab87cc0da8ac973417ce4f7878557d6cdf40b35b4a0ca3eb310c6a95d68ce284ad4e25ea28591611ee08b8444bd64b25f3f7c572410ddfb39cc728b9c936f85f419129869929cdb909a6a3a99bbe089216368171bd0ba81de4fe33 + X = 0xc53eae6d45323164c7d07af5715703744a63fc3a + Y = 0x313fd9ebca91574e1c2eebe1517c57e0c21b0209872140c5328761bbb2450b33f1b18b409ce9ab7c4cd8fda3391e8e34868357c199e16a6b2eba06d6749def791d79e95d3a4d09b24c392ad89dbf100995ae19c01062056bb14bce005e8731efde175f95b975089bdcdaea562b32786d96f5a31aedf75364008ad4fffebb970b + + key_pub = DSA.construct((Y, G, P, Q)) + key_priv = DSA.construct((Y, G, P, Q, X)) + + def shortDescription(self): + return "FIPS DSA Tests" + + def test_loopback(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv, 'fips-186-3') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub, 'fips-186-3') + verifier.verify(hashed_msg, signature) + + def test_negative_unapproved_hashes(self): + """Verify that unapproved hashes are rejected""" + + from Cryptodome.Hash import RIPEMD160 + + self.description = "Unapproved hash (RIPEMD160) test" + hash_obj = RIPEMD160.new() + signer = DSS.new(self.key_priv, 'fips-186-3') + self.assertRaises(ValueError, signer.sign, hash_obj) + self.assertRaises(ValueError, signer.verify, hash_obj, b"\x00" * 40) + + def test_negative_unknown_modes_encodings(self): + """Verify that unknown modes/encodings are rejected""" + + self.description = "Unknown mode test" + self.assertRaises(ValueError, DSS.new, self.key_priv, 'fips-186-0') + + self.description = "Unknown encoding test" + self.assertRaises(ValueError, DSS.new, self.key_priv, 'fips-186-3', 'xml') + + def test_asn1_encoding(self): + """Verify ASN.1 encoding""" + + self.description = "ASN.1 encoding test" + hash_obj = SHA1.new() + signer = DSS.new(self.key_priv, 'fips-186-3', 'der') + signature = signer.sign(hash_obj) + + # Verify that output looks like a DER SEQUENCE + self.assertEqual(bord(signature[0]), 48) + signer.verify(hash_obj, signature) + + # Verify that ASN.1 parsing fails as expected + signature = bchr(7) + signature[1:] + self.assertRaises(ValueError, signer.verify, hash_obj, signature) + + def test_sign_verify(self): + """Verify public/private method""" + + self.description = "can_sign() test" + signer = DSS.new(self.key_priv, 'fips-186-3') + self.assertTrue(signer.can_sign()) + + signer = DSS.new(self.key_pub, 'fips-186-3') + self.assertFalse(signer.can_sign()) + + try: + signer.sign(SHA256.new(b'xyz')) + except TypeError as e: + msg = str(e) + else: + msg = "" + self.assertTrue("Private key is needed" in msg) + + +class FIPS_DSA_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_verify = load_test_vectors(("Signature", "DSA"), + "FIPS_186_3_SigVer.rsp", + "Signature Verification 186-3", + {'result': lambda x: x}) or [] + +for idx, tv in enumerate(test_vectors_verify): + + if isinstance(tv, str): + res = re.match(r"\[mod = L=([0-9]+), N=([0-9]+), ([a-zA-Z0-9-]+)\]", tv) + assert(res) + hash_name = res.group(3).replace("-", "") + hash_module = load_hash_by_name(hash_name) + continue + + if hasattr(tv, "p"): + modulus = tv.p + generator = tv.g + suborder = tv.q + continue + + hash_obj = hash_module.new(tv.msg) + + comps = [bytes_to_long(x) for x in (tv.y, generator, modulus, suborder)] + key = DSA.construct(comps, False) # type: ignore + verifier = DSS.new(key, 'fips-186-3') + + def positive_test(self, verifier=verifier, hash_obj=hash_obj, signature=tv.r+tv.s): + verifier.verify(hash_obj, signature) + + def negative_test(self, verifier=verifier, hash_obj=hash_obj, signature=tv.r+tv.s): + self.assertRaises(ValueError, verifier.verify, hash_obj, signature) + + if tv.result == 'p': + setattr(FIPS_DSA_Tests_KAT, "test_verify_positive_%d" % idx, positive_test) + else: + setattr(FIPS_DSA_Tests_KAT, "test_verify_negative_%d" % idx, negative_test) + + +test_vectors_sign = load_test_vectors(("Signature", "DSA"), + "FIPS_186_3_SigGen.txt", + "Signature Creation 186-3", + {}) or [] + +for idx, tv in enumerate(test_vectors_sign): + + if isinstance(tv, str): + res = re.match(r"\[mod = L=([0-9]+), N=([0-9]+), ([a-zA-Z0-9-]+)\]", tv) + assert(res) + hash_name = res.group(3).replace("-", "") + hash_module = load_hash_by_name(hash_name) + continue + + if hasattr(tv, "p"): + modulus = tv.p + generator = tv.g + suborder = tv.q + continue + + hash_obj = hash_module.new(tv.msg) + comps_dsa = [bytes_to_long(x) for x in (tv.y, generator, modulus, suborder, tv.x)] + key = DSA.construct(comps_dsa, False) # type: ignore + signer = DSS.new(key, 'fips-186-3', randfunc=StrRNG(tv.k)) + + def new_test(self, signer=signer, hash_obj=hash_obj, signature=tv.r+tv.s): + self.assertEqual(signer.sign(hash_obj), signature) + setattr(FIPS_DSA_Tests_KAT, "test_sign_%d" % idx, new_test) + + +class FIPS_ECDSA_Tests(unittest.TestCase): + + key_priv = ECC.generate(curve="P-256") + key_pub = key_priv.public_key() + + def shortDescription(self): + return "FIPS ECDSA Tests" + + def test_loopback(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv, 'fips-186-3') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub, 'fips-186-3') + verifier.verify(hashed_msg, signature) + + def test_negative_unapproved_hashes(self): + """Verify that unapproved hashes are rejected""" + + from Cryptodome.Hash import SHA1 + + self.description = "Unapproved hash (SHA-1) test" + hash_obj = SHA1.new() + signer = DSS.new(self.key_priv, 'fips-186-3') + self.assertRaises(ValueError, signer.sign, hash_obj) + self.assertRaises(ValueError, signer.verify, hash_obj, b"\x00" * 40) + + def test_negative_eddsa_key(self): + key = ECC.generate(curve="ed25519") + self.assertRaises(ValueError, DSS.new, key, 'fips-186-3') + + def test_sign_verify(self): + """Verify public/private method""" + + self.description = "can_sign() test" + signer = DSS.new(self.key_priv, 'fips-186-3') + self.assertTrue(signer.can_sign()) + + signer = DSS.new(self.key_pub, 'fips-186-3') + self.assertFalse(signer.can_sign()) + self.assertRaises(TypeError, signer.sign, SHA256.new(b'xyz')) + + try: + signer.sign(SHA256.new(b'xyz')) + except TypeError as e: + msg = str(e) + else: + msg = "" + self.assertTrue("Private key is needed" in msg) + + def test_negative_unknown_modes_encodings(self): + """Verify that unknown modes/encodings are rejected""" + + self.description = "Unknown mode test" + self.assertRaises(ValueError, DSS.new, self.key_priv, 'fips-186-0') + + self.description = "Unknown encoding test" + self.assertRaises(ValueError, DSS.new, self.key_priv, 'fips-186-3', 'xml') + + def test_asn1_encoding(self): + """Verify ASN.1 encoding""" + + self.description = "ASN.1 encoding test" + hash_obj = SHA256.new() + signer = DSS.new(self.key_priv, 'fips-186-3', 'der') + signature = signer.sign(hash_obj) + + # Verify that output looks like a DER SEQUENCE + self.assertEqual(bord(signature[0]), 48) + signer.verify(hash_obj, signature) + + # Verify that ASN.1 parsing fails as expected + signature = bchr(7) + signature[1:] + self.assertRaises(ValueError, signer.verify, hash_obj, signature) + + +class FIPS_ECDSA_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_verify = load_test_vectors(("Signature", "ECDSA"), + "SigVer.rsp", + "ECDSA Signature Verification 186-3", + {'result': lambda x: x, + 'qx': lambda x: int(x, 16), + 'qy': lambda x: int(x, 16), + }) or [] +test_vectors_verify += load_test_vectors(("Signature", "ECDSA"), + "SigVer_TruncatedSHAs.rsp", + "ECDSA Signature Verification 186-3", + {'result': lambda x: x, + 'qx': lambda x: int(x, 16), + 'qy': lambda x: int(x, 16), + }) or [] + + +for idx, tv in enumerate(test_vectors_verify): + + if isinstance(tv, str): + res = re.match(r"\[(P-[0-9]+),(SHA-[0-9]+)\]", tv) + assert res + curve_name = res.group(1) + hash_name = res.group(2).replace("-", "") + if hash_name in ("SHA512224", "SHA512256"): + truncate = hash_name[-3:] + hash_name = hash_name[:-3] + else: + truncate = None + hash_module = load_hash_by_name(hash_name) + continue + + if truncate is None: + hash_obj = hash_module.new(tv.msg) + else: + hash_obj = hash_module.new(tv.msg, truncate=truncate) + ecc_key = ECC.construct(curve=curve_name, point_x=tv.qx, point_y=tv.qy) + verifier = DSS.new(ecc_key, 'fips-186-3') + + def positive_test(self, verifier=verifier, hash_obj=hash_obj, signature=tv.r+tv.s): + verifier.verify(hash_obj, signature) + + def negative_test(self, verifier=verifier, hash_obj=hash_obj, signature=tv.r+tv.s): + self.assertRaises(ValueError, verifier.verify, hash_obj, signature) + + if tv.result.startswith('p'): + setattr(FIPS_ECDSA_Tests_KAT, "test_verify_positive_%d" % idx, positive_test) + else: + setattr(FIPS_ECDSA_Tests_KAT, "test_verify_negative_%d" % idx, negative_test) + + +test_vectors_sign = load_test_vectors(("Signature", "ECDSA"), + "SigGen.txt", + "ECDSA Signature Verification 186-3", + {'d': lambda x: int(x, 16)}) or [] + +for idx, tv in enumerate(test_vectors_sign): + + if isinstance(tv, str): + res = re.match(r"\[(P-[0-9]+),(SHA-[0-9]+)\]", tv) + assert res + curve_name = res.group(1) + hash_name = res.group(2).replace("-", "") + hash_module = load_hash_by_name(hash_name) + continue + + hash_obj = hash_module.new(tv.msg) + ecc_key = ECC.construct(curve=curve_name, d=tv.d) + signer = DSS.new(ecc_key, 'fips-186-3', randfunc=StrRNG(tv.k)) + + def sign_test(self, signer=signer, hash_obj=hash_obj, signature=tv.r+tv.s): + self.assertEqual(signer.sign(hash_obj), signature) + setattr(FIPS_ECDSA_Tests_KAT, "test_sign_%d" % idx, sign_test) + + +class Det_DSA_Tests(unittest.TestCase): + """Tests from rfc6979""" + + # Each key is (p, q, g, x, y, desc) + keys = [ + ( + """ + 86F5CA03DCFEB225063FF830A0C769B9DD9D6153AD91D7CE27F787C43278B447 + E6533B86B18BED6E8A48B784A14C252C5BE0DBF60B86D6385BD2F12FB763ED88 + 73ABFD3F5BA2E0A8C0A59082EAC056935E529DAF7C610467899C77ADEDFC846C + 881870B7B19B2B58F9BE0521A17002E3BDD6B86685EE90B3D9A1B02B782B1779""", + "996F967F6C8E388D9E28D01E205FBA957A5698B1", + """ + 07B0F92546150B62514BB771E2A0C0CE387F03BDA6C56B505209FF25FD3C133D + 89BBCD97E904E09114D9A7DEFDEADFC9078EA544D2E401AEECC40BB9FBBF78FD + 87995A10A1C27CB7789B594BA7EFB5C4326A9FE59A070E136DB77175464ADCA4 + 17BE5DCE2F40D10A46A3A3943F26AB7FD9C0398FF8C76EE0A56826A8A88F1DBD""", + "411602CB19A6CCC34494D79D98EF1E7ED5AF25F7", + """ + 5DF5E01DED31D0297E274E1691C192FE5868FEF9E19A84776454B100CF16F653 + 92195A38B90523E2542EE61871C0440CB87C322FC4B4D2EC5E1E7EC766E1BE8D + 4CE935437DC11C3C8FD426338933EBFE739CB3465F4D3668C5E473508253B1E6 + 82F65CBDC4FAE93C2EA212390E54905A86E2223170B44EAA7DA5DD9FFCFB7F3B""", + "DSA1024" + ), + ( + """ + 9DB6FB5951B66BB6FE1E140F1D2CE5502374161FD6538DF1648218642F0B5C48 + C8F7A41AADFA187324B87674FA1822B00F1ECF8136943D7C55757264E5A1A44F + FE012E9936E00C1D3E9310B01C7D179805D3058B2A9F4BB6F9716BFE6117C6B5 + B3CC4D9BE341104AD4A80AD6C94E005F4B993E14F091EB51743BF33050C38DE2 + 35567E1B34C3D6A5C0CEAA1A0F368213C3D19843D0B4B09DCB9FC72D39C8DE41 + F1BF14D4BB4563CA28371621CAD3324B6A2D392145BEBFAC748805236F5CA2FE + 92B871CD8F9C36D3292B5509CA8CAA77A2ADFC7BFD77DDA6F71125A7456FEA15 + 3E433256A2261C6A06ED3693797E7995FAD5AABBCFBE3EDA2741E375404AE25B""", + "F2C3119374CE76C9356990B465374A17F23F9ED35089BD969F61C6DDE9998C1F", + """ + 5C7FF6B06F8F143FE8288433493E4769C4D988ACE5BE25A0E24809670716C613 + D7B0CEE6932F8FAA7C44D2CB24523DA53FBE4F6EC3595892D1AA58C4328A06C4 + 6A15662E7EAA703A1DECF8BBB2D05DBE2EB956C142A338661D10461C0D135472 + 085057F3494309FFA73C611F78B32ADBB5740C361C9F35BE90997DB2014E2EF5 + AA61782F52ABEB8BD6432C4DD097BC5423B285DAFB60DC364E8161F4A2A35ACA + 3A10B1C4D203CC76A470A33AFDCBDD92959859ABD8B56E1725252D78EAC66E71 + BA9AE3F1DD2487199874393CD4D832186800654760E1E34C09E4D155179F9EC0 + DC4473F996BDCE6EED1CABED8B6F116F7AD9CF505DF0F998E34AB27514B0FFE7""", + "69C7548C21D0DFEA6B9A51C9EAD4E27C33D3B3F180316E5BCAB92C933F0E4DBC", + """ + 667098C654426C78D7F8201EAC6C203EF030D43605032C2F1FA937E5237DBD94 + 9F34A0A2564FE126DC8B715C5141802CE0979C8246463C40E6B6BDAA2513FA61 + 1728716C2E4FD53BC95B89E69949D96512E873B9C8F8DFD499CC312882561ADE + CB31F658E934C0C197F2C4D96B05CBAD67381E7B768891E4DA3843D24D94CDFB + 5126E9B8BF21E8358EE0E0A30EF13FD6A664C0DCE3731F7FB49A4845A4FD8254 + 687972A2D382599C9BAC4E0ED7998193078913032558134976410B89D2C171D1 + 23AC35FD977219597AA7D15C1A9A428E59194F75C721EBCBCFAE44696A499AFA + 74E04299F132026601638CB87AB79190D4A0986315DA8EEC6561C938996BEADF""", + "DSA2048" + ), + ] + + # This is a sequence of items: + # message, k, r, s, hash module + signatures = [ + ( + "sample", + "7BDB6B0FF756E1BB5D53583EF979082F9AD5BD5B", + "2E1A0C2562B2912CAAF89186FB0F42001585DA55", + "29EFB6B0AFF2D7A68EB70CA313022253B9A88DF5", + SHA1, + 'DSA1024' + ), + ( + "sample", + "562097C06782D60C3037BA7BE104774344687649", + "4BC3B686AEA70145856814A6F1BB53346F02101E", + "410697B92295D994D21EDD2F4ADA85566F6F94C1", + SHA224, + 'DSA1024' + ), + ( + "sample", + "519BA0546D0C39202A7D34D7DFA5E760B318BCFB", + "81F2F5850BE5BC123C43F71A3033E9384611C545", + "4CDD914B65EB6C66A8AAAD27299BEE6B035F5E89", + SHA256, + 'DSA1024' + ), + ( + "sample", + "95897CD7BBB944AA932DBC579C1C09EB6FCFC595", + "07F2108557EE0E3921BC1774F1CA9B410B4CE65A", + "54DF70456C86FAC10FAB47C1949AB83F2C6F7595", + SHA384, + 'DSA1024' + ), + ( + "sample", + "09ECE7CA27D0F5A4DD4E556C9DF1D21D28104F8B", + "16C3491F9B8C3FBBDD5E7A7B667057F0D8EE8E1B", + "02C36A127A7B89EDBB72E4FFBC71DABC7D4FC69C", + SHA512, + 'DSA1024' + ), + ( + "test", + "5C842DF4F9E344EE09F056838B42C7A17F4A6433", + "42AB2052FD43E123F0607F115052A67DCD9C5C77", + "183916B0230D45B9931491D4C6B0BD2FB4AAF088", + SHA1, + 'DSA1024' + ), + ( + "test", + "4598B8EFC1A53BC8AECD58D1ABBB0C0C71E67297", + "6868E9964E36C1689F6037F91F28D5F2C30610F2", + "49CEC3ACDC83018C5BD2674ECAAD35B8CD22940F", + SHA224, + 'DSA1024' + ), + ( + "test", + "5A67592E8128E03A417B0484410FB72C0B630E1A", + "22518C127299B0F6FDC9872B282B9E70D0790812", + "6837EC18F150D55DE95B5E29BE7AF5D01E4FE160", + SHA256, + 'DSA1024' + ), + ( + "test", + "220156B761F6CA5E6C9F1B9CF9C24BE25F98CD89", + "854CF929B58D73C3CBFDC421E8D5430CD6DB5E66", + "91D0E0F53E22F898D158380676A871A157CDA622", + SHA384, + 'DSA1024' + ), + ( + "test", + "65D2C2EEB175E370F28C75BFCDC028D22C7DBE9C", + "8EA47E475BA8AC6F2D821DA3BD212D11A3DEB9A0", + "7C670C7AD72B6C050C109E1790008097125433E8", + SHA512, + 'DSA1024' + ), + ( + "sample", + "888FA6F7738A41BDC9846466ABDB8174C0338250AE50CE955CA16230F9CBD53E", + "3A1B2DBD7489D6ED7E608FD036C83AF396E290DBD602408E8677DAABD6E7445A", + "D26FCBA19FA3E3058FFC02CA1596CDBB6E0D20CB37B06054F7E36DED0CDBBCCF", + SHA1, + 'DSA2048' + ), + ( + "sample", + "BC372967702082E1AA4FCE892209F71AE4AD25A6DFD869334E6F153BD0C4D806", + "DC9F4DEADA8D8FF588E98FED0AB690FFCE858DC8C79376450EB6B76C24537E2C", + "A65A9C3BC7BABE286B195D5DA68616DA8D47FA0097F36DD19F517327DC848CEC", + SHA224, + 'DSA2048' + ), + ( + "sample", + "8926A27C40484216F052F4427CFD5647338B7B3939BC6573AF4333569D597C52", + "EACE8BDBBE353C432A795D9EC556C6D021F7A03F42C36E9BC87E4AC7932CC809", + "7081E175455F9247B812B74583E9E94F9EA79BD640DC962533B0680793A38D53", + SHA256, + 'DSA2048' + ), + ( + "sample", + "C345D5AB3DA0A5BCB7EC8F8FB7A7E96069E03B206371EF7D83E39068EC564920", + "B2DA945E91858834FD9BF616EBAC151EDBC4B45D27D0DD4A7F6A22739F45C00B", + "19048B63D9FD6BCA1D9BAE3664E1BCB97F7276C306130969F63F38FA8319021B", + SHA384, + 'DSA2048' + ), + ( + "sample", + "5A12994431785485B3F5F067221517791B85A597B7A9436995C89ED0374668FC", + "2016ED092DC5FB669B8EFB3D1F31A91EECB199879BE0CF78F02BA062CB4C942E", + "D0C76F84B5F091E141572A639A4FB8C230807EEA7D55C8A154A224400AFF2351", + SHA512, + 'DSA2048' + ), + ( + "test", + "6EEA486F9D41A037B2C640BC5645694FF8FF4B98D066A25F76BE641CCB24BA4F", + "C18270A93CFC6063F57A4DFA86024F700D980E4CF4E2CB65A504397273D98EA0", + "414F22E5F31A8B6D33295C7539C1C1BA3A6160D7D68D50AC0D3A5BEAC2884FAA", + SHA1, + 'DSA2048' + ), + ( + "test", + "06BD4C05ED74719106223BE33F2D95DA6B3B541DAD7BFBD7AC508213B6DA6670", + "272ABA31572F6CC55E30BF616B7A265312018DD325BE031BE0CC82AA17870EA3", + "E9CC286A52CCE201586722D36D1E917EB96A4EBDB47932F9576AC645B3A60806", + SHA224, + 'DSA2048' + ), + ( + "test", + "1D6CE6DDA1C5D37307839CD03AB0A5CBB18E60D800937D67DFB4479AAC8DEAD7", + "8190012A1969F9957D56FCCAAD223186F423398D58EF5B3CEFD5A4146A4476F0", + "7452A53F7075D417B4B013B278D1BB8BBD21863F5E7B1CEE679CF2188E1AB19E", + SHA256, + 'DSA2048' + ), + ( + "test", + "206E61F73DBE1B2DC8BE736B22B079E9DACD974DB00EEBBC5B64CAD39CF9F91C", + "239E66DDBE8F8C230A3D071D601B6FFBDFB5901F94D444C6AF56F732BEB954BE", + "6BD737513D5E72FE85D1C750E0F73921FE299B945AAD1C802F15C26A43D34961", + SHA384, + 'DSA2048' + ), + ( + "test", + "AFF1651E4CD6036D57AA8B2A05CCF1A9D5A40166340ECBBDC55BE10B568AA0AA", + "89EC4BB1400ECCFF8E7D9AA515CD1DE7803F2DAFF09693EE7FD1353E90A68307", + "C9F0BDABCC0D880BB137A994CC7F3980CE91CC10FAF529FC46565B15CEA854E1", + SHA512, + 'DSA2048' + ) + ] + + def setUp(self): + # Convert DSA key components from hex strings to integers + # Each key is (p, q, g, x, y, desc) + + from collections import namedtuple + + TestKey = namedtuple('TestKey', 'p q g x y') + new_keys = {} + for k in self.keys: + tk = TestKey(*[t2l(y) for y in k[:-1]]) + new_keys[k[-1]] = tk + self.keys = new_keys + + # Convert signature encoding + TestSig = namedtuple('TestSig', 'message nonce result module test_key') + new_signatures = [] + for message, nonce, r, s, module, test_key in self.signatures: + tsig = TestSig( + tobytes(message), + t2l(nonce), + t2b(r) + t2b(s), + module, + self.keys[test_key] + ) + new_signatures.append(tsig) + self.signatures = new_signatures + + def test1(self): + q = 0x4000000000000000000020108A2E0CC0D99F8A5EF + x = 0x09A4D6792295A7F730FC3F2B49CBC0F62E862272F + p = 2 * q + 1 + y = pow(2, x, p) + key = DSA.construct([pow(y, 2, p), 2, p, q, x], False) + signer = DSS.new(key, 'deterministic-rfc6979') + + # Test _int2octets + self.assertEqual(hexlify(signer._int2octets(x)), + b'009a4d6792295a7f730fc3f2b49cbc0f62e862272f') + + # Test _bits2octets + h1 = SHA256.new(b"sample").digest() + self.assertEqual(hexlify(signer._bits2octets(h1)), + b'01795edf0d54db760f156d0dac04c0322b3a204224') + + def test2(self): + + for sig in self.signatures: + tk = sig.test_key + key = DSA.construct([tk.y, tk.g, tk.p, tk.q, tk.x], False) + signer = DSS.new(key, 'deterministic-rfc6979') + + hash_obj = sig.module.new(sig.message) + result = signer.sign(hash_obj) + self.assertEqual(sig.result, result) + + +class Det_ECDSA_Tests(unittest.TestCase): + + key_priv_p192 = ECC.construct(curve="P-192", d=0x6FAB034934E4C0FC9AE67F5B5659A9D7D1FEFD187EE09FD4) + key_pub_p192 = key_priv_p192.public_key() + + key_priv_p224 = ECC.construct(curve="P-224", d=0xF220266E1105BFE3083E03EC7A3A654651F45E37167E88600BF257C1) + key_pub_p224 = key_priv_p224.public_key() + + key_priv_p256 = ECC.construct(curve="P-256", d=0xC9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721) + key_pub_p256 = key_priv_p256.public_key() + + key_priv_p384 = ECC.construct(curve="P-384", d=0x6B9D3DAD2E1B8C1C05B19875B6659F4DE23C3B667BF297BA9AA47740787137D896D5724E4C70A825F872C9EA60D2EDF5) + key_pub_p384 = key_priv_p384.public_key() + + key_priv_p521 = ECC.construct(curve="P-521", d=0x0FAD06DAA62BA3B25D2FB40133DA757205DE67F5BB0018FEE8C86E1B68C7E75CAA896EB32F1F47C70855836A6D16FCC1466F6D8FBEC67DB89EC0C08B0E996B83538) + key_pub_p521 = key_priv_p521.public_key() + + # This is a sequence of items: + # message, k, r, s, hash module + # taken from RFC6979 + signatures_p192_ = ( + ( + "sample", + "37D7CA00D2C7B0E5E412AC03BD44BA837FDD5B28CD3B0021", + "98C6BD12B23EAF5E2A2045132086BE3EB8EBD62ABF6698FF", + "57A22B07DEA9530F8DE9471B1DC6624472E8E2844BC25B64", + SHA1 + ), + ( + "sample", + "4381526B3FC1E7128F202E194505592F01D5FF4C5AF015D8", + "A1F00DAD97AEEC91C95585F36200C65F3C01812AA60378F5", + "E07EC1304C7C6C9DEBBE980B9692668F81D4DE7922A0F97A", + SHA224 + ), + ( + "sample", + "32B1B6D7D42A05CB449065727A84804FB1A3E34D8F261496", + "4B0B8CE98A92866A2820E20AA6B75B56382E0F9BFD5ECB55", + "CCDB006926EA9565CBADC840829D8C384E06DE1F1E381B85", + SHA256 + ), + ( + "sample", + "4730005C4FCB01834C063A7B6760096DBE284B8252EF4311", + "DA63BF0B9ABCF948FBB1E9167F136145F7A20426DCC287D5", + "C3AA2C960972BD7A2003A57E1C4C77F0578F8AE95E31EC5E", + SHA384 + ), + ( + "sample", + "A2AC7AB055E4F20692D49209544C203A7D1F2C0BFBC75DB1", + "4D60C5AB1996BD848343B31C00850205E2EA6922DAC2E4B8", + "3F6E837448F027A1BF4B34E796E32A811CBB4050908D8F67", + SHA512 + ), + ( + "test", + "D9CF9C3D3297D3260773A1DA7418DB5537AB8DD93DE7FA25", + "0F2141A0EBBC44D2E1AF90A50EBCFCE5E197B3B7D4DE036D", + "EB18BC9E1F3D7387500CB99CF5F7C157070A8961E38700B7", + SHA1 + ), + ( + "test", + "F5DC805F76EF851800700CCE82E7B98D8911B7D510059FBE", + "6945A1C1D1B2206B8145548F633BB61CEF04891BAF26ED34", + "B7FB7FDFC339C0B9BD61A9F5A8EAF9BE58FC5CBA2CB15293", + SHA224 + ), + ( + "test", + "5C4CE89CF56D9E7C77C8585339B006B97B5F0680B4306C6C", + "3A718BD8B4926C3B52EE6BBE67EF79B18CB6EB62B1AD97AE", + "5662E6848A4A19B1F1AE2F72ACD4B8BBE50F1EAC65D9124F", + SHA256 + ), + ( + "test", + "5AFEFB5D3393261B828DB6C91FBC68C230727B030C975693", + "B234B60B4DB75A733E19280A7A6034BD6B1EE88AF5332367", + "7994090B2D59BB782BE57E74A44C9A1C700413F8ABEFE77A", + SHA384 + ), + ( + "test", + "0758753A5254759C7CFBAD2E2D9B0792EEE44136C9480527", + "FE4F4AE86A58B6507946715934FE2D8FF9D95B6B098FE739", + "74CF5605C98FBA0E1EF34D4B5A1577A7DCF59457CAE52290", + SHA512 + ) + ) + + signatures_p224_ = ( + ( + "sample", + "7EEFADD91110D8DE6C2C470831387C50D3357F7F4D477054B8B426BC", + "22226F9D40A96E19C4A301CE5B74B115303C0F3A4FD30FC257FB57AC", + "66D1CDD83E3AF75605DD6E2FEFF196D30AA7ED7A2EDF7AF475403D69", + SHA1 + ), + ( + "sample", + "C1D1F2F10881088301880506805FEB4825FE09ACB6816C36991AA06D", + "1CDFE6662DDE1E4A1EC4CDEDF6A1F5A2FB7FBD9145C12113E6ABFD3E", + "A6694FD7718A21053F225D3F46197CA699D45006C06F871808F43EBC", + SHA224 + ), + ( + "sample", + "AD3029E0278F80643DE33917CE6908C70A8FF50A411F06E41DEDFCDC", + "61AA3DA010E8E8406C656BC477A7A7189895E7E840CDFE8FF42307BA", + "BC814050DAB5D23770879494F9E0A680DC1AF7161991BDE692B10101", + SHA256 + ), + ( + "sample", + "52B40F5A9D3D13040F494E83D3906C6079F29981035C7BD51E5CAC40", + "0B115E5E36F0F9EC81F1325A5952878D745E19D7BB3EABFABA77E953", + "830F34CCDFE826CCFDC81EB4129772E20E122348A2BBD889A1B1AF1D", + SHA384 + ), + ( + "sample", + "9DB103FFEDEDF9CFDBA05184F925400C1653B8501BAB89CEA0FBEC14", + "074BD1D979D5F32BF958DDC61E4FB4872ADCAFEB2256497CDAC30397", + "A4CECA196C3D5A1FF31027B33185DC8EE43F288B21AB342E5D8EB084", + SHA512 + ), + ( + "test", + "2519178F82C3F0E4F87ED5883A4E114E5B7A6E374043D8EFD329C253", + "DEAA646EC2AF2EA8AD53ED66B2E2DDAA49A12EFD8356561451F3E21C", + "95987796F6CF2062AB8135271DE56AE55366C045F6D9593F53787BD2", + SHA1 + ), + ( + "test", + "DF8B38D40DCA3E077D0AC520BF56B6D565134D9B5F2EAE0D34900524", + "C441CE8E261DED634E4CF84910E4C5D1D22C5CF3B732BB204DBEF019", + "902F42847A63BDC5F6046ADA114953120F99442D76510150F372A3F4", + SHA224 + ), + ( + "test", + "FF86F57924DA248D6E44E8154EB69F0AE2AEBAEE9931D0B5A969F904", + "AD04DDE87B84747A243A631EA47A1BA6D1FAA059149AD2440DE6FBA6", + "178D49B1AE90E3D8B629BE3DB5683915F4E8C99FDF6E666CF37ADCFD", + SHA256 + ), + ( + "test", + "7046742B839478C1B5BD31DB2E862AD868E1A45C863585B5F22BDC2D", + "389B92682E399B26518A95506B52C03BC9379A9DADF3391A21FB0EA4", + "414A718ED3249FF6DBC5B50C27F71F01F070944DA22AB1F78F559AAB", + SHA384 + ), + ( + "test", + "E39C2AA4EA6BE2306C72126D40ED77BF9739BB4D6EF2BBB1DCB6169D", + "049F050477C5ADD858CAC56208394B5A55BAEBBE887FDF765047C17C", + "077EB13E7005929CEFA3CD0403C7CDCC077ADF4E44F3C41B2F60ECFF", + SHA512 + ) + ) + + signatures_p256_ = ( + ( + "sample", + "882905F1227FD620FBF2ABF21244F0BA83D0DC3A9103DBBEE43A1FB858109DB4", + "61340C88C3AAEBEB4F6D667F672CA9759A6CCAA9FA8811313039EE4A35471D32", + "6D7F147DAC089441BB2E2FE8F7A3FA264B9C475098FDCF6E00D7C996E1B8B7EB", + SHA1 + ), + ( + "sample", + "103F90EE9DC52E5E7FB5132B7033C63066D194321491862059967C715985D473", + "53B2FFF5D1752B2C689DF257C04C40A587FABABB3F6FC2702F1343AF7CA9AA3F", + "B9AFB64FDC03DC1A131C7D2386D11E349F070AA432A4ACC918BEA988BF75C74C", + SHA224 + ), + ( + "sample", + "A6E3C57DD01ABE90086538398355DD4C3B17AA873382B0F24D6129493D8AAD60", + "EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716", + "F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8", + SHA256 + ), + ( + "sample", + "09F634B188CEFD98E7EC88B1AA9852D734D0BC272F7D2A47DECC6EBEB375AAD4", + "0EAFEA039B20E9B42309FB1D89E213057CBF973DC0CFC8F129EDDDC800EF7719", + "4861F0491E6998B9455193E34E7B0D284DDD7149A74B95B9261F13ABDE940954", + SHA384 + ), + ( + "sample", + "5FA81C63109BADB88C1F367B47DA606DA28CAD69AA22C4FE6AD7DF73A7173AA5", + "8496A60B5E9B47C825488827E0495B0E3FA109EC4568FD3F8D1097678EB97F00", + "2362AB1ADBE2B8ADF9CB9EDAB740EA6049C028114F2460F96554F61FAE3302FE", + SHA512 + ), + ( + "test", + "8C9520267C55D6B980DF741E56B4ADEE114D84FBFA2E62137954164028632A2E", + "0CBCC86FD6ABD1D99E703E1EC50069EE5C0B4BA4B9AC60E409E8EC5910D81A89", + "01B9D7B73DFAA60D5651EC4591A0136F87653E0FD780C3B1BC872FFDEAE479B1", + SHA1 + ), + ( + "test", + "669F4426F2688B8BE0DB3A6BD1989BDAEFFF84B649EEB84F3DD26080F667FAA7", + "C37EDB6F0AE79D47C3C27E962FA269BB4F441770357E114EE511F662EC34A692", + "C820053A05791E521FCAAD6042D40AEA1D6B1A540138558F47D0719800E18F2D", + SHA224 + ), + ( + "test", + "D16B6AE827F17175E040871A1C7EC3500192C4C92677336EC2537ACAEE0008E0", + "F1ABB023518351CD71D881567B1EA663ED3EFCF6C5132B354F28D3B0B7D38367", + "019F4113742A2B14BD25926B49C649155F267E60D3814B4C0CC84250E46F0083", + SHA256 + ), + ( + "test", + "16AEFFA357260B04B1DD199693960740066C1A8F3E8EDD79070AA914D361B3B8", + "83910E8B48BB0C74244EBDF7F07A1C5413D61472BD941EF3920E623FBCCEBEB6", + "8DDBEC54CF8CD5874883841D712142A56A8D0F218F5003CB0296B6B509619F2C", + SHA384 + ), + ( + "test", + "6915D11632ACA3C40D5D51C08DAF9C555933819548784480E93499000D9F0B7F", + "461D93F31B6540894788FD206C07CFA0CC35F46FA3C91816FFF1040AD1581A04", + "39AF9F15DE0DB8D97E72719C74820D304CE5226E32DEDAE67519E840D1194E55", + SHA512 + ) + ) + + signatures_p384_ = ( + ( + "sample", + "4471EF7518BB2C7C20F62EAE1C387AD0C5E8E470995DB4ACF694466E6AB096630F29E5938D25106C3C340045A2DB01A7", + "EC748D839243D6FBEF4FC5C4859A7DFFD7F3ABDDF72014540C16D73309834FA37B9BA002899F6FDA3A4A9386790D4EB2", + "A3BCFA947BEEF4732BF247AC17F71676CB31A847B9FF0CBC9C9ED4C1A5B3FACF26F49CA031D4857570CCB5CA4424A443", + SHA1 + ), + ( + "sample", + "A4E4D2F0E729EB786B31FC20AD5D849E304450E0AE8E3E341134A5C1AFA03CAB8083EE4E3C45B06A5899EA56C51B5879", + "42356E76B55A6D9B4631C865445DBE54E056D3B3431766D0509244793C3F9366450F76EE3DE43F5A125333A6BE060122", + "9DA0C81787064021E78DF658F2FBB0B042BF304665DB721F077A4298B095E4834C082C03D83028EFBF93A3C23940CA8D", + SHA224 + ), + ( + "sample", + "180AE9F9AEC5438A44BC159A1FCB277C7BE54FA20E7CF404B490650A8ACC414E375572342863C899F9F2EDF9747A9B60", + "21B13D1E013C7FA1392D03C5F99AF8B30C570C6F98D4EA8E354B63A21D3DAA33BDE1E888E63355D92FA2B3C36D8FB2CD", + "F3AA443FB107745BF4BD77CB3891674632068A10CA67E3D45DB2266FA7D1FEEBEFDC63ECCD1AC42EC0CB8668A4FA0AB0", + SHA256 + ), + ( + "sample", + "94ED910D1A099DAD3254E9242AE85ABDE4BA15168EAF0CA87A555FD56D10FBCA2907E3E83BA95368623B8C4686915CF9", + "94EDBB92A5ECB8AAD4736E56C691916B3F88140666CE9FA73D64C4EA95AD133C81A648152E44ACF96E36DD1E80FABE46", + "99EF4AEB15F178CEA1FE40DB2603138F130E740A19624526203B6351D0A3A94FA329C145786E679E7B82C71A38628AC8", + SHA384 + ), + ( + "sample", + "92FC3C7183A883E24216D1141F1A8976C5B0DD797DFA597E3D7B32198BD35331A4E966532593A52980D0E3AAA5E10EC3", + "ED0959D5880AB2D869AE7F6C2915C6D60F96507F9CB3E047C0046861DA4A799CFE30F35CC900056D7C99CD7882433709", + "512C8CCEEE3890A84058CE1E22DBC2198F42323CE8ACA9135329F03C068E5112DC7CC3EF3446DEFCEB01A45C2667FDD5", + SHA512 + ), + ( + "test", + "66CC2C8F4D303FC962E5FF6A27BD79F84EC812DDAE58CF5243B64A4AD8094D47EC3727F3A3C186C15054492E30698497", + "4BC35D3A50EF4E30576F58CD96CE6BF638025EE624004A1F7789A8B8E43D0678ACD9D29876DAF46638645F7F404B11C7", + "D5A6326C494ED3FF614703878961C0FDE7B2C278F9A65FD8C4B7186201A2991695BA1C84541327E966FA7B50F7382282", + SHA1 + ), + ( + "test", + "18FA39DB95AA5F561F30FA3591DC59C0FA3653A80DAFFA0B48D1A4C6DFCBFF6E3D33BE4DC5EB8886A8ECD093F2935726", + "E8C9D0B6EA72A0E7837FEA1D14A1A9557F29FAA45D3E7EE888FC5BF954B5E62464A9A817C47FF78B8C11066B24080E72", + "07041D4A7A0379AC7232FF72E6F77B6DDB8F09B16CCE0EC3286B2BD43FA8C6141C53EA5ABEF0D8231077A04540A96B66", + SHA224 + ), + ( + "test", + "0CFAC37587532347DC3389FDC98286BBA8C73807285B184C83E62E26C401C0FAA48DD070BA79921A3457ABFF2D630AD7", + "6D6DEFAC9AB64DABAFE36C6BF510352A4CC27001263638E5B16D9BB51D451559F918EEDAF2293BE5B475CC8F0188636B", + "2D46F3BECBCC523D5F1A1256BF0C9B024D879BA9E838144C8BA6BAEB4B53B47D51AB373F9845C0514EEFB14024787265", + SHA256 + ), + ( + "test", + "015EE46A5BF88773ED9123A5AB0807962D193719503C527B031B4C2D225092ADA71F4A459BC0DA98ADB95837DB8312EA", + "8203B63D3C853E8D77227FB377BCF7B7B772E97892A80F36AB775D509D7A5FEB0542A7F0812998DA8F1DD3CA3CF023DB", + "DDD0760448D42D8A43AF45AF836FCE4DE8BE06B485E9B61B827C2F13173923E06A739F040649A667BF3B828246BAA5A5", + SHA384 + ), + ( + "test", + "3780C4F67CB15518B6ACAE34C9F83568D2E12E47DEAB6C50A4E4EE5319D1E8CE0E2CC8A136036DC4B9C00E6888F66B6C", + "A0D5D090C9980FAF3C2CE57B7AE951D31977DD11C775D314AF55F76C676447D06FB6495CD21B4B6E340FC236584FB277", + "976984E59B4C77B0E8E4460DCA3D9F20E07B9BB1F63BEEFAF576F6B2E8B224634A2092CD3792E0159AD9CEE37659C736", + SHA512 + ), + ) + + signatures_p521_ = ( + ( + "sample", + "0089C071B419E1C2820962321787258469511958E80582E95D8378E0C2CCDB3CB42BEDE42F50E3FA3C71F5A76724281D31D9C89F0F91FC1BE4918DB1C03A5838D0F9", + "00343B6EC45728975EA5CBA6659BBB6062A5FF89EEA58BE3C80B619F322C87910FE092F7D45BB0F8EEE01ED3F20BABEC079D202AE677B243AB40B5431D497C55D75D", + "00E7B0E675A9B24413D448B8CC119D2BF7B2D2DF032741C096634D6D65D0DBE3D5694625FB9E8104D3B842C1B0E2D0B98BEA19341E8676AEF66AE4EBA3D5475D5D16", + SHA1 + ), + ( + "sample", + "0121415EC2CD7726330A61F7F3FA5DE14BE9436019C4DB8CB4041F3B54CF31BE0493EE3F427FB906393D895A19C9523F3A1D54BB8702BD4AA9C99DAB2597B92113F3", + "01776331CFCDF927D666E032E00CF776187BC9FDD8E69D0DABB4109FFE1B5E2A30715F4CC923A4A5E94D2503E9ACFED92857B7F31D7152E0F8C00C15FF3D87E2ED2E", + "0050CB5265417FE2320BBB5A122B8E1A32BD699089851128E360E620A30C7E17BA41A666AF126CE100E5799B153B60528D5300D08489CA9178FB610A2006C254B41F", + SHA224 + ), + ( + "sample", + "00EDF38AFCAAECAB4383358B34D67C9F2216C8382AAEA44A3DAD5FDC9C32575761793FEF24EB0FC276DFC4F6E3EC476752F043CF01415387470BCBD8678ED2C7E1A0", + "01511BB4D675114FE266FC4372B87682BAECC01D3CC62CF2303C92B3526012659D16876E25C7C1E57648F23B73564D67F61C6F14D527D54972810421E7D87589E1A7", + "004A171143A83163D6DF460AAF61522695F207A58B95C0644D87E52AA1A347916E4F7A72930B1BC06DBE22CE3F58264AFD23704CBB63B29B931F7DE6C9D949A7ECFC", + SHA256 + ), + ( + "sample", + "01546A108BC23A15D6F21872F7DED661FA8431DDBD922D0DCDB77CC878C8553FFAD064C95A920A750AC9137E527390D2D92F153E66196966EA554D9ADFCB109C4211", + "01EA842A0E17D2DE4F92C15315C63DDF72685C18195C2BB95E572B9C5136CA4B4B576AD712A52BE9730627D16054BA40CC0B8D3FF035B12AE75168397F5D50C67451", + "01F21A3CEE066E1961025FB048BD5FE2B7924D0CD797BABE0A83B66F1E35EEAF5FDE143FA85DC394A7DEE766523393784484BDF3E00114A1C857CDE1AA203DB65D61", + SHA384 + ), + ( + "sample", + "01DAE2EA071F8110DC26882D4D5EAE0621A3256FC8847FB9022E2B7D28E6F10198B1574FDD03A9053C08A1854A168AA5A57470EC97DD5CE090124EF52A2F7ECBFFD3", + "00C328FAFCBD79DD77850370C46325D987CB525569FB63C5D3BC53950E6D4C5F174E25A1EE9017B5D450606ADD152B534931D7D4E8455CC91F9B15BF05EC36E377FA", + "00617CCE7CF5064806C467F678D3B4080D6F1CC50AF26CA209417308281B68AF282623EAA63E5B5C0723D8B8C37FF0777B1A20F8CCB1DCCC43997F1EE0E44DA4A67A", + SHA512 + ), + ( + "test", + "00BB9F2BF4FE1038CCF4DABD7139A56F6FD8BB1386561BD3C6A4FC818B20DF5DDBA80795A947107A1AB9D12DAA615B1ADE4F7A9DC05E8E6311150F47F5C57CE8B222", + "013BAD9F29ABE20DE37EBEB823C252CA0F63361284015A3BF430A46AAA80B87B0693F0694BD88AFE4E661FC33B094CD3B7963BED5A727ED8BD6A3A202ABE009D0367", + "01E9BB81FF7944CA409AD138DBBEE228E1AFCC0C890FC78EC8604639CB0DBDC90F717A99EAD9D272855D00162EE9527567DD6A92CBD629805C0445282BBC916797FF", + SHA1 + ), + ( + "test", + "0040D09FCF3C8A5F62CF4FB223CBBB2B9937F6B0577C27020A99602C25A01136987E452988781484EDBBCF1C47E554E7FC901BC3085E5206D9F619CFF07E73D6F706", + "01C7ED902E123E6815546065A2C4AF977B22AA8EADDB68B2C1110E7EA44D42086BFE4A34B67DDC0E17E96536E358219B23A706C6A6E16BA77B65E1C595D43CAE17FB", + "0177336676304FCB343CE028B38E7B4FBA76C1C1B277DA18CAD2A8478B2A9A9F5BEC0F3BA04F35DB3E4263569EC6AADE8C92746E4C82F8299AE1B8F1739F8FD519A4", + SHA224 + ), + ( + "test", + "001DE74955EFAABC4C4F17F8E84D881D1310B5392D7700275F82F145C61E843841AF09035BF7A6210F5A431A6A9E81C9323354A9E69135D44EBD2FCAA7731B909258", + "000E871C4A14F993C6C7369501900C4BC1E9C7B0B4BA44E04868B30B41D8071042EB28C4C250411D0CE08CD197E4188EA4876F279F90B3D8D74A3C76E6F1E4656AA8", + "00CD52DBAA33B063C3A6CD8058A1FB0A46A4754B034FCC644766CA14DA8CA5CA9FDE00E88C1AD60CCBA759025299079D7A427EC3CC5B619BFBC828E7769BCD694E86", + SHA256 + ), + ( + "test", + "01F1FC4A349A7DA9A9E116BFDD055DC08E78252FF8E23AC276AC88B1770AE0B5DCEB1ED14A4916B769A523CE1E90BA22846AF11DF8B300C38818F713DADD85DE0C88", + "014BEE21A18B6D8B3C93FAB08D43E739707953244FDBE924FA926D76669E7AC8C89DF62ED8975C2D8397A65A49DCC09F6B0AC62272741924D479354D74FF6075578C", + "0133330865C067A0EAF72362A65E2D7BC4E461E8C8995C3B6226A21BD1AA78F0ED94FE536A0DCA35534F0CD1510C41525D163FE9D74D134881E35141ED5E8E95B979", + SHA384 + ), + ( + "test", + "016200813020EC986863BEDFC1B121F605C1215645018AEA1A7B215A564DE9EB1B38A67AA1128B80CE391C4FB71187654AAA3431027BFC7F395766CA988C964DC56D", + "013E99020ABF5CEE7525D16B69B229652AB6BDF2AFFCAEF38773B4B7D08725F10CDB93482FDCC54EDCEE91ECA4166B2A7C6265EF0CE2BD7051B7CEF945BABD47EE6D", + "01FBD0013C674AA79CB39849527916CE301C66EA7CE8B80682786AD60F98F7E78A19CA69EFF5C57400E3B3A0AD66CE0978214D13BAF4E9AC60752F7B155E2DE4DCE3", + SHA512 + ), + ) + + signatures_p192 = [] + for a, b, c, d, e in signatures_p192_: + new_tv = (tobytes(a), unhexlify(b), unhexlify(c), unhexlify(d), e) + signatures_p192.append(new_tv) + + signatures_p224 = [] + for a, b, c, d, e in signatures_p224_: + new_tv = (tobytes(a), unhexlify(b), unhexlify(c), unhexlify(d), e) + signatures_p224.append(new_tv) + + signatures_p256 = [] + for a, b, c, d, e in signatures_p256_: + new_tv = (tobytes(a), unhexlify(b), unhexlify(c), unhexlify(d), e) + signatures_p256.append(new_tv) + + signatures_p384 = [] + for a, b, c, d, e in signatures_p384_: + new_tv = (tobytes(a), unhexlify(b), unhexlify(c), unhexlify(d), e) + signatures_p384.append(new_tv) + + signatures_p521 = [] + for a, b, c, d, e in signatures_p521_: + new_tv = (tobytes(a), unhexlify(b), unhexlify(c), unhexlify(d), e) + signatures_p521.append(new_tv) + + def shortDescription(self): + return "Deterministic ECDSA Tests" + + def test_loopback_p192(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv_p192, 'deterministic-rfc6979') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub_p192, 'deterministic-rfc6979') + verifier.verify(hashed_msg, signature) + + def test_loopback_p224(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv_p224, 'deterministic-rfc6979') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub_p224, 'deterministic-rfc6979') + verifier.verify(hashed_msg, signature) + + def test_loopback_p256(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv_p256, 'deterministic-rfc6979') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub_p256, 'deterministic-rfc6979') + verifier.verify(hashed_msg, signature) + + def test_loopback_p384(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv_p384, 'deterministic-rfc6979') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub_p384, 'deterministic-rfc6979') + verifier.verify(hashed_msg, signature) + + def test_loopback_p521(self): + hashed_msg = SHA512.new(b"test") + signer = DSS.new(self.key_priv_p521, 'deterministic-rfc6979') + signature = signer.sign(hashed_msg) + + verifier = DSS.new(self.key_pub_p521, 'deterministic-rfc6979') + verifier.verify(hashed_msg, signature) + + def test_data_rfc6979_p192(self): + signer = DSS.new(self.key_priv_p192, 'deterministic-rfc6979') + for message, k, r, s, module in self.signatures_p192: + hash_obj = module.new(message) + result = signer.sign(hash_obj) + self.assertEqual(r + s, result) + + def test_data_rfc6979_p224(self): + signer = DSS.new(self.key_priv_p224, 'deterministic-rfc6979') + for message, k, r, s, module in self.signatures_p224: + hash_obj = module.new(message) + result = signer.sign(hash_obj) + self.assertEqual(r + s, result) + + def test_data_rfc6979_p256(self): + signer = DSS.new(self.key_priv_p256, 'deterministic-rfc6979') + for message, k, r, s, module in self.signatures_p256: + hash_obj = module.new(message) + result = signer.sign(hash_obj) + self.assertEqual(r + s, result) + + def test_data_rfc6979_p384(self): + signer = DSS.new(self.key_priv_p384, 'deterministic-rfc6979') + for message, k, r, s, module in self.signatures_p384: + hash_obj = module.new(message) + result = signer.sign(hash_obj) + self.assertEqual(r + s, result) + + def test_data_rfc6979_p521(self): + signer = DSS.new(self.key_priv_p521, 'deterministic-rfc6979') + for message, k, r, s, module in self.signatures_p521: + hash_obj = module.new(message) + result = signer.sign(hash_obj) + self.assertEqual(r + s, result) + + +def get_hash_module(hash_name): + if hash_name == "SHA-512": + hash_module = SHA512 + elif hash_name == "SHA-512/224": + hash_module = SHA512.new(truncate="224") + elif hash_name == "SHA-512/256": + hash_module = SHA512.new(truncate="256") + elif hash_name == "SHA-384": + hash_module = SHA384 + elif hash_name == "SHA-256": + hash_module = SHA256 + elif hash_name == "SHA-224": + hash_module = SHA224 + elif hash_name == "SHA-1": + hash_module = SHA1 + elif hash_name == "SHA3-224": + hash_module = SHA3_224 + elif hash_name == "SHA3-256": + hash_module = SHA3_256 + elif hash_name == "SHA3-384": + hash_module = SHA3_384 + elif hash_name == "SHA3-512": + hash_module = SHA3_512 + else: + raise ValueError("Unknown hash algorithm: " + hash_name) + return hash_module + + +class TestVectorsDSAWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, slow_tests): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._slow_tests = slow_tests + self._id = "None" + self.tv = [] + + def setUp(self): + + def filter_dsa(group): + return DSA.import_key(group['keyPem']) + + def filter_sha(group): + return get_hash_module(group['sha']) + + def filter_type(group): + sig_type = group['type'] + if sig_type != 'DsaVerify': + raise ValueError("Unknown signature type " + sig_type) + return sig_type + + result = load_test_vectors_wycheproof(("Signature", "wycheproof"), + "dsa_test.json", + "Wycheproof DSA signature", + group_tag={'key': filter_dsa, + 'hash_module': filter_sha, + 'sig_type': filter_type}) + self.tv += result + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_verify(self, tv): + self._id = "Wycheproof DSA Test #" + str(tv.id) + + hashed_msg = tv.hash_module.new(tv.msg) + signer = DSS.new(tv.key, 'fips-186-3', encoding='der') + try: + signature = signer.verify(hashed_msg, tv.sig) + except ValueError as e: + if tv.warning: + return + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + for tv in self.tv: + self.test_verify(tv) + + +class TestVectorsECDSAWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings, slow_tests): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._slow_tests = slow_tests + self._id = "None" + + def add_tests(self, filename): + + def filter_ecc(group): + # These are the only curves we accept to skip + if group['key']['curve'] in ('secp224k1', 'secp256k1', + 'brainpoolP224r1', 'brainpoolP224t1', + 'brainpoolP256r1', 'brainpoolP256t1', + 'brainpoolP320r1', 'brainpoolP320t1', + 'brainpoolP384r1', 'brainpoolP384t1', + 'brainpoolP512r1', 'brainpoolP512t1', + ): + return None + return ECC.import_key(group['keyPem']) + + def filter_sha(group): + return get_hash_module(group['sha']) + + def filter_encoding(group): + encoding_name = group['type'] + if encoding_name == "EcdsaVerify": + return "der" + elif encoding_name == "EcdsaP1363Verify": + return "binary" + else: + raise ValueError("Unknown signature type " + encoding_name) + + result = load_test_vectors_wycheproof(("Signature", "wycheproof"), + filename, + "Wycheproof ECDSA signature (%s)" % filename, + group_tag={'key': filter_ecc, + 'hash_module': filter_sha, + 'encoding': filter_encoding, + }) + self.tv += result + + def setUp(self): + self.tv = [] + self.add_tests("ecdsa_secp224r1_sha224_p1363_test.json") + self.add_tests("ecdsa_secp224r1_sha224_test.json") + if self._slow_tests: + self.add_tests("ecdsa_secp224r1_sha256_p1363_test.json") + self.add_tests("ecdsa_secp224r1_sha256_test.json") + self.add_tests("ecdsa_secp224r1_sha3_224_test.json") + self.add_tests("ecdsa_secp224r1_sha3_256_test.json") + self.add_tests("ecdsa_secp224r1_sha3_512_test.json") + self.add_tests("ecdsa_secp224r1_sha512_p1363_test.json") + self.add_tests("ecdsa_secp224r1_sha512_test.json") + self.add_tests("ecdsa_secp256r1_sha256_p1363_test.json") + self.add_tests("ecdsa_secp256r1_sha256_test.json") + self.add_tests("ecdsa_secp256r1_sha3_256_test.json") + self.add_tests("ecdsa_secp256r1_sha3_512_test.json") + self.add_tests("ecdsa_secp256r1_sha512_p1363_test.json") + self.add_tests("ecdsa_secp256r1_sha512_test.json") + if self._slow_tests: + self.add_tests("ecdsa_secp384r1_sha3_384_test.json") + self.add_tests("ecdsa_secp384r1_sha3_512_test.json") + self.add_tests("ecdsa_secp384r1_sha384_p1363_test.json") + self.add_tests("ecdsa_secp384r1_sha384_test.json") + self.add_tests("ecdsa_secp384r1_sha512_p1363_test.json") + self.add_tests("ecdsa_secp384r1_sha512_test.json") + if self._slow_tests: + self.add_tests("ecdsa_secp521r1_sha3_512_test.json") + self.add_tests("ecdsa_secp521r1_sha512_p1363_test.json") + self.add_tests("ecdsa_secp521r1_sha512_test.json") + self.add_tests("ecdsa_test.json") + self.add_tests("ecdsa_webcrypto_test.json") + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_verify(self, tv): + self._id = "Wycheproof ECDSA Test #%d (%s, %s)" % (tv.id, tv.comment, tv.filename) + + # Skip tests with unsupported curves + if tv.key is None: + return + + hashed_msg = tv.hash_module.new(tv.msg) + signer = DSS.new(tv.key, 'fips-186-3', encoding=tv.encoding) + try: + signature = signer.verify(hashed_msg, tv.sig) + except ValueError as e: + if tv.warning: + return + if tv.comment == "k*G has a large x-coordinate": + return + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + for tv in self.tv: + self.test_verify(tv) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(FIPS_DSA_Tests) + tests += list_test_cases(FIPS_ECDSA_Tests) + tests += list_test_cases(Det_DSA_Tests) + tests += list_test_cases(Det_ECDSA_Tests) + + slow_tests = config.get('slow_tests') + if slow_tests: + tests += list_test_cases(FIPS_DSA_Tests_KAT) + tests += list_test_cases(FIPS_ECDSA_Tests_KAT) + + tests += [TestVectorsDSAWycheproof(wycheproof_warnings, slow_tests)] + tests += [TestVectorsECDSAWycheproof(wycheproof_warnings, slow_tests)] + + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py new file mode 100644 index 0000000..015e247 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py @@ -0,0 +1,578 @@ +# +# Copyright (c) 2022, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify + +from Cryptodome.PublicKey import ECC +from Cryptodome.Signature import eddsa +from Cryptodome.Hash import SHA512, SHAKE256 +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors_wycheproof +from Cryptodome.Util.number import bytes_to_long + +rfc8032_tv_str = ( + # 7.1 Ed25519 + ( + "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", + "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a", + "", + None, + "", + "e5564300c360ac729086e2cc806e828a" + "84877f1eb8e5d974d873e06522490155" + "5fb8821590a33bacc61e39701cf9b46b" + "d25bf5f0595bbe24655141438e7a100b" + ), + ( + "4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb", + "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c", + "72", + None, + "", + "92a009a9f0d4cab8720e820b5f642540" + "a2b27b5416503f8fb3762223ebdb69da" + "085ac1e43e15996e458f3613d0f11d8c" + "387b2eaeb4302aeeb00d291612bb0c00" + ), + ( + "c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7", + "fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025", + "af82", + None, + "", + "6291d657deec24024827e69c3abe01a3" + "0ce548a284743a445e3680d7db5ac3ac" + "18ff9b538d16f290ae67f760984dc659" + "4a7c15e9716ed28dc027beceea1ec40a" + ), + ( + "f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5", + "278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e", + "08b8b2b733424243760fe426a4b54908" + "632110a66c2f6591eabd3345e3e4eb98" + "fa6e264bf09efe12ee50f8f54e9f77b1" + "e355f6c50544e23fb1433ddf73be84d8" + "79de7c0046dc4996d9e773f4bc9efe57" + "38829adb26c81b37c93a1b270b20329d" + "658675fc6ea534e0810a4432826bf58c" + "941efb65d57a338bbd2e26640f89ffbc" + "1a858efcb8550ee3a5e1998bd177e93a" + "7363c344fe6b199ee5d02e82d522c4fe" + "ba15452f80288a821a579116ec6dad2b" + "3b310da903401aa62100ab5d1a36553e" + "06203b33890cc9b832f79ef80560ccb9" + "a39ce767967ed628c6ad573cb116dbef" + "efd75499da96bd68a8a97b928a8bbc10" + "3b6621fcde2beca1231d206be6cd9ec7" + "aff6f6c94fcd7204ed3455c68c83f4a4" + "1da4af2b74ef5c53f1d8ac70bdcb7ed1" + "85ce81bd84359d44254d95629e9855a9" + "4a7c1958d1f8ada5d0532ed8a5aa3fb2" + "d17ba70eb6248e594e1a2297acbbb39d" + "502f1a8c6eb6f1ce22b3de1a1f40cc24" + "554119a831a9aad6079cad88425de6bd" + "e1a9187ebb6092cf67bf2b13fd65f270" + "88d78b7e883c8759d2c4f5c65adb7553" + "878ad575f9fad878e80a0c9ba63bcbcc" + "2732e69485bbc9c90bfbd62481d9089b" + "eccf80cfe2df16a2cf65bd92dd597b07" + "07e0917af48bbb75fed413d238f5555a" + "7a569d80c3414a8d0859dc65a46128ba" + "b27af87a71314f318c782b23ebfe808b" + "82b0ce26401d2e22f04d83d1255dc51a" + "ddd3b75a2b1ae0784504df543af8969b" + "e3ea7082ff7fc9888c144da2af58429e" + "c96031dbcad3dad9af0dcbaaaf268cb8" + "fcffead94f3c7ca495e056a9b47acdb7" + "51fb73e666c6c655ade8297297d07ad1" + "ba5e43f1bca32301651339e22904cc8c" + "42f58c30c04aafdb038dda0847dd988d" + "cda6f3bfd15c4b4c4525004aa06eeff8" + "ca61783aacec57fb3d1f92b0fe2fd1a8" + "5f6724517b65e614ad6808d6f6ee34df" + "f7310fdc82aebfd904b01e1dc54b2927" + "094b2db68d6f903b68401adebf5a7e08" + "d78ff4ef5d63653a65040cf9bfd4aca7" + "984a74d37145986780fc0b16ac451649" + "de6188a7dbdf191f64b5fc5e2ab47b57" + "f7f7276cd419c17a3ca8e1b939ae49e4" + "88acba6b965610b5480109c8b17b80e1" + "b7b750dfc7598d5d5011fd2dcc5600a3" + "2ef5b52a1ecc820e308aa342721aac09" + "43bf6686b64b2579376504ccc493d97e" + "6aed3fb0f9cd71a43dd497f01f17c0e2" + "cb3797aa2a2f256656168e6c496afc5f" + "b93246f6b1116398a346f1a641f3b041" + "e989f7914f90cc2c7fff357876e506b5" + "0d334ba77c225bc307ba537152f3f161" + "0e4eafe595f6d9d90d11faa933a15ef1" + "369546868a7f3a45a96768d40fd9d034" + "12c091c6315cf4fde7cb68606937380d" + "b2eaaa707b4c4185c32eddcdd306705e" + "4dc1ffc872eeee475a64dfac86aba41c" + "0618983f8741c5ef68d3a101e8a3b8ca" + "c60c905c15fc910840b94c00a0b9d0", + None, + "", + "0aab4c900501b3e24d7cdf4663326a3a" + "87df5e4843b2cbdb67cbf6e460fec350" + "aa5371b1508f9f4528ecea23c436d94b" + "5e8fcd4f681e30a6ac00a9704a188a03" + ), + # 7.2 Ed25519ctx + ( + "0305334e381af78f141cb666f6199f57" + "bc3495335a256a95bd2a55bf546663f6", + "dfc9425e4f968f7f0c29f0259cf5f9ae" + "d6851c2bb4ad8bfb860cfee0ab248292", + "f726936d19c800494e3fdaff20b276a8", + None, + "666f6f", + "55a4cc2f70a54e04288c5f4cd1e45a7b" + "b520b36292911876cada7323198dd87a" + "8b36950b95130022907a7fb7c4e9b2d5" + "f6cca685a587b4b21f4b888e4e7edb0d" + ), + ( + "0305334e381af78f141cb666f6199f57" + "bc3495335a256a95bd2a55bf546663f6", + "dfc9425e4f968f7f0c29f0259cf5f9ae" + "d6851c2bb4ad8bfb860cfee0ab248292", + "f726936d19c800494e3fdaff20b276a8", + None, + "626172", + "fc60d5872fc46b3aa69f8b5b4351d580" + "8f92bcc044606db097abab6dbcb1aee3" + "216c48e8b3b66431b5b186d1d28f8ee1" + "5a5ca2df6668346291c2043d4eb3e90d" + ), + ( + "0305334e381af78f141cb666f6199f57" + "bc3495335a256a95bd2a55bf546663f6", + "dfc9425e4f968f7f0c29f0259cf5f9ae" + "d6851c2bb4ad8bfb860cfee0ab248292", + "508e9e6882b979fea900f62adceaca35", + None, + "666f6f", + "8b70c1cc8310e1de20ac53ce28ae6e72" + "07f33c3295e03bb5c0732a1d20dc6490" + "8922a8b052cf99b7c4fe107a5abb5b2c" + "4085ae75890d02df26269d8945f84b0b" + ), + ( + "ab9c2853ce297ddab85c993b3ae14bca" + "d39b2c682beabc27d6d4eb20711d6560", + "0f1d1274943b91415889152e893d80e9" + "3275a1fc0b65fd71b4b0dda10ad7d772", + "f726936d19c800494e3fdaff20b276a8", + None, + "666f6f", + "21655b5f1aa965996b3f97b3c849eafb" + "a922a0a62992f73b3d1b73106a84ad85" + "e9b86a7b6005ea868337ff2d20a7f5fb" + "d4cd10b0be49a68da2b2e0dc0ad8960f" + ), + # 7.3 Ed25519ph + ( + "833fe62409237b9d62ec77587520911e" + "9a759cec1d19755b7da901b96dca3d42", + "ec172b93ad5e563bf4932c70e1245034" + "c35467ef2efd4d64ebf819683467e2bf", + "616263", + SHA512, + "", + "98a70222f0b8121aa9d30f813d683f80" + "9e462b469c7ff87639499bb94e6dae41" + "31f85042463c2a355a2003d062adf5aa" + "a10b8c61e636062aaad11c2a26083406" + ), + # 7.4 Ed448 + ( + "6c82a562cb808d10d632be89c8513ebf6c929f34ddfa8c9f63c9960ef6e348a3" + "528c8a3fcc2f044e39a3fc5b94492f8f032e7549a20098f95b", + "5fd7449b59b461fd2ce787ec616ad46a1da1342485a70e1f8a0ea75d80e96778" + "edf124769b46c7061bd6783df1e50f6cd1fa1abeafe8256180", + "", + None, + "", + "533a37f6bbe457251f023c0d88f976ae2dfb504a843e34d2074fd823d41a591f" + "2b233f034f628281f2fd7a22ddd47d7828c59bd0a21bfd3980ff0d2028d4b18a" + "9df63e006c5d1c2d345b925d8dc00b4104852db99ac5c7cdda8530a113a0f4db" + "b61149f05a7363268c71d95808ff2e652600" + ), + ( + "c4eab05d357007c632f3dbb48489924d552b08fe0c353a0d4a1f00acda2c463a" + "fbea67c5e8d2877c5e3bc397a659949ef8021e954e0a12274e", + "43ba28f430cdff456ae531545f7ecd0ac834a55d9358c0372bfa0c6c6798c086" + "6aea01eb00742802b8438ea4cb82169c235160627b4c3a9480", + "03", + None, + "", + "26b8f91727bd62897af15e41eb43c377efb9c610d48f2335cb0bd0087810f435" + "2541b143c4b981b7e18f62de8ccdf633fc1bf037ab7cd779805e0dbcc0aae1cb" + "cee1afb2e027df36bc04dcecbf154336c19f0af7e0a6472905e799f1953d2a0f" + "f3348ab21aa4adafd1d234441cf807c03a00", + ), + ( + "c4eab05d357007c632f3dbb48489924d552b08fe0c353a0d4a1f00acda2c463a" + "fbea67c5e8d2877c5e3bc397a659949ef8021e954e0a12274e", + "43ba28f430cdff456ae531545f7ecd0ac834a55d9358c0372bfa0c6c6798c086" + "6aea01eb00742802b8438ea4cb82169c235160627b4c3a9480", + "03", + None, + "666f6f", + "d4f8f6131770dd46f40867d6fd5d5055de43541f8c5e35abbcd001b32a89f7d2" + "151f7647f11d8ca2ae279fb842d607217fce6e042f6815ea000c85741de5c8da" + "1144a6a1aba7f96de42505d7a7298524fda538fccbbb754f578c1cad10d54d0d" + "5428407e85dcbc98a49155c13764e66c3c00", + ), + ( + "cd23d24f714274e744343237b93290f511f6425f98e64459ff203e8985083ffd" + "f60500553abc0e05cd02184bdb89c4ccd67e187951267eb328", + "dcea9e78f35a1bf3499a831b10b86c90aac01cd84b67a0109b55a36e9328b1e3" + "65fce161d71ce7131a543ea4cb5f7e9f1d8b00696447001400", + "0c3e544074ec63b0265e0c", + None, + "", + "1f0a8888ce25e8d458a21130879b840a9089d999aaba039eaf3e3afa090a09d3" + "89dba82c4ff2ae8ac5cdfb7c55e94d5d961a29fe0109941e00b8dbdeea6d3b05" + "1068df7254c0cdc129cbe62db2dc957dbb47b51fd3f213fb8698f064774250a5" + "028961c9bf8ffd973fe5d5c206492b140e00", + ), + ( + "258cdd4ada32ed9c9ff54e63756ae582fb8fab2ac721f2c8e676a72768513d93" + "9f63dddb55609133f29adf86ec9929dccb52c1c5fd2ff7e21b", + "3ba16da0c6f2cc1f30187740756f5e798d6bc5fc015d7c63cc9510ee3fd44adc" + "24d8e968b6e46e6f94d19b945361726bd75e149ef09817f580", + "64a65f3cdedcdd66811e2915", + None, + "", + "7eeeab7c4e50fb799b418ee5e3197ff6bf15d43a14c34389b59dd1a7b1b85b4a" + "e90438aca634bea45e3a2695f1270f07fdcdf7c62b8efeaf00b45c2c96ba457e" + "b1a8bf075a3db28e5c24f6b923ed4ad747c3c9e03c7079efb87cb110d3a99861" + "e72003cbae6d6b8b827e4e6c143064ff3c00", + ), + ( + "7ef4e84544236752fbb56b8f31a23a10e42814f5f55ca037cdcc11c64c9a3b29" + "49c1bb60700314611732a6c2fea98eebc0266a11a93970100e", + "b3da079b0aa493a5772029f0467baebee5a8112d9d3a22532361da294f7bb381" + "5c5dc59e176b4d9f381ca0938e13c6c07b174be65dfa578e80", + "64a65f3cdedcdd66811e2915e7", + None, + "", + "6a12066f55331b6c22acd5d5bfc5d71228fbda80ae8dec26bdd306743c5027cb" + "4890810c162c027468675ecf645a83176c0d7323a2ccde2d80efe5a1268e8aca" + "1d6fbc194d3f77c44986eb4ab4177919ad8bec33eb47bbb5fc6e28196fd1caf5" + "6b4e7e0ba5519234d047155ac727a1053100", + ), + ( + "d65df341ad13e008567688baedda8e9dcdc17dc024974ea5b4227b6530e339bf" + "f21f99e68ca6968f3cca6dfe0fb9f4fab4fa135d5542ea3f01", + "df9705f58edbab802c7f8363cfe5560ab1c6132c20a9f1dd163483a26f8ac53a" + "39d6808bf4a1dfbd261b099bb03b3fb50906cb28bd8a081f00", + "bd0f6a3747cd561bdddf4640a332461a4a30a12a434cd0bf40d766d9c6d458e5" + "512204a30c17d1f50b5079631f64eb3112182da3005835461113718d1a5ef944", + None, + "", + "554bc2480860b49eab8532d2a533b7d578ef473eeb58c98bb2d0e1ce488a98b1" + "8dfde9b9b90775e67f47d4a1c3482058efc9f40d2ca033a0801b63d45b3b722e" + "f552bad3b4ccb667da350192b61c508cf7b6b5adadc2c8d9a446ef003fb05cba" + "5f30e88e36ec2703b349ca229c2670833900", + ), + ( + "2ec5fe3c17045abdb136a5e6a913e32ab75ae68b53d2fc149b77e504132d3756" + "9b7e766ba74a19bd6162343a21c8590aa9cebca9014c636df5", + "79756f014dcfe2079f5dd9e718be4171e2ef2486a08f25186f6bff43a9936b9b" + "fe12402b08ae65798a3d81e22e9ec80e7690862ef3d4ed3a00", + "15777532b0bdd0d1389f636c5f6b9ba734c90af572877e2d272dd078aa1e567c" + "fa80e12928bb542330e8409f3174504107ecd5efac61ae7504dabe2a602ede89" + "e5cca6257a7c77e27a702b3ae39fc769fc54f2395ae6a1178cab4738e543072f" + "c1c177fe71e92e25bf03e4ecb72f47b64d0465aaea4c7fad372536c8ba516a60" + "39c3c2a39f0e4d832be432dfa9a706a6e5c7e19f397964ca4258002f7c0541b5" + "90316dbc5622b6b2a6fe7a4abffd96105eca76ea7b98816af0748c10df048ce0" + "12d901015a51f189f3888145c03650aa23ce894c3bd889e030d565071c59f409" + "a9981b51878fd6fc110624dcbcde0bf7a69ccce38fabdf86f3bef6044819de11", + None, + "", + "c650ddbb0601c19ca11439e1640dd931f43c518ea5bea70d3dcde5f4191fe53f" + "00cf966546b72bcc7d58be2b9badef28743954e3a44a23f880e8d4f1cfce2d7a" + "61452d26da05896f0a50da66a239a8a188b6d825b3305ad77b73fbac0836ecc6" + "0987fd08527c1a8e80d5823e65cafe2a3d00", + ), + ( + "872d093780f5d3730df7c212664b37b8a0f24f56810daa8382cd4fa3f77634ec" + "44dc54f1c2ed9bea86fafb7632d8be199ea165f5ad55dd9ce8", + "a81b2e8a70a5ac94ffdbcc9badfc3feb0801f258578bb114ad44ece1ec0e799d" + "a08effb81c5d685c0c56f64eecaef8cdf11cc38737838cf400", + "6ddf802e1aae4986935f7f981ba3f0351d6273c0a0c22c9c0e8339168e675412" + "a3debfaf435ed651558007db4384b650fcc07e3b586a27a4f7a00ac8a6fec2cd" + "86ae4bf1570c41e6a40c931db27b2faa15a8cedd52cff7362c4e6e23daec0fbc" + "3a79b6806e316efcc7b68119bf46bc76a26067a53f296dafdbdc11c77f7777e9" + "72660cf4b6a9b369a6665f02e0cc9b6edfad136b4fabe723d2813db3136cfde9" + "b6d044322fee2947952e031b73ab5c603349b307bdc27bc6cb8b8bbd7bd32321" + "9b8033a581b59eadebb09b3c4f3d2277d4f0343624acc817804728b25ab79717" + "2b4c5c21a22f9c7839d64300232eb66e53f31c723fa37fe387c7d3e50bdf9813" + "a30e5bb12cf4cd930c40cfb4e1fc622592a49588794494d56d24ea4b40c89fc0" + "596cc9ebb961c8cb10adde976a5d602b1c3f85b9b9a001ed3c6a4d3b1437f520" + "96cd1956d042a597d561a596ecd3d1735a8d570ea0ec27225a2c4aaff26306d1" + "526c1af3ca6d9cf5a2c98f47e1c46db9a33234cfd4d81f2c98538a09ebe76998" + "d0d8fd25997c7d255c6d66ece6fa56f11144950f027795e653008f4bd7ca2dee" + "85d8e90f3dc315130ce2a00375a318c7c3d97be2c8ce5b6db41a6254ff264fa6" + "155baee3b0773c0f497c573f19bb4f4240281f0b1f4f7be857a4e59d416c06b4" + "c50fa09e1810ddc6b1467baeac5a3668d11b6ecaa901440016f389f80acc4db9" + "77025e7f5924388c7e340a732e554440e76570f8dd71b7d640b3450d1fd5f041" + "0a18f9a3494f707c717b79b4bf75c98400b096b21653b5d217cf3565c9597456" + "f70703497a078763829bc01bb1cbc8fa04eadc9a6e3f6699587a9e75c94e5bab" + "0036e0b2e711392cff0047d0d6b05bd2a588bc109718954259f1d86678a579a3" + "120f19cfb2963f177aeb70f2d4844826262e51b80271272068ef5b3856fa8535" + "aa2a88b2d41f2a0e2fda7624c2850272ac4a2f561f8f2f7a318bfd5caf969614" + "9e4ac824ad3460538fdc25421beec2cc6818162d06bbed0c40a387192349db67" + "a118bada6cd5ab0140ee273204f628aad1c135f770279a651e24d8c14d75a605" + "9d76b96a6fd857def5e0b354b27ab937a5815d16b5fae407ff18222c6d1ed263" + "be68c95f32d908bd895cd76207ae726487567f9a67dad79abec316f683b17f2d" + "02bf07e0ac8b5bc6162cf94697b3c27cd1fea49b27f23ba2901871962506520c" + "392da8b6ad0d99f7013fbc06c2c17a569500c8a7696481c1cd33e9b14e40b82e" + "79a5f5db82571ba97bae3ad3e0479515bb0e2b0f3bfcd1fd33034efc6245eddd" + "7ee2086ddae2600d8ca73e214e8c2b0bdb2b047c6a464a562ed77b73d2d841c4" + "b34973551257713b753632efba348169abc90a68f42611a40126d7cb21b58695" + "568186f7e569d2ff0f9e745d0487dd2eb997cafc5abf9dd102e62ff66cba87", + None, + "", + "e301345a41a39a4d72fff8df69c98075a0cc082b802fc9b2b6bc503f926b65bd" + "df7f4c8f1cb49f6396afc8a70abe6d8aef0db478d4c6b2970076c6a0484fe76d" + "76b3a97625d79f1ce240e7c576750d295528286f719b413de9ada3e8eb78ed57" + "3603ce30d8bb761785dc30dbc320869e1a00" + ), + # 7.5 Ed448ph + ( + "833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42" + "ef7822e0d5104127dc05d6dbefde69e3ab2cec7c867c6e2c49", + "259b71c19f83ef77a7abd26524cbdb3161b590a48f7d17de3ee0ba9c52beb743" + "c09428a131d6b1b57303d90d8132c276d5ed3d5d01c0f53880", + "616263", + SHAKE256, + "", + "822f6901f7480f3d5f562c592994d9693602875614483256505600bbc281ae38" + "1f54d6bce2ea911574932f52a4e6cadd78769375ec3ffd1b801a0d9b3f4030cd" + "433964b6457ea39476511214f97469b57dd32dbc560a9a94d00bff07620464a3" + "ad203df7dc7ce360c3cd3696d9d9fab90f00" + ), + ( + "833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42" + "ef7822e0d5104127dc05d6dbefde69e3ab2cec7c867c6e2c49", + "259b71c19f83ef77a7abd26524cbdb3161b590a48f7d17de3ee0ba9c52beb743" + "c09428a131d6b1b57303d90d8132c276d5ed3d5d01c0f53880", + "616263", + SHAKE256, + "666f6f", + "c32299d46ec8ff02b54540982814dce9a05812f81962b649d528095916a2aa48" + "1065b1580423ef927ecf0af5888f90da0f6a9a85ad5dc3f280d91224ba9911a3" + "653d00e484e2ce232521481c8658df304bb7745a73514cdb9bf3e15784ab7128" + "4f8d0704a608c54a6b62d97beb511d132100", + ), +) + + +rfc8032_tv_bytes = [] +for tv_str in rfc8032_tv_str: + rfc8032_tv_bytes.append([unhexlify(i) if isinstance(i, str) else i for i in tv_str]) + + +class TestEdDSA(unittest.TestCase): + + def test_sign(self): + for sk, _, msg, hashmod, ctx, exp_signature in rfc8032_tv_bytes: + key = eddsa.import_private_key(sk) + signer = eddsa.new(key, 'rfc8032', context=ctx) + if hashmod is None: + # PureEdDSA + signature = signer.sign(msg) + else: + # HashEdDSA + hashobj = hashmod.new(msg) + signature = signer.sign(hashobj) + self.assertEqual(exp_signature, signature) + + def test_verify(self): + for _, pk, msg, hashmod, ctx, exp_signature in rfc8032_tv_bytes: + key = eddsa.import_public_key(pk) + verifier = eddsa.new(key, 'rfc8032', context=ctx) + if hashmod is None: + # PureEdDSA + verifier.verify(msg, exp_signature) + else: + # HashEdDSA + hashobj = hashmod.new(msg) + verifier.verify(hashobj, exp_signature) + + def test_negative(self): + key = ECC.generate(curve="ed25519") + self.assertRaises(ValueError, eddsa.new, key, 'rfc9999') + + nist_key = ECC.generate(curve="p256") + self.assertRaises(ValueError, eddsa.new, nist_key, 'rfc8032') + + +class TestExport_Ed25519(unittest.TestCase): + + def test_raw(self): + key = ECC.generate(curve="Ed25519") + x, y = key.pointQ.xy + raw = bytearray(key._export_eddsa()) + sign_x = raw[31] >> 7 + raw[31] &= 0x7F + yt = bytes_to_long(raw[::-1]) + self.assertEqual(y, yt) + self.assertEqual(x & 1, sign_x) + + key = ECC.construct(point_x=0, point_y=1, curve="Ed25519") + out = key._export_eddsa() + self.assertEqual(b'\x01' + b'\x00' * 31, out) + + +class TestExport_Ed448(unittest.TestCase): + + def test_raw(self): + key = ECC.generate(curve="Ed448") + x, y = key.pointQ.xy + raw = bytearray(key._export_eddsa()) + sign_x = raw[56] >> 7 + raw[56] &= 0x7F + yt = bytes_to_long(raw[::-1]) + self.assertEqual(y, yt) + self.assertEqual(x & 1, sign_x) + + key = ECC.construct(point_x=0, point_y=1, curve="Ed448") + out = key._export_eddsa() + self.assertEqual(b'\x01' + b'\x00' * 56, out) + + +class TestImport_Ed25519(unittest.TestCase): + + def test_raw(self): + Px = 24407857220263921307776619664228778204996144802740950419837658238229122415920 + Py = 56480760040633817885061096979765646085062883740629155052073094891081309750690 + encoded = b'\xa2\x05\xd6\x00\xe1 \xe1\xc0\xff\x96\xee?V\x8e\xba/\xd3\x89\x06\xd7\xc4c\xe8$\xc2d\xd7a1\xfa\xde|' + key = eddsa.import_public_key(encoded) + self.assertEqual(Py, key.pointQ.y) + self.assertEqual(Px, key.pointQ.x) + + encoded = b'\x01' + b'\x00' * 31 + key = eddsa.import_public_key(encoded) + self.assertEqual(1, key.pointQ.y) + self.assertEqual(0, key.pointQ.x) + + +class TestImport_Ed448(unittest.TestCase): + + def test_raw(self): + Px = 0x153f42025aba3b0daecaa5cd79458b3146c7c9378c16c17b4a59bc3561113d90c169045bc12966c3f93e140c2ca0a3acc33d9205b9daf9b1 + Py = 0x38f5c0015d3dedd576c232810dd90373b5b1d631a12894c043b7be529cbae03ede177d8fa490b56131dbcb2465d2aba777ef839fc1719b25 + encoded = unhexlify("259b71c19f83ef77a7abd26524cbdb31" + "61b590a48f7d17de3ee0ba9c52beb743" + "c09428a131d6b1b57303d90d8132c276" + "d5ed3d5d01c0f53880") + key = eddsa.import_public_key(encoded) + self.assertEqual(Py, key.pointQ.y) + self.assertEqual(Px, key.pointQ.x) + + encoded = b'\x01' + b'\x00' * 56 + key = eddsa.import_public_key(encoded) + self.assertEqual(1, key.pointQ.y) + self.assertEqual(0, key.pointQ.x) + + +class TestVectorsEdDSAWycheproof(unittest.TestCase): + + def add_tests(self, filename): + + def pk(group): + elem = group['key']['pk'] + return unhexlify(elem) + + def sk(group): + elem = group['key']['sk'] + return unhexlify(elem) + + result = load_test_vectors_wycheproof(("Signature", "wycheproof"), + filename, + "Wycheproof ECDSA signature (%s)" + % filename, + group_tag={'pk': pk, 'sk': sk}) + self.tv += result + + def setUp(self): + self.tv = [] + self.add_tests("eddsa_test.json") + self.add_tests("ed448_test.json") + + def test_sign(self, tv): + if not tv.valid: + return + + self._id = "Wycheproof EdDSA Sign Test #%d (%s, %s)" % (tv.id, tv.comment, tv.filename) + key = eddsa.import_private_key(tv.sk) + signer = eddsa.new(key, 'rfc8032') + signature = signer.sign(tv.msg) + self.assertEqual(signature, tv.sig) + + def test_verify(self, tv): + self._id = "Wycheproof EdDSA Verify Test #%d (%s, %s)" % (tv.id, tv.comment, tv.filename) + key = eddsa.import_public_key(tv.pk) + verifier = eddsa.new(key, 'rfc8032') + try: + verifier.verify(tv.msg, tv.sig) + except ValueError: + assert not tv.valid + else: + assert tv.valid + + def runTest(self): + for tv in self.tv: + self.test_sign(tv) + self.test_verify(tv) + + +def get_tests(config={}): + + tests = [] + tests += list_test_cases(TestExport_Ed25519) + tests += list_test_cases(TestExport_Ed448) + tests += list_test_cases(TestImport_Ed25519) + tests += list_test_cases(TestImport_Ed448) + tests += list_test_cases(TestEdDSA) + tests += [TestVectorsEdDSAWycheproof()] + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py new file mode 100644 index 0000000..3a3e30b --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py @@ -0,0 +1,348 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import json +import unittest +from binascii import unhexlify + +from Cryptodome.Util.py3compat import bchr +from Cryptodome.Util.number import bytes_to_long +from Cryptodome.Util.strxor import strxor +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors, load_test_vectors_wycheproof + +from Cryptodome.Hash import (SHA1, SHA224, SHA256, SHA384, SHA512, SHA3_384, + SHA3_224, SHA3_256, SHA3_512) +from Cryptodome.PublicKey import RSA +from Cryptodome.Signature import pkcs1_15 +from Cryptodome.Signature import PKCS1_v1_5 + +from Cryptodome.Util._file_system import pycryptodome_filename +from Cryptodome.Util.strxor import strxor + + +def load_hash_by_name(hash_name): + return __import__("Cryptodome.Hash." + hash_name, globals(), locals(), ["new"]) + + +class FIPS_PKCS1_Verify_Tests(unittest.TestCase): + + def shortDescription(self): + return "FIPS PKCS1 Tests (Verify)" + + def test_can_sign(self): + test_public_key = RSA.generate(1024).public_key() + verifier = pkcs1_15.new(test_public_key) + self.assertEqual(verifier.can_sign(), False) + + +class FIPS_PKCS1_Verify_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_verify = load_test_vectors(("Signature", "PKCS1-v1.5"), + "SigVer15_186-3.rsp", + "Signature Verification 186-3", + {'shaalg': lambda x: x, + 'd': lambda x: int(x), + 'result': lambda x: x}) or [] + + +for count, tv in enumerate(test_vectors_verify): + if isinstance(tv, str): + continue + if hasattr(tv, "n"): + modulus = tv.n + continue + + hash_module = load_hash_by_name(tv.shaalg.upper()) + hash_obj = hash_module.new(tv.msg) + public_key = RSA.construct([bytes_to_long(x) for x in (modulus, tv.e)]) # type: ignore + verifier = pkcs1_15.new(public_key) + + def positive_test(self, hash_obj=hash_obj, verifier=verifier, signature=tv.s): + verifier.verify(hash_obj, signature) + + def negative_test(self, hash_obj=hash_obj, verifier=verifier, signature=tv.s): + self.assertRaises(ValueError, verifier.verify, hash_obj, signature) + + if tv.result == 'f': + setattr(FIPS_PKCS1_Verify_Tests_KAT, "test_negative_%d" % count, negative_test) + else: + setattr(FIPS_PKCS1_Verify_Tests_KAT, "test_positive_%d" % count, positive_test) + + +class FIPS_PKCS1_Sign_Tests(unittest.TestCase): + + def shortDescription(self): + return "FIPS PKCS1 Tests (Sign)" + + def test_can_sign(self): + test_private_key = RSA.generate(1024) + signer = pkcs1_15.new(test_private_key) + self.assertEqual(signer.can_sign(), True) + + +class FIPS_PKCS1_Sign_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_sign = load_test_vectors(("Signature", "PKCS1-v1.5"), + "SigGen15_186-2.txt", + "Signature Generation 186-2", + {'shaalg': lambda x: x}) or [] + +test_vectors_sign += load_test_vectors(("Signature", "PKCS1-v1.5"), + "SigGen15_186-3.txt", + "Signature Generation 186-3", + {'shaalg': lambda x: x}) or [] + +for count, tv in enumerate(test_vectors_sign): + if isinstance(tv, str): + continue + if hasattr(tv, "n"): + modulus = tv.n + continue + if hasattr(tv, "e"): + private_key = RSA.construct([bytes_to_long(x) for x in (modulus, tv.e, tv.d)]) # type: ignore + signer = pkcs1_15.new(private_key) + continue + + hash_module = load_hash_by_name(tv.shaalg.upper()) + hash_obj = hash_module.new(tv.msg) + + def new_test(self, hash_obj=hash_obj, signer=signer, result=tv.s): + signature = signer.sign(hash_obj) + self.assertEqual(signature, result) + + setattr(FIPS_PKCS1_Sign_Tests_KAT, "test_%d" % count, new_test) + + +class PKCS1_15_NoParams(unittest.TestCase): + """Verify that PKCS#1 v1.5 signatures pass even without NULL parameters in + the algorithm identifier (PyCrypto/LP bug #1119552).""" + + rsakey = """-----BEGIN RSA PRIVATE KEY----- + MIIBOwIBAAJBAL8eJ5AKoIsjURpcEoGubZMxLD7+kT+TLr7UkvEtFrRhDDKMtuII + q19FrL4pUIMymPMSLBn3hJLe30Dw48GQM4UCAwEAAQJACUSDEp8RTe32ftq8IwG8 + Wojl5mAd1wFiIOrZ/Uv8b963WJOJiuQcVN29vxU5+My9GPZ7RA3hrDBEAoHUDPrI + OQIhAPIPLz4dphiD9imAkivY31Rc5AfHJiQRA7XixTcjEkojAiEAyh/pJHks/Mlr + +rdPNEpotBjfV4M4BkgGAA/ipcmaAjcCIQCHvhwwKVBLzzTscT2HeUdEeBMoiXXK + JACAr3sJQJGxIQIgarRp+m1WSKV1MciwMaTOnbU7wxFs9DP1pva76lYBzgUCIQC9 + n0CnZCJ6IZYqSt0H5N7+Q+2Ro64nuwV/OSQfM6sBwQ== + -----END RSA PRIVATE KEY-----""" + + msg = b"This is a test\x0a" + + # PKCS1 v1.5 signature of the message computed using SHA-1. + # The digestAlgorithm SEQUENCE does NOT contain the NULL parameter. + sig_str = "a287a13517f716e72fb14eea8e33a8db4a4643314607e7ca3e3e28"\ + "1893db74013dda8b855fd99f6fecedcb25fcb7a434f35cd0a101f8"\ + "b19348e0bd7b6f152dfc" + signature = unhexlify(sig_str) + + def runTest(self): + verifier = pkcs1_15.new(RSA.importKey(self.rsakey)) + hashed = SHA1.new(self.msg) + verifier.verify(hashed, self.signature) + + +class PKCS1_Legacy_Module_Tests(unittest.TestCase): + """Verify that the legacy module Cryptodome.Signature.PKCS1_v1_5 + behaves as expected. The only difference is that the verify() + method returns True/False and does not raise exceptions.""" + + def shortDescription(self): + return "Test legacy Cryptodome.Signature.PKCS1_v1_5" + + def runTest(self): + key = RSA.importKey(PKCS1_15_NoParams.rsakey) + hashed = SHA1.new(b"Test") + good_signature = PKCS1_v1_5.new(key).sign(hashed) + verifier = PKCS1_v1_5.new(key.public_key()) + + self.assertEqual(verifier.verify(hashed, good_signature), True) + + # Flip a few bits in the signature + bad_signature = strxor(good_signature, bchr(1) * len(good_signature)) + self.assertEqual(verifier.verify(hashed, bad_signature), False) + + +class PKCS1_All_Hashes_Tests(unittest.TestCase): + + def shortDescription(self): + return "Test PKCS#1v1.5 signature in combination with all hashes" + + def runTest(self): + + key = RSA.generate(1024) + signer = pkcs1_15.new(key) + hash_names = ("MD2", "MD4", "MD5", "RIPEMD160", "SHA1", + "SHA224", "SHA256", "SHA384", "SHA512", + "SHA3_224", "SHA3_256", "SHA3_384", "SHA3_512") + + for name in hash_names: + hashed = load_hash_by_name(name).new(b"Test") + signer.sign(hashed) + + from Cryptodome.Hash import BLAKE2b, BLAKE2s + for hash_size in (20, 32, 48, 64): + hashed_b = BLAKE2b.new(digest_bytes=hash_size, data=b"Test") + signer.sign(hashed_b) + for hash_size in (16, 20, 28, 32): + hashed_s = BLAKE2s.new(digest_bytes=hash_size, data=b"Test") + signer.sign(hashed_s) + + +class TestVectorsWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def setUp(self): + self.tv = [] + self.add_tests("rsa_sig_gen_misc_test.json") + self.add_tests("rsa_signature_2048_sha224_test.json") + self.add_tests("rsa_signature_2048_sha256_test.json") + self.add_tests("rsa_signature_2048_sha384_test.json") + self.add_tests("rsa_signature_2048_sha3_224_test.json") + self.add_tests("rsa_signature_2048_sha3_256_test.json") + self.add_tests("rsa_signature_2048_sha3_384_test.json") + self.add_tests("rsa_signature_2048_sha3_512_test.json") + self.add_tests("rsa_signature_2048_sha512_test.json") + self.add_tests("rsa_signature_2048_sha512_224_test.json") + self.add_tests("rsa_signature_2048_sha512_256_test.json") + self.add_tests("rsa_signature_3072_sha256_test.json") + self.add_tests("rsa_signature_3072_sha384_test.json") + self.add_tests("rsa_signature_3072_sha3_256_test.json") + self.add_tests("rsa_signature_3072_sha3_384_test.json") + self.add_tests("rsa_signature_3072_sha3_512_test.json") + self.add_tests("rsa_signature_3072_sha512_test.json") + self.add_tests("rsa_signature_3072_sha512_256_test.json") + self.add_tests("rsa_signature_4096_sha384_test.json") + self.add_tests("rsa_signature_4096_sha512_test.json") + self.add_tests("rsa_signature_4096_sha512_256_test.json") + self.add_tests("rsa_signature_test.json") + + def add_tests(self, filename): + + def filter_rsa(group): + return RSA.import_key(group['keyPem']) + + def filter_sha(group): + hash_name = group['sha'] + if hash_name == "SHA-512": + return SHA512 + elif hash_name == "SHA-512/224": + return SHA512.new(truncate="224") + elif hash_name == "SHA-512/256": + return SHA512.new(truncate="256") + elif hash_name == "SHA3-512": + return SHA3_512 + elif hash_name == "SHA-384": + return SHA384 + elif hash_name == "SHA3-384": + return SHA3_384 + elif hash_name == "SHA-256": + return SHA256 + elif hash_name == "SHA3-256": + return SHA3_256 + elif hash_name == "SHA-224": + return SHA224 + elif hash_name == "SHA3-224": + return SHA3_224 + elif hash_name == "SHA-1": + return SHA1 + else: + raise ValueError("Unknown hash algorithm: " + hash_name) + + def filter_type(group): + type_name = group['type'] + if type_name not in ("RsassaPkcs1Verify", "RsassaPkcs1Generate"): + raise ValueError("Unknown type name " + type_name) + + result = load_test_vectors_wycheproof(("Signature", "wycheproof"), + filename, + "Wycheproof PKCS#1v1.5 signature (%s)" % filename, + group_tag={'rsa_key': filter_rsa, + 'hash_mod': filter_sha, + 'type': filter_type}) + return result + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_verify(self, tv): + self._id = "Wycheproof RSA PKCS$#1 Test #" + str(tv.id) + + hashed_msg = tv.hash_module.new(tv.msg) + signer = pkcs1_15.new(tv.key) + try: + signature = signer.verify(hashed_msg, tv.sig) + except ValueError as e: + if tv.warning: + return + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + for tv in self.tv: + self.test_verify(tv) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(FIPS_PKCS1_Verify_Tests) + tests += list_test_cases(FIPS_PKCS1_Sign_Tests) + tests += list_test_cases(PKCS1_15_NoParams) + tests += list_test_cases(PKCS1_Legacy_Module_Tests) + tests += list_test_cases(PKCS1_All_Hashes_Tests) + tests += [ TestVectorsWycheproof(wycheproof_warnings) ] + + if config.get('slow_tests'): + tests += list_test_cases(FIPS_PKCS1_Verify_Tests_KAT) + tests += list_test_cases(FIPS_PKCS1_Sign_Tests_KAT) + + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pss.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pss.py new file mode 100644 index 0000000..c3b1ce5 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Signature/test_pss.py @@ -0,0 +1,377 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest + +from Cryptodome.Util.py3compat import b, bchr +from Cryptodome.Util.number import bytes_to_long +from Cryptodome.Util.strxor import strxor +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.SelfTest.loader import load_test_vectors, load_test_vectors_wycheproof + +from Cryptodome.Hash import SHA1, SHA224, SHA256, SHA384, SHA512 +from Cryptodome.PublicKey import RSA +from Cryptodome.Signature import pss +from Cryptodome.Signature import PKCS1_PSS + +from Cryptodome.Signature.pss import MGF1 + + +def load_hash_by_name(hash_name): + return __import__("Cryptodome.Hash." + hash_name, globals(), locals(), ["new"]) + + +class PRNG(object): + + def __init__(self, stream): + self.stream = stream + self.idx = 0 + + def __call__(self, rnd_size): + result = self.stream[self.idx:self.idx + rnd_size] + self.idx += rnd_size + return result + + +class PSS_Tests(unittest.TestCase): + + rsa_key = b'-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAsvI34FgiTK8+txBvmooNGpNwk23YTU51dwNZi5yha3W4lA/Q\nvcZrDalkmD7ekWQwnduxVKa6pRSI13KBgeUOIqJoGXSWhntEtY3FEwvWOHW5AE7Q\njUzTzCiYT6TVaCcpa/7YLai+p6ai2g5f5Zfh4jSawa9uYeuggFygQq4IVW796MgV\nyqxYMM/arEj+/sKz3Viua9Rp9fFosertCYCX4DUTgW0mX9bwEnEOgjSI3pLOPXz1\n8vx+DRZS5wMCmwCUa0sKonLn3cAUPq+sGix7+eo7T0Z12MU8ud7IYVX/75r3cXiF\nPaYE2q8Le0kgOApIXbb+x74x0rNgyIh1yGygkwIDAQABAoIBABz4t1A0pLT6qHI2\nEIOaNz3mwhK0dZEqkz0GB1Dhtoax5ATgvKCFB98J3lYB08IBURe1snOsnMpOVUtg\naBRSM+QqnCUG6bnzKjAkuFP5liDE+oNQv1YpKp9CsUovuzdmI8Au3ewihl+ZTIN2\nUVNYMEOR1b5m+z2SSwWNOYsiJwpBrT7zkpdlDyjat7FiiPhMMIMXjhQFVxURMIcB\njUBtPzGvV/PG90cVDWi1wRGeeP1dDqti/jsnvykQ15KW1MqGrpeNKRmDdTy/Ucl1\nWIoYklKw3U456lgZ/rDTDB818+Tlnk35z4yF7d5ANPM8CKfqOPcnO1BCKVFzf4eq\n54wvUtkCgYEA1Zv2lp06l7rXMsvNtyYQjbFChezRDRnPwZmN4NCdRtTgGG1G0Ryd\nYz6WWoPGqZp0b4LAaaHd3W2GTcpXF8WXMKfMX1W+tMAxMozfsXRKMcHoypwuS5wT\nfJRXJCG4pvd57AB0iVUEJW2we+uGKU5Zxcx//id2nXGCpoRyViIplQsCgYEA1nVC\neHupHChht0Fh4N09cGqZHZzuwXjOUMzR3Vsfz+4WzVS3NvIgN4g5YgmQFOeKwo5y\niRq5yvubcNdFvf85eHWClg0zPAyxJCVUWigCrrOanGEhJo6re4idJvNVzu4Ucg0v\n6B3SJ1HsCda+ZSNz24bSyqRep8A+RoAaoVSFx5kCgYEAn3RvXPs9s+obnqWYiPF3\nRe5etE6Vt2vfNKwFxx6zaR6bsmBQjuUHcABWiHb6I71S0bMPI0tbrWGG8ibrYKl1\nNTLtUvVVCOS3VP7oNTWT9RTFTAnOXU7DFSo+6o/poWn3r36ff6zhDXeWWMr2OXtt\ndEQ1/2lCGEGVv+v61eVmmQUCgYABFHITPTwqwiFL1O5zPWnzyPWgaovhOYSAb6eW\n38CXQXGn8wdBJZL39J2lWrr4//l45VK6UgIhfYbY2JynSkO10ZGow8RARygVMILu\nOUlaK9lZdDvAf/NpGdUAvzTtZ9F+iYZ2OsA2JnlzyzsGM1l//3vMPWukmJk3ral0\nqoJJ8QKBgGRG3eVHnIegBbFVuMDp2NTcfuSuDVUQ1fGAwtPiFa8u81IodJnMk2pq\niXu2+0ytNA/M+SVrAnE2AgIzcaJbtr0p2srkuVM7KMWnG1vWFNjtXN8fAhf/joOv\nD+NmPL/N4uE57e40tbiU/H7KdyZaDt+5QiTmdhuyAe6CBjKsF2jy\n-----END RSA PRIVATE KEY-----' + msg = b'AAA' + tag = b'\x00[c5\xd8\xb0\x8b!D\x81\x83\x07\xc0\xdd\xb9\xb4\xb2`\x92\xe7\x02\xf1\xe1P\xea\xc3\xf0\xe3>\xddX5\xdd\x8e\xc5\x89\xef\xf3\xc2\xdc\xfeP\x02\x7f\x12+\xc9\xaf\xbb\xec\xfe\xb0\xa5\xb9\x08\x11P\x8fL\xee5\x9b\xb0k{=_\xd2\x14\xfb\x01R\xb7\xfe\x14}b\x03\x8d5Y\x89~}\xfc\xf2l\xd01-\xbd\xeb\x11\xcdV\x11\xe9l\x19k/o5\xa2\x0f\x15\xe7Q$\t=\xec\x1dAB\x19\xa5P\x9a\xaf\xa3G\x86"\xd6~\xf0j\xfcqkbs\x13\x84b\xe4\xbdm(\xed`\xa4F\xfb\x8f.\xe1\x8c)/_\x9eS\x98\xa4v\xb8\xdc\xfe\xf7/D\x18\x19\xb3T\x97:\xe2\x96s\xe8<\xa2\xb4\xb9\xf8/' + + def test_positive_1(self): + key = RSA.import_key(self.rsa_key) + h = SHA256.new(self.msg) + verifier = pss.new(key) + verifier.verify(h, self.tag) + + def test_negative_1(self): + key = RSA.import_key(self.rsa_key) + h = SHA256.new(self.msg + b'A') + verifier = pss.new(key) + tag = bytearray(self.tag) + self.assertRaises(ValueError, verifier.verify, h, tag) + + def test_negative_2(self): + key = RSA.import_key(self.rsa_key) + h = SHA256.new(self.msg) + verifier = pss.new(key, salt_bytes=1000) + tag = bytearray(self.tag) + self.assertRaises(ValueError, verifier.verify, h, tag) + + +class FIPS_PKCS1_Verify_Tests(unittest.TestCase): + + def shortDescription(self): + return "FIPS PKCS1 Tests (Verify)" + + def verify_positive(self, hashmod, message, public_key, salt, signature): + prng = PRNG(salt) + hashed = hashmod.new(message) + verifier = pss.new(public_key, salt_bytes=len(salt), rand_func=prng) + verifier.verify(hashed, signature) + + def verify_negative(self, hashmod, message, public_key, salt, signature): + prng = PRNG(salt) + hashed = hashmod.new(message) + verifier = pss.new(public_key, salt_bytes=len(salt), rand_func=prng) + self.assertRaises(ValueError, verifier.verify, hashed, signature) + + def test_can_sign(self): + test_public_key = RSA.generate(1024).public_key() + verifier = pss.new(test_public_key) + self.assertEqual(verifier.can_sign(), False) + + +class FIPS_PKCS1_Verify_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_verify = load_test_vectors(("Signature", "PKCS1-PSS"), + "SigVerPSS_186-3.rsp", + "Signature Verification 186-3", + {'shaalg': lambda x: x, + 'result': lambda x: x}) or [] + + +for count, tv in enumerate(test_vectors_verify): + if isinstance(tv, str): + continue + if hasattr(tv, "n"): + modulus = tv.n + continue + if hasattr(tv, "p"): + continue + + hash_module = load_hash_by_name(tv.shaalg.upper()) + hash_obj = hash_module.new(tv.msg) + public_key = RSA.construct([bytes_to_long(x) for x in (modulus, tv.e)]) # type: ignore + if tv.saltval != b("\x00"): + prng = PRNG(tv.saltval) + verifier = pss.new(public_key, salt_bytes=len(tv.saltval), rand_func=prng) + else: + verifier = pss.new(public_key, salt_bytes=0) + + def positive_test(self, hash_obj=hash_obj, verifier=verifier, signature=tv.s): + verifier.verify(hash_obj, signature) + + def negative_test(self, hash_obj=hash_obj, verifier=verifier, signature=tv.s): + self.assertRaises(ValueError, verifier.verify, hash_obj, signature) + + if tv.result == 'p': + setattr(FIPS_PKCS1_Verify_Tests_KAT, "test_positive_%d" % count, positive_test) + else: + setattr(FIPS_PKCS1_Verify_Tests_KAT, "test_negative_%d" % count, negative_test) + + +class FIPS_PKCS1_Sign_Tests(unittest.TestCase): + + def shortDescription(self): + return "FIPS PKCS1 Tests (Sign)" + + def test_can_sign(self): + test_private_key = RSA.generate(1024) + signer = pss.new(test_private_key) + self.assertEqual(signer.can_sign(), True) + + +class FIPS_PKCS1_Sign_Tests_KAT(unittest.TestCase): + pass + + +test_vectors_sign = load_test_vectors(("Signature", "PKCS1-PSS"), + "SigGenPSS_186-2.txt", + "Signature Generation 186-2", + {'shaalg': lambda x: x}) or [] + +test_vectors_sign += load_test_vectors(("Signature", "PKCS1-PSS"), + "SigGenPSS_186-3.txt", + "Signature Generation 186-3", + {'shaalg': lambda x: x}) or [] + +for count, tv in enumerate(test_vectors_sign): + if isinstance(tv, str): + continue + if hasattr(tv, "n"): + modulus = tv.n + continue + if hasattr(tv, "e"): + private_key = RSA.construct([bytes_to_long(x) for x in (modulus, tv.e, tv.d)]) # type: ignore + continue + + hash_module = load_hash_by_name(tv.shaalg.upper()) + hash_obj = hash_module.new(tv.msg) + if tv.saltval != b("\x00"): + prng = PRNG(tv.saltval) + signer = pss.new(private_key, salt_bytes=len(tv.saltval), rand_func=prng) + else: + signer = pss.new(private_key, salt_bytes=0) + + def new_test(self, hash_obj=hash_obj, signer=signer, result=tv.s): + signature = signer.sign(hash_obj) + self.assertEqual(signature, result) + + setattr(FIPS_PKCS1_Sign_Tests_KAT, "test_%d" % count, new_test) + + +class PKCS1_Legacy_Module_Tests(unittest.TestCase): + """Verify that the legacy module Cryptodome.Signature.PKCS1_PSS + behaves as expected. The only difference is that the verify() + method returns True/False and does not raise exceptions.""" + + def shortDescription(self): + return "Test legacy Cryptodome.Signature.PKCS1_PSS" + + def runTest(self): + key = RSA.generate(1024) + hashed = SHA1.new(b("Test")) + good_signature = PKCS1_PSS.new(key).sign(hashed) + verifier = PKCS1_PSS.new(key.public_key()) + + self.assertEqual(verifier.verify(hashed, good_signature), True) + + # Flip a few bits in the signature + bad_signature = strxor(good_signature, bchr(1) * len(good_signature)) + self.assertEqual(verifier.verify(hashed, bad_signature), False) + + +class PKCS1_All_Hashes_Tests(unittest.TestCase): + + def shortDescription(self): + return "Test PKCS#1 PSS signature in combination with all hashes" + + def runTest(self): + + key = RSA.generate(1280) + signer = pss.new(key) + hash_names = ("MD2", "MD4", "MD5", "RIPEMD160", "SHA1", + "SHA224", "SHA256", "SHA384", "SHA512", + "SHA3_224", "SHA3_256", "SHA3_384", "SHA3_512") + + for name in hash_names: + hashed = load_hash_by_name(name).new(b("Test")) + signer.sign(hashed) + + from Cryptodome.Hash import BLAKE2b, BLAKE2s + for hash_size in (20, 32, 48, 64): + hashed_b = BLAKE2b.new(digest_bytes=hash_size, data=b("Test")) + signer.sign(hashed_b) + for hash_size in (16, 20, 28, 32): + hashed_s = BLAKE2s.new(digest_bytes=hash_size, data=b("Test")) + signer.sign(hashed_s) + + +def get_hash_module(hash_name): + if hash_name == "SHA-512": + hash_module = SHA512 + elif hash_name == "SHA-512/224": + hash_module = SHA512.new(truncate="224") + elif hash_name == "SHA-512/256": + hash_module = SHA512.new(truncate="256") + elif hash_name == "SHA-384": + hash_module = SHA384 + elif hash_name == "SHA-256": + hash_module = SHA256 + elif hash_name == "SHA-224": + hash_module = SHA224 + elif hash_name == "SHA-1": + hash_module = SHA1 + else: + raise ValueError("Unknown hash algorithm: " + hash_name) + return hash_module + + +class TestVectorsPSSWycheproof(unittest.TestCase): + + def __init__(self, wycheproof_warnings): + unittest.TestCase.__init__(self) + self._wycheproof_warnings = wycheproof_warnings + self._id = "None" + + def add_tests(self, filename): + + def filter_rsa(group): + return RSA.import_key(group['keyPem']) + + def filter_sha(group): + return get_hash_module(group['sha']) + + def filter_type(group): + type_name = group['type'] + if type_name not in ("RsassaPssVerify", ): + raise ValueError("Unknown type name " + type_name) + + def filter_slen(group): + return group['sLen'] + + def filter_mgf(group): + mgf = group['mgf'] + if mgf not in ("MGF1", ): + raise ValueError("Unknown MGF " + mgf) + mgf1_hash = get_hash_module(group['mgfSha']) + + def mgf(x, y, mh=mgf1_hash): + return MGF1(x, y, mh) + + return mgf + + result = load_test_vectors_wycheproof(("Signature", "wycheproof"), + filename, + "Wycheproof PSS signature (%s)" % filename, + group_tag={'key': filter_rsa, + 'hash_module': filter_sha, + 'sLen': filter_slen, + 'mgf': filter_mgf, + 'type': filter_type}) + return result + + def setUp(self): + self.tv = [] + self.add_tests("rsa_pss_2048_sha1_mgf1_20_test.json") + self.add_tests("rsa_pss_2048_sha256_mgf1_0_test.json") + self.add_tests("rsa_pss_2048_sha256_mgf1_32_test.json") + self.add_tests("rsa_pss_2048_sha512_256_mgf1_28_test.json") + self.add_tests("rsa_pss_2048_sha512_256_mgf1_32_test.json") + self.add_tests("rsa_pss_3072_sha256_mgf1_32_test.json") + self.add_tests("rsa_pss_4096_sha256_mgf1_32_test.json") + self.add_tests("rsa_pss_4096_sha512_mgf1_32_test.json") + self.add_tests("rsa_pss_misc_test.json") + + def shortDescription(self): + return self._id + + def warn(self, tv): + if tv.warning and self._wycheproof_warnings: + import warnings + warnings.warn("Wycheproof warning: %s (%s)" % (self._id, tv.comment)) + + def test_verify(self, tv): + self._id = "Wycheproof RSA PSS Test #%d (%s)" % (tv.id, tv.comment) + + hashed_msg = tv.hash_module.new(tv.msg) + signer = pss.new(tv.key, mask_func=tv.mgf, salt_bytes=tv.sLen) + try: + signature = signer.verify(hashed_msg, tv.sig) + except ValueError as e: + if tv.warning: + return + assert not tv.valid + else: + assert tv.valid + self.warn(tv) + + def runTest(self): + for tv in self.tv: + self.test_verify(tv) + + +def get_tests(config={}): + wycheproof_warnings = config.get('wycheproof_warnings') + + tests = [] + tests += list_test_cases(PSS_Tests) + tests += list_test_cases(FIPS_PKCS1_Verify_Tests) + tests += list_test_cases(FIPS_PKCS1_Sign_Tests) + tests += list_test_cases(PKCS1_Legacy_Module_Tests) + tests += list_test_cases(PKCS1_All_Hashes_Tests) + + if config.get('slow_tests'): + tests += list_test_cases(FIPS_PKCS1_Verify_Tests_KAT) + tests += list_test_cases(FIPS_PKCS1_Sign_Tests_KAT) + + tests += [TestVectorsPSSWycheproof(wycheproof_warnings)] + + return tests + + +if __name__ == '__main__': + def suite(): + return unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/__init__.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/__init__.py new file mode 100644 index 0000000..e52c490 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/__init__.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Util/__init__.py: Self-test for utility modules +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-test for utility modules""" + +__revision__ = "$Id$" + +import os + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest.Util import test_number; tests += test_number.get_tests(config=config) + from Cryptodome.SelfTest.Util import test_Counter; tests += test_Counter.get_tests(config=config) + from Cryptodome.SelfTest.Util import test_Padding; tests += test_Padding.get_tests(config=config) + from Cryptodome.SelfTest.Util import test_strxor; tests += test_strxor.get_tests(config=config) + from Cryptodome.SelfTest.Util import test_asn1; tests += test_asn1.get_tests(config=config) + from Cryptodome.SelfTest.Util import test_rfc1751; tests += test_rfc1751.get_tests(config=config) + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Counter.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Counter.py new file mode 100644 index 0000000..0d1e089 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Counter.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Util/test_Counter: Self-test for the Cryptodome.Util.Counter module +# +# Written in 2009 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-tests for Cryptodome.Util.Counter""" + +from Cryptodome.Util.py3compat import * + +import unittest + +class CounterTests(unittest.TestCase): + def setUp(self): + global Counter + from Cryptodome.Util import Counter + + def test_BE(self): + """Big endian""" + c = Counter.new(128) + c = Counter.new(128, little_endian=False) + + def test_LE(self): + """Little endian""" + c = Counter.new(128, little_endian=True) + + def test_nbits(self): + c = Counter.new(nbits=128) + self.assertRaises(ValueError, Counter.new, 129) + + def test_prefix(self): + c = Counter.new(128, prefix=b("xx")) + + def test_suffix(self): + c = Counter.new(128, suffix=b("xx")) + + def test_iv(self): + c = Counter.new(128, initial_value=2) + self.assertRaises(ValueError, Counter.new, 16, initial_value=0x1FFFF) + +def get_tests(config={}): + from Cryptodome.SelfTest.st_common import list_test_cases + return list_test_cases(CounterTests) + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Padding.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Padding.py new file mode 100644 index 0000000..d6a794e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_Padding.py @@ -0,0 +1,154 @@ +# +# SelfTest/Util/test_Padding.py: Self-test for padding functions +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify as uh + +from Cryptodome.Util.py3compat import * +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.Padding import pad, unpad + +class PKCS7_Tests(unittest.TestCase): + + def test1(self): + padded = pad(b(""), 4) + self.assertTrue(padded == uh(b("04040404"))) + padded = pad(b(""), 4, 'pkcs7') + self.assertTrue(padded == uh(b("04040404"))) + back = unpad(padded, 4) + self.assertTrue(back == b("")) + + def test2(self): + padded = pad(uh(b("12345678")), 4) + self.assertTrue(padded == uh(b("1234567804040404"))) + back = unpad(padded, 4) + self.assertTrue(back == uh(b("12345678"))) + + def test3(self): + padded = pad(uh(b("123456")), 4) + self.assertTrue(padded == uh(b("12345601"))) + back = unpad(padded, 4) + self.assertTrue(back == uh(b("123456"))) + + def test4(self): + padded = pad(uh(b("1234567890")), 4) + self.assertTrue(padded == uh(b("1234567890030303"))) + back = unpad(padded, 4) + self.assertTrue(back == uh(b("1234567890"))) + + def testn1(self): + self.assertRaises(ValueError, pad, uh(b("12")), 4, 'pkcs8') + + def testn2(self): + self.assertRaises(ValueError, unpad, b("\0\0\0"), 4) + self.assertRaises(ValueError, unpad, b(""), 4) + + def testn3(self): + self.assertRaises(ValueError, unpad, b("123456\x02"), 4) + self.assertRaises(ValueError, unpad, b("123456\x00"), 4) + self.assertRaises(ValueError, unpad, b("123456\x05\x05\x05\x05\x05"), 4) + +class X923_Tests(unittest.TestCase): + + def test1(self): + padded = pad(b(""), 4, 'x923') + self.assertTrue(padded == uh(b("00000004"))) + back = unpad(padded, 4, 'x923') + self.assertTrue(back == b("")) + + def test2(self): + padded = pad(uh(b("12345678")), 4, 'x923') + self.assertTrue(padded == uh(b("1234567800000004"))) + back = unpad(padded, 4, 'x923') + self.assertTrue(back == uh(b("12345678"))) + + def test3(self): + padded = pad(uh(b("123456")), 4, 'x923') + self.assertTrue(padded == uh(b("12345601"))) + back = unpad(padded, 4, 'x923') + self.assertTrue(back == uh(b("123456"))) + + def test4(self): + padded = pad(uh(b("1234567890")), 4, 'x923') + self.assertTrue(padded == uh(b("1234567890000003"))) + back = unpad(padded, 4, 'x923') + self.assertTrue(back == uh(b("1234567890"))) + + def testn1(self): + self.assertRaises(ValueError, unpad, b("123456\x02"), 4, 'x923') + self.assertRaises(ValueError, unpad, b("123456\x00"), 4, 'x923') + self.assertRaises(ValueError, unpad, b("123456\x00\x00\x00\x00\x05"), 4, 'x923') + self.assertRaises(ValueError, unpad, b(""), 4, 'x923') + +class ISO7816_Tests(unittest.TestCase): + + def test1(self): + padded = pad(b(""), 4, 'iso7816') + self.assertTrue(padded == uh(b("80000000"))) + back = unpad(padded, 4, 'iso7816') + self.assertTrue(back == b("")) + + def test2(self): + padded = pad(uh(b("12345678")), 4, 'iso7816') + self.assertTrue(padded == uh(b("1234567880000000"))) + back = unpad(padded, 4, 'iso7816') + self.assertTrue(back == uh(b("12345678"))) + + def test3(self): + padded = pad(uh(b("123456")), 4, 'iso7816') + self.assertTrue(padded == uh(b("12345680"))) + #import pdb; pdb.set_trace() + back = unpad(padded, 4, 'iso7816') + self.assertTrue(back == uh(b("123456"))) + + def test4(self): + padded = pad(uh(b("1234567890")), 4, 'iso7816') + self.assertTrue(padded == uh(b("1234567890800000"))) + back = unpad(padded, 4, 'iso7816') + self.assertTrue(back == uh(b("1234567890"))) + + def testn1(self): + self.assertRaises(ValueError, unpad, b("123456\x81"), 4, 'iso7816') + self.assertRaises(ValueError, unpad, b(""), 4, 'iso7816') + +def get_tests(config={}): + tests = [] + tests += list_test_cases(PKCS7_Tests) + tests += list_test_cases(X923_Tests) + tests += list_test_cases(ISO7816_Tests) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_asn1.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_asn1.py new file mode 100644 index 0000000..811ac84 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_asn1.py @@ -0,0 +1,851 @@ +# +# SelfTest/Util/test_asn.py: Self-test for the Cryptodome.Util.asn1 module +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Self-tests for Cryptodome.Util.asn1""" + +import unittest + +from Cryptodome.Util.py3compat import * +from Cryptodome.Util.asn1 import (DerObject, DerSetOf, DerInteger, + DerBitString, + DerObjectId, DerNull, DerOctetString, + DerSequence, DerBoolean) + +class DerObjectTests(unittest.TestCase): + + def testObjInit1(self): + # Fail with invalid tag format (must be 1 byte) + self.assertRaises(ValueError, DerObject, b('\x00\x99')) + # Fail with invalid implicit tag (must be <0x1F) + self.assertRaises(ValueError, DerObject, 0x1F) + + # ------ + + def testObjEncode1(self): + # No payload + der = DerObject(b('\x02')) + self.assertEqual(der.encode(), b('\x02\x00')) + # Small payload (primitive) + der.payload = b('\x45') + self.assertEqual(der.encode(), b('\x02\x01\x45')) + # Invariant + self.assertEqual(der.encode(), b('\x02\x01\x45')) + # Initialize with numerical tag + der = DerObject(0x04) + der.payload = b('\x45') + self.assertEqual(der.encode(), b('\x04\x01\x45')) + # Initialize with constructed type + der = DerObject(b('\x10'), constructed=True) + self.assertEqual(der.encode(), b('\x30\x00')) + + def testObjEncode2(self): + # Initialize with payload + der = DerObject(0x03, b('\x12\x12')) + self.assertEqual(der.encode(), b('\x03\x02\x12\x12')) + + def testObjEncode3(self): + # Long payload + der = DerObject(b('\x10')) + der.payload = b("0")*128 + self.assertEqual(der.encode(), b('\x10\x81\x80' + "0"*128)) + + def testObjEncode4(self): + # Implicit tags (constructed) + der = DerObject(0x10, implicit=1, constructed=True) + der.payload = b('ppll') + self.assertEqual(der.encode(), b('\xa1\x04ppll')) + # Implicit tags (primitive) + der = DerObject(0x02, implicit=0x1E, constructed=False) + der.payload = b('ppll') + self.assertEqual(der.encode(), b('\x9E\x04ppll')) + + def testObjEncode5(self): + # Encode type with explicit tag + der = DerObject(0x10, explicit=5) + der.payload = b("xxll") + self.assertEqual(der.encode(), b("\xa5\x06\x10\x04xxll")) + + # ----- + + def testObjDecode1(self): + # Decode short payload + der = DerObject(0x02) + der.decode(b('\x02\x02\x01\x02')) + self.assertEqual(der.payload, b("\x01\x02")) + self.assertEqual(der._tag_octet, 0x02) + + def testObjDecode2(self): + # Decode long payload + der = DerObject(0x02) + der.decode(b('\x02\x81\x80' + "1"*128)) + self.assertEqual(der.payload, b("1")*128) + self.assertEqual(der._tag_octet, 0x02) + + def testObjDecode3(self): + # Decode payload with too much data gives error + der = DerObject(0x02) + self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02\xFF')) + # Decode payload with too little data gives error + der = DerObject(0x02) + self.assertRaises(ValueError, der.decode, b('\x02\x02\x01')) + + def testObjDecode4(self): + # Decode implicit tag (primitive) + der = DerObject(0x02, constructed=False, implicit=0xF) + self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02')) + der.decode(b('\x8F\x01\x00')) + self.assertEqual(der.payload, b('\x00')) + # Decode implicit tag (constructed) + der = DerObject(0x02, constructed=True, implicit=0xF) + self.assertRaises(ValueError, der.decode, b('\x02\x02\x01\x02')) + der.decode(b('\xAF\x01\x00')) + self.assertEqual(der.payload, b('\x00')) + + def testObjDecode5(self): + # Decode payload with unexpected tag gives error + der = DerObject(0x02) + self.assertRaises(ValueError, der.decode, b('\x03\x02\x01\x02')) + + def testObjDecode6(self): + # Arbitrary DER object + der = DerObject() + der.decode(b('\x65\x01\x88')) + self.assertEqual(der._tag_octet, 0x65) + self.assertEqual(der.payload, b('\x88')) + + def testObjDecode7(self): + # Decode explicit tag + der = DerObject(0x10, explicit=5) + der.decode(b("\xa5\x06\x10\x04xxll")) + self.assertEqual(der._inner_tag_octet, 0x10) + self.assertEqual(der.payload, b('xxll')) + + # Explicit tag may be 0 + der = DerObject(0x10, explicit=0) + der.decode(b("\xa0\x06\x10\x04xxll")) + self.assertEqual(der._inner_tag_octet, 0x10) + self.assertEqual(der.payload, b('xxll')) + + def testObjDecode8(self): + # Verify that decode returns the object + der = DerObject(0x02) + self.assertEqual(der, der.decode(b('\x02\x02\x01\x02'))) + +class DerIntegerTests(unittest.TestCase): + + def testInit1(self): + der = DerInteger(1) + self.assertEqual(der.encode(), b('\x02\x01\x01')) + + def testEncode1(self): + # Single-byte integers + # Value 0 + der = DerInteger(0) + self.assertEqual(der.encode(), b('\x02\x01\x00')) + # Value 1 + der = DerInteger(1) + self.assertEqual(der.encode(), b('\x02\x01\x01')) + # Value 127 + der = DerInteger(127) + self.assertEqual(der.encode(), b('\x02\x01\x7F')) + + def testEncode2(self): + # Multi-byte integers + # Value 128 + der = DerInteger(128) + self.assertEqual(der.encode(), b('\x02\x02\x00\x80')) + # Value 0x180 + der = DerInteger(0x180) + self.assertEqual(der.encode(), b('\x02\x02\x01\x80')) + # One very long integer + der = DerInteger(2**2048) + self.assertEqual(der.encode(), + b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) + + def testEncode3(self): + # Negative integers + # Value -1 + der = DerInteger(-1) + self.assertEqual(der.encode(), b('\x02\x01\xFF')) + # Value -128 + der = DerInteger(-128) + self.assertEqual(der.encode(), b('\x02\x01\x80')) + # Value + der = DerInteger(-87873) + self.assertEqual(der.encode(), b('\x02\x03\xFE\xA8\xBF')) + + def testEncode4(self): + # Explicit encoding + number = DerInteger(0x34, explicit=3) + self.assertEqual(number.encode(), b('\xa3\x03\x02\x01\x34')) + + # ----- + + def testDecode1(self): + # Single-byte integer + der = DerInteger() + # Value 0 + der.decode(b('\x02\x01\x00')) + self.assertEqual(der.value, 0) + # Value 1 + der.decode(b('\x02\x01\x01')) + self.assertEqual(der.value, 1) + # Value 127 + der.decode(b('\x02\x01\x7F')) + self.assertEqual(der.value, 127) + + def testDecode2(self): + # Multi-byte integer + der = DerInteger() + # Value 0x180L + der.decode(b('\x02\x02\x01\x80')) + self.assertEqual(der.value,0x180) + # One very long integer + der.decode( + b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) + self.assertEqual(der.value,2**2048) + + def testDecode3(self): + # Negative integer + der = DerInteger() + # Value -1 + der.decode(b('\x02\x01\xFF')) + self.assertEqual(der.value, -1) + # Value -32768 + der.decode(b('\x02\x02\x80\x00')) + self.assertEqual(der.value, -32768) + + def testDecode5(self): + # We still accept BER integer format + der = DerInteger() + # Redundant leading zeroes + der.decode(b('\x02\x02\x00\x01')) + self.assertEqual(der.value, 1) + # Redundant leading 0xFF + der.decode(b('\x02\x02\xFF\xFF')) + self.assertEqual(der.value, -1) + # Empty payload + der.decode(b('\x02\x00')) + self.assertEqual(der.value, 0) + + def testDecode6(self): + # Explicit encoding + number = DerInteger(explicit=3) + number.decode(b('\xa3\x03\x02\x01\x34')) + self.assertEqual(number.value, 0x34) + + def testDecode7(self): + # Verify decode returns the DerInteger + der = DerInteger() + self.assertEqual(der, der.decode(b('\x02\x01\x7F'))) + + ### + + def testStrict1(self): + number = DerInteger() + + number.decode(b'\x02\x02\x00\x01') + number.decode(b'\x02\x02\x00\x7F') + self.assertRaises(ValueError, number.decode, b'\x02\x02\x00\x01', strict=True) + self.assertRaises(ValueError, number.decode, b'\x02\x02\x00\x7F', strict=True) + + ### + + def testErrDecode1(self): + # Wide length field + der = DerInteger() + self.assertRaises(ValueError, der.decode, b('\x02\x81\x01\x01')) + + +class DerSequenceTests(unittest.TestCase): + + def testInit1(self): + der = DerSequence([1, DerInteger(2), b('0\x00')]) + self.assertEqual(der.encode(), b('0\x08\x02\x01\x01\x02\x01\x020\x00')) + + def testEncode1(self): + # Empty sequence + der = DerSequence() + self.assertEqual(der.encode(), b('0\x00')) + self.assertFalse(der.hasOnlyInts()) + # One single-byte integer (zero) + der.append(0) + self.assertEqual(der.encode(), b('0\x03\x02\x01\x00')) + self.assertEqual(der.hasInts(),1) + self.assertEqual(der.hasInts(False),1) + self.assertTrue(der.hasOnlyInts()) + self.assertTrue(der.hasOnlyInts(False)) + # Invariant + self.assertEqual(der.encode(), b('0\x03\x02\x01\x00')) + + def testEncode2(self): + # Indexing + der = DerSequence() + der.append(0) + der[0] = 1 + self.assertEqual(len(der),1) + self.assertEqual(der[0],1) + self.assertEqual(der[-1],1) + self.assertEqual(der.encode(), b('0\x03\x02\x01\x01')) + # + der[:] = [1] + self.assertEqual(len(der),1) + self.assertEqual(der[0],1) + self.assertEqual(der.encode(), b('0\x03\x02\x01\x01')) + + def testEncode3(self): + # One multi-byte integer (non-zero) + der = DerSequence() + der.append(0x180) + self.assertEqual(der.encode(), b('0\x04\x02\x02\x01\x80')) + + def testEncode4(self): + # One very long integer + der = DerSequence() + der.append(2**2048) + self.assertEqual(der.encode(), b('0\x82\x01\x05')+ + b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) + + def testEncode5(self): + der = DerSequence() + der += 1 + der += b('\x30\x00') + self.assertEqual(der.encode(), b('\x30\x05\x02\x01\x01\x30\x00')) + + def testEncode6(self): + # Two positive integers + der = DerSequence() + der.append(0x180) + der.append(0xFF) + self.assertEqual(der.encode(), b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff')) + self.assertTrue(der.hasOnlyInts()) + self.assertTrue(der.hasOnlyInts(False)) + # Two mixed integers + der = DerSequence() + der.append(2) + der.append(-2) + self.assertEqual(der.encode(), b('0\x06\x02\x01\x02\x02\x01\xFE')) + self.assertEqual(der.hasInts(), 1) + self.assertEqual(der.hasInts(False), 2) + self.assertFalse(der.hasOnlyInts()) + self.assertTrue(der.hasOnlyInts(False)) + # + der.append(0x01) + der[1:] = [9,8] + self.assertEqual(len(der),3) + self.assertEqual(der[1:],[9,8]) + self.assertEqual(der[1:-1],[9]) + self.assertEqual(der.encode(), b('0\x09\x02\x01\x02\x02\x01\x09\x02\x01\x08')) + + def testEncode7(self): + # One integer and another type (already encoded) + der = DerSequence() + der.append(0x180) + der.append(b('0\x03\x02\x01\x05')) + self.assertEqual(der.encode(), b('0\x09\x02\x02\x01\x800\x03\x02\x01\x05')) + self.assertFalse(der.hasOnlyInts()) + + def testEncode8(self): + # One integer and another type (yet to encode) + der = DerSequence() + der.append(0x180) + der.append(DerSequence([5])) + self.assertEqual(der.encode(), b('0\x09\x02\x02\x01\x800\x03\x02\x01\x05')) + self.assertFalse(der.hasOnlyInts()) + + #### + + def testDecode1(self): + # Empty sequence + der = DerSequence() + der.decode(b('0\x00')) + self.assertEqual(len(der),0) + # One single-byte integer (zero) + der.decode(b('0\x03\x02\x01\x00')) + self.assertEqual(len(der),1) + self.assertEqual(der[0],0) + # Invariant + der.decode(b('0\x03\x02\x01\x00')) + self.assertEqual(len(der),1) + self.assertEqual(der[0],0) + + def testDecode2(self): + # One single-byte integer (non-zero) + der = DerSequence() + der.decode(b('0\x03\x02\x01\x7f')) + self.assertEqual(len(der),1) + self.assertEqual(der[0],127) + + def testDecode4(self): + # One very long integer + der = DerSequence() + der.decode(b('0\x82\x01\x05')+ + b('\x02\x82\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')+ + b('\x00\x00\x00\x00\x00\x00\x00\x00\x00')) + self.assertEqual(len(der),1) + self.assertEqual(der[0],2**2048) + + def testDecode6(self): + # Two integers + der = DerSequence() + der.decode(b('0\x08\x02\x02\x01\x80\x02\x02\x00\xff')) + self.assertEqual(len(der),2) + self.assertEqual(der[0],0x180) + self.assertEqual(der[1],0xFF) + + def testDecode7(self): + # One integer and 2 other types + der = DerSequence() + der.decode(b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00')) + self.assertEqual(len(der),3) + self.assertEqual(der[0],0x180) + self.assertEqual(der[1],b('\x24\x02\xb6\x63')) + self.assertEqual(der[2],b('\x12\x00')) + + def testDecode8(self): + # Only 2 other types + der = DerSequence() + der.decode(b('0\x06\x24\x02\xb6\x63\x12\x00')) + self.assertEqual(len(der),2) + self.assertEqual(der[0],b('\x24\x02\xb6\x63')) + self.assertEqual(der[1],b('\x12\x00')) + self.assertEqual(der.hasInts(), 0) + self.assertEqual(der.hasInts(False), 0) + self.assertFalse(der.hasOnlyInts()) + self.assertFalse(der.hasOnlyInts(False)) + + def testDecode9(self): + # Verify that decode returns itself + der = DerSequence() + self.assertEqual(der, der.decode(b('0\x06\x24\x02\xb6\x63\x12\x00'))) + + ### + + def testErrDecode1(self): + # Not a sequence + der = DerSequence() + self.assertRaises(ValueError, der.decode, b('')) + self.assertRaises(ValueError, der.decode, b('\x00')) + self.assertRaises(ValueError, der.decode, b('\x30')) + + def testErrDecode2(self): + der = DerSequence() + # Too much data + self.assertRaises(ValueError, der.decode, b('\x30\x00\x00')) + + def testErrDecode3(self): + # Wrong length format + der = DerSequence() + # Missing length in sub-item + self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x01\x01\x00')) + # Valid BER, but invalid DER length + self.assertRaises(ValueError, der.decode, b('\x30\x81\x03\x02\x01\x01')) + self.assertRaises(ValueError, der.decode, b('\x30\x04\x02\x81\x01\x01')) + + def test_expected_nr_elements(self): + der_bin = DerSequence([1, 2, 3]).encode() + + DerSequence().decode(der_bin, nr_elements=3) + DerSequence().decode(der_bin, nr_elements=(2,3)) + self.assertRaises(ValueError, DerSequence().decode, der_bin, nr_elements=1) + self.assertRaises(ValueError, DerSequence().decode, der_bin, nr_elements=(4,5)) + + def test_expected_only_integers(self): + + der_bin1 = DerSequence([1, 2, 3]).encode() + der_bin2 = DerSequence([1, 2, DerSequence([3, 4])]).encode() + + DerSequence().decode(der_bin1, only_ints_expected=True) + DerSequence().decode(der_bin1, only_ints_expected=False) + DerSequence().decode(der_bin2, only_ints_expected=False) + self.assertRaises(ValueError, DerSequence().decode, der_bin2, only_ints_expected=True) + + +class DerOctetStringTests(unittest.TestCase): + + def testInit1(self): + der = DerOctetString(b('\xFF')) + self.assertEqual(der.encode(), b('\x04\x01\xFF')) + + def testEncode1(self): + # Empty sequence + der = DerOctetString() + self.assertEqual(der.encode(), b('\x04\x00')) + # Small payload + der.payload = b('\x01\x02') + self.assertEqual(der.encode(), b('\x04\x02\x01\x02')) + + #### + + def testDecode1(self): + # Empty sequence + der = DerOctetString() + der.decode(b('\x04\x00')) + self.assertEqual(der.payload, b('')) + # Small payload + der.decode(b('\x04\x02\x01\x02')) + self.assertEqual(der.payload, b('\x01\x02')) + + def testDecode2(self): + # Verify that decode returns the object + der = DerOctetString() + self.assertEqual(der, der.decode(b('\x04\x00'))) + + def testErrDecode1(self): + # No leftovers allowed + der = DerOctetString() + self.assertRaises(ValueError, der.decode, b('\x04\x01\x01\xff')) + +class DerNullTests(unittest.TestCase): + + def testEncode1(self): + der = DerNull() + self.assertEqual(der.encode(), b('\x05\x00')) + + #### + + def testDecode1(self): + # Empty sequence + der = DerNull() + self.assertEqual(der, der.decode(b('\x05\x00'))) + +class DerObjectIdTests(unittest.TestCase): + + def testInit1(self): + der = DerObjectId("1.1") + self.assertEqual(der.encode(), b'\x06\x01)') + + def testEncode1(self): + der = DerObjectId('1.2.840.113549.1.1.1') + self.assertEqual(der.encode(), b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01') + + der = DerObjectId() + der.value = '1.2.840.113549.1.1.1' + self.assertEqual(der.encode(), b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01') + + der = DerObjectId('2.999.1234') + self.assertEqual(der.encode(), b'\x06\x04\x88\x37\x89\x52') + + def testEncode2(self): + der = DerObjectId('3.4') + self.assertRaises(ValueError, der.encode) + + der = DerObjectId('1.40') + self.assertRaises(ValueError, der.encode) + + #### + + def testDecode1(self): + # Empty sequence + der = DerObjectId() + der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01') + self.assertEqual(der.value, '1.2.840.113549.1.1.1') + + def testDecode2(self): + # Verify that decode returns the object + der = DerObjectId() + self.assertEqual(der, + der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01')) + + def testDecode3(self): + der = DerObjectId() + der.decode(b'\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x00\x01') + self.assertEqual(der.value, '1.2.840.113549.1.0.1') + + def testDecode4(self): + der = DerObjectId() + der.decode(b'\x06\x04\x88\x37\x89\x52') + self.assertEqual(der.value, '2.999.1234') + + +class DerBitStringTests(unittest.TestCase): + + def testInit1(self): + der = DerBitString(b("\xFF")) + self.assertEqual(der.encode(), b('\x03\x02\x00\xFF')) + + def testInit2(self): + der = DerBitString(DerInteger(1)) + self.assertEqual(der.encode(), b('\x03\x04\x00\x02\x01\x01')) + + def testEncode1(self): + # Empty sequence + der = DerBitString() + self.assertEqual(der.encode(), b('\x03\x01\x00')) + # Small payload + der = DerBitString(b('\x01\x02')) + self.assertEqual(der.encode(), b('\x03\x03\x00\x01\x02')) + # Small payload + der = DerBitString() + der.value = b('\x01\x02') + self.assertEqual(der.encode(), b('\x03\x03\x00\x01\x02')) + + #### + + def testDecode1(self): + # Empty sequence + der = DerBitString() + der.decode(b('\x03\x00')) + self.assertEqual(der.value, b('')) + # Small payload + der.decode(b('\x03\x03\x00\x01\x02')) + self.assertEqual(der.value, b('\x01\x02')) + + def testDecode2(self): + # Verify that decode returns the object + der = DerBitString() + self.assertEqual(der, der.decode(b('\x03\x00'))) + + +class DerSetOfTests(unittest.TestCase): + + def testInit1(self): + der = DerSetOf([DerInteger(1), DerInteger(2)]) + self.assertEqual(der.encode(), b('1\x06\x02\x01\x01\x02\x01\x02')) + + def testEncode1(self): + # Empty set + der = DerSetOf() + self.assertEqual(der.encode(), b('1\x00')) + # One single-byte integer (zero) + der.add(0) + self.assertEqual(der.encode(), b('1\x03\x02\x01\x00')) + # Invariant + self.assertEqual(der.encode(), b('1\x03\x02\x01\x00')) + + def testEncode2(self): + # Two integers + der = DerSetOf() + der.add(0x180) + der.add(0xFF) + self.assertEqual(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80')) + # Initialize with integers + der = DerSetOf([0x180, 0xFF]) + self.assertEqual(der.encode(), b('1\x08\x02\x02\x00\xff\x02\x02\x01\x80')) + + def testEncode3(self): + # One integer and another type (no matter what it is) + der = DerSetOf() + der.add(0x180) + self.assertRaises(ValueError, der.add, b('\x00\x02\x00\x00')) + + def testEncode4(self): + # Only non integers + der = DerSetOf() + der.add(b('\x01\x00')) + der.add(b('\x01\x01\x01')) + self.assertEqual(der.encode(), b('1\x05\x01\x00\x01\x01\x01')) + + #### + + def testDecode1(self): + # Empty sequence + der = DerSetOf() + der.decode(b('1\x00')) + self.assertEqual(len(der),0) + # One single-byte integer (zero) + der.decode(b('1\x03\x02\x01\x00')) + self.assertEqual(len(der),1) + self.assertEqual(list(der),[0]) + + def testDecode2(self): + # Two integers + der = DerSetOf() + der.decode(b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff')) + self.assertEqual(len(der),2) + l = list(der) + self.assertTrue(0x180 in l) + self.assertTrue(0xFF in l) + + def testDecode3(self): + # One integer and 2 other types + der = DerSetOf() + #import pdb; pdb.set_trace() + self.assertRaises(ValueError, der.decode, + b('0\x0A\x02\x02\x01\x80\x24\x02\xb6\x63\x12\x00')) + + def testDecode4(self): + # Verify that decode returns the object + der = DerSetOf() + self.assertEqual(der, + der.decode(b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff'))) + + ### + + def testErrDecode1(self): + # No leftovers allowed + der = DerSetOf() + self.assertRaises(ValueError, der.decode, + b('1\x08\x02\x02\x01\x80\x02\x02\x00\xff\xAA')) + + +class DerBooleanTests(unittest.TestCase): + + def testEncode1(self): + der = DerBoolean(False) + self.assertEqual(der.encode(), b'\x01\x01\x00') + + def testEncode2(self): + der = DerBoolean(True) + self.assertEqual(der.encode(), b'\x01\x01\xFF') + + def testEncode3(self): + der = DerBoolean(False, implicit=0x12) + self.assertEqual(der.encode(), b'\x92\x01\x00') + + def testEncode4(self): + der = DerBoolean(False, explicit=0x05) + self.assertEqual(der.encode(), b'\xA5\x03\x01\x01\x00') + #### + + def testDecode1(self): + der = DerBoolean() + der.decode(b'\x01\x01\x00') + self.assertEqual(der.value, False) + + def testDecode2(self): + der = DerBoolean() + der.decode(b'\x01\x01\xFF') + self.assertEqual(der.value, True) + + def testDecode3(self): + der = DerBoolean(implicit=0x12) + der.decode(b'\x92\x01\x00') + self.assertEqual(der.value, False) + + def testDecode4(self): + der = DerBoolean(explicit=0x05) + der.decode(b'\xA5\x03\x01\x01\x00') + self.assertEqual(der.value, False) + + def testErrorDecode1(self): + der = DerBoolean() + # Wrong tag + self.assertRaises(ValueError, der.decode, b'\x02\x01\x00') + + def testErrorDecode2(self): + der = DerBoolean() + # Payload too long + self.assertRaises(ValueError, der.decode, b'\x01\x01\x00\xFF') + + +def get_tests(config={}): + from Cryptodome.SelfTest.st_common import list_test_cases + listTests = [] + listTests += list_test_cases(DerObjectTests) + listTests += list_test_cases(DerIntegerTests) + listTests += list_test_cases(DerSequenceTests) + listTests += list_test_cases(DerOctetStringTests) + listTests += list_test_cases(DerNullTests) + listTests += list_test_cases(DerObjectIdTests) + listTests += list_test_cases(DerBitStringTests) + listTests += list_test_cases(DerSetOfTests) + listTests += list_test_cases(DerBooleanTests) + return listTests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_number.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_number.py new file mode 100644 index 0000000..8221443 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_number.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/Util/test_number.py: Self-test for parts of the Cryptodome.Util.number module +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self-tests for (some of) Cryptodome.Util.number""" + +import math +import unittest + +from Cryptodome.Util.py3compat import * +from Cryptodome.SelfTest.st_common import list_test_cases + +from Cryptodome.Util import number +from Cryptodome.Util.number import long_to_bytes + + +class MyError(Exception): + """Dummy exception used for tests""" + +# NB: In some places, we compare tuples instead of just output values so that +# if any inputs cause a test failure, we'll be able to tell which ones. + +class MiscTests(unittest.TestCase): + + def test_ceil_div(self): + """Util.number.ceil_div""" + self.assertRaises(TypeError, number.ceil_div, "1", 1) + self.assertRaises(ZeroDivisionError, number.ceil_div, 1, 0) + self.assertRaises(ZeroDivisionError, number.ceil_div, -1, 0) + + # b = 1 + self.assertEqual(0, number.ceil_div(0, 1)) + self.assertEqual(1, number.ceil_div(1, 1)) + self.assertEqual(2, number.ceil_div(2, 1)) + self.assertEqual(3, number.ceil_div(3, 1)) + + # b = 2 + self.assertEqual(0, number.ceil_div(0, 2)) + self.assertEqual(1, number.ceil_div(1, 2)) + self.assertEqual(1, number.ceil_div(2, 2)) + self.assertEqual(2, number.ceil_div(3, 2)) + self.assertEqual(2, number.ceil_div(4, 2)) + self.assertEqual(3, number.ceil_div(5, 2)) + + # b = 3 + self.assertEqual(0, number.ceil_div(0, 3)) + self.assertEqual(1, number.ceil_div(1, 3)) + self.assertEqual(1, number.ceil_div(2, 3)) + self.assertEqual(1, number.ceil_div(3, 3)) + self.assertEqual(2, number.ceil_div(4, 3)) + self.assertEqual(2, number.ceil_div(5, 3)) + self.assertEqual(2, number.ceil_div(6, 3)) + self.assertEqual(3, number.ceil_div(7, 3)) + + # b = 4 + self.assertEqual(0, number.ceil_div(0, 4)) + self.assertEqual(1, number.ceil_div(1, 4)) + self.assertEqual(1, number.ceil_div(2, 4)) + self.assertEqual(1, number.ceil_div(3, 4)) + self.assertEqual(1, number.ceil_div(4, 4)) + self.assertEqual(2, number.ceil_div(5, 4)) + self.assertEqual(2, number.ceil_div(6, 4)) + self.assertEqual(2, number.ceil_div(7, 4)) + self.assertEqual(2, number.ceil_div(8, 4)) + self.assertEqual(3, number.ceil_div(9, 4)) + + def test_getPrime(self): + """Util.number.getPrime""" + self.assertRaises(ValueError, number.getPrime, -100) + self.assertRaises(ValueError, number.getPrime, 0) + self.assertRaises(ValueError, number.getPrime, 1) + + bits = 4 + for i in range(100): + x = number.getPrime(bits) + self.assertEqual(x >= (1 << bits - 1), 1) + self.assertEqual(x < (1 << bits), 1) + + bits = 512 + x = number.getPrime(bits) + self.assertNotEqual(x % 2, 0) + self.assertEqual(x >= (1 << bits - 1), 1) + self.assertEqual(x < (1 << bits), 1) + + def test_getStrongPrime(self): + """Util.number.getStrongPrime""" + self.assertRaises(ValueError, number.getStrongPrime, 256) + self.assertRaises(ValueError, number.getStrongPrime, 513) + bits = 512 + x = number.getStrongPrime(bits) + self.assertNotEqual(x % 2, 0) + self.assertEqual(x > (1 << bits-1)-1, 1) + self.assertEqual(x < (1 << bits), 1) + e = 2**16+1 + x = number.getStrongPrime(bits, e) + self.assertEqual(number.GCD(x-1, e), 1) + self.assertNotEqual(x % 2, 0) + self.assertEqual(x > (1 << bits-1)-1, 1) + self.assertEqual(x < (1 << bits), 1) + e = 2**16+2 + x = number.getStrongPrime(bits, e) + self.assertEqual(number.GCD((x-1)>>1, e), 1) + self.assertNotEqual(x % 2, 0) + self.assertEqual(x > (1 << bits-1)-1, 1) + self.assertEqual(x < (1 << bits), 1) + + def test_isPrime(self): + """Util.number.isPrime""" + self.assertEqual(number.isPrime(-3), False) # Regression test: negative numbers should not be prime + self.assertEqual(number.isPrime(-2), False) # Regression test: negative numbers should not be prime + self.assertEqual(number.isPrime(1), False) # Regression test: isPrime(1) caused some versions of PyCryptodome to crash. + self.assertEqual(number.isPrime(2), True) + self.assertEqual(number.isPrime(3), True) + self.assertEqual(number.isPrime(4), False) + self.assertEqual(number.isPrime(2**1279-1), True) + self.assertEqual(number.isPrime(-(2**1279-1)), False) # Regression test: negative numbers should not be prime + # test some known gmp pseudo-primes taken from + # http://www.trnicely.net/misc/mpzspsp.html + for composite in (43 * 127 * 211, 61 * 151 * 211, 15259 * 30517, + 346141 * 692281, 1007119 * 2014237, 3589477 * 7178953, + 4859419 * 9718837, 2730439 * 5460877, + 245127919 * 490255837, 963939391 * 1927878781, + 4186358431 * 8372716861, 1576820467 * 3153640933): + self.assertEqual(number.isPrime(int(composite)), False) + + def test_size(self): + self.assertEqual(number.size(2),2) + self.assertEqual(number.size(3),2) + self.assertEqual(number.size(0xa2),8) + self.assertEqual(number.size(0xa2ba40),8*3) + self.assertEqual(number.size(0xa2ba40ee07e3b2bd2f02ce227f36a195024486e49c19cb41bbbdfbba98b22b0e577c2eeaffa20d883a76e65e394c69d4b3c05a1e8fadda27edb2a42bc000fe888b9b32c22d15add0cd76b3e7936e19955b220dd17d4ea904b1ec102b2e4de7751222aa99151024c7cb41cc5ea21d00eeb41f7c800834d2c6e06bce3bce7ea9a5), 1024) + self.assertRaises(ValueError, number.size, -1) + + +class LongTests(unittest.TestCase): + + def test1(self): + self.assertEqual(long_to_bytes(0), b'\x00') + self.assertEqual(long_to_bytes(1), b'\x01') + self.assertEqual(long_to_bytes(0x100), b'\x01\x00') + self.assertEqual(long_to_bytes(0xFF00000000), b'\xFF\x00\x00\x00\x00') + self.assertEqual(long_to_bytes(0xFF00000000), b'\xFF\x00\x00\x00\x00') + self.assertEqual(long_to_bytes(0x1122334455667788), b'\x11\x22\x33\x44\x55\x66\x77\x88') + self.assertEqual(long_to_bytes(0x112233445566778899), b'\x11\x22\x33\x44\x55\x66\x77\x88\x99') + + def test2(self): + self.assertEqual(long_to_bytes(0, 1), b'\x00') + self.assertEqual(long_to_bytes(0, 2), b'\x00\x00') + self.assertEqual(long_to_bytes(1, 3), b'\x00\x00\x01') + self.assertEqual(long_to_bytes(65535, 2), b'\xFF\xFF') + self.assertEqual(long_to_bytes(65536, 2), b'\x00\x01\x00\x00') + self.assertEqual(long_to_bytes(0x100, 1), b'\x01\x00') + self.assertEqual(long_to_bytes(0xFF00000001, 6), b'\x00\xFF\x00\x00\x00\x01') + self.assertEqual(long_to_bytes(0xFF00000001, 8), b'\x00\x00\x00\xFF\x00\x00\x00\x01') + self.assertEqual(long_to_bytes(0xFF00000001, 10), b'\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x01') + self.assertEqual(long_to_bytes(0xFF00000001, 11), b'\x00\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x01') + + def test_err1(self): + self.assertRaises(ValueError, long_to_bytes, -1) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(MiscTests) + tests += list_test_cases(LongTests) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py new file mode 100644 index 0000000..43b137d --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py @@ -0,0 +1,38 @@ +import unittest + +import binascii +from Cryptodome.Util.RFC1751 import key_to_english, english_to_key + + +class RFC1751_Tests(unittest.TestCase): + + def test1(self): + data = [ + ('EB33F77EE73D4053', 'TIDE ITCH SLOW REIN RULE MOT'), + ('CCAC2AED591056BE4F90FD441C534766', 'RASH BUSH MILK LOOK BAD BRIM AVID GAFF BAIT ROT POD LOVE'), + ('EFF81F9BFBC65350920CDD7416DE8009', 'TROD MUTE TAIL WARM CHAR KONG HAAG CITY BORE O TEAL AWL') + ] + + for key_hex, words in data: + key_bin = binascii.a2b_hex(key_hex) + + w2 = key_to_english(key_bin) + self.assertEqual(w2, words) + + k2 = english_to_key(words) + self.assertEqual(k2, key_bin) + + def test_error_key_to_english(self): + + self.assertRaises(ValueError, key_to_english, b'0' * 7) + + +def get_tests(config={}): + from Cryptodome.SelfTest.st_common import list_test_cases + tests = list_test_cases(RFC1751_Tests) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_strxor.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_strxor.py new file mode 100644 index 0000000..6a96129 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/Util/test_strxor.py @@ -0,0 +1,280 @@ +# +# SelfTest/Util/test_strxor.py: Self-test for XORing +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import unittest +from binascii import unhexlify, hexlify + +from Cryptodome.SelfTest.st_common import list_test_cases +from Cryptodome.Util.strxor import strxor, strxor_c + + +class StrxorTests(unittest.TestCase): + + def test1(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"383d4ba020573314395b") + result = unhexlify(b"c70ed123c59a7fcb6f12") + self.assertEqual(strxor(term1, term2), result) + self.assertEqual(strxor(term2, term1), result) + + def test2(self): + es = b"" + self.assertEqual(strxor(es, es), es) + + def test3(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + all_zeros = b"\x00" * len(term1) + self.assertEqual(strxor(term1, term1), all_zeros) + + def test_wrong_length(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"ff339a83e5cd4cdf564990") + self.assertRaises(ValueError, strxor, term1, term2) + + def test_bytearray(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term1_ba = bytearray(term1) + term2 = unhexlify(b"383d4ba020573314395b") + result = unhexlify(b"c70ed123c59a7fcb6f12") + + self.assertEqual(strxor(term1_ba, term2), result) + + def test_memoryview(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term1_mv = memoryview(term1) + term2 = unhexlify(b"383d4ba020573314395b") + result = unhexlify(b"c70ed123c59a7fcb6f12") + + self.assertEqual(strxor(term1_mv, term2), result) + + def test_output_bytearray(self): + """Verify result can be stored in pre-allocated memory""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"383d4ba020573314395b") + original_term1 = term1[:] + original_term2 = term2[:] + expected_xor = unhexlify(b"c70ed123c59a7fcb6f12") + output = bytearray(len(term1)) + + result = strxor(term1, term2, output=output) + + self.assertEqual(result, None) + self.assertEqual(output, expected_xor) + self.assertEqual(term1, original_term1) + self.assertEqual(term2, original_term2) + + def test_output_memoryview(self): + """Verify result can be stored in pre-allocated memory""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"383d4ba020573314395b") + original_term1 = term1[:] + original_term2 = term2[:] + expected_xor = unhexlify(b"c70ed123c59a7fcb6f12") + output = memoryview(bytearray(len(term1))) + + result = strxor(term1, term2, output=output) + + self.assertEqual(result, None) + self.assertEqual(output, expected_xor) + self.assertEqual(term1, original_term1) + self.assertEqual(term2, original_term2) + + def test_output_overlapping_bytearray(self): + """Verify result can be stored in overlapping memory""" + + term1 = bytearray(unhexlify(b"ff339a83e5cd4cdf5649")) + term2 = unhexlify(b"383d4ba020573314395b") + original_term2 = term2[:] + expected_xor = unhexlify(b"c70ed123c59a7fcb6f12") + + result = strxor(term1, term2, output=term1) + + self.assertEqual(result, None) + self.assertEqual(term1, expected_xor) + self.assertEqual(term2, original_term2) + + def test_output_overlapping_memoryview(self): + """Verify result can be stored in overlapping memory""" + + term1 = memoryview(bytearray(unhexlify(b"ff339a83e5cd4cdf5649"))) + term2 = unhexlify(b"383d4ba020573314395b") + original_term2 = term2[:] + expected_xor = unhexlify(b"c70ed123c59a7fcb6f12") + + result = strxor(term1, term2, output=term1) + + self.assertEqual(result, None) + self.assertEqual(term1, expected_xor) + self.assertEqual(term2, original_term2) + + def test_output_ro_bytes(self): + """Verify result cannot be stored in read-only memory""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"383d4ba020573314395b") + + self.assertRaises(TypeError, strxor, term1, term2, output=term1) + + def test_output_ro_memoryview(self): + """Verify result cannot be stored in read-only memory""" + + term1 = memoryview(unhexlify(b"ff339a83e5cd4cdf5649")) + term2 = unhexlify(b"383d4ba020573314395b") + + self.assertRaises(TypeError, strxor, term1, term2, output=term1) + + def test_output_incorrect_length(self): + """Verify result cannot be stored in memory of incorrect length""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term2 = unhexlify(b"383d4ba020573314395b") + output = bytearray(len(term1) - 1) + + self.assertRaises(ValueError, strxor, term1, term2, output=output) + + +class Strxor_cTests(unittest.TestCase): + + def test1(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + result = unhexlify(b"be72dbc2a48c0d9e1708") + self.assertEqual(strxor_c(term1, 65), result) + + def test2(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + self.assertEqual(strxor_c(term1, 0), term1) + + def test3(self): + self.assertEqual(strxor_c(b"", 90), b"") + + def test_wrong_range(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + self.assertRaises(ValueError, strxor_c, term1, -1) + self.assertRaises(ValueError, strxor_c, term1, 256) + + def test_bytearray(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term1_ba = bytearray(term1) + result = unhexlify(b"be72dbc2a48c0d9e1708") + + self.assertEqual(strxor_c(term1_ba, 65), result) + + def test_memoryview(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + term1_mv = memoryview(term1) + result = unhexlify(b"be72dbc2a48c0d9e1708") + + self.assertEqual(strxor_c(term1_mv, 65), result) + + def test_output_bytearray(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + original_term1 = term1[:] + expected_result = unhexlify(b"be72dbc2a48c0d9e1708") + output = bytearray(len(term1)) + + result = strxor_c(term1, 65, output=output) + + self.assertEqual(result, None) + self.assertEqual(output, expected_result) + self.assertEqual(term1, original_term1) + + def test_output_memoryview(self): + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + original_term1 = term1[:] + expected_result = unhexlify(b"be72dbc2a48c0d9e1708") + output = memoryview(bytearray(len(term1))) + + result = strxor_c(term1, 65, output=output) + + self.assertEqual(result, None) + self.assertEqual(output, expected_result) + self.assertEqual(term1, original_term1) + + def test_output_overlapping_bytearray(self): + """Verify result can be stored in overlapping memory""" + + term1 = bytearray(unhexlify(b"ff339a83e5cd4cdf5649")) + expected_xor = unhexlify(b"be72dbc2a48c0d9e1708") + + result = strxor_c(term1, 65, output=term1) + + self.assertEqual(result, None) + self.assertEqual(term1, expected_xor) + + def test_output_overlapping_memoryview(self): + """Verify result can be stored in overlapping memory""" + + term1 = memoryview(bytearray(unhexlify(b"ff339a83e5cd4cdf5649"))) + expected_xor = unhexlify(b"be72dbc2a48c0d9e1708") + + result = strxor_c(term1, 65, output=term1) + + self.assertEqual(result, None) + self.assertEqual(term1, expected_xor) + + def test_output_ro_bytes(self): + """Verify result cannot be stored in read-only memory""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + + self.assertRaises(TypeError, strxor_c, term1, 65, output=term1) + + def test_output_ro_memoryview(self): + """Verify result cannot be stored in read-only memory""" + + term1 = memoryview(unhexlify(b"ff339a83e5cd4cdf5649")) + term2 = unhexlify(b"383d4ba020573314395b") + + self.assertRaises(TypeError, strxor_c, term1, 65, output=term1) + + def test_output_incorrect_length(self): + """Verify result cannot be stored in memory of incorrect length""" + + term1 = unhexlify(b"ff339a83e5cd4cdf5649") + output = bytearray(len(term1) - 1) + + self.assertRaises(ValueError, strxor_c, term1, 65, output=output) + + +def get_tests(config={}): + tests = [] + tests += list_test_cases(StrxorTests) + tests += list_test_cases(Strxor_cTests) + return tests + + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/__init__.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/__init__.py new file mode 100644 index 0000000..dcc6ce6 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/__init__.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/__init__.py: Self-test for PyCrypto +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Self tests + +These tests should perform quickly and can ideally be used every time an +application runs. +""" + +__revision__ = "$Id$" + +import sys +import unittest +from Cryptodome.Util.py3compat import StringIO + +class SelfTestError(Exception): + def __init__(self, message, result): + Exception.__init__(self, message, result) + self.message = message + self.result = result + +def run(module=None, verbosity=0, stream=None, tests=None, config=None, **kwargs): + """Execute self-tests. + + This raises SelfTestError if any test is unsuccessful. + + You may optionally pass in a sub-module of SelfTest if you only want to + perform some of the tests. For example, the following would test only the + hash modules: + + Cryptodome.SelfTest.run(Cryptodome.SelfTest.Hash) + + """ + + if config is None: + config = {} + suite = unittest.TestSuite() + if module is None: + if tests is None: + tests = get_tests(config=config) + suite.addTests(tests) + else: + if tests is None: + suite.addTests(module.get_tests(config=config)) + else: + raise ValueError("'module' and 'tests' arguments are mutually exclusive") + if stream is None: + kwargs['stream'] = StringIO() + else: + kwargs['stream'] = stream + runner = unittest.TextTestRunner(verbosity=verbosity, **kwargs) + result = runner.run(suite) + if not result.wasSuccessful(): + if stream is None: + sys.stderr.write(kwargs['stream'].getvalue()) + raise SelfTestError("Self-test failed", result) + return result + +def get_tests(config={}): + tests = [] + from Cryptodome.SelfTest import Cipher; tests += Cipher.get_tests(config=config) + from Cryptodome.SelfTest import Hash; tests += Hash.get_tests(config=config) + from Cryptodome.SelfTest import Protocol; tests += Protocol.get_tests(config=config) + from Cryptodome.SelfTest import PublicKey; tests += PublicKey.get_tests(config=config) + from Cryptodome.SelfTest import Random; tests += Random.get_tests(config=config) + from Cryptodome.SelfTest import Util; tests += Util.get_tests(config=config) + from Cryptodome.SelfTest import Signature; tests += Signature.get_tests(config=config) + from Cryptodome.SelfTest import IO; tests += IO.get_tests(config=config) + from Cryptodome.SelfTest import Math; tests += Math.get_tests(config=config) + return tests + +if __name__ == '__main__': + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/__main__.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/__main__.py new file mode 100644 index 0000000..28f0d37 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/__main__.py @@ -0,0 +1,38 @@ +#! /usr/bin/env python +# +# __main__.py : Stand-along loader for PyCryptodome test suite +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from __future__ import print_function + +import sys + +from Cryptodome import SelfTest + +slow_tests = not "--skip-slow-tests" in sys.argv +if not slow_tests: + print("Skipping slow tests") + +wycheproof_warnings = "--wycheproof-warnings" in sys.argv +if wycheproof_warnings: + print("Printing Wycheproof warnings") + +config = {'slow_tests' : slow_tests, 'wycheproof_warnings' : wycheproof_warnings } +SelfTest.run(stream=sys.stdout, verbosity=1, config=config) diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/loader.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/loader.py new file mode 100644 index 0000000..34d5bd9 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/loader.py @@ -0,0 +1,235 @@ +# =================================================================== +# +# Copyright (c) 2016, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import os +import re +import json +import errno +import binascii +import warnings +from binascii import unhexlify +from Cryptodome.Util.py3compat import FileNotFoundError + + +try: + import pycryptodome_test_vectors # type: ignore + test_vectors_available = True +except ImportError: + test_vectors_available = False + + +def _load_tests(dir_comps, file_in, description, conversions): + """Load and parse a test vector file + + Return a list of objects, one per group of adjacent + KV lines or for a single line in the form "[.*]". + + For a group of lines, the object has one attribute per line. + """ + + line_number = 0 + results = [] + + class TestVector(object): + def __init__(self, description, count): + self.desc = description + self.count = count + self.others = [] + + test_vector = None + count = 0 + new_group = True + + while True: + line_number += 1 + line = file_in.readline() + if not line: + if test_vector is not None: + results.append(test_vector) + break + line = line.strip() + + # Skip comments and empty lines + if line.startswith('#') or not line: + new_group = True + continue + + if line.startswith("["): + if test_vector is not None: + results.append(test_vector) + test_vector = None + results.append(line) + continue + + if new_group: + count += 1 + new_group = False + if test_vector is not None: + results.append(test_vector) + test_vector = TestVector("%s (#%d)" % (description, count), count) + + res = re.match("([A-Za-z0-9]+) = ?(.*)", line) + if not res: + test_vector.others += [line] + else: + token = res.group(1).lower() + data = res.group(2).lower() + + conversion = conversions.get(token, None) + if conversion is None: + if len(data) % 2 != 0: + data = "0" + data + setattr(test_vector, token, binascii.unhexlify(data)) + else: + setattr(test_vector, token, conversion(data)) + + # This line is ignored + return results + + +def load_test_vectors(dir_comps, file_name, description, conversions): + """Load and parse a test vector file, formatted using the NIST style. + + Args: + dir_comps (list of strings): + The path components under the ``pycryptodome_test_vectors`` package. + For instance ``("Cipher", "AES")``. + file_name (string): + The name of the file with the test vectors. + description (string): + A description applicable to the test vectors in the file. + conversions (dictionary): + The dictionary contains functions. + Values in the file that have an entry in this dictionary + will be converted usign the matching function. + Otherwise, values will be considered as hexadecimal and + converted to binary. + + Returns: + A list of test vector objects. + + The file is formatted in the following way: + + - Lines starting with "#" are comments and will be ignored. + - Each test vector is a sequence of 1 or more adjacent lines, where + each lines is an assignement. + - Test vectors are separated by an empty line, a comment, or + a line starting with "[". + + A test vector object has the following attributes: + + - desc (string): description + - counter (int): the order of the test vector in the file (from 1) + - others (list): zero or more lines of the test vector that were not assignments + - left-hand side of each assignment (lowercase): the value of the + assignement, either converted or bytes. + """ + + results = None + + try: + if not test_vectors_available: + raise FileNotFoundError(errno.ENOENT, + os.strerror(errno.ENOENT), + file_name) + + description = "%s test (%s)" % (description, file_name) + + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + with open(full_file_name) as file_in: + results = _load_tests(dir_comps, file_in, description, conversions) + + except FileNotFoundError: + warnings.warn("Warning: skipping extended tests for " + description, + UserWarning, + stacklevel=2) + + return results + + +def load_test_vectors_wycheproof(dir_comps, file_name, description, + root_tag={}, group_tag={}, unit_tag={}): + + result = [] + try: + if not test_vectors_available: + raise FileNotFoundError(errno.ENOENT, + os.strerror(errno.ENOENT), + file_name) + + init_dir = os.path.dirname(pycryptodome_test_vectors.__file__) + full_file_name = os.path.join(os.path.join(init_dir, *dir_comps), file_name) + with open(full_file_name) as file_in: + tv_tree = json.load(file_in) + + except FileNotFoundError: + warnings.warn("Warning: skipping extended tests for " + description, + UserWarning, + stacklevel=2) + return result + + class TestVector(object): + pass + + common_root = {} + for k, v in root_tag.items(): + common_root[k] = v(tv_tree) + + for group in tv_tree['testGroups']: + + common_group = {} + for k, v in group_tag.items(): + common_group[k] = v(group) + + for test in group['tests']: + tv = TestVector() + + for k, v in common_root.items(): + setattr(tv, k, v) + for k, v in common_group.items(): + setattr(tv, k, v) + + tv.id = test['tcId'] + tv.comment = test['comment'] + for attr in 'key', 'iv', 'aad', 'msg', 'ct', 'tag', 'label', 'ikm', 'salt', 'info', 'okm', 'sig': + if attr in test: + setattr(tv, attr, unhexlify(test[attr])) + tv.filename = file_name + + for k, v in unit_tag.items(): + setattr(tv, k, v(test)) + + tv.valid = test['result'] != "invalid" + tv.warning = test['result'] == "acceptable" + result.append(tv) + + return result + diff --git a/lib/python3.11/site-packages/Cryptodome/SelfTest/st_common.py b/lib/python3.11/site-packages/Cryptodome/SelfTest/st_common.py new file mode 100644 index 0000000..3565251 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/SelfTest/st_common.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# +# SelfTest/st_common.py: Common functions for SelfTest modules +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Common functions for SelfTest modules""" + +import unittest +import binascii +from Cryptodome.Util.py3compat import b + + +def list_test_cases(class_): + """Return a list of TestCase instances given a TestCase class + + This is useful when you have defined test* methods on your TestCase class. + """ + return unittest.TestLoader().loadTestsFromTestCase(class_) + +def strip_whitespace(s): + """Remove whitespace from a text or byte string""" + if isinstance(s,str): + return b("".join(s.split())) + else: + return b("").join(s.split()) + +def a2b_hex(s): + """Convert hexadecimal to binary, ignoring whitespace""" + return binascii.a2b_hex(strip_whitespace(s)) + +def b2a_hex(s): + """Convert binary to hexadecimal""" + # For completeness + return binascii.b2a_hex(s) + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/DSS.py b/lib/python3.11/site-packages/Cryptodome/Signature/DSS.py new file mode 100644 index 0000000..67f23ac --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/DSS.py @@ -0,0 +1,403 @@ +# +# Signature/DSS.py : DSS.py +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.asn1 import DerSequence +from Cryptodome.Util.number import long_to_bytes +from Cryptodome.Math.Numbers import Integer + +from Cryptodome.Hash import HMAC +from Cryptodome.PublicKey.ECC import EccKey +from Cryptodome.PublicKey.DSA import DsaKey + +__all__ = ['DssSigScheme', 'new'] + + +class DssSigScheme(object): + """A (EC)DSA signature object. + Do not instantiate directly. + Use :func:`Cryptodome.Signature.DSS.new`. + """ + + def __init__(self, key, encoding, order): + """Create a new Digital Signature Standard (DSS) object. + + Do not instantiate this object directly, + use `Cryptodome.Signature.DSS.new` instead. + """ + + self._key = key + self._encoding = encoding + self._order = order + + self._order_bits = self._order.size_in_bits() + self._order_bytes = (self._order_bits - 1) // 8 + 1 + + def can_sign(self): + """Return ``True`` if this signature object can be used + for signing messages.""" + + return self._key.has_private() + + def _compute_nonce(self, msg_hash): + raise NotImplementedError("To be provided by subclasses") + + def _valid_hash(self, msg_hash): + raise NotImplementedError("To be provided by subclasses") + + def sign(self, msg_hash): + """Compute the DSA/ECDSA signature of a message. + + Args: + msg_hash (hash object): + The hash that was carried out over the message. + The object belongs to the :mod:`Cryptodome.Hash` package. + Under mode ``'fips-186-3'``, the hash must be a FIPS + approved secure hash (SHA-2 or SHA-3). + + :return: The signature as ``bytes`` + :raise ValueError: if the hash algorithm is incompatible to the (EC)DSA key + :raise TypeError: if the (EC)DSA key has no private half + """ + + if not self._key.has_private(): + raise TypeError("Private key is needed to sign") + + if not self._valid_hash(msg_hash): + raise ValueError("Hash is not sufficiently strong") + + # Generate the nonce k (critical!) + nonce = self._compute_nonce(msg_hash) + + # Perform signature using the raw API + z = Integer.from_bytes(msg_hash.digest()[:self._order_bytes]) + sig_pair = self._key._sign(z, nonce) + + # Encode the signature into a single byte string + if self._encoding == 'binary': + output = b"".join([long_to_bytes(x, self._order_bytes) + for x in sig_pair]) + else: + # Dss-sig ::= SEQUENCE { + # r INTEGER, + # s INTEGER + # } + # Ecdsa-Sig-Value ::= SEQUENCE { + # r INTEGER, + # s INTEGER + # } + output = DerSequence(sig_pair).encode() + + return output + + def verify(self, msg_hash, signature): + """Check if a certain (EC)DSA signature is authentic. + + Args: + msg_hash (hash object): + The hash that was carried out over the message. + This is an object belonging to the :mod:`Cryptodome.Hash` module. + Under mode ``'fips-186-3'``, the hash must be a FIPS + approved secure hash (SHA-2 or SHA-3). + + signature (``bytes``): + The signature that needs to be validated. + + :raise ValueError: if the signature is not authentic + """ + + if not self._valid_hash(msg_hash): + raise ValueError("Hash is not sufficiently strong") + + if self._encoding == 'binary': + if len(signature) != (2 * self._order_bytes): + raise ValueError("The signature is not authentic (length)") + r_prime, s_prime = [Integer.from_bytes(x) + for x in (signature[:self._order_bytes], + signature[self._order_bytes:])] + else: + try: + der_seq = DerSequence().decode(signature, strict=True) + except (ValueError, IndexError): + raise ValueError("The signature is not authentic (DER)") + if len(der_seq) != 2 or not der_seq.hasOnlyInts(): + raise ValueError("The signature is not authentic (DER content)") + r_prime, s_prime = Integer(der_seq[0]), Integer(der_seq[1]) + + if not (0 < r_prime < self._order) or not (0 < s_prime < self._order): + raise ValueError("The signature is not authentic (d)") + + z = Integer.from_bytes(msg_hash.digest()[:self._order_bytes]) + result = self._key._verify(z, (r_prime, s_prime)) + if not result: + raise ValueError("The signature is not authentic") + # Make PyCryptodome code to fail + return False + + +class DeterministicDsaSigScheme(DssSigScheme): + # Also applicable to ECDSA + + def __init__(self, key, encoding, order, private_key): + super(DeterministicDsaSigScheme, self).__init__(key, encoding, order) + self._private_key = private_key + + def _bits2int(self, bstr): + """See 2.3.2 in RFC6979""" + + result = Integer.from_bytes(bstr) + q_len = self._order.size_in_bits() + b_len = len(bstr) * 8 + if b_len > q_len: + # Only keep leftmost q_len bits + result >>= (b_len - q_len) + return result + + def _int2octets(self, int_mod_q): + """See 2.3.3 in RFC6979""" + + assert 0 < int_mod_q < self._order + return long_to_bytes(int_mod_q, self._order_bytes) + + def _bits2octets(self, bstr): + """See 2.3.4 in RFC6979""" + + z1 = self._bits2int(bstr) + if z1 < self._order: + z2 = z1 + else: + z2 = z1 - self._order + return self._int2octets(z2) + + def _compute_nonce(self, mhash): + """Generate k in a deterministic way""" + + # See section 3.2 in RFC6979.txt + # Step a + h1 = mhash.digest() + # Step b + mask_v = b'\x01' * mhash.digest_size + # Step c + nonce_k = b'\x00' * mhash.digest_size + + for int_oct in (b'\x00', b'\x01'): + # Step d/f + nonce_k = HMAC.new(nonce_k, + mask_v + int_oct + + self._int2octets(self._private_key) + + self._bits2octets(h1), mhash).digest() + # Step e/g + mask_v = HMAC.new(nonce_k, mask_v, mhash).digest() + + nonce = -1 + while not (0 < nonce < self._order): + # Step h.C (second part) + if nonce != -1: + nonce_k = HMAC.new(nonce_k, mask_v + b'\x00', + mhash).digest() + mask_v = HMAC.new(nonce_k, mask_v, mhash).digest() + + # Step h.A + mask_t = b"" + + # Step h.B + while len(mask_t) < self._order_bytes: + mask_v = HMAC.new(nonce_k, mask_v, mhash).digest() + mask_t += mask_v + + # Step h.C (first part) + nonce = self._bits2int(mask_t) + return nonce + + def _valid_hash(self, msg_hash): + return True + + +class FipsDsaSigScheme(DssSigScheme): + + #: List of L (bit length of p) and N (bit length of q) combinations + #: that are allowed by FIPS 186-3. The security level is provided in + #: Table 2 of FIPS 800-57 (rev3). + _fips_186_3_L_N = ( + (1024, 160), # 80 bits (SHA-1 or stronger) + (2048, 224), # 112 bits (SHA-224 or stronger) + (2048, 256), # 128 bits (SHA-256 or stronger) + (3072, 256) # 256 bits (SHA-512) + ) + + def __init__(self, key, encoding, order, randfunc): + super(FipsDsaSigScheme, self).__init__(key, encoding, order) + self._randfunc = randfunc + + L = Integer(key.p).size_in_bits() + if (L, self._order_bits) not in self._fips_186_3_L_N: + error = ("L/N (%d, %d) is not compliant to FIPS 186-3" + % (L, self._order_bits)) + raise ValueError(error) + + def _compute_nonce(self, msg_hash): + # hash is not used + return Integer.random_range(min_inclusive=1, + max_exclusive=self._order, + randfunc=self._randfunc) + + def _valid_hash(self, msg_hash): + """Verify that SHA-1, SHA-2 or SHA-3 are used""" + return (msg_hash.oid == "1.3.14.3.2.26" or + msg_hash.oid.startswith("2.16.840.1.101.3.4.2.")) + + +class FipsEcDsaSigScheme(DssSigScheme): + + def __init__(self, key, encoding, order, randfunc): + super(FipsEcDsaSigScheme, self).__init__(key, encoding, order) + self._randfunc = randfunc + + def _compute_nonce(self, msg_hash): + return Integer.random_range(min_inclusive=1, + max_exclusive=self._key._curve.order, + randfunc=self._randfunc) + + def _valid_hash(self, msg_hash): + """Verify that the strength of the hash matches or exceeds + the strength of the EC. We fail if the hash is too weak.""" + + modulus_bits = self._key.pointQ.size_in_bits() + + # SHS: SHA-2, SHA-3, truncated SHA-512 + sha224 = ("2.16.840.1.101.3.4.2.4", "2.16.840.1.101.3.4.2.7", "2.16.840.1.101.3.4.2.5") + sha256 = ("2.16.840.1.101.3.4.2.1", "2.16.840.1.101.3.4.2.8", "2.16.840.1.101.3.4.2.6") + sha384 = ("2.16.840.1.101.3.4.2.2", "2.16.840.1.101.3.4.2.9") + sha512 = ("2.16.840.1.101.3.4.2.3", "2.16.840.1.101.3.4.2.10") + shs = sha224 + sha256 + sha384 + sha512 + + try: + result = msg_hash.oid in shs + except AttributeError: + result = False + return result + + +def new(key, mode, encoding='binary', randfunc=None): + """Create a signature object :class:`DssSigScheme` that + can perform (EC)DSA signature or verification. + + .. note:: + Refer to `NIST SP 800 Part 1 Rev 4`_ (or newer release) for an + overview of the recommended key lengths. + + Args: + key (:class:`Cryptodome.PublicKey.DSA` or :class:`Cryptodome.PublicKey.ECC`): + The key to use for computing the signature (*private* keys only) + or for verifying one. + For DSA keys, let ``L`` and ``N`` be the bit lengths of the modulus ``p`` + and of ``q``: the pair ``(L,N)`` must appear in the following list, + in compliance to section 4.2 of `FIPS 186-4`_: + + - (1024, 160) *legacy only; do not create new signatures with this* + - (2048, 224) *deprecated; do not create new signatures with this* + - (2048, 256) + - (3072, 256) + + For ECC, only keys over P-224, P-256, P-384, and P-521 are accepted. + + mode (string): + The parameter can take these values: + + - ``'fips-186-3'``. The signature generation is randomized and carried out + according to `FIPS 186-3`_: the nonce ``k`` is taken from the RNG. + - ``'deterministic-rfc6979'``. The signature generation is not + randomized. See RFC6979_. + + encoding (string): + How the signature is encoded. This value determines the output of + :meth:`sign` and the input to :meth:`verify`. + + The following values are accepted: + + - ``'binary'`` (default), the signature is the raw concatenation + of ``r`` and ``s``. It is defined in the IEEE P.1363 standard. + For DSA, the size in bytes of the signature is ``N/4`` bytes + (e.g. 64 for ``N=256``). + For ECDSA, the signature is always twice the length of a point + coordinate (e.g. 64 bytes for P-256). + + - ``'der'``, the signature is a ASN.1 DER SEQUENCE + with two INTEGERs (``r`` and ``s``). It is defined in RFC3279_. + The size of the signature is variable. + + randfunc (callable): + A function that returns random ``bytes``, of a given length. + If omitted, the internal RNG is used. + Only applicable for the *'fips-186-3'* mode. + + .. _FIPS 186-3: http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf + .. _FIPS 186-4: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + .. _NIST SP 800 Part 1 Rev 4: http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf + .. _RFC6979: http://tools.ietf.org/html/rfc6979 + .. _RFC3279: https://tools.ietf.org/html/rfc3279#section-2.2.2 + """ + + # The goal of the 'mode' parameter is to avoid to + # have the current version of the standard as default. + # + # Over time, such version will be superseded by (for instance) + # FIPS 186-4 and it will be odd to have -3 as default. + + if encoding not in ('binary', 'der'): + raise ValueError("Unknown encoding '%s'" % encoding) + + if isinstance(key, EccKey): + order = key._curve.order + private_key_attr = 'd' + if key._curve.name == "ed25519": + raise ValueError("ECC key is not on a NIST P curve") + elif isinstance(key, DsaKey): + order = Integer(key.q) + private_key_attr = 'x' + else: + raise ValueError("Unsupported key type " + str(type(key))) + + if key.has_private(): + private_key = getattr(key, private_key_attr) + else: + private_key = None + + if mode == 'deterministic-rfc6979': + return DeterministicDsaSigScheme(key, encoding, order, private_key) + elif mode == 'fips-186-3': + if isinstance(key, EccKey): + return FipsEcDsaSigScheme(key, encoding, order, randfunc) + else: + return FipsDsaSigScheme(key, encoding, order, randfunc) + else: + raise ValueError("Unknown DSS mode '%s'" % mode) diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/DSS.pyi b/lib/python3.11/site-packages/Cryptodome/Signature/DSS.pyi new file mode 100644 index 0000000..52ecc8f --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/DSS.pyi @@ -0,0 +1,27 @@ +from typing import Union, Optional, Callable +from typing_extensions import Protocol + +from Cryptodome.PublicKey.DSA import DsaKey +from Cryptodome.PublicKey.ECC import EccKey + +class Hash(Protocol): + def digest(self) -> bytes: ... + +__all__ = ['new'] + +class DssSigScheme: + def __init__(self, key: Union[DsaKey, EccKey], encoding: str, order: int) -> None: ... + def can_sign(self) -> bool: ... + def sign(self, msg_hash: Hash) -> bytes: ... + def verify(self, msg_hash: Hash, signature: bytes) -> bool: ... + +class DeterministicDsaSigScheme(DssSigScheme): + def __init__(self, key, encoding, order, private_key) -> None: ... + +class FipsDsaSigScheme(DssSigScheme): + def __init__(self, key: DsaKey, encoding: str, order: int, randfunc: Callable) -> None: ... + +class FipsEcDsaSigScheme(DssSigScheme): + def __init__(self, key: EccKey, encoding: str, order: int, randfunc: Callable) -> None: ... + +def new(key: Union[DsaKey, EccKey], mode: str, encoding: Optional[str]='binary', randfunc: Optional[Callable]=None) -> Union[DeterministicDsaSigScheme, FipsDsaSigScheme, FipsEcDsaSigScheme]: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.py b/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.py new file mode 100644 index 0000000..1e7e5b5 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.py @@ -0,0 +1,55 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +Legacy module for PKCS#1 PSS signatures. + +:undocumented: __package__ +""" + +import types + +from Cryptodome.Signature import pss + + +def _pycrypto_verify(self, hash_object, signature): + try: + self._verify(hash_object, signature) + except (ValueError, TypeError): + return False + return True + + +def new(rsa_key, mgfunc=None, saltLen=None, randfunc=None): + pkcs1 = pss.new(rsa_key, mask_func=mgfunc, + salt_bytes=saltLen, rand_func=randfunc) + pkcs1._verify = pkcs1.verify + pkcs1.verify = types.MethodType(_pycrypto_verify, pkcs1) + return pkcs1 diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi b/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi new file mode 100644 index 0000000..e7424f5 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi @@ -0,0 +1,28 @@ +from typing import Union, Callable, Optional +from typing_extensions import Protocol + +from Cryptodome.PublicKey.RSA import RsaKey + + +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/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.py b/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.py new file mode 100644 index 0000000..d560663 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.py @@ -0,0 +1,53 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +Legacy module for PKCS#1 v1.5 signatures. + +:undocumented: __package__ +""" + +import types + +from Cryptodome.Signature import pkcs1_15 + +def _pycrypto_verify(self, hash_object, signature): + try: + self._verify(hash_object, signature) + except (ValueError, TypeError): + return False + return True + +def new(rsa_key): + pkcs1 = pkcs1_15.new(rsa_key) + pkcs1._verify = pkcs1.verify + pkcs1.verify = types.MethodType(_pycrypto_verify, pkcs1) + return pkcs1 + diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi b/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi new file mode 100644 index 0000000..d02555c --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi @@ -0,0 +1,16 @@ +from typing import Optional +from typing_extensions import Protocol + +from Cryptodome.PublicKey.RSA import RsaKey + +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: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/__init__.py b/lib/python3.11/site-packages/Cryptodome/Signature/__init__.py new file mode 100644 index 0000000..11ca64c --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/__init__.py @@ -0,0 +1,36 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Digital signature protocols + +A collection of standardized protocols to carry out digital signatures. +""" + +__all__ = ['PKCS1_v1_5', 'PKCS1_PSS', 'DSS', 'pkcs1_15', 'pss', 'eddsa'] diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.py b/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.py new file mode 100644 index 0000000..638b96b --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.py @@ -0,0 +1,343 @@ +# =================================================================== +# +# Copyright (c) 2022, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Math.Numbers import Integer + +from Cryptodome.Hash import SHA512, SHAKE256 +from Cryptodome.Util.py3compat import bchr, is_bytes +from Cryptodome.PublicKey.ECC import (EccKey, + construct, + _import_ed25519_public_key, + _import_ed448_public_key) + + +def import_public_key(encoded): + """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): + The EdDSA public key to import. + It must be 32 bytes for Ed25519, and 57 bytes for Ed448. + + Returns: + :class:`Cryptodome.PublicKey.EccKey` : a new ECC key object. + + Raises: + ValueError: when the given key cannot be parsed. + """ + + if len(encoded) == 32: + x, y = _import_ed25519_public_key(encoded) + curve_name = "Ed25519" + elif len(encoded) == 57: + x, y = _import_ed448_public_key(encoded) + curve_name = "Ed448" + else: + raise ValueError("Not an EdDSA key (%d bytes)" % len(encoded)) + return construct(curve=curve_name, point_x=x, point_y=y) + + +def import_private_key(encoded): + """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): + The EdDSA private key to import. + It must be 32 bytes for Ed25519, and 57 bytes for Ed448. + + Returns: + :class:`Cryptodome.PublicKey.EccKey` : a new ECC key object. + + Raises: + ValueError: when the given key cannot be parsed. + """ + + if len(encoded) == 32: + curve_name = "ed25519" + elif len(encoded) == 57: + curve_name = "ed448" + else: + raise ValueError("Incorrect length. Only EdDSA private keys are supported.") + + # Note that the private key is truly a sequence of random bytes, + # so we cannot check its correctness in any way. + + return construct(seed=encoded, curve=curve_name) + + +class EdDSASigScheme(object): + """An EdDSA signature object. + Do not instantiate directly. + Use :func:`Cryptodome.Signature.eddsa.new`. + """ + + def __init__(self, key, context): + """Create a new EdDSA object. + + Do not instantiate this object directly, + use `Cryptodome.Signature.DSS.new` instead. + """ + + self._key = key + self._context = context + self._A = key._export_eddsa() + self._order = key._curve.order + + def can_sign(self): + """Return ``True`` if this signature object can be used + for signing messages.""" + + return self._key.has_private() + + def sign(self, msg_or_hash): + """Compute the EdDSA signature of a message. + + Args: + msg_or_hash (bytes or a hash object): + The message to sign (``bytes``, in case of *PureEdDSA*) or + the hash that was carried out over the message (hash object, for *HashEdDSA*). + + The hash object must be :class:`Cryptodome.Hash.SHA512` for Ed25519, + and :class:`Cryptodome.Hash.SHAKE256` object for Ed448. + + :return: The signature as ``bytes``. It is always 64 bytes for Ed25519, and 114 bytes for Ed448. + :raise TypeError: if the EdDSA key has no private half + """ + + if not self._key.has_private(): + raise TypeError("Private key is needed to sign") + + if self._key._curve.name == "ed25519": + ph = isinstance(msg_or_hash, SHA512.SHA512Hash) + if not (ph or is_bytes(msg_or_hash)): + raise TypeError("'msg_or_hash' must be bytes of a SHA-512 hash") + eddsa_sign_method = self._sign_ed25519 + + elif self._key._curve.name == "ed448": + ph = isinstance(msg_or_hash, SHAKE256.SHAKE256_XOF) + if not (ph or is_bytes(msg_or_hash)): + raise TypeError("'msg_or_hash' must be bytes of a SHAKE256 hash") + eddsa_sign_method = self._sign_ed448 + + else: + raise ValueError("Incorrect curve for EdDSA") + + return eddsa_sign_method(msg_or_hash, ph) + + def _sign_ed25519(self, msg_or_hash, ph): + + if self._context or ph: + flag = int(ph) + # dom2(flag, self._context) + dom2 = b'SigEd25519 no Ed25519 collisions' + bchr(flag) + \ + bchr(len(self._context)) + self._context + else: + dom2 = b'' + + PHM = msg_or_hash.digest() if ph else msg_or_hash + + # See RFC 8032, section 5.1.6 + + # Step 2 + r_hash = SHA512.new(dom2 + self._key._prefix + PHM).digest() + r = Integer.from_bytes(r_hash, 'little') % self._order + # Step 3 + R_pk = EccKey(point=r * self._key._curve.G)._export_eddsa() + # Step 4 + k_hash = SHA512.new(dom2 + R_pk + self._A + PHM).digest() + k = Integer.from_bytes(k_hash, 'little') % self._order + # Step 5 + s = (r + k * self._key.d) % self._order + + return R_pk + s.to_bytes(32, 'little') + + def _sign_ed448(self, msg_or_hash, ph): + + flag = int(ph) + # dom4(flag, self._context) + dom4 = b'SigEd448' + bchr(flag) + \ + bchr(len(self._context)) + self._context + + PHM = msg_or_hash.read(64) if ph else msg_or_hash + + # See RFC 8032, section 5.2.6 + + # Step 2 + r_hash = SHAKE256.new(dom4 + self._key._prefix + PHM).read(114) + r = Integer.from_bytes(r_hash, 'little') % self._order + # Step 3 + R_pk = EccKey(point=r * self._key._curve.G)._export_eddsa() + # Step 4 + k_hash = SHAKE256.new(dom4 + R_pk + self._A + PHM).read(114) + k = Integer.from_bytes(k_hash, 'little') % self._order + # Step 5 + s = (r + k * self._key.d) % self._order + + return R_pk + s.to_bytes(57, 'little') + + def verify(self, msg_or_hash, signature): + """Check if an EdDSA signature is authentic. + + Args: + msg_or_hash (bytes or a hash object): + The message to verify (``bytes``, in case of *PureEdDSA*) or + the hash that was carried out over the message (hash object, for *HashEdDSA*). + + The hash object must be :class:`Cryptodome.Hash.SHA512` object for Ed25519, + and :class:`Cryptodome.Hash.SHAKE256` for Ed448. + + signature (``bytes``): + The signature that needs to be validated. + It must be 64 bytes for Ed25519, and 114 bytes for Ed448. + + :raise ValueError: if the signature is not authentic + """ + + if self._key._curve.name == "ed25519": + ph = isinstance(msg_or_hash, SHA512.SHA512Hash) + if not (ph or is_bytes(msg_or_hash)): + raise TypeError("'msg_or_hash' must be bytes of a SHA-512 hash") + eddsa_verify_method = self._verify_ed25519 + + elif self._key._curve.name == "ed448": + ph = isinstance(msg_or_hash, SHAKE256.SHAKE256_XOF) + if not (ph or is_bytes(msg_or_hash)): + raise TypeError("'msg_or_hash' must be bytes of a SHAKE256 hash") + eddsa_verify_method = self._verify_ed448 + + else: + raise ValueError("Incorrect curve for EdDSA") + + return eddsa_verify_method(msg_or_hash, signature, ph) + + def _verify_ed25519(self, msg_or_hash, signature, ph): + + if len(signature) != 64: + raise ValueError("The signature is not authentic (length)") + + if self._context or ph: + flag = int(ph) + dom2 = b'SigEd25519 no Ed25519 collisions' + bchr(flag) + \ + bchr(len(self._context)) + self._context + else: + dom2 = b'' + + PHM = msg_or_hash.digest() if ph else msg_or_hash + + # Section 5.1.7 + + # Step 1 + try: + R = import_public_key(signature[:32]).pointQ + except ValueError: + raise ValueError("The signature is not authentic (R)") + s = Integer.from_bytes(signature[32:], 'little') + if s > self._order: + raise ValueError("The signature is not authentic (S)") + # Step 2 + k_hash = SHA512.new(dom2 + signature[:32] + self._A + PHM).digest() + k = Integer.from_bytes(k_hash, 'little') % self._order + # Step 3 + point1 = s * 8 * self._key._curve.G + # OPTIMIZE: with double-scalar multiplication, with no SCA + # countermeasures because it is public values + point2 = 8 * R + k * 8 * self._key.pointQ + if point1 != point2: + raise ValueError("The signature is not authentic") + + def _verify_ed448(self, msg_or_hash, signature, ph): + + if len(signature) != 114: + raise ValueError("The signature is not authentic (length)") + + flag = int(ph) + # dom4(flag, self._context) + dom4 = b'SigEd448' + bchr(flag) + \ + bchr(len(self._context)) + self._context + + PHM = msg_or_hash.read(64) if ph else msg_or_hash + + # Section 5.2.7 + + # Step 1 + try: + R = import_public_key(signature[:57]).pointQ + except ValueError: + raise ValueError("The signature is not authentic (R)") + s = Integer.from_bytes(signature[57:], 'little') + if s > self._order: + raise ValueError("The signature is not authentic (S)") + # Step 2 + k_hash = SHAKE256.new(dom4 + signature[:57] + self._A + PHM).read(114) + k = Integer.from_bytes(k_hash, 'little') % self._order + # Step 3 + point1 = s * 8 * self._key._curve.G + # OPTIMIZE: with double-scalar multiplication, with no SCA + # countermeasures because it is public values + point2 = 8 * R + k * 8 * self._key.pointQ + if point1 != point2: + raise ValueError("The signature is not authentic") + + +def new(key, mode, context=None): + """Create a signature object :class:`EdDSASigScheme` that + can perform or verify an EdDSA signature. + + Args: + 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``. + + mode (string): + This parameter must be ``'rfc8032'``. + + context (bytes): + Up to 255 bytes of `context `_, + which is a constant byte string to segregate different protocols or + different applications of the same key. + """ + + if not isinstance(key, EccKey) or not key._is_eddsa(): + raise ValueError("EdDSA can only be used with EdDSA keys") + + if mode != 'rfc8032': + raise ValueError("Mode must be 'rfc8032'") + + if context is None: + context = b'' + elif len(context) > 255: + raise ValueError("Context for EdDSA must not be longer than 255 bytes") + + return EdDSASigScheme(key, context) diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.pyi b/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.pyi new file mode 100644 index 0000000..809a7ad --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/eddsa.pyi @@ -0,0 +1,21 @@ +from typing import Union, Optional +from typing_extensions import Protocol +from Cryptodome.PublicKey.ECC import EccKey + +class Hash(Protocol): + def digest(self) -> bytes: ... + +class XOF(Protocol): + def read(self, len: int) -> bytes: ... + +def import_public_key(encoded: bytes) -> EccKey: ... +def import_private_key(encoded: bytes) -> EccKey: ... + +class EdDSASigScheme(object): + + def __init__(self, key: EccKey, context: bytes) -> None: ... + def can_sign(self) -> bool: ... + 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: str, context: Optional[bytes]=None) -> EdDSASigScheme: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.py b/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.py new file mode 100644 index 0000000..ae9257e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.py @@ -0,0 +1,222 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import Cryptodome.Util.number +from Cryptodome.Util.number import ceil_div, bytes_to_long, long_to_bytes +from Cryptodome.Util.asn1 import DerSequence, DerNull, DerOctetString, DerObjectId + +class PKCS115_SigScheme: + """A signature object for ``RSASSA-PKCS1-v1_5``. + Do not instantiate directly. + Use :func:`Cryptodome.Signature.pkcs1_15.new`. + """ + + def __init__(self, rsa_key): + """Initialize this PKCS#1 v1.5 signature scheme object. + + :Parameters: + rsa_key : an RSA key object + Creation of signatures is only possible if this is a *private* + RSA key. Verification of signatures is always possible. + """ + self._key = rsa_key + + def can_sign(self): + """Return ``True`` if this object can be used to sign messages.""" + return self._key.has_private() + + def sign(self, msg_hash): + """Create the PKCS#1 v1.5 signature of a message. + + This function is also called ``RSASSA-PKCS1-V1_5-SIGN`` and + it is specified in + `section 8.2.1 of RFC8017 `_. + + :parameter msg_hash: + This is an object from the :mod:`Cryptodome.Hash` package. + It has been used to digest the message to sign. + :type msg_hash: hash object + + :return: the signature encoded as a *byte string*. + :raise ValueError: if the RSA key is not long enough for the given hash algorithm. + :raise TypeError: if the RSA key has no private half. + """ + + # See 8.2.1 in RFC3447 + modBits = Cryptodome.Util.number.size(self._key.n) + k = ceil_div(modBits,8) # Convert from bits to bytes + + # Step 1 + 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) + return signature + + def verify(self, msg_hash, signature): + """Check if the PKCS#1 v1.5 signature over a message is valid. + + This function is also called ``RSASSA-PKCS1-V1_5-VERIFY`` and + it is specified in + `section 8.2.2 of RFC8037 `_. + + :parameter msg_hash: + The hash that was carried out over the message. This is an object + belonging to the :mod:`Cryptodome.Hash` module. + :type parameter: hash object + + :parameter signature: + The signature that needs to be validated. + :type signature: byte string + + :raise ValueError: if the signature is not valid. + """ + + # See 8.2.2 in RFC3447 + modBits = Cryptodome.Util.number.size(self._key.n) + k = ceil_div(modBits, 8) # Convert from bits to bytes + + # Step 1 + if len(signature) != k: + raise ValueError("Invalid signature") + # Step 2a (O2SIP) + signature_int = bytes_to_long(signature) + # Step 2b (RSAVP1) + em_int = self._key._encrypt(signature_int) + # Step 2c (I2OSP) + em1 = long_to_bytes(em_int, k) + # Step 3 + try: + possible_em1 = [ _EMSA_PKCS1_V1_5_ENCODE(msg_hash, k, True) ] + # MD2/4/5 hashes always require NULL params in AlgorithmIdentifier. + # For all others, it is optional. + try: + algorithm_is_md = msg_hash.oid.startswith('1.2.840.113549.2.') + except AttributeError: + algorithm_is_md = False + if not algorithm_is_md: # MD2/MD4/MD5 + possible_em1.append(_EMSA_PKCS1_V1_5_ENCODE(msg_hash, k, False)) + except ValueError: + raise ValueError("Invalid signature") + # Step 4 + # By comparing the full encodings (as opposed to checking each + # of its components one at a time) we avoid attacks to the padding + # scheme like Bleichenbacher's (see http://www.mail-archive.com/cryptography@metzdowd.com/msg06537). + # + if em1 not in possible_em1: + raise ValueError("Invalid signature") + pass + + +def _EMSA_PKCS1_V1_5_ENCODE(msg_hash, emLen, with_hash_parameters=True): + """ + Implement the ``EMSA-PKCS1-V1_5-ENCODE`` function, as defined + in PKCS#1 v2.1 (RFC3447, 9.2). + + ``_EMSA-PKCS1-V1_5-ENCODE`` actually accepts the message ``M`` as input, + and hash it internally. Here, we expect that the message has already + been hashed instead. + + :Parameters: + msg_hash : hash object + The hash object that holds the digest of the message being signed. + emLen : int + The length the final encoding must have, in bytes. + with_hash_parameters : bool + If True (default), include NULL parameters for the hash + algorithm in the ``digestAlgorithm`` SEQUENCE. + + :attention: the early standard (RFC2313) stated that ``DigestInfo`` + had to be BER-encoded. This means that old signatures + might have length tags in indefinite form, which + is not supported in DER. Such encoding cannot be + reproduced by this function. + + :Return: An ``emLen`` byte long string that encodes the hash. + """ + + # First, build the ASN.1 DER object DigestInfo: + # + # DigestInfo ::= SEQUENCE { + # digestAlgorithm AlgorithmIdentifier, + # digest OCTET STRING + # } + # + # where digestAlgorithm identifies the hash function and shall be an + # algorithm ID with an OID in the set PKCS1-v1-5DigestAlgorithms. + # + # PKCS1-v1-5DigestAlgorithms ALGORITHM-IDENTIFIER ::= { + # { OID id-md2 PARAMETERS NULL }| + # { OID id-md5 PARAMETERS NULL }| + # { OID id-sha1 PARAMETERS NULL }| + # { OID id-sha256 PARAMETERS NULL }| + # { OID id-sha384 PARAMETERS NULL }| + # { OID id-sha512 PARAMETERS NULL } + # } + # + # Appendix B.1 also says that for SHA-1/-2 algorithms, the parameters + # should be omitted. They may be present, but when they are, they shall + # have NULL value. + + digestAlgo = DerSequence([ DerObjectId(msg_hash.oid).encode() ]) + + if with_hash_parameters: + digestAlgo.append(DerNull().encode()) + + digest = DerOctetString(msg_hash.digest()) + digestInfo = DerSequence([ + digestAlgo.encode(), + digest.encode() + ]).encode() + + # We need at least 11 bytes for the remaining data: 3 fixed bytes and + # at least 8 bytes of padding). + if emLen 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) -> None: ... + +def _EMSA_PKCS1_V1_5_ENCODE(msg_hash: Hash, emLen: int, with_hash_parameters: Optional[bool]=True) -> bytes: ... + +def new(rsa_key: RsaKey) -> PKCS115_SigScheme: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/pss.py b/lib/python3.11/site-packages/Cryptodome/Signature/pss.py new file mode 100644 index 0000000..0b05ed2 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/pss.py @@ -0,0 +1,386 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util.py3compat import bchr, bord, iter_range +import Cryptodome.Util.number +from Cryptodome.Util.number import (ceil_div, + long_to_bytes, + bytes_to_long + ) +from Cryptodome.Util.strxor import strxor +from Cryptodome import Random + + +class PSS_SigScheme: + """A signature object for ``RSASSA-PSS``. + Do not instantiate directly. + Use :func:`Cryptodome.Signature.pss.new`. + """ + + def __init__(self, key, mgfunc, saltLen, randfunc): + """Initialize this PKCS#1 PSS signature scheme object. + + :Parameters: + key : an RSA key object + If a private half is given, both signature and + verification are possible. + If a public half is given, only verification is possible. + mgfunc : callable + A mask generation function that accepts two parameters: + a string to use as seed, and the lenth of the mask to + generate, in bytes. + saltLen : integer + Length of the salt, in bytes. + randfunc : callable + A function that returns random bytes. + """ + + self._key = key + self._saltLen = saltLen + self._mgfunc = mgfunc + self._randfunc = randfunc + + def can_sign(self): + """Return ``True`` if this object can be used to sign messages.""" + return self._key.has_private() + + def sign(self, msg_hash): + """Create the PKCS#1 PSS signature of a message. + + This function is also called ``RSASSA-PSS-SIGN`` and + it is specified in + `section 8.1.1 of RFC8017 `_. + + :parameter msg_hash: + This is an object from the :mod:`Cryptodome.Hash` package. + It has been used to digest the message to sign. + :type msg_hash: hash object + + :return: the signature encoded as a *byte string*. + :raise ValueError: if the RSA key is not long enough for the given hash algorithm. + :raise TypeError: if the RSA key has no private half. + """ + + # Set defaults for salt length and mask generation function + if self._saltLen is None: + sLen = msg_hash.digest_size + else: + sLen = self._saltLen + + if self._mgfunc is None: + mgf = lambda x, y: MGF1(x, y, msg_hash) + else: + mgf = self._mgfunc + + modBits = Cryptodome.Util.number.size(self._key.n) + + # See 8.1.1 in RFC3447 + k = ceil_div(modBits, 8) # k is length in bytes of the modulus + # Step 1 + em = _EMSA_PSS_ENCODE(msg_hash, modBits-1, self._randfunc, mgf, sLen) + # Step 2a (OS2IP) + em_int = bytes_to_long(em) + # Step 2b (RSASP1) + m_int = self._key._decrypt(em_int) + # Step 2c (I2OSP) + signature = long_to_bytes(m_int, k) + return signature + + def verify(self, msg_hash, signature): + """Check if the PKCS#1 PSS signature over a message is valid. + + This function is also called ``RSASSA-PSS-VERIFY`` and + it is specified in + `section 8.1.2 of RFC8037 `_. + + :parameter msg_hash: + The hash that was carried out over the message. This is an object + belonging to the :mod:`Cryptodome.Hash` module. + :type parameter: hash object + + :parameter signature: + The signature that needs to be validated. + :type signature: bytes + + :raise ValueError: if the signature is not valid. + """ + + # Set defaults for salt length and mask generation function + if self._saltLen is None: + sLen = msg_hash.digest_size + else: + sLen = self._saltLen + if self._mgfunc: + mgf = self._mgfunc + else: + mgf = lambda x, y: MGF1(x, y, msg_hash) + + modBits = Cryptodome.Util.number.size(self._key.n) + + # See 8.1.2 in RFC3447 + k = ceil_div(modBits, 8) # Convert from bits to bytes + # Step 1 + if len(signature) != k: + raise ValueError("Incorrect signature") + # Step 2a (O2SIP) + signature_int = bytes_to_long(signature) + # Step 2b (RSAVP1) + em_int = self._key._encrypt(signature_int) + # Step 2c (I2OSP) + emLen = ceil_div(modBits - 1, 8) + em = long_to_bytes(em_int, emLen) + # Step 3/4 + _EMSA_PSS_VERIFY(msg_hash, em, modBits-1, mgf, sLen) + + +def MGF1(mgfSeed, maskLen, hash_gen): + """Mask Generation Function, described in `B.2.1 of RFC8017 + `_. + + :param mfgSeed: + seed from which the mask is generated + :type mfgSeed: byte string + + :param maskLen: + intended length in bytes of the mask + :type maskLen: integer + + :param hash_gen: + A module or a hash object from :mod:`Cryptodome.Hash` + :type hash_object: + + :return: the mask, as a *byte string* + """ + + T = b"" + for counter in iter_range(ceil_div(maskLen, hash_gen.digest_size)): + c = long_to_bytes(counter, 4) + hobj = hash_gen.new() + hobj.update(mgfSeed + c) + T = T + hobj.digest() + assert(len(T) >= maskLen) + return T[:maskLen] + + +def _EMSA_PSS_ENCODE(mhash, emBits, randFunc, mgf, sLen): + r""" + Implement the ``EMSA-PSS-ENCODE`` function, as defined + in PKCS#1 v2.1 (RFC3447, 9.1.1). + + The original ``EMSA-PSS-ENCODE`` actually accepts the message ``M`` + as input, and hash it internally. Here, we expect that the message + has already been hashed instead. + + :Parameters: + mhash : hash object + The hash object that holds the digest of the message being signed. + emBits : int + Maximum length of the final encoding, in bits. + randFunc : callable + An RNG function that accepts as only parameter an int, and returns + a string of random bytes, to be used as salt. + mgf : callable + A mask generation function that accepts two parameters: a string to + use as seed, and the lenth of the mask to generate, in bytes. + sLen : int + Length of the salt, in bytes. + + :Return: An ``emLen`` byte long string that encodes the hash + (with ``emLen = \ceil(emBits/8)``). + + :Raise ValueError: + When digest or salt length are too big. + """ + + emLen = ceil_div(emBits, 8) + + # Bitmask of digits that fill up + lmask = 0 + for i in iter_range(8*emLen-emBits): + lmask = lmask >> 1 | 0x80 + + # Step 1 and 2 have been already done + # Step 3 + if emLen < mhash.digest_size+sLen+2: + raise ValueError("Digest or salt length are too long" + " for given key size.") + # Step 4 + salt = randFunc(sLen) + # Step 5 + m_prime = bchr(0)*8 + mhash.digest() + salt + # Step 6 + h = mhash.new() + h.update(m_prime) + # Step 7 + ps = bchr(0)*(emLen-sLen-mhash.digest_size-2) + # Step 8 + db = ps + bchr(1) + salt + # Step 9 + dbMask = mgf(h.digest(), emLen-mhash.digest_size-1) + # Step 10 + maskedDB = strxor(db, dbMask) + # Step 11 + maskedDB = bchr(bord(maskedDB[0]) & ~lmask) + maskedDB[1:] + # Step 12 + em = maskedDB + h.digest() + bchr(0xBC) + return em + + +def _EMSA_PSS_VERIFY(mhash, em, emBits, mgf, sLen): + """ + Implement the ``EMSA-PSS-VERIFY`` function, as defined + in PKCS#1 v2.1 (RFC3447, 9.1.2). + + ``EMSA-PSS-VERIFY`` actually accepts the message ``M`` as input, + and hash it internally. Here, we expect that the message has already + been hashed instead. + + :Parameters: + mhash : hash object + The hash object that holds the digest of the message to be verified. + em : string + The signature to verify, therefore proving that the sender really + signed the message that was received. + emBits : int + Length of the final encoding (em), in bits. + mgf : callable + A mask generation function that accepts two parameters: a string to + use as seed, and the lenth of the mask to generate, in bytes. + sLen : int + Length of the salt, in bytes. + + :Raise ValueError: + When the encoding is inconsistent, or the digest or salt lengths + are too big. + """ + + emLen = ceil_div(emBits, 8) + + # Bitmask of digits that fill up + lmask = 0 + for i in iter_range(8*emLen-emBits): + lmask = lmask >> 1 | 0x80 + + # Step 1 and 2 have been already done + # Step 3 + if emLen < mhash.digest_size+sLen+2: + raise ValueError("Incorrect signature") + # Step 4 + if ord(em[-1:]) != 0xBC: + raise ValueError("Incorrect signature") + # Step 5 + maskedDB = em[:emLen-mhash.digest_size-1] + h = em[emLen-mhash.digest_size-1:-1] + # Step 6 + if lmask & bord(em[0]): + raise ValueError("Incorrect signature") + # Step 7 + dbMask = mgf(h, emLen-mhash.digest_size-1) + # Step 8 + db = strxor(maskedDB, dbMask) + # Step 9 + db = bchr(bord(db[0]) & ~lmask) + db[1:] + # Step 10 + if not db.startswith(bchr(0)*(emLen-mhash.digest_size-sLen-2) + bchr(1)): + raise ValueError("Incorrect signature") + # Step 11 + if sLen > 0: + salt = db[-sLen:] + else: + salt = b"" + # Step 12 + m_prime = bchr(0)*8 + mhash.digest() + salt + # Step 13 + hobj = mhash.new() + hobj.update(m_prime) + hp = hobj.digest() + # Step 14 + if h != hp: + raise ValueError("Incorrect signature") + + +def new(rsa_key, **kwargs): + """Create an object for making or verifying PKCS#1 PSS signatures. + + :parameter rsa_key: + The RSA key to use for signing or verifying the message. + This is a :class:`Cryptodome.PublicKey.RSA` object. + Signing is only possible when ``rsa_key`` is a **private** RSA key. + :type rsa_key: RSA object + + :Keyword Arguments: + + * *mask_func* (``callable``) -- + A function that returns the mask (as `bytes`). + It must accept two parameters: a seed (as `bytes`) + and the length of the data to return. + + If not specified, it will be the function :func:`MGF1` defined in + `RFC8017 `_ and + combined with the same hash algorithm applied to the + message to sign or verify. + + If you want to use a different function, for instance still :func:`MGF1` + but together with another hash, you can do:: + + from Cryptodome.Hash import SHA256 + from Cryptodome.Signature.pss import MGF1 + mgf = lambda x, y: MGF1(x, y, SHA256) + + * *salt_bytes* (``integer``) -- + Length of the salt, in bytes. + It is a value between 0 and ``emLen - hLen - 2``, where ``emLen`` + is the size of the RSA modulus and ``hLen`` is the size of the digest + applied to the message to sign or verify. + + The salt is generated internally, you don't need to provide it. + + If not specified, the salt length will be ``hLen``. + If it is zero, the signature scheme becomes deterministic. + + Note that in some implementations such as OpenSSL the default + salt length is ``emLen - hLen - 2`` (even though it is not more + secure than ``hLen``). + + * *rand_func* (``callable``) -- + A function that returns random ``bytes``, of the desired length. + The default is :func:`Cryptodome.Random.get_random_bytes`. + + :return: a :class:`PSS_SigScheme` signature object + """ + + mask_func = kwargs.pop("mask_func", None) + salt_len = kwargs.pop("salt_bytes", None) + rand_func = kwargs.pop("rand_func", None) + if rand_func is None: + rand_func = Random.get_random_bytes + if kwargs: + raise ValueError("Unknown keywords: " + str(kwargs.keys())) + return PSS_SigScheme(rsa_key, mask_func, salt_len, rand_func) diff --git a/lib/python3.11/site-packages/Cryptodome/Signature/pss.pyi b/lib/python3.11/site-packages/Cryptodome/Signature/pss.pyi new file mode 100644 index 0000000..84a960e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Signature/pss.pyi @@ -0,0 +1,30 @@ +from typing import Union, Callable, Optional +from typing_extensions import Protocol + +from Cryptodome.PublicKey.RSA import RsaKey + + +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) -> None: ... + + +MGF1 : MaskFunction +def _EMSA_PSS_ENCODE(mhash: Hash, emBits: int, randFunc: RndFunction, mgf:MaskFunction, sLen: int) -> str: ... +def _EMSA_PSS_VERIFY(mhash: Hash, em: str, emBits: int, mgf: MaskFunction, sLen: int) -> None: ... +def new(rsa_key: RsaKey, **kwargs: Union[MaskFunction, RndFunction, int]) -> PSS_SigScheme: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Util/Counter.py b/lib/python3.11/site-packages/Cryptodome/Util/Counter.py new file mode 100644 index 0000000..c67bc95 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/Counter.py @@ -0,0 +1,77 @@ +# -*- coding: ascii -*- +# +# Util/Counter.py : Fast counter for use with CTR-mode ciphers +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +def new(nbits, prefix=b"", suffix=b"", initial_value=1, little_endian=False, allow_wraparound=False): + """Create a stateful counter block function suitable for CTR encryption modes. + + Each call to the function returns the next counter block. + Each counter block is made up by three parts: + + +------+--------------+-------+ + |prefix| counter value|postfix| + +------+--------------+-------+ + + The counter value is incremented by 1 at each call. + + Args: + nbits (integer): + Length of the desired counter value, in bits. It must be a multiple of 8. + prefix (byte string): + The constant prefix of the counter block. By default, no prefix is + used. + suffix (byte string): + The constant postfix of the counter block. By default, no suffix is + used. + initial_value (integer): + The initial value of the counter. Default value is 1. + Its length in bits must not exceed the argument ``nbits``. + little_endian (boolean): + If ``True``, the counter number will be encoded in little endian format. + If ``False`` (default), in big endian format. + allow_wraparound (boolean): + This parameter is ignored. + Returns: + An object that can be passed with the :data:`counter` parameter to a CTR mode + cipher. + + It must hold that *len(prefix) + nbits//8 + len(suffix)* matches the + block size of the underlying block cipher. + """ + + if (nbits % 8) != 0: + raise ValueError("'nbits' must be a multiple of 8") + + iv_bl = initial_value.bit_length() + if iv_bl > nbits: + raise ValueError("Initial value takes %d bits but it is longer than " + "the counter (%d bits)" % + (iv_bl, nbits)) + + # Ignore wraparound + return {"counter_len": nbits // 8, + "prefix": prefix, + "suffix": suffix, + "initial_value": initial_value, + "little_endian": little_endian + } diff --git a/lib/python3.11/site-packages/Cryptodome/Util/Counter.pyi b/lib/python3.11/site-packages/Cryptodome/Util/Counter.pyi new file mode 100644 index 0000000..fa2ffdd --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/Counter.pyi @@ -0,0 +1,5 @@ +from typing import Optional, Union, Dict + +def new(nbits: int, prefix: Optional[bytes]=..., suffix: Optional[bytes]=..., initial_value: Optional[int]=1, + little_endian: Optional[bool]=False, allow_wraparound: Optional[bool]=False) -> \ + Dict[str, Union[int, bytes, bool]]: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Util/Padding.py b/lib/python3.11/site-packages/Cryptodome/Util/Padding.py new file mode 100644 index 0000000..b525475 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/Padding.py @@ -0,0 +1,108 @@ +# +# Util/Padding.py : Functions to manage padding +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +__all__ = [ 'pad', 'unpad' ] + +from Cryptodome.Util.py3compat import * + + +def pad(data_to_pad, block_size, style='pkcs7'): + """Apply standard padding. + + Args: + data_to_pad (byte string): + The data that needs to be padded. + block_size (integer): + The block boundary to use for padding. The output length is guaranteed + to be a multiple of :data:`block_size`. + style (string): + Padding algorithm. It can be *'pkcs7'* (default), *'iso7816'* or *'x923'*. + + Return: + byte string : the original data with the appropriate padding added at the end. + """ + + padding_len = block_size-len(data_to_pad)%block_size + if style == 'pkcs7': + padding = bchr(padding_len)*padding_len + elif style == 'x923': + padding = bchr(0)*(padding_len-1) + bchr(padding_len) + elif style == 'iso7816': + padding = bchr(128) + bchr(0)*(padding_len-1) + else: + raise ValueError("Unknown padding style") + return data_to_pad + padding + + +def unpad(padded_data, block_size, style='pkcs7'): + """Remove standard padding. + + Args: + padded_data (byte string): + A piece of data with padding that needs to be stripped. + block_size (integer): + The block boundary to use for padding. The input length + must be a multiple of :data:`block_size`. + style (string): + Padding algorithm. It can be *'pkcs7'* (default), *'iso7816'* or *'x923'*. + Return: + byte string : data without padding. + Raises: + ValueError: if the padding is incorrect. + """ + + pdata_len = len(padded_data) + if pdata_len == 0: + raise ValueError("Zero-length input cannot be unpadded") + if pdata_len % block_size: + raise ValueError("Input data is not padded") + if style in ('pkcs7', 'x923'): + padding_len = bord(padded_data[-1]) + if padding_len<1 or padding_len>min(block_size, pdata_len): + raise ValueError("Padding is incorrect.") + if style == 'pkcs7': + if padded_data[-padding_len:]!=bchr(padding_len)*padding_len: + raise ValueError("PKCS#7 padding is incorrect.") + else: + if padded_data[-padding_len:-1]!=bchr(0)*(padding_len-1): + raise ValueError("ANSI X.923 padding is incorrect.") + elif style == 'iso7816': + padding_len = pdata_len - padded_data.rfind(bchr(128)) + if padding_len<1 or padding_len>min(block_size, pdata_len): + raise ValueError("Padding is incorrect.") + if padding_len>1 and padded_data[1-padding_len:]!=bchr(0)*(padding_len-1): + raise ValueError("ISO 7816-4 padding is incorrect.") + else: + raise ValueError("Unknown padding style") + return padded_data[:-padding_len] + diff --git a/lib/python3.11/site-packages/Cryptodome/Util/Padding.pyi b/lib/python3.11/site-packages/Cryptodome/Util/Padding.pyi new file mode 100644 index 0000000..4d8d30d --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/Padding.pyi @@ -0,0 +1,6 @@ +from typing import Optional + +__all__ = [ 'pad', 'unpad' ] + +def pad(data_to_pad: bytes, block_size: int, style: Optional[str]='pkcs7') -> bytes: ... +def unpad(padded_data: bytes, block_size: int, style: Optional[str]='pkcs7') -> bytes: ... \ No newline at end of file diff --git a/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.py b/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.py new file mode 100644 index 0000000..10859c3 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.py @@ -0,0 +1,386 @@ +# rfc1751.py : Converts between 128-bit strings and a human-readable +# sequence of words, as defined in RFC1751: "A Convention for +# Human-Readable 128-bit Keys", by Daniel L. McDonald. +# +# Part of the Python Cryptography Toolkit +# +# Written by Andrew M. Kuchling and others +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from __future__ import print_function + +import binascii + +from Cryptodome.Util.py3compat import bord, bchr + +binary = {0: '0000', 1: '0001', 2: '0010', 3: '0011', 4: '0100', 5: '0101', + 6: '0110', 7: '0111', 8: '1000', 9: '1001', 10: '1010', 11: '1011', + 12: '1100', 13: '1101', 14: '1110', 15: '1111'} + + +def _key2bin(s): + "Convert a key into a string of binary digits" + kl = map(lambda x: bord(x), s) + kl = map(lambda x: binary[x >> 4] + binary[x & 15], kl) + return ''.join(kl) + + +def _extract(key, start, length): + """Extract a bitstring(2.x)/bytestring(2.x) from a string of binary digits, and return its + numeric value.""" + + result = 0 + for y in key[start:start+length]: + result = result * 2 + ord(y) - 48 + return result + + +def key_to_english(key): + """Transform an arbitrary key into a string containing English words. + + Example:: + + >>> from Cryptodome.Util.RFC1751 import key_to_english + >>> key_to_english(b'66666666') + 'RAM LOIS GOAD CREW CARE HIT' + + Args: + key (byte string): + The key to convert. Its length must be a multiple of 8. + Return: + A string of English words. + """ + + if len(key) % 8 != 0: + raise ValueError('The length of the key must be a multiple of 8.') + + english = '' + for index in range(0, len(key), 8): # Loop over 8-byte subkeys + subkey = key[index:index + 8] + # Compute the parity of the key + skbin = _key2bin(subkey) + p = 0 + for i in range(0, 64, 2): + p = p + _extract(skbin, i, 2) + # Append parity bits to the subkey + skbin = _key2bin(subkey + bchr((p << 6) & 255)) + for i in range(0, 64, 11): + english = english + wordlist[_extract(skbin, i, 11)] + ' ' + + return english.strip() + + +def english_to_key(s): + """Transform a string into a corresponding key. + + Example:: + + >>> from Cryptodome.Util.RFC1751 import english_to_key + >>> english_to_key('RAM LOIS GOAD CREW CARE HIT') + b'66666666' + + Args: + s (string): the string with the words separated by whitespace; + the number of words must be a multiple of 6. + Return: + A byte string. + """ + + L = s.upper().split() + key = b'' + for index in range(0, len(L), 6): + sublist = L[index:index + 6] + char = 9 * [0] + bits = 0 + for i in sublist: + index = wordlist.index(i) + shift = (8 - (bits + 11) % 8) % 8 + y = index << shift + cl, cc, cr = (y >> 16), (y >> 8) & 0xff, y & 0xff + if (shift > 5): + char[bits >> 3] = char[bits >> 3] | cl + char[(bits >> 3) + 1] = char[(bits >> 3) + 1] | cc + char[(bits >> 3) + 2] = char[(bits >> 3) + 2] | cr + elif shift > -3: + char[bits >> 3] = char[bits >> 3] | cc + char[(bits >> 3) + 1] = char[(bits >> 3) + 1] | cr + else: + char[bits >> 3] = char[bits >> 3] | cr + bits = bits + 11 + + subkey = b'' + for y in char: + subkey = subkey + bchr(y) + + # Check the parity of the resulting key + skbin = _key2bin(subkey) + p = 0 + for i in range(0, 64, 2): + p = p + _extract(skbin, i, 2) + if (p & 3) != _extract(skbin, 64, 2): + raise ValueError("Parity error in resulting key") + key = key + subkey[0:8] + return key + + +wordlist = [ + "A", "ABE", "ACE", "ACT", "AD", "ADA", "ADD", + "AGO", "AID", "AIM", "AIR", "ALL", "ALP", "AM", "AMY", "AN", "ANA", + "AND", "ANN", "ANT", "ANY", "APE", "APS", "APT", "ARC", "ARE", "ARK", + "ARM", "ART", "AS", "ASH", "ASK", "AT", "ATE", "AUG", "AUK", "AVE", + "AWE", "AWK", "AWL", "AWN", "AX", "AYE", "BAD", "BAG", "BAH", "BAM", + "BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", "BEN", "BET", + "BEY", "BIB", "BID", "BIG", "BIN", "BIT", "BOB", "BOG", "BON", "BOO", + "BOP", "BOW", "BOY", "BUB", "BUD", "BUG", "BUM", "BUN", "BUS", "BUT", + "BUY", "BY", "BYE", "CAB", "CAL", "CAM", "CAN", "CAP", "CAR", "CAT", + "CAW", "COD", "COG", "COL", "CON", "COO", "COP", "COT", "COW", "COY", + "CRY", "CUB", "CUE", "CUP", "CUR", "CUT", "DAB", "DAD", "DAM", "DAN", + "DAR", "DAY", "DEE", "DEL", "DEN", "DES", "DEW", "DID", "DIE", "DIG", + "DIN", "DIP", "DO", "DOE", "DOG", "DON", "DOT", "DOW", "DRY", "DUB", + "DUD", "DUE", "DUG", "DUN", "EAR", "EAT", "ED", "EEL", "EGG", "EGO", + "ELI", "ELK", "ELM", "ELY", "EM", "END", "EST", "ETC", "EVA", "EVE", + "EWE", "EYE", "FAD", "FAN", "FAR", "FAT", "FAY", "FED", "FEE", "FEW", + "FIB", "FIG", "FIN", "FIR", "FIT", "FLO", "FLY", "FOE", "FOG", "FOR", + "FRY", "FUM", "FUN", "FUR", "GAB", "GAD", "GAG", "GAL", "GAM", "GAP", + "GAS", "GAY", "GEE", "GEL", "GEM", "GET", "GIG", "GIL", "GIN", "GO", + "GOT", "GUM", "GUN", "GUS", "GUT", "GUY", "GYM", "GYP", "HA", "HAD", + "HAL", "HAM", "HAN", "HAP", "HAS", "HAT", "HAW", "HAY", "HE", "HEM", + "HEN", "HER", "HEW", "HEY", "HI", "HID", "HIM", "HIP", "HIS", "HIT", + "HO", "HOB", "HOC", "HOE", "HOG", "HOP", "HOT", "HOW", "HUB", "HUE", + "HUG", "HUH", "HUM", "HUT", "I", "ICY", "IDA", "IF", "IKE", "ILL", + "INK", "INN", "IO", "ION", "IQ", "IRA", "IRE", "IRK", "IS", "IT", + "ITS", "IVY", "JAB", "JAG", "JAM", "JAN", "JAR", "JAW", "JAY", "JET", + "JIG", "JIM", "JO", "JOB", "JOE", "JOG", "JOT", "JOY", "JUG", "JUT", + "KAY", "KEG", "KEN", "KEY", "KID", "KIM", "KIN", "KIT", "LA", "LAB", + "LAC", "LAD", "LAG", "LAM", "LAP", "LAW", "LAY", "LEA", "LED", "LEE", + "LEG", "LEN", "LEO", "LET", "LEW", "LID", "LIE", "LIN", "LIP", "LIT", + "LO", "LOB", "LOG", "LOP", "LOS", "LOT", "LOU", "LOW", "LOY", "LUG", + "LYE", "MA", "MAC", "MAD", "MAE", "MAN", "MAO", "MAP", "MAT", "MAW", + "MAY", "ME", "MEG", "MEL", "MEN", "MET", "MEW", "MID", "MIN", "MIT", + "MOB", "MOD", "MOE", "MOO", "MOP", "MOS", "MOT", "MOW", "MUD", "MUG", + "MUM", "MY", "NAB", "NAG", "NAN", "NAP", "NAT", "NAY", "NE", "NED", + "NEE", "NET", "NEW", "NIB", "NIL", "NIP", "NIT", "NO", "NOB", "NOD", + "NON", "NOR", "NOT", "NOV", "NOW", "NU", "NUN", "NUT", "O", "OAF", + "OAK", "OAR", "OAT", "ODD", "ODE", "OF", "OFF", "OFT", "OH", "OIL", + "OK", "OLD", "ON", "ONE", "OR", "ORB", "ORE", "ORR", "OS", "OTT", + "OUR", "OUT", "OVA", "OW", "OWE", "OWL", "OWN", "OX", "PA", "PAD", + "PAL", "PAM", "PAN", "PAP", "PAR", "PAT", "PAW", "PAY", "PEA", "PEG", + "PEN", "PEP", "PER", "PET", "PEW", "PHI", "PI", "PIE", "PIN", "PIT", + "PLY", "PO", "POD", "POE", "POP", "POT", "POW", "PRO", "PRY", "PUB", + "PUG", "PUN", "PUP", "PUT", "QUO", "RAG", "RAM", "RAN", "RAP", "RAT", + "RAW", "RAY", "REB", "RED", "REP", "RET", "RIB", "RID", "RIG", "RIM", + "RIO", "RIP", "ROB", "ROD", "ROE", "RON", "ROT", "ROW", "ROY", "RUB", + "RUE", "RUG", "RUM", "RUN", "RYE", "SAC", "SAD", "SAG", "SAL", "SAM", + "SAN", "SAP", "SAT", "SAW", "SAY", "SEA", "SEC", "SEE", "SEN", "SET", + "SEW", "SHE", "SHY", "SIN", "SIP", "SIR", "SIS", "SIT", "SKI", "SKY", + "SLY", "SO", "SOB", "SOD", "SON", "SOP", "SOW", "SOY", "SPA", "SPY", + "SUB", "SUD", "SUE", "SUM", "SUN", "SUP", "TAB", "TAD", "TAG", "TAN", + "TAP", "TAR", "TEA", "TED", "TEE", "TEN", "THE", "THY", "TIC", "TIE", + "TIM", "TIN", "TIP", "TO", "TOE", "TOG", "TOM", "TON", "TOO", "TOP", + "TOW", "TOY", "TRY", "TUB", "TUG", "TUM", "TUN", "TWO", "UN", "UP", + "US", "USE", "VAN", "VAT", "VET", "VIE", "WAD", "WAG", "WAR", "WAS", + "WAY", "WE", "WEB", "WED", "WEE", "WET", "WHO", "WHY", "WIN", "WIT", + "WOK", "WON", "WOO", "WOW", "WRY", "WU", "YAM", "YAP", "YAW", "YE", + "YEA", "YES", "YET", "YOU", "ABED", "ABEL", "ABET", "ABLE", "ABUT", + "ACHE", "ACID", "ACME", "ACRE", "ACTA", "ACTS", "ADAM", "ADDS", + "ADEN", "AFAR", "AFRO", "AGEE", "AHEM", "AHOY", "AIDA", "AIDE", + "AIDS", "AIRY", "AJAR", "AKIN", "ALAN", "ALEC", "ALGA", "ALIA", + "ALLY", "ALMA", "ALOE", "ALSO", "ALTO", "ALUM", "ALVA", "AMEN", + "AMES", "AMID", "AMMO", "AMOK", "AMOS", "AMRA", "ANDY", "ANEW", + "ANNA", "ANNE", "ANTE", "ANTI", "AQUA", "ARAB", "ARCH", "AREA", + "ARGO", "ARID", "ARMY", "ARTS", "ARTY", "ASIA", "ASKS", "ATOM", + "AUNT", "AURA", "AUTO", "AVER", "AVID", "AVIS", "AVON", "AVOW", + "AWAY", "AWRY", "BABE", "BABY", "BACH", "BACK", "BADE", "BAIL", + "BAIT", "BAKE", "BALD", "BALE", "BALI", "BALK", "BALL", "BALM", + "BAND", "BANE", "BANG", "BANK", "BARB", "BARD", "BARE", "BARK", + "BARN", "BARR", "BASE", "BASH", "BASK", "BASS", "BATE", "BATH", + "BAWD", "BAWL", "BEAD", "BEAK", "BEAM", "BEAN", "BEAR", "BEAT", + "BEAU", "BECK", "BEEF", "BEEN", "BEER", + "BEET", "BELA", "BELL", "BELT", "BEND", "BENT", "BERG", "BERN", + "BERT", "BESS", "BEST", "BETA", "BETH", "BHOY", "BIAS", "BIDE", + "BIEN", "BILE", "BILK", "BILL", "BIND", "BING", "BIRD", "BITE", + "BITS", "BLAB", "BLAT", "BLED", "BLEW", "BLOB", "BLOC", "BLOT", + "BLOW", "BLUE", "BLUM", "BLUR", "BOAR", "BOAT", "BOCA", "BOCK", + "BODE", "BODY", "BOGY", "BOHR", "BOIL", "BOLD", "BOLO", "BOLT", + "BOMB", "BONA", "BOND", "BONE", "BONG", "BONN", "BONY", "BOOK", + "BOOM", "BOON", "BOOT", "BORE", "BORG", "BORN", "BOSE", "BOSS", + "BOTH", "BOUT", "BOWL", "BOYD", "BRAD", "BRAE", "BRAG", "BRAN", + "BRAY", "BRED", "BREW", "BRIG", "BRIM", "BROW", "BUCK", "BUDD", + "BUFF", "BULB", "BULK", "BULL", "BUNK", "BUNT", "BUOY", "BURG", + "BURL", "BURN", "BURR", "BURT", "BURY", "BUSH", "BUSS", "BUST", + "BUSY", "BYTE", "CADY", "CAFE", "CAGE", "CAIN", "CAKE", "CALF", + "CALL", "CALM", "CAME", "CANE", "CANT", "CARD", "CARE", "CARL", + "CARR", "CART", "CASE", "CASH", "CASK", "CAST", "CAVE", "CEIL", + "CELL", "CENT", "CERN", "CHAD", "CHAR", "CHAT", "CHAW", "CHEF", + "CHEN", "CHEW", "CHIC", "CHIN", "CHOU", "CHOW", "CHUB", "CHUG", + "CHUM", "CITE", "CITY", "CLAD", "CLAM", "CLAN", "CLAW", "CLAY", + "CLOD", "CLOG", "CLOT", "CLUB", "CLUE", "COAL", "COAT", "COCA", + "COCK", "COCO", "CODA", "CODE", "CODY", "COED", "COIL", "COIN", + "COKE", "COLA", "COLD", "COLT", "COMA", "COMB", "COME", "COOK", + "COOL", "COON", "COOT", "CORD", "CORE", "CORK", "CORN", "COST", + "COVE", "COWL", "CRAB", "CRAG", "CRAM", "CRAY", "CREW", "CRIB", + "CROW", "CRUD", "CUBA", "CUBE", "CUFF", "CULL", "CULT", "CUNY", + "CURB", "CURD", "CURE", "CURL", "CURT", "CUTS", "DADE", "DALE", + "DAME", "DANA", "DANE", "DANG", "DANK", "DARE", "DARK", "DARN", + "DART", "DASH", "DATA", "DATE", "DAVE", "DAVY", "DAWN", "DAYS", + "DEAD", "DEAF", "DEAL", "DEAN", "DEAR", "DEBT", "DECK", "DEED", + "DEEM", "DEER", "DEFT", "DEFY", "DELL", "DENT", "DENY", "DESK", + "DIAL", "DICE", "DIED", "DIET", "DIME", "DINE", "DING", "DINT", + "DIRE", "DIRT", "DISC", "DISH", "DISK", "DIVE", "DOCK", "DOES", + "DOLE", "DOLL", "DOLT", "DOME", "DONE", "DOOM", "DOOR", "DORA", + "DOSE", "DOTE", "DOUG", "DOUR", "DOVE", "DOWN", "DRAB", "DRAG", + "DRAM", "DRAW", "DREW", "DRUB", "DRUG", "DRUM", "DUAL", "DUCK", + "DUCT", "DUEL", "DUET", "DUKE", "DULL", "DUMB", "DUNE", "DUNK", + "DUSK", "DUST", "DUTY", "EACH", "EARL", "EARN", "EASE", "EAST", + "EASY", "EBEN", "ECHO", "EDDY", "EDEN", "EDGE", "EDGY", "EDIT", + "EDNA", "EGAN", "ELAN", "ELBA", "ELLA", "ELSE", "EMIL", "EMIT", + "EMMA", "ENDS", "ERIC", "EROS", "EVEN", "EVER", "EVIL", "EYED", + "FACE", "FACT", "FADE", "FAIL", "FAIN", "FAIR", "FAKE", "FALL", + "FAME", "FANG", "FARM", "FAST", "FATE", "FAWN", "FEAR", "FEAT", + "FEED", "FEEL", "FEET", "FELL", "FELT", "FEND", "FERN", "FEST", + "FEUD", "FIEF", "FIGS", "FILE", "FILL", "FILM", "FIND", "FINE", + "FINK", "FIRE", "FIRM", "FISH", "FISK", "FIST", "FITS", "FIVE", + "FLAG", "FLAK", "FLAM", "FLAT", "FLAW", "FLEA", "FLED", "FLEW", + "FLIT", "FLOC", "FLOG", "FLOW", "FLUB", "FLUE", "FOAL", "FOAM", + "FOGY", "FOIL", "FOLD", "FOLK", "FOND", "FONT", "FOOD", "FOOL", + "FOOT", "FORD", "FORE", "FORK", "FORM", "FORT", "FOSS", "FOUL", + "FOUR", "FOWL", "FRAU", "FRAY", "FRED", "FREE", "FRET", "FREY", + "FROG", "FROM", "FUEL", "FULL", "FUME", "FUND", "FUNK", "FURY", + "FUSE", "FUSS", "GAFF", "GAGE", "GAIL", "GAIN", "GAIT", "GALA", + "GALE", "GALL", "GALT", "GAME", "GANG", "GARB", "GARY", "GASH", + "GATE", "GAUL", "GAUR", "GAVE", "GAWK", "GEAR", "GELD", "GENE", + "GENT", "GERM", "GETS", "GIBE", "GIFT", "GILD", "GILL", "GILT", + "GINA", "GIRD", "GIRL", "GIST", "GIVE", "GLAD", "GLEE", "GLEN", + "GLIB", "GLOB", "GLOM", "GLOW", "GLUE", "GLUM", "GLUT", "GOAD", + "GOAL", "GOAT", "GOER", "GOES", "GOLD", "GOLF", "GONE", "GONG", + "GOOD", "GOOF", "GORE", "GORY", "GOSH", "GOUT", "GOWN", "GRAB", + "GRAD", "GRAY", "GREG", "GREW", "GREY", "GRID", "GRIM", "GRIN", + "GRIT", "GROW", "GRUB", "GULF", "GULL", "GUNK", "GURU", "GUSH", + "GUST", "GWEN", "GWYN", "HAAG", "HAAS", "HACK", "HAIL", "HAIR", + "HALE", "HALF", "HALL", "HALO", "HALT", "HAND", "HANG", "HANK", + "HANS", "HARD", "HARK", "HARM", "HART", "HASH", "HAST", "HATE", + "HATH", "HAUL", "HAVE", "HAWK", "HAYS", "HEAD", "HEAL", "HEAR", + "HEAT", "HEBE", "HECK", "HEED", "HEEL", "HEFT", "HELD", "HELL", + "HELM", "HERB", "HERD", "HERE", "HERO", "HERS", "HESS", "HEWN", + "HICK", "HIDE", "HIGH", "HIKE", "HILL", "HILT", "HIND", "HINT", + "HIRE", "HISS", "HIVE", "HOBO", "HOCK", "HOFF", "HOLD", "HOLE", + "HOLM", "HOLT", "HOME", "HONE", "HONK", "HOOD", "HOOF", "HOOK", + "HOOT", "HORN", "HOSE", "HOST", "HOUR", "HOVE", "HOWE", "HOWL", + "HOYT", "HUCK", "HUED", "HUFF", "HUGE", "HUGH", "HUGO", "HULK", + "HULL", "HUNK", "HUNT", "HURD", "HURL", "HURT", "HUSH", "HYDE", + "HYMN", "IBIS", "ICON", "IDEA", "IDLE", "IFFY", "INCA", "INCH", + "INTO", "IONS", "IOTA", "IOWA", "IRIS", "IRMA", "IRON", "ISLE", + "ITCH", "ITEM", "IVAN", "JACK", "JADE", "JAIL", "JAKE", "JANE", + "JAVA", "JEAN", "JEFF", "JERK", "JESS", "JEST", "JIBE", "JILL", + "JILT", "JIVE", "JOAN", "JOBS", "JOCK", "JOEL", "JOEY", "JOHN", + "JOIN", "JOKE", "JOLT", "JOVE", "JUDD", "JUDE", "JUDO", "JUDY", + "JUJU", "JUKE", "JULY", "JUNE", "JUNK", "JUNO", "JURY", "JUST", + "JUTE", "KAHN", "KALE", "KANE", "KANT", "KARL", "KATE", "KEEL", + "KEEN", "KENO", "KENT", "KERN", "KERR", "KEYS", "KICK", "KILL", + "KIND", "KING", "KIRK", "KISS", "KITE", "KLAN", "KNEE", "KNEW", + "KNIT", "KNOB", "KNOT", "KNOW", "KOCH", "KONG", "KUDO", "KURD", + "KURT", "KYLE", "LACE", "LACK", "LACY", "LADY", "LAID", "LAIN", + "LAIR", "LAKE", "LAMB", "LAME", "LAND", "LANE", "LANG", "LARD", + "LARK", "LASS", "LAST", "LATE", "LAUD", "LAVA", "LAWN", "LAWS", + "LAYS", "LEAD", "LEAF", "LEAK", "LEAN", "LEAR", "LEEK", "LEER", + "LEFT", "LEND", "LENS", "LENT", "LEON", "LESK", "LESS", "LEST", + "LETS", "LIAR", "LICE", "LICK", "LIED", "LIEN", "LIES", "LIEU", + "LIFE", "LIFT", "LIKE", "LILA", "LILT", "LILY", "LIMA", "LIMB", + "LIME", "LIND", "LINE", "LINK", "LINT", "LION", "LISA", "LIST", + "LIVE", "LOAD", "LOAF", "LOAM", "LOAN", "LOCK", "LOFT", "LOGE", + "LOIS", "LOLA", "LONE", "LONG", "LOOK", "LOON", "LOOT", "LORD", + "LORE", "LOSE", "LOSS", "LOST", "LOUD", "LOVE", "LOWE", "LUCK", + "LUCY", "LUGE", "LUKE", "LULU", "LUND", "LUNG", "LURA", "LURE", + "LURK", "LUSH", "LUST", "LYLE", "LYNN", "LYON", "LYRA", "MACE", + "MADE", "MAGI", "MAID", "MAIL", "MAIN", "MAKE", "MALE", "MALI", + "MALL", "MALT", "MANA", "MANN", "MANY", "MARC", "MARE", "MARK", + "MARS", "MART", "MARY", "MASH", "MASK", "MASS", "MAST", "MATE", + "MATH", "MAUL", "MAYO", "MEAD", "MEAL", "MEAN", "MEAT", "MEEK", + "MEET", "MELD", "MELT", "MEMO", "MEND", "MENU", "MERT", "MESH", + "MESS", "MICE", "MIKE", "MILD", "MILE", "MILK", "MILL", "MILT", + "MIMI", "MIND", "MINE", "MINI", "MINK", "MINT", "MIRE", "MISS", + "MIST", "MITE", "MITT", "MOAN", "MOAT", "MOCK", "MODE", "MOLD", + "MOLE", "MOLL", "MOLT", "MONA", "MONK", "MONT", "MOOD", "MOON", + "MOOR", "MOOT", "MORE", "MORN", "MORT", "MOSS", "MOST", "MOTH", + "MOVE", "MUCH", "MUCK", "MUDD", "MUFF", "MULE", "MULL", "MURK", + "MUSH", "MUST", "MUTE", "MUTT", "MYRA", "MYTH", "NAGY", "NAIL", + "NAIR", "NAME", "NARY", "NASH", "NAVE", "NAVY", "NEAL", "NEAR", + "NEAT", "NECK", "NEED", "NEIL", "NELL", "NEON", "NERO", "NESS", + "NEST", "NEWS", "NEWT", "NIBS", "NICE", "NICK", "NILE", "NINA", + "NINE", "NOAH", "NODE", "NOEL", "NOLL", "NONE", "NOOK", "NOON", + "NORM", "NOSE", "NOTE", "NOUN", "NOVA", "NUDE", "NULL", "NUMB", + "OATH", "OBEY", "OBOE", "ODIN", "OHIO", "OILY", "OINT", "OKAY", + "OLAF", "OLDY", "OLGA", "OLIN", "OMAN", "OMEN", "OMIT", "ONCE", + "ONES", "ONLY", "ONTO", "ONUS", "ORAL", "ORGY", "OSLO", "OTIS", + "OTTO", "OUCH", "OUST", "OUTS", "OVAL", "OVEN", "OVER", "OWLY", + "OWNS", "QUAD", "QUIT", "QUOD", "RACE", "RACK", "RACY", "RAFT", + "RAGE", "RAID", "RAIL", "RAIN", "RAKE", "RANK", "RANT", "RARE", + "RASH", "RATE", "RAVE", "RAYS", "READ", "REAL", "REAM", "REAR", + "RECK", "REED", "REEF", "REEK", "REEL", "REID", "REIN", "RENA", + "REND", "RENT", "REST", "RICE", "RICH", "RICK", "RIDE", "RIFT", + "RILL", "RIME", "RING", "RINK", "RISE", "RISK", "RITE", "ROAD", + "ROAM", "ROAR", "ROBE", "ROCK", "RODE", "ROIL", "ROLL", "ROME", + "ROOD", "ROOF", "ROOK", "ROOM", "ROOT", "ROSA", "ROSE", "ROSS", + "ROSY", "ROTH", "ROUT", "ROVE", "ROWE", "ROWS", "RUBE", "RUBY", + "RUDE", "RUDY", "RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE", + "RUSH", "RUSK", "RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE", + "SAID", "SAIL", "SALE", "SALK", "SALT", "SAME", "SAND", "SANE", + "SANG", "SANK", "SARA", "SAUL", "SAVE", "SAYS", "SCAN", "SCAR", + "SCAT", "SCOT", "SEAL", "SEAM", "SEAR", "SEAT", "SEED", "SEEK", + "SEEM", "SEEN", "SEES", "SELF", "SELL", "SEND", "SENT", "SETS", + "SEWN", "SHAG", "SHAM", "SHAW", "SHAY", "SHED", "SHIM", "SHIN", + "SHOD", "SHOE", "SHOT", "SHOW", "SHUN", "SHUT", "SICK", "SIDE", + "SIFT", "SIGH", "SIGN", "SILK", "SILL", "SILO", "SILT", "SINE", + "SING", "SINK", "SIRE", "SITE", "SITS", "SITU", "SKAT", "SKEW", + "SKID", "SKIM", "SKIN", "SKIT", "SLAB", "SLAM", "SLAT", "SLAY", + "SLED", "SLEW", "SLID", "SLIM", "SLIT", "SLOB", "SLOG", "SLOT", + "SLOW", "SLUG", "SLUM", "SLUR", "SMOG", "SMUG", "SNAG", "SNOB", + "SNOW", "SNUB", "SNUG", "SOAK", "SOAR", "SOCK", "SODA", "SOFA", + "SOFT", "SOIL", "SOLD", "SOME", "SONG", "SOON", "SOOT", "SORE", + "SORT", "SOUL", "SOUR", "SOWN", "STAB", "STAG", "STAN", "STAR", + "STAY", "STEM", "STEW", "STIR", "STOW", "STUB", "STUN", "SUCH", + "SUDS", "SUIT", "SULK", "SUMS", "SUNG", "SUNK", "SURE", "SURF", + "SWAB", "SWAG", "SWAM", "SWAN", "SWAT", "SWAY", "SWIM", "SWUM", + "TACK", "TACT", "TAIL", "TAKE", "TALE", "TALK", "TALL", "TANK", + "TASK", "TATE", "TAUT", "TEAL", "TEAM", "TEAR", "TECH", "TEEM", + "TEEN", "TEET", "TELL", "TEND", "TENT", "TERM", "TERN", "TESS", + "TEST", "THAN", "THAT", "THEE", "THEM", "THEN", "THEY", "THIN", + "THIS", "THUD", "THUG", "TICK", "TIDE", "TIDY", "TIED", "TIER", + "TILE", "TILL", "TILT", "TIME", "TINA", "TINE", "TINT", "TINY", + "TIRE", "TOAD", "TOGO", "TOIL", "TOLD", "TOLL", "TONE", "TONG", + "TONY", "TOOK", "TOOL", "TOOT", "TORE", "TORN", "TOTE", "TOUR", + "TOUT", "TOWN", "TRAG", "TRAM", "TRAY", "TREE", "TREK", "TRIG", + "TRIM", "TRIO", "TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE", + "TUCK", "TUFT", "TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK", + "TWIG", "TWIN", "TWIT", "ULAN", "UNIT", "URGE", "USED", "USER", + "USES", "UTAH", "VAIL", "VAIN", "VALE", "VARY", "VASE", "VAST", + "VEAL", "VEDA", "VEIL", "VEIN", "VEND", "VENT", "VERB", "VERY", + "VETO", "VICE", "VIEW", "VINE", "VISE", "VOID", "VOLT", "VOTE", + "WACK", "WADE", "WAGE", "WAIL", "WAIT", "WAKE", "WALE", "WALK", + "WALL", "WALT", "WAND", "WANE", "WANG", "WANT", "WARD", "WARM", + "WARN", "WART", "WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY", + "WAYS", "WEAK", "WEAL", "WEAN", "WEAR", "WEED", "WEEK", "WEIR", + "WELD", "WELL", "WELT", "WENT", "WERE", "WERT", "WEST", "WHAM", + "WHAT", "WHEE", "WHEN", "WHET", "WHOA", "WHOM", "WICK", "WIFE", + "WILD", "WILL", "WIND", "WINE", "WING", "WINK", "WINO", "WIRE", + "WISE", "WISH", "WITH", "WOLF", "WONT", "WOOD", "WOOL", "WORD", + "WORE", "WORK", "WORM", "WORN", "WOVE", "WRIT", "WYNN", "YALE", + "YANG", "YANK", "YARD", "YARN", "YAWL", "YAWN", "YEAH", "YEAR", + "YELL", "YOGA", "YOKE" ] diff --git a/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.pyi b/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.pyi new file mode 100644 index 0000000..6ad07ff --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/RFC1751.pyi @@ -0,0 +1,7 @@ +from typing import Dict, List + +binary: Dict[int, str] +wordlist: List[str] + +def key_to_english(key: bytes) -> str: ... +def english_to_key(s: str) -> bytes: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Util/__init__.py b/lib/python3.11/site-packages/Cryptodome/Util/__init__.py new file mode 100644 index 0000000..1862b82 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/__init__.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Miscellaneous modules + +Contains useful modules that don't belong into any of the +other Cryptodome.* subpackages. + +======================== ============================================= +Module Description +======================== ============================================= +`Cryptodome.Util.number` Number-theoretic functions (primality testing, etc.) +`Cryptodome.Util.Counter` Fast counter functions for CTR cipher modes. +`Cryptodome.Util.RFC1751` Converts between 128-bit keys and human-readable + strings of words. +`Cryptodome.Util.asn1` Minimal support for ASN.1 DER encoding +`Cryptodome.Util.Padding` Set of functions for adding and removing padding. +======================== ============================================= + +:undocumented: _galois, _number_new, cpuid, py3compat, _raw_api +""" + +__all__ = ['RFC1751', 'number', 'strxor', 'asn1', 'Counter', 'Padding'] + diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.py b/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.py new file mode 100644 index 0000000..4794a02 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.py @@ -0,0 +1,46 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util._raw_api import load_pycryptodome_raw_lib + + +_raw_cpuid_lib = load_pycryptodome_raw_lib("Cryptodome.Util._cpuid_c", + """ + int have_aes_ni(void); + int have_clmul(void); + """) + + +def have_aes_ni(): + return _raw_cpuid_lib.have_aes_ni() + + +def have_clmul(): + return _raw_cpuid_lib.have_clmul() diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.pyi b/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.pyi new file mode 100644 index 0000000..10e669e --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/_cpu_features.pyi @@ -0,0 +1,2 @@ +def have_aes_ni() -> int: ... +def have_clmul() -> int: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_cpuid_c.abi3.so b/lib/python3.11/site-packages/Cryptodome/Util/_cpuid_c.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..51e31b74f5844907c19e0fcba72a1662b897402e GIT binary patch literal 19304 zcmeHPe{3699e?MG6Sr<1=U1Eb2fd7zrrqNF=aO`5A zvviMB%c3y2^*!QdYX2K<;@L;OCEBn`q%5)q%_Z}3_Kl4QHM^AK~_#kv@c}M3D>vqmP z{x-FR>~x(ePPXsl5z$o_muX1ffa8xZTnha3!S^C>{r;WEQ>oB$sAepSU@>Y~DPb-B z`Wf{5p}z))wax9(7f$(a^sONE^)MB30&k;k)pY>x>9~NE&k*lJtM)I^dJBy-t& zERji$TV~QKnMf%4RBo)C6S?g0Av;sFlId8f5bGs5Mci7kbN8;T+syu0e{2o6Q3P>OZ6V{(p2|^w{%jdQ@32BVbwd8WarRQ6dZ11}C zG{(4GcIo-vAX|If@u2bM&SSXrZhyzyKl=#y2>1y22>1y22>1y22>1y6e<6@K`gSPs z)!?6cghF4B{*I=4l_6E+4OXA>2&XDoqxk;2|uaHbr_KPn; zOgy;h3>1k6gD(=Be#wGVrtHeV$^_?8-JK1;wjg3A>y=pvh>SD*yzi0!;Uf6!@ zKumkaV2v* zpH_Z&8CDjq@5-dpena`=*Jars#uZCkDMyt3A4;yYQ|0@p2*1znt#7S*Uw4P1JGX7S z-sr-c-Ybm0Uc4*ZXY}{>_x1Lz>NUFdTWKSaw3VT|uWyC84*8rb3eCM?eCv;#9Y4{$7y!VVr`SBcBC%7Dody4JkUwO$4DA!D@q1 z(s*C<)*k;IuJ|k~H6gT}kq6*0`z2|PSBw;do1sQa?QG{b|6 z))$Q22?yDE$dMZ%P@k8RupI(nOYM%VgK#&PGLFWT5VYuLa28DyIMa>tIF9D8LEzeS zW_Y*<3~h1bDR`WQ>nR+OZ@Pr0XCPdJ_OCcveh#7KH*`9SlPsZiAlgO=4PU`dWz!xf zBphfqO+mwMGKID!EN|p0Xqp%rX1vfu0Qnpo5}Gw&R*^u^+z#f`BoH)5!F&|goXtP&HK>)4M#0#TE9!sT-!urLJOfeZCT>FBgBh&q^5D; z3~teGLk=v|v=pfRB^WyBi3!a@y3`%pNLZw`Ny`OCSSf|uNm#5bmmEP_7UW4-qD3je zf?tqeID%LhBHf}#NcVq|vAycr(21r-~@9oPsh z?#7t5rGvefckF8UWQT^BhM=I(kk?98#M>X)DxGGn#%(@T&+NroU(0^&xvk-Y^KS{? z8on9n!(r_pS~O?1=xYh!VLrFwLz&ns5+w8dpKOI|Bk_w68l@Ownq;tJZT7|osg@S< zz=uvubN9puQ%~B^NEaCMG;LQ4>F0N%hdl^xS5d(YVd}pV)e&@}pd=g?s3b~UNZ65n zk+()%O%f%YdQrd@+xj4&hVbE%&VoLNB4%t1$Oi$Vxw+n?_$+ElqdV7k6 zg56Ut6??Fsq-Qjh>X}%-)?B-~yJ)2|NxM6j&6g*7;Fry(a^g3$3q)DhFr-mX7i&CFM^tw6{tKjHfq6OOKY%6&w*)eZLQaWnjY5b z0`>ZtF$IMyD5s*@LRFv~L z=kbx6$|Q?b+j&gWN=}GUrcktviWhyR!GI5%F>4H0MP&0M1=38Ae$=u}S)IUEqESPh zJfRgAa}3$3A$>C4RDe?jtT}7k%DHzHIc*_(8K+hK=pbqyo}hDjf;NU3+xpgB&5Xh5 z9xIiseh|Byw>FJhd8?RBK};4?nN1i~-D_7H-J?eL4Xcdqk-Lk@L*tl2 zt14}$qBCGo!>tw;HQZ`pQNyhk7I>J;!k^O*h8FVpQ7*Ur(u{u^?yl>cT)y4Gvk!05eR*#0;)8Tay5nVO) zje^&e?kJrWqiQ`_t#1;%zpz^0ENZQLbgVddA7ZsXR*7-9#^H6*Cc0|sX;W_HFL#NW8^yt??ueosJyOQoQt;Th{OXU&#(11*39ET>RkB4tSU#tBy_3H_lCnAm; zU_7N(p6|m)Lu0(->N%;OKCVv5oYTkoAEbZlwDEIJ>AmCa1LzGL-qMVYHP^Vm+MzeR z&XAW&|LOaZ`<0%jRGlhzGxW9c+yebIHS*ig*V-p7QboIDm+|&|N=$8WHtjJpMVp*U zm@%Xa=4h@koXnYNyHG5d$?}9q6~+$bEZa(B%W_Q*xpUe~7K_Qlrj@sghs8)SIcAyZ z^4Qp6gt#QR)w;@+Ct{|#WB`LHw|T>k9XAagFb@oD-93m@|7u6Kv*){dJGg7dwtFMD%ySjH zzvFTDZf<99xrmhxkJ-s#P`l{R40HK{ZN*0O<=AjJn@e|R(?Uv_WGN$J>BD(MI@B&Y zmT{|C$`JpF`Fi$G1=Fcl~LCtlST|nj;C{B98c!cNjpiY zW5t4OMsh5hLe&K%#3?3g87`GX48vp$S07H+aCsEr$^0nBloI8Pm`%gOMQfZbSf5zT z0~2O*1ytjtQkiOu^#4pnPiFcCfj{&^Sp&A zf0x7UXFsL~5l`Q(vdr_F3Z+U=yzO_iLZp?ARp` z#bdTG4ZjKK2v`38nm+1eQMB^CxKgX;DG7^TaPD|R#WCgjIlz-%-0O+wc^cCwC3h8$ zXVraR-1QHs&ts;TDOMG4`|0~wif8E}66QNDhxJ^_a2 zDtvu;9?Adr#Ou#8(;pzV(G_2rZ_pR zSN^{={QqYdH?Ehj<4cHj*U$6Zb3INChC?c6j%Run7I(aeE7x9!b}5kw$1(jg48(K$ zdEVTm;@OYmsV;YU9Rlf;d&R`@sv8wO$1{Cf#aA2@bF)h5&C7A@|KSYrUsi#ybH`MG zH@*Q1uZ~>rQV;Iq9-~JTZ8OBrUh7n7dICJ6=v49Eer9Pxj&iFffJLU)sd&eG>io;~ z4&Pq6u^pM?*mK +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import os + + +def pycryptodome_filename(dir_comps, filename): + """Return the complete file name for the module + + dir_comps : list of string + The list of directory names in the PyCryptodome package. + The first element must be "Cryptodome". + + filename : string + The filename (inclusing extension) in the target directory. + """ + + if dir_comps[0] != "Cryptodome": + raise ValueError("Only available for modules under 'Cryptodome'") + + dir_comps = list(dir_comps[1:]) + [filename] + + util_lib, _ = os.path.split(os.path.abspath(__file__)) + root_lib = os.path.join(util_lib, "..") + + return os.path.join(root_lib, *dir_comps) + diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_file_system.pyi b/lib/python3.11/site-packages/Cryptodome/Util/_file_system.pyi new file mode 100644 index 0000000..d54a126 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/_file_system.pyi @@ -0,0 +1,4 @@ +from typing import List + + +def pycryptodome_filename(dir_comps: List[str], filename: str) -> str: ... \ No newline at end of file diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.py b/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.py new file mode 100644 index 0000000..c2e0187 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.py @@ -0,0 +1,319 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import os +import abc +import sys +from Cryptodome.Util.py3compat import byte_string +from Cryptodome.Util._file_system import pycryptodome_filename + +# +# List of file suffixes for Python extensions +# +if sys.version_info[0] < 3: + + import imp + extension_suffixes = [] + for ext, mod, typ in imp.get_suffixes(): + if typ == imp.C_EXTENSION: + extension_suffixes.append(ext) + +else: + + from importlib import machinery + extension_suffixes = machinery.EXTENSION_SUFFIXES + +# Which types with buffer interface we support (apart from byte strings) +_buffer_type = (bytearray, memoryview) + + +class _VoidPointer(object): + @abc.abstractmethod + def get(self): + """Return the memory location we point to""" + return + + @abc.abstractmethod + def address_of(self): + """Return a raw pointer to this pointer""" + return + + +try: + # Starting from v2.18, pycparser (used by cffi for in-line ABI mode) + # stops working correctly when PYOPTIMIZE==2 or the parameter -OO is + # passed. In that case, we fall back to ctypes. + # Note that PyPy ships with an old version of pycparser so we can keep + # using cffi there. + # See https://github.com/Legrandin/pycryptodome/issues/228 + if '__pypy__' not in sys.builtin_module_names and sys.flags.optimize == 2: + raise ImportError("CFFI with optimize=2 fails due to pycparser bug.") + + from cffi import FFI + + ffi = FFI() + null_pointer = ffi.NULL + uint8_t_type = ffi.typeof(ffi.new("const uint8_t*")) + + _Array = ffi.new("uint8_t[1]").__class__.__bases__ + + def load_lib(name, cdecl): + """Load a shared library and return a handle to it. + + @name, either an absolute path or the name of a library + in the system search path. + + @cdecl, the C function declarations. + """ + + if hasattr(ffi, "RTLD_DEEPBIND") and not os.getenv('PYCRYPTODOME_DISABLE_DEEPBIND'): + lib = ffi.dlopen(name, ffi.RTLD_DEEPBIND) + else: + lib = ffi.dlopen(name) + ffi.cdef(cdecl) + return lib + + def c_ulong(x): + """Convert a Python integer to unsigned long""" + return x + + c_ulonglong = c_ulong + c_uint = c_ulong + c_ubyte = c_ulong + + def c_size_t(x): + """Convert a Python integer to size_t""" + return x + + def create_string_buffer(init_or_size, size=None): + """Allocate the given amount of bytes (initially set to 0)""" + + if isinstance(init_or_size, bytes): + size = max(len(init_or_size) + 1, size) + result = ffi.new("uint8_t[]", size) + result[:] = init_or_size + else: + if size: + raise ValueError("Size must be specified once only") + result = ffi.new("uint8_t[]", init_or_size) + return result + + def get_c_string(c_string): + """Convert a C string into a Python byte sequence""" + return ffi.string(c_string) + + def get_raw_buffer(buf): + """Convert a C buffer into a Python byte sequence""" + return ffi.buffer(buf)[:] + + def c_uint8_ptr(data): + if isinstance(data, _buffer_type): + # This only works for cffi >= 1.7 + return ffi.cast(uint8_t_type, ffi.from_buffer(data)) + elif byte_string(data) or isinstance(data, _Array): + return data + else: + raise TypeError("Object type %s cannot be passed to C code" % type(data)) + + class VoidPointer_cffi(_VoidPointer): + """Model a newly allocated pointer to void""" + + def __init__(self): + self._pp = ffi.new("void *[1]") + + def get(self): + return self._pp[0] + + def address_of(self): + return self._pp + + def VoidPointer(): + return VoidPointer_cffi() + + backend = "cffi" + +except ImportError: + + import ctypes + from ctypes import (CDLL, c_void_p, byref, c_ulong, c_ulonglong, c_size_t, + create_string_buffer, c_ubyte, c_uint) + from ctypes.util import find_library + from ctypes import Array as _Array + + null_pointer = None + cached_architecture = [] + + def c_ubyte(c): + if not (0 <= c < 256): + raise OverflowError() + return ctypes.c_ubyte(c) + + def load_lib(name, cdecl): + if not cached_architecture: + # platform.architecture() creates a subprocess, so caching the + # result makes successive imports faster. + import platform + cached_architecture[:] = platform.architecture() + bits, linkage = cached_architecture + if "." not in name and not linkage.startswith("Win"): + full_name = find_library(name) + if full_name is None: + raise OSError("Cannot load library '%s'" % name) + name = full_name + return CDLL(name) + + def get_c_string(c_string): + return c_string.value + + def get_raw_buffer(buf): + return buf.raw + + # ---- Get raw pointer --- + + _c_ssize_t = ctypes.c_ssize_t + + _PyBUF_SIMPLE = 0 + _PyObject_GetBuffer = ctypes.pythonapi.PyObject_GetBuffer + _PyBuffer_Release = ctypes.pythonapi.PyBuffer_Release + _py_object = ctypes.py_object + _c_ssize_p = ctypes.POINTER(_c_ssize_t) + + # See Include/object.h for CPython + # and https://github.com/pallets/click/blob/master/src/click/_winconsole.py + class _Py_buffer(ctypes.Structure): + _fields_ = [ + ('buf', c_void_p), + ('obj', ctypes.py_object), + ('len', _c_ssize_t), + ('itemsize', _c_ssize_t), + ('readonly', ctypes.c_int), + ('ndim', ctypes.c_int), + ('format', ctypes.c_char_p), + ('shape', _c_ssize_p), + ('strides', _c_ssize_p), + ('suboffsets', _c_ssize_p), + ('internal', c_void_p) + ] + + # Extra field for CPython 2.6/2.7 + if sys.version_info[0] == 2: + _fields_.insert(-1, ('smalltable', _c_ssize_t * 2)) + + def c_uint8_ptr(data): + if byte_string(data) or isinstance(data, _Array): + return data + elif isinstance(data, _buffer_type): + obj = _py_object(data) + buf = _Py_buffer() + _PyObject_GetBuffer(obj, byref(buf), _PyBUF_SIMPLE) + try: + buffer_type = ctypes.c_ubyte * buf.len + return buffer_type.from_address(buf.buf) + finally: + _PyBuffer_Release(byref(buf)) + else: + raise TypeError("Object type %s cannot be passed to C code" % type(data)) + + # --- + + class VoidPointer_ctypes(_VoidPointer): + """Model a newly allocated pointer to void""" + + def __init__(self): + self._p = c_void_p() + + def get(self): + return self._p + + def address_of(self): + return byref(self._p) + + def VoidPointer(): + return VoidPointer_ctypes() + + backend = "ctypes" + + +class SmartPointer(object): + """Class to hold a non-managed piece of memory""" + + def __init__(self, raw_pointer, destructor): + self._raw_pointer = raw_pointer + self._destructor = destructor + + def get(self): + return self._raw_pointer + + def release(self): + rp, self._raw_pointer = self._raw_pointer, None + return rp + + def __del__(self): + try: + if self._raw_pointer is not None: + self._destructor(self._raw_pointer) + self._raw_pointer = None + except AttributeError: + pass + + +def load_pycryptodome_raw_lib(name, cdecl): + """Load a shared library and return a handle to it. + + @name, the name of the library expressed as a PyCryptodome module, + for instance Cryptodome.Cipher._raw_cbc. + + @cdecl, the C function declarations. + """ + + split = name.split(".") + dir_comps, basename = split[:-1], split[-1] + attempts = [] + for ext in extension_suffixes: + try: + filename = basename + ext + full_name = pycryptodome_filename(dir_comps, filename) + if not os.path.isfile(full_name): + attempts.append("Not found '%s'" % filename) + continue + return load_lib(full_name, cdecl) + except OSError as exp: + attempts.append("Cannot load '%s': %s" % (filename, str(exp))) + raise OSError("Cannot load native module '%s': %s" % (name, ", ".join(attempts))) + + +def is_buffer(x): + """Return True if object x supports the buffer interface""" + return isinstance(x, (bytes, bytearray, memoryview)) + + +def is_writeable_buffer(x): + return (isinstance(x, bytearray) or + (isinstance(x, memoryview) and not x.readonly)) diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.pyi b/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.pyi new file mode 100644 index 0000000..2bc5301 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/_raw_api.pyi @@ -0,0 +1,27 @@ +from typing import Any, Optional, Union + +def load_lib(name: str, cdecl: str) -> Any : ... +def c_ulong(x: int ) -> Any : ... +def c_ulonglong(x: int ) -> Any : ... +def c_size_t(x: int) -> Any : ... +def create_string_buffer(init_or_size: Union[bytes,int], size: Optional[int]) -> Any : ... +def get_c_string(c_string: Any) -> bytes : ... +def get_raw_buffer(buf: Any) -> bytes : ... +def c_uint8_ptr(data: Union[bytes, memoryview, bytearray]) -> Any : ... + +class VoidPointer(object): + def get(self) -> Any : ... + def address_of(self) -> Any : ... + +class SmartPointer(object): + def __init__(self, raw_pointer: Any, destructor: Any) -> None : ... + def get(self) -> Any : ... + def release(self) -> Any : ... + +backend : str +null_pointer : Any +ffi: Any + +def load_pycryptodome_raw_lib(name: str, cdecl: str) -> Any : ... +def is_buffer(x: Any) -> bool : ... +def is_writeable_buffer(x: Any) -> bool : ... diff --git a/lib/python3.11/site-packages/Cryptodome/Util/_strxor.abi3.so b/lib/python3.11/site-packages/Cryptodome/Util/_strxor.abi3.so new file mode 100755 index 0000000000000000000000000000000000000000..f0f3784dbd744491d6bacecae5604aa045bee150 GIT binary patch literal 20376 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 G*?$7dsyU4S literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/Cryptodome/Util/asn1.py b/lib/python3.11/site-packages/Cryptodome/Util/asn1.py new file mode 100644 index 0000000..36f2d72 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/asn1.py @@ -0,0 +1,1064 @@ +# -*- coding: ascii -*- +# +# Util/asn1.py : Minimal support for ASN.1 DER binary encoding. +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +import struct + +from Cryptodome.Util.py3compat import byte_string, bchr, bord + +from Cryptodome.Util.number import long_to_bytes, bytes_to_long + +__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 + try: + test = x + test + except TypeError: + return False + return not only_non_negative or x >= 0 + + +class BytesIO_EOF(object): + """This class differs from BytesIO in that a ValueError exception is + raised whenever EOF is reached.""" + + def __init__(self, initial_bytes): + self._buffer = initial_bytes + self._index = 0 + self._bookmark = None + + def set_bookmark(self): + self._bookmark = self._index + + def data_since_bookmark(self): + assert self._bookmark is not None + return self._buffer[self._bookmark:self._index] + + def remaining_data(self): + return len(self._buffer) - self._index + + def read(self, length): + new_index = self._index + length + if new_index > len(self._buffer): + raise ValueError("Not enough data for DER decoding: expected %d bytes and found %d" % (new_index, len(self._buffer))) + + result = self._buffer[self._index:new_index] + self._index = new_index + return result + + def read_byte(self): + return bord(self.read(1)[0]) + + +class DerObject(object): + """Base class for defining a single DER object. + + This class should never be directly instantiated. + """ + + def __init__(self, asn1Id=None, payload=b'', implicit=None, + constructed=False, explicit=None): + """Initialize the DER object according to a specific ASN.1 type. + + :Parameters: + 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. + + payload : byte string + The initial payload of the object (that it, + the content octets). + If not specified, the payload is empty. + + 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* (default). + + 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: + # The tag octet will be read in with ``decode`` + self._tag_octet = None + return + asn1Id = self._convertTag(asn1Id) + + self.payload = payload + + # In a BER/DER identifier octet: + # * bits 4-0 contain the tag value + # * bit 5 is set if the type is 'constructed' + # and unset if 'primitive' + # * bits 7-6 depend on the encoding class + # + # Class | Bit 7, Bit 6 + # ---------------------------------- + # universal | 0 0 + # application | 0 1 + # 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: + # 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 (5 bits). + Convert it from a character to number if necessary. + """ + if not _is_number(tag): + if len(tag) == 1: + tag = bord(tag[0]) + # Ensure that tag is a low tag + if not (_is_number(tag) and 0 <= tag < 0x1F): + raise ValueError("Wrong DER tag") + return tag + + @staticmethod + def _definite_form(length): + """Build length octets according to BER/DER + definite form. + """ + if length > 127: + encoding = long_to_bytes(length) + return bchr(len(encoding) + 128) + encoding + return bchr(length) + + def encode(self): + """Return this DER element, fully encoded as a binary byte string.""" + + # Concatenate identifier octets, length octets, + # and contents octets + + output_payload = self.payload + + # In case of an EXTERNAL tag, first encode the inner + # element. + if hasattr(self, "_inner_tag_octet"): + output_payload = (bchr(self._inner_tag_octet) + + self._definite_form(len(self.payload)) + + self.payload) + + return (bchr(self._tag_octet) + + self._definite_form(len(output_payload)) + + output_payload) + + def _decodeLen(self, s): + """Decode DER length octets from a file.""" + + length = s.read_byte() + + if length > 127: + encoded_length = s.read(length & 0x7F) + if bord(encoded_length[0]) == 0: + raise ValueError("Invalid DER: length has leading zero") + length = bytes_to_long(encoded_length) + if length <= 127: + raise ValueError("Invalid DER: length in long form but smaller than 128") + + return length + + def decode(self, der_encoded, strict=False): + """Decode a complete DER element, and re-initializes this + object with it. + + Args: + der_encoded (byte string): A complete DER element. + + Raises: + ValueError: in case of parsing errors. + """ + + if not byte_string(der_encoded): + raise ValueError("Input is not a byte string") + + s = BytesIO_EOF(der_encoded) + self._decodeFromStream(s, strict) + + # There shouldn't be other bytes left + if s.remaining_data() > 0: + raise ValueError("Unexpected extra data after the DER structure") + + return self + + def _decodeFromStream(self, s, strict): + """Decode a complete DER element from a file.""" + + idOctet = s.read_byte() + if self._tag_octet is not None: + if idOctet != self._tag_octet: + raise ValueError("Unexpected DER tag") + else: + self._tag_octet = idOctet + length = self._decodeLen(s) + self.payload = s.read(length) + + # In case of an EXTERNAL tag, further decode the inner + # element. + if hasattr(self, "_inner_tag_octet"): + p = BytesIO_EOF(self.payload) + inner_octet = p.read_byte() + if inner_octet != self._inner_tag_octet: + raise ValueError("Unexpected internal DER tag") + length = self._decodeLen(p) + self.payload = p.read(length) + + # There shouldn't be other bytes left + if p.remaining_data() > 0: + raise ValueError("Unexpected extra data after the DER structure") + + +class DerInteger(DerObject): + """Class to model a DER INTEGER. + + An example of encoding is:: + + >>> from Cryptodome.Util.asn1 import DerInteger + >>> from binascii import hexlify, unhexlify + >>> int_der = DerInteger(9) + >>> print hexlify(int_der.encode()) + + which will show ``020109``, the DER encoding of 9. + + And for decoding:: + + >>> s = unhexlify(b'020109') + >>> try: + >>> int_der = DerInteger() + >>> int_der.decode(s) + >>> print int_der.value + >>> except ValueError: + >>> print "Not a valid DER INTEGER" + + the output will be ``9``. + + :ivar value: The integer value + :vartype value: integer + """ + + def __init__(self, value=0, implicit=None, explicit=None): + """Initialize the DER object as an INTEGER. + + :Parameters: + value : integer + The value of the integer. + + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for INTEGER (2). + """ + + DerObject.__init__(self, 0x02, b'', implicit, + False, explicit) + self.value = value # The integer value + + def encode(self): + """Return the DER INTEGER, fully encoded as a + binary string.""" + + number = self.value + self.payload = b'' + while True: + self.payload = bchr(int(number & 255)) + self.payload + if 128 <= number <= 255: + self.payload = bchr(0x00) + self.payload + if -128 <= number <= 255: + break + number >>= 8 + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False): + """Decode a DER-encoded INTEGER, and re-initializes this + object with it. + + Args: + der_encoded (byte string): A complete INTEGER DER element. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict=strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER INTEGER from a file.""" + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + if strict: + if len(self.payload) == 0: + raise ValueError("Invalid encoding for DER INTEGER: empty payload") + if len(self.payload) >= 2 and struct.unpack('>H', self.payload[:2])[0] < 0x80: + raise ValueError("Invalid encoding for DER INTEGER: leading zero") + + # Derive self.value from self.payload + self.value = 0 + bits = 1 + for i in self.payload: + self.value *= 256 + self.value += bord(i) + bits <<= 8 + if self.payload and bord(self.payload[0]) & 0x80: + 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. + + This object behaves like a dynamic Python sequence. + + Sub-elements that are INTEGERs behave like Python integers. + + Any other sub-element is a binary string encoded as a complete DER + sub-element (TLV). + + An example of encoding is: + + >>> from Cryptodome.Util.asn1 import DerSequence, DerInteger + >>> from binascii import hexlify, unhexlify + >>> obj_der = unhexlify('070102') + >>> seq_der = DerSequence([4]) + >>> seq_der.append(9) + >>> seq_der.append(obj_der.encode()) + >>> print hexlify(seq_der.encode()) + + which will show ``3009020104020109070102``, the DER encoding of the + sequence containing ``4``, ``9``, and the object with payload ``02``. + + For decoding: + + >>> s = unhexlify(b'3009020104020109070102') + >>> try: + >>> seq_der = DerSequence() + >>> seq_der.decode(s) + >>> print len(seq_der) + >>> print seq_der[0] + >>> print seq_der[:] + >>> except ValueError: + >>> print "Not a valid DER SEQUENCE" + + the output will be:: + + 3 + 4 + [4, 9, b'\x07\x01\x02'] + + """ + + def __init__(self, startSeq=None, implicit=None, explicit=None): + """Initialize the DER object as a SEQUENCE. + + :Parameters: + startSeq : Python sequence + A sequence whose element are either integers or + other DER objects. + + 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, explicit) + if startSeq is None: + self._seq = [] + else: + self._seq = startSeq + + # A few methods to make it behave like a python sequence + + def __delitem__(self, n): + del self._seq[n] + + def __getitem__(self, n): + return self._seq[n] + + def __setitem__(self, key, value): + self._seq[key] = value + + def __setslice__(self, i, j, sequence): + self._seq[i:j] = sequence + + def __delslice__(self, i, j): + del self._seq[i:j] + + def __getslice__(self, i, j): + return self._seq[max(0, i):max(0, j)] + + def __len__(self): + return len(self._seq) + + def __iadd__(self, item): + self._seq.append(item) + return self + + def append(self, item): + 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. + + Args: + only_non_negative (boolean): + If ``True``, negative integers are not counted in. + """ + + items = [x for x in self._seq if _is_number(x, only_non_negative)] + return len(items) + + def hasOnlyInts(self, only_non_negative=True): + """Return ``True`` if all items in this sequence are integers + or non-negative integers. + + This function returns False is the sequence is empty, + or at least one member is not an integer. + + Args: + only_non_negative (boolean): + If ``True``, the presence of negative integers + causes the method to return ``False``.""" + return self._seq and self.hasInts(only_non_negative) == len(self._seq) + + def encode(self): + """Return this DER SEQUENCE, fully encoded as a + binary string. + + Raises: + ValueError: if some elements in the sequence are neither integers + nor byte strings. + """ + self.payload = b'' + for item in self._seq: + if byte_string(item): + self.payload += item + elif _is_number(item): + self.payload += DerInteger(item).encode() + else: + self.payload += item.encode() + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False, nr_elements=None, only_ints_expected=False): + """Decode a complete DER SEQUENCE, and re-initializes this + object with it. + + Args: + der_encoded (byte string): + A complete SEQUENCE DER element. + nr_elements (None or integer or list of integers): + The number of members the SEQUENCE can have + only_ints_expected (boolean): + Whether the SEQUENCE is expected to contain only integers. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + + DER INTEGERs are decoded into Python integers. Any other DER + element is not decoded. Its validity is not checked. + """ + + self._nr_elements = nr_elements + result = DerObject.decode(self, der_encoded, strict=strict) + + if only_ints_expected and not self.hasOnlyInts(): + raise ValueError("Some members are not INTEGERs") + + return result + + def _decodeFromStream(self, s, strict): + """Decode a complete DER SEQUENCE from a file.""" + + self._seq = [] + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + # Add one item at a time to self.seq, by scanning self.payload + p = BytesIO_EOF(self.payload) + while p.remaining_data() > 0: + p.set_bookmark() + + der = DerObject() + der._decodeFromStream(p, strict) + + # Parse INTEGERs differently + if der._tag_octet != 0x02: + self._seq.append(p.data_since_bookmark()) + else: + derInt = DerInteger() + data = p.data_since_bookmark() + derInt.decode(data, strict=strict) + self._seq.append(derInt.value) + + ok = True + if self._nr_elements is not None: + try: + ok = len(self._seq) in self._nr_elements + except TypeError: + ok = len(self._seq) == self._nr_elements + + if not ok: + raise ValueError("Unexpected number of members (%d)" + " in the sequence" % len(self._seq)) + + +class DerOctetString(DerObject): + """Class to model a DER OCTET STRING. + + An example of encoding is: + + >>> from Cryptodome.Util.asn1 import DerOctetString + >>> from binascii import hexlify, unhexlify + >>> os_der = DerOctetString(b'\\xaa') + >>> os_der.payload += b'\\xbb' + >>> print hexlify(os_der.encode()) + + which will show ``0402aabb``, the DER encoding for the byte string + ``b'\\xAA\\xBB'``. + + For decoding: + + >>> s = unhexlify(b'0402aabb') + >>> try: + >>> os_der = DerOctetString() + >>> os_der.decode(s) + >>> print hexlify(os_der.payload) + >>> except ValueError: + >>> print "Not a valid DER OCTET STRING" + + the output will be ``aabb``. + + :ivar payload: The content of the string + :vartype payload: byte string + """ + + def __init__(self, value=b'', implicit=None): + """Initialize the DER object as an OCTET STRING. + + :Parameters: + value : byte string + The initial payload of the object. + If not specified, the payload is empty. + + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for OCTET STRING (4). + """ + DerObject.__init__(self, 0x04, value, implicit, False) + + +class DerNull(DerObject): + """Class to model a DER NULL element.""" + + def __init__(self): + """Initialize the DER object as a NULL.""" + + DerObject.__init__(self, 0x05, b'', None, False) + + +class DerObjectId(DerObject): + """Class to model a DER OBJECT ID. + + An example of encoding is: + + >>> from Cryptodome.Util.asn1 import DerObjectId + >>> from binascii import hexlify, unhexlify + >>> oid_der = DerObjectId("1.2") + >>> oid_der.value += ".840.113549.1.1.1" + >>> print hexlify(oid_der.encode()) + + which will show ``06092a864886f70d010101``, the DER encoding for the + RSA Object Identifier ``1.2.840.113549.1.1.1``. + + For decoding: + + >>> s = unhexlify(b'06092a864886f70d010101') + >>> try: + >>> oid_der = DerObjectId() + >>> oid_der.decode(s) + >>> print oid_der.value + >>> except ValueError: + >>> print "Not a valid DER OBJECT ID" + + the output will be ``1.2.840.113549.1.1.1``. + + :ivar value: The Object ID (OID), a dot separated list of integers + :vartype value: string + """ + + def __init__(self, value='', implicit=None, explicit=None): + """Initialize the DER object as an OBJECT ID. + + :Parameters: + value : string + The initial Object Identifier (e.g. "1.2.0.0.6.2"). + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for OBJECT ID (6). + explicit : integer + The EXPLICIT tag to use for the encoded object. + """ + DerObject.__init__(self, 0x06, b'', implicit, False, explicit) + self.value = value + + def encode(self): + """Return the DER OBJECT ID, fully encoded as a + binary string.""" + + comps = [int(x) for x in self.value.split(".")] + + if len(comps) < 2: + raise ValueError("Not a valid Object Identifier string") + 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): + """Decode a complete DER OBJECT ID, and re-initializes this + object with it. + + Args: + der_encoded (byte string): + A complete DER OBJECT ID. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER OBJECT ID from a file.""" + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + # Derive self.value from self.payload + p = BytesIO_EOF(self.payload) + + subcomps = [] + v = 0 + while p.remaining_data(): + c = p.read_byte() + v = (v << 7) + (c & 0x7F) + if not (c & 0x80): + subcomps.append(v) + v = 0 + + 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): + """Class to model a DER BIT STRING. + + An example of encoding is: + + >>> from Cryptodome.Util.asn1 import DerBitString + >>> bs_der = DerBitString(b'\\xAA') + >>> bs_der.value += b'\\xBB' + >>> print(bs_der.encode().hex()) + + which will show ``030300aabb``, the DER encoding for the bit string + ``b'\\xAA\\xBB'``. + + For decoding: + + >>> s = bytes.fromhex('030300aabb') + >>> try: + >>> bs_der = DerBitString() + >>> bs_der.decode(s) + >>> print(bs_der.value.hex()) + >>> except ValueError: + >>> print "Not a valid DER BIT STRING" + + the output will be ``aabb``. + + :ivar value: The content of the string + :vartype value: byte string + """ + + def __init__(self, value=b'', implicit=None, explicit=None): + """Initialize the DER object as a BIT STRING. + + :Parameters: + value : byte string or DER object + The initial, packed bit string. + 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 BIT STRING (3). + explicit : integer + The EXPLICIT tag to use for the encoded object. + """ + DerObject.__init__(self, 0x03, b'', implicit, False, explicit) + + # The bitstring value (packed) + if isinstance(value, DerObject): + self.value = value.encode() + else: + self.value = value + + def encode(self): + """Return the DER BIT STRING, fully encoded as a + byte string.""" + + # Add padding count byte + self.payload = b'\x00' + self.value + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False): + """Decode a complete DER BIT STRING, and re-initializes this + object with it. + + Args: + der_encoded (byte string): a complete DER BIT STRING. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER BIT STRING DER from a file.""" + + # Fill-up self.payload + DerObject._decodeFromStream(self, s, strict) + + if self.payload and bord(self.payload[0]) != 0: + raise ValueError("Not a valid BIT STRING") + + # Fill-up self.value + self.value = b'' + # Remove padding count byte + if self.payload: + self.value = self.payload[1:] + + +class DerSetOf(DerObject): + """Class to model a DER SET OF. + + An example of encoding is: + + >>> from Cryptodome.Util.asn1 import DerBitString + >>> from binascii import hexlify, unhexlify + >>> so_der = DerSetOf([4,5]) + >>> so_der.add(6) + >>> print hexlify(so_der.encode()) + + which will show ``3109020104020105020106``, the DER encoding + of a SET OF with items 4,5, and 6. + + For decoding: + + >>> s = unhexlify(b'3109020104020105020106') + >>> try: + >>> so_der = DerSetOf() + >>> so_der.decode(s) + >>> print [x for x in so_der] + >>> except ValueError: + >>> print "Not a valid DER SET OF" + + the output will be ``[4, 5, 6]``. + """ + + def __init__(self, startSet=None, implicit=None): + """Initialize the DER object as a SET OF. + + :Parameters: + startSet : container + The initial set of integers or DER encoded objects. + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for SET OF (17). + """ + DerObject.__init__(self, 0x11, b'', implicit, True) + self._seq = [] + + # All elements must be of the same type (and therefore have the + # same leading octet) + self._elemOctet = None + + if startSet: + for e in startSet: + self.add(e) + + def __getitem__(self, n): + return self._seq[n] + + def __iter__(self): + return iter(self._seq) + + def __len__(self): + return len(self._seq) + + def add(self, elem): + """Add an element to the set. + + Args: + elem (byte string or integer): + An element of the same type of objects already in the set. + It can be an integer or a DER encoded object. + """ + + if _is_number(elem): + eo = 0x02 + elif isinstance(elem, DerObject): + eo = self._tag_octet + else: + eo = bord(elem[0]) + + if self._elemOctet != eo: + if self._elemOctet is not None: + raise ValueError("New element does not belong to the set") + self._elemOctet = eo + + if elem not in self._seq: + self._seq.append(elem) + + def decode(self, der_encoded, strict=False): + """Decode a complete SET OF DER element, and re-initializes this + object with it. + + DER INTEGERs are decoded into Python integers. Any other DER + element is left undecoded; its validity is not checked. + + Args: + der_encoded (byte string): a complete DER BIT SET OF. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER SET OF from a file.""" + + self._seq = [] + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + # Add one item at a time to self.seq, by scanning self.payload + p = BytesIO_EOF(self.payload) + setIdOctet = -1 + while p.remaining_data() > 0: + p.set_bookmark() + + der = DerObject() + der._decodeFromStream(p, strict) + + # Verify that all members are of the same type + if setIdOctet < 0: + setIdOctet = der._tag_octet + else: + if setIdOctet != der._tag_octet: + raise ValueError("Not all elements are of the same DER type") + + # Parse INTEGERs differently + if setIdOctet != 0x02: + self._seq.append(p.data_since_bookmark()) + else: + derInt = DerInteger() + derInt.decode(p.data_since_bookmark(), strict) + self._seq.append(derInt.value) + # end + + def encode(self): + """Return this SET OF DER element, fully encoded as a + binary string. + """ + + # Elements in the set must be ordered in lexicographic order + ordered = [] + for item in self._seq: + if _is_number(item): + bys = DerInteger(item).encode() + elif isinstance(item, DerObject): + bys = item.encode() + else: + bys = item + ordered.append(bys) + ordered.sort() + self.payload = b''.join(ordered) + return DerObject.encode(self) diff --git a/lib/python3.11/site-packages/Cryptodome/Util/asn1.pyi b/lib/python3.11/site-packages/Cryptodome/Util/asn1.pyi new file mode 100644 index 0000000..ee4891c --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/asn1.pyi @@ -0,0 +1,80 @@ +from typing import Optional, Sequence, Union, Set, Iterable + +__all__ = ['DerObject', 'DerInteger', 'DerOctetString', 'DerNull', + 'DerSequence', 'DerObjectId', 'DerBitString', 'DerSetOf'] + +# TODO: Make the encoded DerObjects their own type, so that DerSequence and +# DerSetOf can check their contents better + +class BytesIO_EOF: + def __init__(self, initial_bytes: bytes) -> None: ... + def set_bookmark(self) -> None: ... + def data_since_bookmark(self) -> bytes: ... + def remaining_data(self) -> int: ... + def read(self, length: int) -> bytes: ... + def read_byte(self) -> bytes: ... + +class DerObject: + payload: bytes + 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: 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: 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: ... + def __delitem__(self, n: int) -> None: ... + def __getitem__(self, n: int) -> None: ... + def __setitem__(self, key: int, value: DerObject) -> None: ... + def __setslice__(self, i: int, j: int, sequence: Sequence) -> None: ... + def __delslice__(self, i: int, j: int) -> None: ... + def __getslice__(self, i: int, j: int) -> DerSequence: ... + def __len__(self) -> int: ... + def __iadd__(self, item: DerObject) -> DerSequence: ... + def append(self, item: DerObject) -> DerSequence: ... + 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: bool=..., nr_elements: Optional[int]=None, only_ints_expected: Optional[bool]=False) -> DerSequence: ... + +class DerOctetString(DerObject): + payload: bytes + def __init__(self, value: Optional[bytes]=..., implicit: Optional[int]=None) -> None: ... + +class DerNull(DerObject): + def __init__(self) -> None: ... + +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: 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: bool=...) -> DerBitString: ... + +DerSetElement = Union[bytes, int] + +class DerSetOf(DerObject): + def __init__(self, startSet: Optional[Set[DerSetElement]]=None, implicit: Optional[int]=None) -> None: ... + def __getitem__(self, n: int) -> DerSetElement: ... + def __iter__(self) -> Iterable: ... + def __len__(self) -> int: ... + def add(self, elem: DerSetElement) -> None: ... + def decode(self, der_encoded: bytes, strict: bool=...) -> DerObject: ... + def encode(self) -> bytes: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Util/number.py b/lib/python3.11/site-packages/Cryptodome/Util/number.py new file mode 100644 index 0000000..6d59fd9 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/number.py @@ -0,0 +1,1525 @@ +# +# number.py : Number-theoretic functions +# +# Part of the Python Cryptography Toolkit +# +# Written by Andrew M. Kuchling, Barry A. Warsaw, and others +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== +# + +import math +import sys +import struct +from Cryptodome import Random +from Cryptodome.Util.py3compat import iter_range + +# Backward compatibility +_fastmath = None + + +def ceil_div(n, d): + """Return ceil(n/d), that is, the smallest integer r such that r*d >= n""" + + if d == 0: + raise ZeroDivisionError() + if (n < 0) or (d < 0): + raise ValueError("Non positive values") + r, q = divmod(n, d) + if (n != 0) and (q != 0): + r += 1 + return r + + +def size (N): + """Returns the size of the number N in bits.""" + + if N < 0: + raise ValueError("Size in bits only available for non-negative numbers") + return N.bit_length() + + +def getRandomInteger(N, randfunc=None): + """Return a random number at most N bits long. + + If :data:`randfunc` is omitted, then :meth:`Random.get_random_bytes` is used. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. Use :func:`Cryptodome.Random.random.getrandbits` instead. + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + + S = randfunc(N>>3) + odd_bits = N % 8 + if odd_bits != 0: + rand_bits = ord(randfunc(1)) >> (8-odd_bits) + S = struct.pack('B', rand_bits) + S + value = bytes_to_long(S) + return value + +def getRandomRange(a, b, randfunc=None): + """Return a random number *n* so that *a <= n < b*. + + If :data:`randfunc` is omitted, then :meth:`Random.get_random_bytes` is used. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. Use :func:`Cryptodome.Random.random.randrange` instead. + """ + + range_ = b - a - 1 + bits = size(range_) + value = getRandomInteger(bits, randfunc) + while value > range_: + value = getRandomInteger(bits, randfunc) + return a + value + +def getRandomNBitInteger(N, randfunc=None): + """Return a random number with exactly N-bits, + i.e. a random number between 2**(N-1) and (2**N)-1. + + If :data:`randfunc` is omitted, then :meth:`Random.get_random_bytes` is used. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. + """ + + value = getRandomInteger (N-1, randfunc) + value |= 2 ** (N-1) # Ensure high bit is set + assert size(value) >= N + return value + + +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 + + +if sys.version_info[:2] >= (3, 8): + + 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. + +def getPrime(N, randfunc=None): + """Return a random N-bit prime number. + + N must be an integer larger than 1. + If randfunc is omitted, then :meth:`Random.get_random_bytes` is used. + """ + if randfunc is None: + randfunc = Random.get_random_bytes + + if N < 2: + raise ValueError("N must be larger than 1") + + while True: + number = getRandomNBitInteger(N, randfunc) | 1 + if isPrime(number, randfunc=randfunc): + break + return number + + +def _rabinMillerTest(n, rounds, randfunc=None): + """_rabinMillerTest(n:long, rounds:int, randfunc:callable):int + Tests if n is prime. + Returns 0 when n is definitely composite. + Returns 1 when n is probably prime. + Returns 2 when n is definitely prime. + + If randfunc is omitted, then Random.new().read is used. + + This function is for internal use only and may be renamed or removed in + the future. + """ + # check special cases (n==2, n even, n < 2) + if n < 3 or (n & 1) == 0: + return n == 2 + # n might be very large so it might be beneficial to precalculate n-1 + n_1 = n - 1 + # determine m and b so that 2**b * m = n - 1 and b maximal + b = 0 + m = n_1 + while (m & 1) == 0: + b += 1 + m >>= 1 + + tested = [] + # we need to do at most n-2 rounds. + for i in iter_range (min (rounds, n-2)): + # randomly choose a < n and make sure it hasn't been tested yet + a = getRandomRange (2, n, randfunc) + while a in tested: + a = getRandomRange (2, n, randfunc) + tested.append (a) + # do the rabin-miller test + z = pow (a, m, n) # (a**m) % n + if z == 1 or z == n_1: + continue + composite = 1 + for r in iter_range(b): + z = (z * z) % n + if z == 1: + return 0 + elif z == n_1: + composite = 0 + break + if composite: + return 0 + return 1 + +def getStrongPrime(N, e=0, false_positive_prob=1e-6, randfunc=None): + r""" + Return a random strong *N*-bit prime number. + In this context, *p* is a strong prime if *p-1* and *p+1* have at + least one large prime factor. + + Args: + N (integer): the exact length of the strong prime. + It must be a multiple of 128 and > 512. + e (integer): if provided, the returned prime (minus 1) + will be coprime to *e* and thus suitable for RSA where + *e* is the public exponent. + false_positive_prob (float): + The statistical probability for the result not to be actually a + prime. It defaults to 10\ :sup:`-6`. + Note that the real probability of a false-positive is far less. This is + just the mathematically provable limit. + randfunc (callable): + A function that takes a parameter *N* and that returns + a random byte string of such length. + If omitted, :func:`Cryptodome.Random.get_random_bytes` is used. + Return: + The new strong prime. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. + """ + + # This function was implemented following the + # instructions found in the paper: + # "FAST GENERATION OF RANDOM, STRONG RSA PRIMES" + # by Robert D. Silverman + # RSA Laboratories + # May 17, 1997 + # which by the time of writing could be freely downloaded here: + # http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.17.2713&rep=rep1&type=pdf + + if randfunc is None: + randfunc = Random.get_random_bytes + + # Use the accelerator if available + if _fastmath is not None: + return _fastmath.getStrongPrime(long(N), long(e), false_positive_prob, + randfunc) + + if (N < 512) or ((N % 128) != 0): + raise ValueError ("bits must be multiple of 128 and > 512") + + rabin_miller_rounds = int(math.ceil(-math.log(false_positive_prob)/math.log(4))) + + # calculate range for X + # lower_bound = sqrt(2) * 2^{511 + 128*x} + # upper_bound = 2^{512 + 128*x} - 1 + 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 + upper_bound = (1 << (512 + 128*x)) - 1 + # Randomly choose X in calculated range + X = getRandomRange (lower_bound, upper_bound, randfunc) + + # generate p1 and p2 + p = [0, 0] + for i in (0, 1): + # randomly choose 101-bit y + y = getRandomNBitInteger (101, randfunc) + # initialize the field for sieving + field = [0] * 5 * len (sieve_base) + # sieve the field + for prime in sieve_base: + offset = y % prime + for j in iter_range((prime - offset) % prime, len (field), prime): + field[j] = 1 + + # look for suitable p[i] starting at y + result = 0 + for j in range(len(field)): + composite = field[j] + # look for next canidate + if composite: + continue + tmp = y + j + result = _rabinMillerTest (tmp, rabin_miller_rounds) + if result > 0: + p[i] = tmp + break + if result == 0: + raise RuntimeError ("Couln't find prime in field. " + "Developer: Increase field_size") + + # Calculate R + # R = (p2^{-1} mod p1) * p2 - (p1^{-1} mod p2) * p1 + tmp1 = inverse (p[1], p[0]) * p[1] # (p2^-1 mod p1)*p2 + tmp2 = inverse (p[0], p[1]) * p[0] # (p1^-1 mod p2)*p1 + R = tmp1 - tmp2 # (p2^-1 mod p1)*p2 - (p1^-1 mod p2)*p1 + + # search for final prime number starting by Y0 + # Y0 = X + (R - X mod p1p2) + increment = p[0] * p[1] + X = X + (R - (X % increment)) + while 1: + is_possible_prime = 1 + # first check candidate against sieve_base + for prime in sieve_base: + if (X % prime) == 0: + is_possible_prime = 0 + break + # if e is given make sure that e and X-1 are coprime + # this is not necessarily a strong prime criterion but useful when + # creating them for RSA where the p-1 and q-1 should be coprime to + # the public exponent e + if e and is_possible_prime: + if e & 1: + if GCD(e, X-1) != 1: + is_possible_prime = 0 + else: + if GCD(e, (X-1) // 2) != 1: + is_possible_prime = 0 + + # do some Rabin-Miller-Tests + if is_possible_prime: + result = _rabinMillerTest (X, rabin_miller_rounds) + if result > 0: + break + X += increment + # abort when X has more bits than requested + # TODO: maybe we shouldn't abort but rather start over. + if X >= 1 << N: + raise RuntimeError ("Couln't find prime in field. " + "Developer: Increase field_size") + return X + +def isPrime(N, false_positive_prob=1e-6, randfunc=None): + r"""Test if a number *N* is a prime. + + Args: + false_positive_prob (float): + The statistical probability for the result not to be actually a + prime. It defaults to 10\ :sup:`-6`. + Note that the real probability of a false-positive is far less. + This is just the mathematically provable limit. + randfunc (callable): + A function that takes a parameter *N* and that returns + a random byte string of such length. + If omitted, :func:`Cryptodome.Random.get_random_bytes` is used. + + Return: + `True` is the input is indeed prime. + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + + if _fastmath is not None: + return _fastmath.isPrime(long(N), false_positive_prob, randfunc) + + if N < 3 or N & 1 == 0: + return N == 2 + for p in sieve_base: + if N == p: + return True + if N % p == 0: + return False + + rounds = int(math.ceil(-math.log(false_positive_prob)/math.log(4))) + return bool(_rabinMillerTest(N, rounds, randfunc)) + + +# Improved conversion functions contributed by Barry Warsaw, after +# careful benchmarking + +import struct + +def long_to_bytes(n, blocksize=0): + """Convert a positive integer to a byte string using big endian encoding. + + If :data:`blocksize` is absent or zero, the byte string will + be of minimal length. + + Otherwise, the length of the byte string is guaranteed to be a multiple + of :data:`blocksize`. If necessary, zeroes (``\\x00``) are added at the left. + + .. note:: + In Python 3, if you are sure that :data:`n` can fit into + :data:`blocksize` bytes, you can simply use the native method instead:: + + >>> n.to_bytes(blocksize, 'big') + + For instance:: + + >>> n = 80 + >>> n.to_bytes(2, 'big') + b'\\x00P' + + However, and unlike this ``long_to_bytes()`` function, + an ``OverflowError`` exception is raised if :data:`n` does not fit. + """ + + if n < 0 or blocksize < 0: + raise ValueError("Values must be non-negative") + + result = [] + pack = struct.pack + + # Fill the first block independently from the value of n + bsr = blocksize + while bsr >= 8: + result.insert(0, pack('>Q', n & 0xFFFFFFFFFFFFFFFF)) + n = n >> 64 + bsr -= 8 + + while bsr >= 4: + result.insert(0, pack('>I', n & 0xFFFFFFFF)) + n = n >> 32 + bsr -= 4 + + while bsr > 0: + result.insert(0, pack('>B', n & 0xFF)) + n = n >> 8 + bsr -= 1 + + if n == 0: + if len(result) == 0: + bresult = b'\x00' + else: + bresult = b''.join(result) + else: + # The encoded number exceeds the block size + while n > 0: + result.insert(0, pack('>Q', n & 0xFFFFFFFFFFFFFFFF)) + n = n >> 64 + result[0] = result[0].lstrip(b'\x00') + bresult = b''.join(result) + # bresult has minimum length here + if blocksize > 0: + target_len = ((len(bresult) - 1) // blocksize + 1) * blocksize + bresult = b'\x00' * (target_len - len(bresult)) + bresult + + return bresult + + +def bytes_to_long(s): + """Convert a byte string to a long integer (big endian). + + In Python 3.2+, use the native method instead:: + + >>> int.from_bytes(s, 'big') + + For instance:: + + >>> int.from_bytes(b'\x00P', 'big') + 80 + + This is (essentially) the inverse of :func:`long_to_bytes`. + """ + acc = 0 + + unpack = struct.unpack + + # Up to Python 2.7.4, struct.unpack can't work with bytearrays nor + # memoryviews + if sys.version_info[0:3] < (2, 7, 4): + if isinstance(s, bytearray): + s = bytes(s) + elif isinstance(s, memoryview): + s = s.tobytes() + + length = len(s) + if length % 4: + extra = (4 - length % 4) + s = b'\x00' * extra + s + length = length + extra + for i in range(0, length, 4): + acc = (acc << 32) + unpack('>I', s[i:i+4])[0] + return acc + + +# For backwards compatibility... +import warnings +def long2str(n, blocksize=0): + warnings.warn("long2str() has been replaced by long_to_bytes()") + return long_to_bytes(n, blocksize) +def str2long(s): + warnings.warn("str2long() has been replaced by bytes_to_long()") + return bytes_to_long(s) + + +# The first 10000 primes used for checking primality. +# This should be enough to eliminate most of the odd +# numbers before needing to do a Rabin-Miller test at all. +sieve_base = ( + 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, + 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, + 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, + 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, + 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, + 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, + 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, + 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, + 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, + 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, + 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, + 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, + 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, + 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, + 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, + 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, + 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, + 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, + 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, + 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, + 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, + 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, + 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, + 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, + 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, + 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, + 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, + 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, + 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, + 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, + 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, + 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, + 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, + 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, + 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, + 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, + 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, + 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, + 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, + 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, + 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, + 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, + 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, + 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, + 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, + 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, + 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, + 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, + 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, + 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, + 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, + 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, + 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, + 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, + 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, + 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, + 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, + 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, + 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, + 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, + 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, + 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, + 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, + 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, + 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, + 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, + 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, + 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, + 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, + 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, + 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, + 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, + 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, + 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, + 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, + 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, + 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, + 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, + 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, + 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, + 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, + 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, + 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, + 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, + 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, + 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, + 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, + 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, + 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, + 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, + 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, + 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, + 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, + 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, + 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, + 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, + 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, + 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, + 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, + 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, + 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, + 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, + 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, + 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, + 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, + 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, + 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, + 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, + 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, + 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, + 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, + 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, + 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, + 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, + 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, + 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, + 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, + 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, + 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, + 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, + 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, + 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, + 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, + 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, + 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, + 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, + 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, + 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, + 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, + 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, + 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, + 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, + 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, + 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, + 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, + 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, + 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, + 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, + 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, + 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, + 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, + 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, + 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, + 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, + 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, + 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, + 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, + 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, + 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, + 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, + 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, + 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, + 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, + 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, + 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, + 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, + 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, + 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, + 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, + 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, + 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, + 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, + 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, + 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, + 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, + 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, + 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, + 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, + 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, + 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, + 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, + 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, + 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, + 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, + 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, + 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, + 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, + 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, + 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, + 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, + 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, + 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, + 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, + 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, + 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, + 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, + 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, + 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, + 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, + 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, + 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, + 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, + 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, + 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, + 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, + 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, + 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, + 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, + 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, + 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, + 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, + 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, + 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, + 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, + 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, + 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, + 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, + 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, + 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, + 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, + 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, + 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, + 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, + 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, + 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, + 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, + 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, + 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, + 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, + 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, + 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, + 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, + 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, + 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, + 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, + 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, + 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, + 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, + 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, + 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, + 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, + 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, + 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, + 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, + 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, + 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, + 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, + 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, + 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, + 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, + 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, + 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, + 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, + 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, + 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, + 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, + 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, + 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, + 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, + 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, + 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, + 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, + 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, + 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, + 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, + 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, + 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, + 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, + 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, + 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, + 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, + 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, + 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, + 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, + 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, + 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, + 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, + 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, + 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, + 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, + 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, + 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, + 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, + 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, + 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, + 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, + 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, + 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, + 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, + 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, + 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, + 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, + 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, + 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, + 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, + 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, + 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, + 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, + 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, + 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, + 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, + 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, + 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, + 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, + 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, + 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, + 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, + 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, + 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, + 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, + 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, + 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, + 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, + 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, + 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, + 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, + 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, + 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, + 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, + 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, + 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, + 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, + 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, + 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, + 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, + 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, + 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, + 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, + 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, + 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, + 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, + 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, + 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, + 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, + 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, + 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, + 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, + 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, + 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, + 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, + 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, + 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, + 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, + 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, + 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, + 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, + 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, + 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, + 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, + 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, + 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, + 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, + 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, + 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, + 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, + 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, + 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, + 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, + 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, + 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, + 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, + 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, + 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, + 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, + 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, + 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, + 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, + 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, + 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, + 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, + 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, + 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, + 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, + 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, + 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, + 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, + 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, + 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, + 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, + 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, + 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, + 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, + 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, + 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, + 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, + 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, + 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, + 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, + 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, + 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, + 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, + 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, + 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, + 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, + 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, + 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, + 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, + 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, + 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, + 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, + 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, + 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, + 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, + 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, + 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, + 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, + 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, + 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, + 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, + 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, + 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, + 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, + 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, + 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, + 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, + 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, + 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, + 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, + 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, + 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, + 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, + 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, + 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, + 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, + 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, + 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, + 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, + 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, + 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, + 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, + 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, + 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, + 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, + 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, + 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, + 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, + 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, + 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, + 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, + 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, + 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, + 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, + 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, + 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, + 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, + 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, + 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, + 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, + 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, + 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, + 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, + 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, + 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, + 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, + 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, + 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, + 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, + 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, + 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, + 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, + 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, + 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, + 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, + 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, + 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, + 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, + 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, + 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, + 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, + 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, + 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, + 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, + 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, + 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, + 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, + 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, + 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, + 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, + 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, + 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, + 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, + 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, + 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, + 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, + 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, + 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, + 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, + 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, + 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, + 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, + 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, + 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, + 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, + 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, + 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, + 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, + 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, + 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, + 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, + 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, + 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, + 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, + 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, + 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, + 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, + 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, + 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, + 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, + 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, + 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, + 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, + 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, + 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, + 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, + 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, + 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, + 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, + 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, + 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, + 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, + 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, + 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, + 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, + 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, + 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, + 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, + 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, + 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, + 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, + 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, + 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, + 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, + 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, + 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, + 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, + 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, + 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, + 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, + 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, + 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, + 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, + 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, + 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, + 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, + 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, + 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, + 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, + 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, + 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, + 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, + 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, + 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, + 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, + 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, + 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, + 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, + 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, + 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, + 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, + 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, + 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, + 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, + 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, + 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, + 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, + 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, + 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, + 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, + 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, + 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, + 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, + 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, + 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, + 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, + 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, + 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, + 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, + 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, + 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, + 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, + 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, + 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, + 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, + 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, + 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, + 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, + 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, + 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, + 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, + 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, + 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, + 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, + 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, + 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, + 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, + 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, + 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, + 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, + 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, + 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, + 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, + 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, + 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, + 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, + 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, + 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, + 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, + 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, + 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, + 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, + 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, + 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, + 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, + 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, + 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, + 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, + 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, + 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, + 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, + 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, + 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, + 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, + 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, + 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, + 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, + 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, + 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, + 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, + 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, + 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, + 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, + 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, + 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, + 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, + 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, + 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, + 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, + 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, + 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, + 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, + 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, + 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, + 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, + 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, + 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, + 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, + 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, + 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, + 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, + 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, + 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, + 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, + 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, + 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, + 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, + 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, + 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, + 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, + 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, + 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, + 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, + 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, + 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, + 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, + 65519, 65521, 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581, + 65587, 65599, 65609, 65617, 65629, 65633, 65647, 65651, 65657, 65677, + 65687, 65699, 65701, 65707, 65713, 65717, 65719, 65729, 65731, 65761, + 65777, 65789, 65809, 65827, 65831, 65837, 65839, 65843, 65851, 65867, + 65881, 65899, 65921, 65927, 65929, 65951, 65957, 65963, 65981, 65983, + 65993, 66029, 66037, 66041, 66047, 66067, 66071, 66083, 66089, 66103, + 66107, 66109, 66137, 66161, 66169, 66173, 66179, 66191, 66221, 66239, + 66271, 66293, 66301, 66337, 66343, 66347, 66359, 66361, 66373, 66377, + 66383, 66403, 66413, 66431, 66449, 66457, 66463, 66467, 66491, 66499, + 66509, 66523, 66529, 66533, 66541, 66553, 66569, 66571, 66587, 66593, + 66601, 66617, 66629, 66643, 66653, 66683, 66697, 66701, 66713, 66721, + 66733, 66739, 66749, 66751, 66763, 66791, 66797, 66809, 66821, 66841, + 66851, 66853, 66863, 66877, 66883, 66889, 66919, 66923, 66931, 66943, + 66947, 66949, 66959, 66973, 66977, 67003, 67021, 67033, 67043, 67049, + 67057, 67061, 67073, 67079, 67103, 67121, 67129, 67139, 67141, 67153, + 67157, 67169, 67181, 67187, 67189, 67211, 67213, 67217, 67219, 67231, + 67247, 67261, 67271, 67273, 67289, 67307, 67339, 67343, 67349, 67369, + 67391, 67399, 67409, 67411, 67421, 67427, 67429, 67433, 67447, 67453, + 67477, 67481, 67489, 67493, 67499, 67511, 67523, 67531, 67537, 67547, + 67559, 67567, 67577, 67579, 67589, 67601, 67607, 67619, 67631, 67651, + 67679, 67699, 67709, 67723, 67733, 67741, 67751, 67757, 67759, 67763, + 67777, 67783, 67789, 67801, 67807, 67819, 67829, 67843, 67853, 67867, + 67883, 67891, 67901, 67927, 67931, 67933, 67939, 67943, 67957, 67961, + 67967, 67979, 67987, 67993, 68023, 68041, 68053, 68059, 68071, 68087, + 68099, 68111, 68113, 68141, 68147, 68161, 68171, 68207, 68209, 68213, + 68219, 68227, 68239, 68261, 68279, 68281, 68311, 68329, 68351, 68371, + 68389, 68399, 68437, 68443, 68447, 68449, 68473, 68477, 68483, 68489, + 68491, 68501, 68507, 68521, 68531, 68539, 68543, 68567, 68581, 68597, + 68611, 68633, 68639, 68659, 68669, 68683, 68687, 68699, 68711, 68713, + 68729, 68737, 68743, 68749, 68767, 68771, 68777, 68791, 68813, 68819, + 68821, 68863, 68879, 68881, 68891, 68897, 68899, 68903, 68909, 68917, + 68927, 68947, 68963, 68993, 69001, 69011, 69019, 69029, 69031, 69061, + 69067, 69073, 69109, 69119, 69127, 69143, 69149, 69151, 69163, 69191, + 69193, 69197, 69203, 69221, 69233, 69239, 69247, 69257, 69259, 69263, + 69313, 69317, 69337, 69341, 69371, 69379, 69383, 69389, 69401, 69403, + 69427, 69431, 69439, 69457, 69463, 69467, 69473, 69481, 69491, 69493, + 69497, 69499, 69539, 69557, 69593, 69623, 69653, 69661, 69677, 69691, + 69697, 69709, 69737, 69739, 69761, 69763, 69767, 69779, 69809, 69821, + 69827, 69829, 69833, 69847, 69857, 69859, 69877, 69899, 69911, 69929, + 69931, 69941, 69959, 69991, 69997, 70001, 70003, 70009, 70019, 70039, + 70051, 70061, 70067, 70079, 70099, 70111, 70117, 70121, 70123, 70139, + 70141, 70157, 70163, 70177, 70181, 70183, 70199, 70201, 70207, 70223, + 70229, 70237, 70241, 70249, 70271, 70289, 70297, 70309, 70313, 70321, + 70327, 70351, 70373, 70379, 70381, 70393, 70423, 70429, 70439, 70451, + 70457, 70459, 70481, 70487, 70489, 70501, 70507, 70529, 70537, 70549, + 70571, 70573, 70583, 70589, 70607, 70619, 70621, 70627, 70639, 70657, + 70663, 70667, 70687, 70709, 70717, 70729, 70753, 70769, 70783, 70793, + 70823, 70841, 70843, 70849, 70853, 70867, 70877, 70879, 70891, 70901, + 70913, 70919, 70921, 70937, 70949, 70951, 70957, 70969, 70979, 70981, + 70991, 70997, 70999, 71011, 71023, 71039, 71059, 71069, 71081, 71089, + 71119, 71129, 71143, 71147, 71153, 71161, 71167, 71171, 71191, 71209, + 71233, 71237, 71249, 71257, 71261, 71263, 71287, 71293, 71317, 71327, + 71329, 71333, 71339, 71341, 71347, 71353, 71359, 71363, 71387, 71389, + 71399, 71411, 71413, 71419, 71429, 71437, 71443, 71453, 71471, 71473, + 71479, 71483, 71503, 71527, 71537, 71549, 71551, 71563, 71569, 71593, + 71597, 71633, 71647, 71663, 71671, 71693, 71699, 71707, 71711, 71713, + 71719, 71741, 71761, 71777, 71789, 71807, 71809, 71821, 71837, 71843, + 71849, 71861, 71867, 71879, 71881, 71887, 71899, 71909, 71917, 71933, + 71941, 71947, 71963, 71971, 71983, 71987, 71993, 71999, 72019, 72031, + 72043, 72047, 72053, 72073, 72077, 72089, 72091, 72101, 72103, 72109, + 72139, 72161, 72167, 72169, 72173, 72211, 72221, 72223, 72227, 72229, + 72251, 72253, 72269, 72271, 72277, 72287, 72307, 72313, 72337, 72341, + 72353, 72367, 72379, 72383, 72421, 72431, 72461, 72467, 72469, 72481, + 72493, 72497, 72503, 72533, 72547, 72551, 72559, 72577, 72613, 72617, + 72623, 72643, 72647, 72649, 72661, 72671, 72673, 72679, 72689, 72701, + 72707, 72719, 72727, 72733, 72739, 72763, 72767, 72797, 72817, 72823, + 72859, 72869, 72871, 72883, 72889, 72893, 72901, 72907, 72911, 72923, + 72931, 72937, 72949, 72953, 72959, 72973, 72977, 72997, 73009, 73013, + 73019, 73037, 73039, 73043, 73061, 73063, 73079, 73091, 73121, 73127, + 73133, 73141, 73181, 73189, 73237, 73243, 73259, 73277, 73291, 73303, + 73309, 73327, 73331, 73351, 73361, 73363, 73369, 73379, 73387, 73417, + 73421, 73433, 73453, 73459, 73471, 73477, 73483, 73517, 73523, 73529, + 73547, 73553, 73561, 73571, 73583, 73589, 73597, 73607, 73609, 73613, + 73637, 73643, 73651, 73673, 73679, 73681, 73693, 73699, 73709, 73721, + 73727, 73751, 73757, 73771, 73783, 73819, 73823, 73847, 73849, 73859, + 73867, 73877, 73883, 73897, 73907, 73939, 73943, 73951, 73961, 73973, + 73999, 74017, 74021, 74027, 74047, 74051, 74071, 74077, 74093, 74099, + 74101, 74131, 74143, 74149, 74159, 74161, 74167, 74177, 74189, 74197, + 74201, 74203, 74209, 74219, 74231, 74257, 74279, 74287, 74293, 74297, + 74311, 74317, 74323, 74353, 74357, 74363, 74377, 74381, 74383, 74411, + 74413, 74419, 74441, 74449, 74453, 74471, 74489, 74507, 74509, 74521, + 74527, 74531, 74551, 74561, 74567, 74573, 74587, 74597, 74609, 74611, + 74623, 74653, 74687, 74699, 74707, 74713, 74717, 74719, 74729, 74731, + 74747, 74759, 74761, 74771, 74779, 74797, 74821, 74827, 74831, 74843, + 74857, 74861, 74869, 74873, 74887, 74891, 74897, 74903, 74923, 74929, + 74933, 74941, 74959, 75011, 75013, 75017, 75029, 75037, 75041, 75079, + 75083, 75109, 75133, 75149, 75161, 75167, 75169, 75181, 75193, 75209, + 75211, 75217, 75223, 75227, 75239, 75253, 75269, 75277, 75289, 75307, + 75323, 75329, 75337, 75347, 75353, 75367, 75377, 75389, 75391, 75401, + 75403, 75407, 75431, 75437, 75479, 75503, 75511, 75521, 75527, 75533, + 75539, 75541, 75553, 75557, 75571, 75577, 75583, 75611, 75617, 75619, + 75629, 75641, 75653, 75659, 75679, 75683, 75689, 75703, 75707, 75709, + 75721, 75731, 75743, 75767, 75773, 75781, 75787, 75793, 75797, 75821, + 75833, 75853, 75869, 75883, 75913, 75931, 75937, 75941, 75967, 75979, + 75983, 75989, 75991, 75997, 76001, 76003, 76031, 76039, 76079, 76081, + 76091, 76099, 76103, 76123, 76129, 76147, 76157, 76159, 76163, 76207, + 76213, 76231, 76243, 76249, 76253, 76259, 76261, 76283, 76289, 76303, + 76333, 76343, 76367, 76369, 76379, 76387, 76403, 76421, 76423, 76441, + 76463, 76471, 76481, 76487, 76493, 76507, 76511, 76519, 76537, 76541, + 76543, 76561, 76579, 76597, 76603, 76607, 76631, 76649, 76651, 76667, + 76673, 76679, 76697, 76717, 76733, 76753, 76757, 76771, 76777, 76781, + 76801, 76819, 76829, 76831, 76837, 76847, 76871, 76873, 76883, 76907, + 76913, 76919, 76943, 76949, 76961, 76963, 76991, 77003, 77017, 77023, + 77029, 77041, 77047, 77069, 77081, 77093, 77101, 77137, 77141, 77153, + 77167, 77171, 77191, 77201, 77213, 77237, 77239, 77243, 77249, 77261, + 77263, 77267, 77269, 77279, 77291, 77317, 77323, 77339, 77347, 77351, + 77359, 77369, 77377, 77383, 77417, 77419, 77431, 77447, 77471, 77477, + 77479, 77489, 77491, 77509, 77513, 77521, 77527, 77543, 77549, 77551, + 77557, 77563, 77569, 77573, 77587, 77591, 77611, 77617, 77621, 77641, + 77647, 77659, 77681, 77687, 77689, 77699, 77711, 77713, 77719, 77723, + 77731, 77743, 77747, 77761, 77773, 77783, 77797, 77801, 77813, 77839, + 77849, 77863, 77867, 77893, 77899, 77929, 77933, 77951, 77969, 77977, + 77983, 77999, 78007, 78017, 78031, 78041, 78049, 78059, 78079, 78101, + 78121, 78137, 78139, 78157, 78163, 78167, 78173, 78179, 78191, 78193, + 78203, 78229, 78233, 78241, 78259, 78277, 78283, 78301, 78307, 78311, + 78317, 78341, 78347, 78367, 78401, 78427, 78437, 78439, 78467, 78479, + 78487, 78497, 78509, 78511, 78517, 78539, 78541, 78553, 78569, 78571, + 78577, 78583, 78593, 78607, 78623, 78643, 78649, 78653, 78691, 78697, + 78707, 78713, 78721, 78737, 78779, 78781, 78787, 78791, 78797, 78803, + 78809, 78823, 78839, 78853, 78857, 78877, 78887, 78889, 78893, 78901, + 78919, 78929, 78941, 78977, 78979, 78989, 79031, 79039, 79043, 79063, + 79087, 79103, 79111, 79133, 79139, 79147, 79151, 79153, 79159, 79181, + 79187, 79193, 79201, 79229, 79231, 79241, 79259, 79273, 79279, 79283, + 79301, 79309, 79319, 79333, 79337, 79349, 79357, 79367, 79379, 79393, + 79397, 79399, 79411, 79423, 79427, 79433, 79451, 79481, 79493, 79531, + 79537, 79549, 79559, 79561, 79579, 79589, 79601, 79609, 79613, 79621, + 79627, 79631, 79633, 79657, 79669, 79687, 79691, 79693, 79697, 79699, + 79757, 79769, 79777, 79801, 79811, 79813, 79817, 79823, 79829, 79841, + 79843, 79847, 79861, 79867, 79873, 79889, 79901, 79903, 79907, 79939, + 79943, 79967, 79973, 79979, 79987, 79997, 79999, 80021, 80039, 80051, + 80071, 80077, 80107, 80111, 80141, 80147, 80149, 80153, 80167, 80173, + 80177, 80191, 80207, 80209, 80221, 80231, 80233, 80239, 80251, 80263, + 80273, 80279, 80287, 80309, 80317, 80329, 80341, 80347, 80363, 80369, + 80387, 80407, 80429, 80447, 80449, 80471, 80473, 80489, 80491, 80513, + 80527, 80537, 80557, 80567, 80599, 80603, 80611, 80621, 80627, 80629, + 80651, 80657, 80669, 80671, 80677, 80681, 80683, 80687, 80701, 80713, + 80737, 80747, 80749, 80761, 80777, 80779, 80783, 80789, 80803, 80809, + 80819, 80831, 80833, 80849, 80863, 80897, 80909, 80911, 80917, 80923, + 80929, 80933, 80953, 80963, 80989, 81001, 81013, 81017, 81019, 81023, + 81031, 81041, 81043, 81047, 81049, 81071, 81077, 81083, 81097, 81101, + 81119, 81131, 81157, 81163, 81173, 81181, 81197, 81199, 81203, 81223, + 81233, 81239, 81281, 81283, 81293, 81299, 81307, 81331, 81343, 81349, + 81353, 81359, 81371, 81373, 81401, 81409, 81421, 81439, 81457, 81463, + 81509, 81517, 81527, 81533, 81547, 81551, 81553, 81559, 81563, 81569, + 81611, 81619, 81629, 81637, 81647, 81649, 81667, 81671, 81677, 81689, + 81701, 81703, 81707, 81727, 81737, 81749, 81761, 81769, 81773, 81799, + 81817, 81839, 81847, 81853, 81869, 81883, 81899, 81901, 81919, 81929, + 81931, 81937, 81943, 81953, 81967, 81971, 81973, 82003, 82007, 82009, + 82013, 82021, 82031, 82037, 82039, 82051, 82067, 82073, 82129, 82139, + 82141, 82153, 82163, 82171, 82183, 82189, 82193, 82207, 82217, 82219, + 82223, 82231, 82237, 82241, 82261, 82267, 82279, 82301, 82307, 82339, + 82349, 82351, 82361, 82373, 82387, 82393, 82421, 82457, 82463, 82469, + 82471, 82483, 82487, 82493, 82499, 82507, 82529, 82531, 82549, 82559, + 82561, 82567, 82571, 82591, 82601, 82609, 82613, 82619, 82633, 82651, + 82657, 82699, 82721, 82723, 82727, 82729, 82757, 82759, 82763, 82781, + 82787, 82793, 82799, 82811, 82813, 82837, 82847, 82883, 82889, 82891, + 82903, 82913, 82939, 82963, 82981, 82997, 83003, 83009, 83023, 83047, + 83059, 83063, 83071, 83077, 83089, 83093, 83101, 83117, 83137, 83177, + 83203, 83207, 83219, 83221, 83227, 83231, 83233, 83243, 83257, 83267, + 83269, 83273, 83299, 83311, 83339, 83341, 83357, 83383, 83389, 83399, + 83401, 83407, 83417, 83423, 83431, 83437, 83443, 83449, 83459, 83471, + 83477, 83497, 83537, 83557, 83561, 83563, 83579, 83591, 83597, 83609, + 83617, 83621, 83639, 83641, 83653, 83663, 83689, 83701, 83717, 83719, + 83737, 83761, 83773, 83777, 83791, 83813, 83833, 83843, 83857, 83869, + 83873, 83891, 83903, 83911, 83921, 83933, 83939, 83969, 83983, 83987, + 84011, 84017, 84047, 84053, 84059, 84061, 84067, 84089, 84121, 84127, + 84131, 84137, 84143, 84163, 84179, 84181, 84191, 84199, 84211, 84221, + 84223, 84229, 84239, 84247, 84263, 84299, 84307, 84313, 84317, 84319, + 84347, 84349, 84377, 84389, 84391, 84401, 84407, 84421, 84431, 84437, + 84443, 84449, 84457, 84463, 84467, 84481, 84499, 84503, 84509, 84521, + 84523, 84533, 84551, 84559, 84589, 84629, 84631, 84649, 84653, 84659, + 84673, 84691, 84697, 84701, 84713, 84719, 84731, 84737, 84751, 84761, + 84787, 84793, 84809, 84811, 84827, 84857, 84859, 84869, 84871, 84913, + 84919, 84947, 84961, 84967, 84977, 84979, 84991, 85009, 85021, 85027, + 85037, 85049, 85061, 85081, 85087, 85091, 85093, 85103, 85109, 85121, + 85133, 85147, 85159, 85193, 85199, 85201, 85213, 85223, 85229, 85237, + 85243, 85247, 85259, 85297, 85303, 85313, 85331, 85333, 85361, 85363, + 85369, 85381, 85411, 85427, 85429, 85439, 85447, 85451, 85453, 85469, + 85487, 85513, 85517, 85523, 85531, 85549, 85571, 85577, 85597, 85601, + 85607, 85619, 85621, 85627, 85639, 85643, 85661, 85667, 85669, 85691, + 85703, 85711, 85717, 85733, 85751, 85781, 85793, 85817, 85819, 85829, + 85831, 85837, 85843, 85847, 85853, 85889, 85903, 85909, 85931, 85933, + 85991, 85999, 86011, 86017, 86027, 86029, 86069, 86077, 86083, 86111, + 86113, 86117, 86131, 86137, 86143, 86161, 86171, 86179, 86183, 86197, + 86201, 86209, 86239, 86243, 86249, 86257, 86263, 86269, 86287, 86291, + 86293, 86297, 86311, 86323, 86341, 86351, 86353, 86357, 86369, 86371, + 86381, 86389, 86399, 86413, 86423, 86441, 86453, 86461, 86467, 86477, + 86491, 86501, 86509, 86531, 86533, 86539, 86561, 86573, 86579, 86587, + 86599, 86627, 86629, 86677, 86689, 86693, 86711, 86719, 86729, 86743, + 86753, 86767, 86771, 86783, 86813, 86837, 86843, 86851, 86857, 86861, + 86869, 86923, 86927, 86929, 86939, 86951, 86959, 86969, 86981, 86993, + 87011, 87013, 87037, 87041, 87049, 87071, 87083, 87103, 87107, 87119, + 87121, 87133, 87149, 87151, 87179, 87181, 87187, 87211, 87221, 87223, + 87251, 87253, 87257, 87277, 87281, 87293, 87299, 87313, 87317, 87323, + 87337, 87359, 87383, 87403, 87407, 87421, 87427, 87433, 87443, 87473, + 87481, 87491, 87509, 87511, 87517, 87523, 87539, 87541, 87547, 87553, + 87557, 87559, 87583, 87587, 87589, 87613, 87623, 87629, 87631, 87641, + 87643, 87649, 87671, 87679, 87683, 87691, 87697, 87701, 87719, 87721, + 87739, 87743, 87751, 87767, 87793, 87797, 87803, 87811, 87833, 87853, + 87869, 87877, 87881, 87887, 87911, 87917, 87931, 87943, 87959, 87961, + 87973, 87977, 87991, 88001, 88003, 88007, 88019, 88037, 88069, 88079, + 88093, 88117, 88129, 88169, 88177, 88211, 88223, 88237, 88241, 88259, + 88261, 88289, 88301, 88321, 88327, 88337, 88339, 88379, 88397, 88411, + 88423, 88427, 88463, 88469, 88471, 88493, 88499, 88513, 88523, 88547, + 88589, 88591, 88607, 88609, 88643, 88651, 88657, 88661, 88663, 88667, + 88681, 88721, 88729, 88741, 88747, 88771, 88789, 88793, 88799, 88801, + 88807, 88811, 88813, 88817, 88819, 88843, 88853, 88861, 88867, 88873, + 88883, 88897, 88903, 88919, 88937, 88951, 88969, 88993, 88997, 89003, + 89009, 89017, 89021, 89041, 89051, 89057, 89069, 89071, 89083, 89087, + 89101, 89107, 89113, 89119, 89123, 89137, 89153, 89189, 89203, 89209, + 89213, 89227, 89231, 89237, 89261, 89269, 89273, 89293, 89303, 89317, + 89329, 89363, 89371, 89381, 89387, 89393, 89399, 89413, 89417, 89431, + 89443, 89449, 89459, 89477, 89491, 89501, 89513, 89519, 89521, 89527, + 89533, 89561, 89563, 89567, 89591, 89597, 89599, 89603, 89611, 89627, + 89633, 89653, 89657, 89659, 89669, 89671, 89681, 89689, 89753, 89759, + 89767, 89779, 89783, 89797, 89809, 89819, 89821, 89833, 89839, 89849, + 89867, 89891, 89897, 89899, 89909, 89917, 89923, 89939, 89959, 89963, + 89977, 89983, 89989, 90001, 90007, 90011, 90017, 90019, 90023, 90031, + 90053, 90059, 90067, 90071, 90073, 90089, 90107, 90121, 90127, 90149, + 90163, 90173, 90187, 90191, 90197, 90199, 90203, 90217, 90227, 90239, + 90247, 90263, 90271, 90281, 90289, 90313, 90353, 90359, 90371, 90373, + 90379, 90397, 90401, 90403, 90407, 90437, 90439, 90469, 90473, 90481, + 90499, 90511, 90523, 90527, 90529, 90533, 90547, 90583, 90599, 90617, + 90619, 90631, 90641, 90647, 90659, 90677, 90679, 90697, 90703, 90709, + 90731, 90749, 90787, 90793, 90803, 90821, 90823, 90833, 90841, 90847, + 90863, 90887, 90901, 90907, 90911, 90917, 90931, 90947, 90971, 90977, + 90989, 90997, 91009, 91019, 91033, 91079, 91081, 91097, 91099, 91121, + 91127, 91129, 91139, 91141, 91151, 91153, 91159, 91163, 91183, 91193, + 91199, 91229, 91237, 91243, 91249, 91253, 91283, 91291, 91297, 91303, + 91309, 91331, 91367, 91369, 91373, 91381, 91387, 91393, 91397, 91411, + 91423, 91433, 91453, 91457, 91459, 91463, 91493, 91499, 91513, 91529, + 91541, 91571, 91573, 91577, 91583, 91591, 91621, 91631, 91639, 91673, + 91691, 91703, 91711, 91733, 91753, 91757, 91771, 91781, 91801, 91807, + 91811, 91813, 91823, 91837, 91841, 91867, 91873, 91909, 91921, 91939, + 91943, 91951, 91957, 91961, 91967, 91969, 91997, 92003, 92009, 92033, + 92041, 92051, 92077, 92083, 92107, 92111, 92119, 92143, 92153, 92173, + 92177, 92179, 92189, 92203, 92219, 92221, 92227, 92233, 92237, 92243, + 92251, 92269, 92297, 92311, 92317, 92333, 92347, 92353, 92357, 92363, + 92369, 92377, 92381, 92383, 92387, 92399, 92401, 92413, 92419, 92431, + 92459, 92461, 92467, 92479, 92489, 92503, 92507, 92551, 92557, 92567, + 92569, 92581, 92593, 92623, 92627, 92639, 92641, 92647, 92657, 92669, + 92671, 92681, 92683, 92693, 92699, 92707, 92717, 92723, 92737, 92753, + 92761, 92767, 92779, 92789, 92791, 92801, 92809, 92821, 92831, 92849, + 92857, 92861, 92863, 92867, 92893, 92899, 92921, 92927, 92941, 92951, + 92957, 92959, 92987, 92993, 93001, 93047, 93053, 93059, 93077, 93083, + 93089, 93097, 93103, 93113, 93131, 93133, 93139, 93151, 93169, 93179, + 93187, 93199, 93229, 93239, 93241, 93251, 93253, 93257, 93263, 93281, + 93283, 93287, 93307, 93319, 93323, 93329, 93337, 93371, 93377, 93383, + 93407, 93419, 93427, 93463, 93479, 93481, 93487, 93491, 93493, 93497, + 93503, 93523, 93529, 93553, 93557, 93559, 93563, 93581, 93601, 93607, + 93629, 93637, 93683, 93701, 93703, 93719, 93739, 93761, 93763, 93787, + 93809, 93811, 93827, 93851, 93871, 93887, 93889, 93893, 93901, 93911, + 93913, 93923, 93937, 93941, 93949, 93967, 93971, 93979, 93983, 93997, + 94007, 94009, 94033, 94049, 94057, 94063, 94079, 94099, 94109, 94111, + 94117, 94121, 94151, 94153, 94169, 94201, 94207, 94219, 94229, 94253, + 94261, 94273, 94291, 94307, 94309, 94321, 94327, 94331, 94343, 94349, + 94351, 94379, 94397, 94399, 94421, 94427, 94433, 94439, 94441, 94447, + 94463, 94477, 94483, 94513, 94529, 94531, 94541, 94543, 94547, 94559, + 94561, 94573, 94583, 94597, 94603, 94613, 94621, 94649, 94651, 94687, + 94693, 94709, 94723, 94727, 94747, 94771, 94777, 94781, 94789, 94793, + 94811, 94819, 94823, 94837, 94841, 94847, 94849, 94873, 94889, 94903, + 94907, 94933, 94949, 94951, 94961, 94993, 94999, 95003, 95009, 95021, + 95027, 95063, 95071, 95083, 95087, 95089, 95093, 95101, 95107, 95111, + 95131, 95143, 95153, 95177, 95189, 95191, 95203, 95213, 95219, 95231, + 95233, 95239, 95257, 95261, 95267, 95273, 95279, 95287, 95311, 95317, + 95327, 95339, 95369, 95383, 95393, 95401, 95413, 95419, 95429, 95441, + 95443, 95461, 95467, 95471, 95479, 95483, 95507, 95527, 95531, 95539, + 95549, 95561, 95569, 95581, 95597, 95603, 95617, 95621, 95629, 95633, + 95651, 95701, 95707, 95713, 95717, 95723, 95731, 95737, 95747, 95773, + 95783, 95789, 95791, 95801, 95803, 95813, 95819, 95857, 95869, 95873, + 95881, 95891, 95911, 95917, 95923, 95929, 95947, 95957, 95959, 95971, + 95987, 95989, 96001, 96013, 96017, 96043, 96053, 96059, 96079, 96097, + 96137, 96149, 96157, 96167, 96179, 96181, 96199, 96211, 96221, 96223, + 96233, 96259, 96263, 96269, 96281, 96289, 96293, 96323, 96329, 96331, + 96337, 96353, 96377, 96401, 96419, 96431, 96443, 96451, 96457, 96461, + 96469, 96479, 96487, 96493, 96497, 96517, 96527, 96553, 96557, 96581, + 96587, 96589, 96601, 96643, 96661, 96667, 96671, 96697, 96703, 96731, + 96737, 96739, 96749, 96757, 96763, 96769, 96779, 96787, 96797, 96799, + 96821, 96823, 96827, 96847, 96851, 96857, 96893, 96907, 96911, 96931, + 96953, 96959, 96973, 96979, 96989, 96997, 97001, 97003, 97007, 97021, + 97039, 97073, 97081, 97103, 97117, 97127, 97151, 97157, 97159, 97169, + 97171, 97177, 97187, 97213, 97231, 97241, 97259, 97283, 97301, 97303, + 97327, 97367, 97369, 97373, 97379, 97381, 97387, 97397, 97423, 97429, + 97441, 97453, 97459, 97463, 97499, 97501, 97511, 97523, 97547, 97549, + 97553, 97561, 97571, 97577, 97579, 97583, 97607, 97609, 97613, 97649, + 97651, 97673, 97687, 97711, 97729, 97771, 97777, 97787, 97789, 97813, + 97829, 97841, 97843, 97847, 97849, 97859, 97861, 97871, 97879, 97883, + 97919, 97927, 97931, 97943, 97961, 97967, 97973, 97987, 98009, 98011, + 98017, 98041, 98047, 98057, 98081, 98101, 98123, 98129, 98143, 98179, + 98207, 98213, 98221, 98227, 98251, 98257, 98269, 98297, 98299, 98317, + 98321, 98323, 98327, 98347, 98369, 98377, 98387, 98389, 98407, 98411, + 98419, 98429, 98443, 98453, 98459, 98467, 98473, 98479, 98491, 98507, + 98519, 98533, 98543, 98561, 98563, 98573, 98597, 98621, 98627, 98639, + 98641, 98663, 98669, 98689, 98711, 98713, 98717, 98729, 98731, 98737, + 98773, 98779, 98801, 98807, 98809, 98837, 98849, 98867, 98869, 98873, + 98887, 98893, 98897, 98899, 98909, 98911, 98927, 98929, 98939, 98947, + 98953, 98963, 98981, 98993, 98999, 99013, 99017, 99023, 99041, 99053, + 99079, 99083, 99089, 99103, 99109, 99119, 99131, 99133, 99137, 99139, + 99149, 99173, 99181, 99191, 99223, 99233, 99241, 99251, 99257, 99259, + 99277, 99289, 99317, 99347, 99349, 99367, 99371, 99377, 99391, 99397, + 99401, 99409, 99431, 99439, 99469, 99487, 99497, 99523, 99527, 99529, + 99551, 99559, 99563, 99571, 99577, 99581, 99607, 99611, 99623, 99643, + 99661, 99667, 99679, 99689, 99707, 99709, 99713, 99719, 99721, 99733, + 99761, 99767, 99787, 99793, 99809, 99817, 99823, 99829, 99833, 99839, + 99859, 99871, 99877, 99881, 99901, 99907, 99923, 99929, 99961, 99971, + 99989, 99991, 100003, 100019, 100043, 100049, 100057, 100069, 100103, 100109, +100129, 100151, 100153, 100169, 100183, 100189, 100193, 100207, 100213, 100237, +100267, 100271, 100279, 100291, 100297, 100313, 100333, 100343, 100357, 100361, +100363, 100379, 100391, 100393, 100403, 100411, 100417, 100447, 100459, 100469, +100483, 100493, 100501, 100511, 100517, 100519, 100523, 100537, 100547, 100549, +100559, 100591, 100609, 100613, 100621, 100649, 100669, 100673, 100693, 100699, +100703, 100733, 100741, 100747, 100769, 100787, 100799, 100801, 100811, 100823, +100829, 100847, 100853, 100907, 100913, 100927, 100931, 100937, 100943, 100957, +100981, 100987, 100999, 101009, 101021, 101027, 101051, 101063, 101081, 101089, +101107, 101111, 101113, 101117, 101119, 101141, 101149, 101159, 101161, 101173, +101183, 101197, 101203, 101207, 101209, 101221, 101267, 101273, 101279, 101281, +101287, 101293, 101323, 101333, 101341, 101347, 101359, 101363, 101377, 101383, +101399, 101411, 101419, 101429, 101449, 101467, 101477, 101483, 101489, 101501, +101503, 101513, 101527, 101531, 101533, 101537, 101561, 101573, 101581, 101599, +101603, 101611, 101627, 101641, 101653, 101663, 101681, 101693, 101701, 101719, +101723, 101737, 101741, 101747, 101749, 101771, 101789, 101797, 101807, 101833, +101837, 101839, 101863, 101869, 101873, 101879, 101891, 101917, 101921, 101929, +101939, 101957, 101963, 101977, 101987, 101999, 102001, 102013, 102019, 102023, +102031, 102043, 102059, 102061, 102071, 102077, 102079, 102101, 102103, 102107, +102121, 102139, 102149, 102161, 102181, 102191, 102197, 102199, 102203, 102217, +102229, 102233, 102241, 102251, 102253, 102259, 102293, 102299, 102301, 102317, +102329, 102337, 102359, 102367, 102397, 102407, 102409, 102433, 102437, 102451, +102461, 102481, 102497, 102499, 102503, 102523, 102533, 102539, 102547, 102551, +102559, 102563, 102587, 102593, 102607, 102611, 102643, 102647, 102653, 102667, +102673, 102677, 102679, 102701, 102761, 102763, 102769, 102793, 102797, 102811, +102829, 102841, 102859, 102871, 102877, 102881, 102911, 102913, 102929, 102931, +102953, 102967, 102983, 103001, 103007, 103043, 103049, 103067, 103069, 103079, +103087, 103091, 103093, 103099, 103123, 103141, 103171, 103177, 103183, 103217, +103231, 103237, 103289, 103291, 103307, 103319, 103333, 103349, 103357, 103387, +103391, 103393, 103399, 103409, 103421, 103423, 103451, 103457, 103471, 103483, +103511, 103529, 103549, 103553, 103561, 103567, 103573, 103577, 103583, 103591, +103613, 103619, 103643, 103651, 103657, 103669, 103681, 103687, 103699, 103703, +103723, 103769, 103787, 103801, 103811, 103813, 103837, 103841, 103843, 103867, +103889, 103903, 103913, 103919, 103951, 103963, 103967, 103969, 103979, 103981, +103991, 103993, 103997, 104003, 104009, 104021, 104033, 104047, 104053, 104059, +104087, 104089, 104107, 104113, 104119, 104123, 104147, 104149, 104161, 104173, +104179, 104183, 104207, 104231, 104233, 104239, 104243, 104281, 104287, 104297, +104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383, 104393, 104399, +104417, 104459, 104471, 104473, 104479, 104491, 104513, 104527, 104537, 104543, +104549, 104551, 104561, 104579, 104593, 104597, 104623, 104639, 104651, 104659, +104677, 104681, 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729, +) diff --git a/lib/python3.11/site-packages/Cryptodome/Util/number.pyi b/lib/python3.11/site-packages/Cryptodome/Util/number.pyi new file mode 100644 index 0000000..f8680bf --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/number.pyi @@ -0,0 +1,19 @@ +from typing import List, Optional, Callable + + +def ceil_div(n: int, d: int) -> int: ... +def size (N: int) -> int: ... +def getRandomInteger(N: int, randfunc: Optional[Callable]=None) -> int: ... +def getRandomRange(a: int, b: int, randfunc: Optional[Callable]=None) -> int: ... +def getRandomNBitInteger(N: int, randfunc: Optional[Callable]=None) -> int: ... +def GCD(x: int,y: int) -> int: ... +def inverse(u: int, v: int) -> int: ... +def getPrime(N: int, randfunc: Optional[Callable]=None) -> int: ... +def getStrongPrime(N: int, e: Optional[int]=0, false_positive_prob: Optional[float]=1e-6, randfunc: Optional[Callable]=None) -> int: ... +def isPrime(N: int, false_positive_prob: Optional[float]=1e-6, randfunc: Optional[Callable]=None) -> bool: ... +def long_to_bytes(n: int, blocksize: Optional[int]=0) -> bytes: ... +def bytes_to_long(s: bytes) -> int: ... +def long2str(n: int, blocksize: Optional[int]=0) -> bytes: ... +def str2long(s: bytes) -> int: ... + +sieve_base: List[int] diff --git a/lib/python3.11/site-packages/Cryptodome/Util/py3compat.py b/lib/python3.11/site-packages/Cryptodome/Util/py3compat.py new file mode 100644 index 0000000..9a982e9 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/py3compat.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# +# Util/py3compat.py : Compatibility code for handling Py3k / Python 2.x +# +# Written in 2010 by Thorsten Behrens +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Compatibility code for handling string/bytes changes from Python 2.x to Py3k + +In Python 2.x, strings (of type ''str'') contain binary data, including encoded +Unicode text (e.g. UTF-8). The separate type ''unicode'' holds Unicode text. +Unicode literals are specified via the u'...' prefix. Indexing or slicing +either type always produces a string of the same type as the original. +Data read from a file is always of '''str'' type. + +In Python 3.x, strings (type ''str'') may only contain Unicode text. The u'...' +prefix and the ''unicode'' type are now redundant. A new type (called +''bytes'') has to be used for binary data (including any particular +''encoding'' of a string). The b'...' prefix allows one to specify a binary +literal. Indexing or slicing a string produces another string. Slicing a byte +string produces another byte string, but the indexing operation produces an +integer. Data read from a file is of '''str'' type if the file was opened in +text mode, or of ''bytes'' type otherwise. + +Since PyCryptodome aims at supporting both Python 2.x and 3.x, the following helper +functions are used to keep the rest of the library as independent as possible +from the actual Python version. + +In general, the code should always deal with binary strings, and use integers +instead of 1-byte character strings. + +b(s) + Take a text string literal (with no prefix or with u'...' prefix) and + make a byte string. +bchr(c) + Take an integer and make a 1-character byte string. +bord(c) + Take the result of indexing on a byte string and make an integer. +tobytes(s) + Take a text string, a byte string, or a sequence of character taken from + a byte string and make a byte string. +""" + +import sys +import abc + + +if sys.version_info[0] == 2: + def b(s): + return s + def bchr(s): + return chr(s) + def bstr(s): + return str(s) + def bord(s): + return ord(s) + def tobytes(s, encoding="latin-1"): + if isinstance(s, unicode): + return s.encode(encoding) + elif isinstance(s, str): + return s + elif isinstance(s, bytearray): + return bytes(s) + elif isinstance(s, memoryview): + return s.tobytes() + else: + return ''.join(s) + def tostr(bs): + return bs + def byte_string(s): + return isinstance(s, str) + + from StringIO import StringIO + BytesIO = StringIO + + from sys import maxint + + iter_range = xrange + + def is_native_int(x): + return isinstance(x, (int, long)) + + def is_string(x): + return isinstance(x, basestring) + + def is_bytes(x): + return isinstance(x, str) or \ + isinstance(x, bytearray) or \ + isinstance(x, memoryview) + + ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()}) + + FileNotFoundError = IOError + +else: + def b(s): + return s.encode("latin-1") # utf-8 would cause some side-effects we don't want + def bchr(s): + return bytes([s]) + def bstr(s): + if isinstance(s,str): + return bytes(s,"latin-1") + else: + return bytes(s) + def bord(s): + return s + def tobytes(s, encoding="latin-1"): + if isinstance(s, bytes): + return s + elif isinstance(s, bytearray): + return bytes(s) + elif isinstance(s,str): + return s.encode(encoding) + elif isinstance(s, memoryview): + return s.tobytes() + else: + return bytes([s]) + def tostr(bs): + return bs.decode("latin-1") + def byte_string(s): + return isinstance(s, bytes) + + from io import BytesIO + from io import StringIO + from sys import maxsize as maxint + + iter_range = range + + def is_native_int(x): + return isinstance(x, int) + + def is_string(x): + return isinstance(x, str) + + def is_bytes(x): + return isinstance(x, bytes) or \ + isinstance(x, bytearray) or \ + isinstance(x, memoryview) + + from abc import ABC + + FileNotFoundError = FileNotFoundError + + +def _copy_bytes(start, end, seq): + """Return an immutable copy of a sequence (byte string, byte array, memoryview) + in a certain interval [start:seq]""" + + if isinstance(seq, memoryview): + return seq[start:end].tobytes() + elif isinstance(seq, bytearray): + return bytes(seq[start:end]) + else: + return seq[start:end] + +del sys +del abc diff --git a/lib/python3.11/site-packages/Cryptodome/Util/py3compat.pyi b/lib/python3.11/site-packages/Cryptodome/Util/py3compat.pyi new file mode 100644 index 0000000..74e04a2 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/py3compat.pyi @@ -0,0 +1,33 @@ +from typing import Union, Any, Optional, IO + +Buffer = Union[bytes, bytearray, memoryview] + +import sys + +def b(s: str) -> bytes: ... +def bchr(s: int) -> bytes: ... +def bord(s: bytes) -> int: ... +def tobytes(s: Union[bytes, str]) -> bytes: ... +def tostr(b: bytes) -> str: ... +def bytestring(x: Any) -> bool: ... + +def is_native_int(s: Any) -> bool: ... +def is_string(x: Any) -> bool: ... +def is_bytes(x: Any) -> bool: ... + +def BytesIO(b: bytes) -> IO[bytes]: ... +def StringIO(s: str) -> IO[str]: ... + +if sys.version_info[0] == 2: + from sys import maxint + iter_range = xrange + +else: + from sys import maxsize as maxint + iter_range = range + +class FileNotFoundError: + def __init__(self, err: int, msg: str, filename: str) -> None: + pass + +def _copy_bytes(start: Optional[int], end: Optional[int], seq: Buffer) -> bytes: ... diff --git a/lib/python3.11/site-packages/Cryptodome/Util/strxor.py b/lib/python3.11/site-packages/Cryptodome/Util/strxor.py new file mode 100644 index 0000000..6b16155 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/strxor.py @@ -0,0 +1,146 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, c_size_t, + create_string_buffer, get_raw_buffer, + c_uint8_ptr, is_writeable_buffer) + +_raw_strxor = load_pycryptodome_raw_lib( + "Cryptodome.Util._strxor", + """ + void strxor(const uint8_t *in1, + const uint8_t *in2, + uint8_t *out, size_t len); + void strxor_c(const uint8_t *in, + uint8_t c, + uint8_t *out, + size_t len); + """) + + +def strxor(term1, term2, output=None): + """From two byte strings of equal length, + create a third one which is the byte-by-byte XOR of the two. + + Args: + term1 (bytes/bytearray/memoryview): + The first byte string to XOR. + term2 (bytes/bytearray/memoryview): + The second byte string to XOR. + output (bytearray/memoryview): + The location where the result will be written to. + It must have the same length as ``term1`` and ``term2``. + If ``None``, the result is returned. + :Return: + If ``output`` is ``None``, a new byte string with the result. + Otherwise ``None``. + + .. note:: + ``term1`` and ``term2`` must have the same length. + """ + + if len(term1) != len(term2): + raise ValueError("Only byte strings of equal length can be xored") + + if output is None: + result = create_string_buffer(len(term1)) + else: + # Note: output may overlap with either input + result = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(term1) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(term1)) + + _raw_strxor.strxor(c_uint8_ptr(term1), + c_uint8_ptr(term2), + c_uint8_ptr(result), + c_size_t(len(term1))) + + if output is None: + return get_raw_buffer(result) + else: + return None + + +def strxor_c(term, c, output=None): + """From a byte string, create a second one of equal length + where each byte is XOR-red with the same value. + + Args: + term(bytes/bytearray/memoryview): + The byte string to XOR. + c (int): + Every byte in the string will be XOR-ed with this value. + It must be between 0 and 255 (included). + output (None or bytearray/memoryview): + The location where the result will be written to. + It must have the same length as ``term``. + If ``None``, the result is returned. + + Return: + If ``output`` is ``None``, a new ``bytes`` string with the result. + Otherwise ``None``. + """ + + if not 0 <= c < 256: + raise ValueError("c must be in range(256)") + + if output is None: + result = create_string_buffer(len(term)) + else: + # Note: output may overlap with either input + result = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(term) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(term)) + + _raw_strxor.strxor_c(c_uint8_ptr(term), + c, + c_uint8_ptr(result), + c_size_t(len(term)) + ) + + if output is None: + return get_raw_buffer(result) + else: + return None + + +def _strxor_direct(term1, term2, result): + """Very fast XOR - check conditions!""" + _raw_strxor.strxor(term1, term2, result, c_size_t(len(term1))) diff --git a/lib/python3.11/site-packages/Cryptodome/Util/strxor.pyi b/lib/python3.11/site-packages/Cryptodome/Util/strxor.pyi new file mode 100644 index 0000000..ca896f3 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/Util/strxor.pyi @@ -0,0 +1,6 @@ +from typing import Union, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +def strxor(term1: bytes, term2: bytes, output: Optional[Buffer]=...) -> bytes: ... +def strxor_c(term: bytes, c: int, output: Optional[Buffer]=...) -> bytes: ... diff --git a/lib/python3.11/site-packages/Cryptodome/__init__.py b/lib/python3.11/site-packages/Cryptodome/__init__.py new file mode 100644 index 0000000..bfd02cd --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/__init__.py @@ -0,0 +1,6 @@ +__all__ = ['Cipher', 'Hash', 'Protocol', 'PublicKey', 'Util', 'Signature', + 'IO', 'Math'] + +version_info = (3, 18, '0') + +__version__ = ".".join([str(x) for x in version_info]) diff --git a/lib/python3.11/site-packages/Cryptodome/__init__.pyi b/lib/python3.11/site-packages/Cryptodome/__init__.pyi new file mode 100644 index 0000000..bc73446 --- /dev/null +++ b/lib/python3.11/site-packages/Cryptodome/__init__.pyi @@ -0,0 +1,4 @@ +from typing import Tuple, Union + +version_info : Tuple[int, int, Union[int, str]] +__version__ : str diff --git a/lib/python3.11/site-packages/Cryptodome/py.typed b/lib/python3.11/site-packages/Cryptodome/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/INSTALLER b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/LICENSE.rst b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +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. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +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/lib/python3.11/site-packages/Flask-2.2.5.dist-info/METADATA b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/METADATA new file mode 100644 index 0000000..2526be4 --- /dev/null +++ b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/METADATA @@ -0,0 +1,123 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 2.2.5 +Summary: A simple framework for building complex web applications. +Home-page: https://palletsprojects.com/p/flask +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Changes, https://flask.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/flask/ +Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: Werkzeug (>=2.2.2) +Requires-Dist: Jinja2 (>=3.0) +Requires-Dist: itsdangerous (>=2.0) +Requires-Dist: click (>=8.0) +Requires-Dist: importlib-metadata (>=3.6.0) ; python_version < "3.10" +Provides-Extra: async +Requires-Dist: asgiref (>=3.2) ; extra == 'async' +Provides-Extra: dotenv +Requires-Dist: python-dotenv ; extra == 'dotenv' + +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + +.. _WSGI: https://wsgi.readthedocs.io/ +.. _Werkzeug: https://werkzeug.palletsprojects.com/ +.. _Jinja: https://jinja.palletsprojects.com/ + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Flask + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + # save this as app.py + from flask import Flask + + app = Flask(__name__) + + @app.route("/") + def hello(): + return "Hello, World!" + +.. code-block:: text + + $ flask run + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst + + +Donate +------ + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://flask.palletsprojects.com/ +- Changes: https://flask.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Flask/ +- Source Code: https://github.com/pallets/flask/ +- Issue Tracker: https://github.com/pallets/flask/issues/ +- Website: https://palletsprojects.com/p/flask/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/RECORD b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/RECORD new file mode 100644 index 0000000..acf9784 --- /dev/null +++ b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/RECORD @@ -0,0 +1,54 @@ +../../../bin/flask,sha256=UfHmEb266rM-LV8wLJVz3LgVkiKxsFLQbuReBDL-XZU,239 +Flask-2.2.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask-2.2.5.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +Flask-2.2.5.dist-info/METADATA,sha256=rZTjr5v4M7HB-zC-w2Y0ZU96OYSGBb-Hm15jlLJhs3g,3889 +Flask-2.2.5.dist-info/RECORD,, +Flask-2.2.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask-2.2.5.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 +Flask-2.2.5.dist-info/entry_points.txt,sha256=s3MqQpduU25y4dq3ftBYD6bMVdVnbMpZP-sUNw0zw0k,41 +Flask-2.2.5.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 +flask/__init__.py,sha256=GJgAILDWhW_DQljuoJ4pk9zBUy70zPPu-VZ6kLyiVI4,2890 +flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 +flask/__pycache__/__init__.cpython-311.pyc,, +flask/__pycache__/__main__.cpython-311.pyc,, +flask/__pycache__/app.cpython-311.pyc,, +flask/__pycache__/blueprints.cpython-311.pyc,, +flask/__pycache__/cli.cpython-311.pyc,, +flask/__pycache__/config.cpython-311.pyc,, +flask/__pycache__/ctx.cpython-311.pyc,, +flask/__pycache__/debughelpers.cpython-311.pyc,, +flask/__pycache__/globals.cpython-311.pyc,, +flask/__pycache__/helpers.cpython-311.pyc,, +flask/__pycache__/logging.cpython-311.pyc,, +flask/__pycache__/scaffold.cpython-311.pyc,, +flask/__pycache__/sessions.cpython-311.pyc,, +flask/__pycache__/signals.cpython-311.pyc,, +flask/__pycache__/templating.cpython-311.pyc,, +flask/__pycache__/testing.cpython-311.pyc,, +flask/__pycache__/typing.cpython-311.pyc,, +flask/__pycache__/views.cpython-311.pyc,, +flask/__pycache__/wrappers.cpython-311.pyc,, +flask/app.py,sha256=ue4tEeDnr3m-eSEwz7OJ1_wafSYl3fl6eo-NLFgNNJQ,99141 +flask/blueprints.py,sha256=fenhKP_Sh5eU6qtWeHacg1GVeun4pQzK2vq8sNDd1hY,27266 +flask/cli.py,sha256=pLmnWObe_G4_ZAFQdh7kgwqPMxRXm4oUhaUSBpJMeq4,33532 +flask/config.py,sha256=Ubo_juzSYsAKqD2vD3vm6mjsPo3EOJDdSEzYq8lKTJI,12585 +flask/ctx.py,sha256=bGEQQuF2_cHqZ3ZNMeMeEG8HOLJkDlL88u2BBxCrRao,14829 +flask/debughelpers.py,sha256=_RvAL3TW5lqMJeCVWtTU6rSDJC7jnRaBL6OEkVmooyU,5511 +flask/globals.py,sha256=EX0XdX73BTWdVF0UHDSNet2ER3kI6sKveo3_o5IOs98,3187 +flask/helpers.py,sha256=XTHRgLlyxeEzR988q63-4OY8RswTscR-5exFxK10CLU,25280 +flask/json/__init__.py,sha256=TOwldHT3_kFaXHlORKi9yCWt7dbPNB0ovdHHQWlSRzY,11175 +flask/json/__pycache__/__init__.cpython-311.pyc,, +flask/json/__pycache__/provider.cpython-311.pyc,, +flask/json/__pycache__/tag.cpython-311.pyc,, +flask/json/provider.py,sha256=jXCNypf11PN4ngQjEt6LnSdCWQ1yHIAkNLHlXQlCB-A,10674 +flask/json/tag.py,sha256=fys3HBLssWHuMAIJuTcf2K0bCtosePBKXIWASZEEjnU,8857 +flask/logging.py,sha256=WYng0bLTRS_CJrocGcCLJpibHf1lygHE_pg-KoUIQ4w,2293 +flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask/scaffold.py,sha256=EKx-Tr5BXLzeKKvq3ZAi_2oUQVZuC4OJSJTocyDXsSo,35958 +flask/sessions.py,sha256=adWCRnJYETJcjjhlcvUgZR5S0DMqKQctS0nzkY9g9Us,15927 +flask/signals.py,sha256=H7QwDciK-dtBxinjKpexpglP0E6k0MJILiFWTItfmqU,2136 +flask/templating.py,sha256=1P4OzvSnA2fsJTYgQT3G4owVKsuOz8XddCiR6jMHGJ0,7419 +flask/testing.py,sha256=JtHRQY7mIH39SM4S51svAr8e7Xk87dqMb30Z6Dyv9TA,10706 +flask/typing.py,sha256=KgxegTF9v9WvuongeF8LooIvpZPauzGrq9ZXf3gBlYc,2969 +flask/views.py,sha256=LulttWL4owVFlgwrJi8GCNM4inC3xbs2IBlY31bdCS4,6765 +flask/wrappers.py,sha256=el3tn1LgSUV0eNGgYMjKICT5I7qGJgbpIhvci4nrwQ8,5702 diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/REQUESTED b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/WHEEL b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/WHEEL new file mode 100644 index 0000000..1f37c02 --- /dev/null +++ b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/entry_points.txt b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/entry_points.txt new file mode 100644 index 0000000..137232d --- /dev/null +++ b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +flask = flask.cli:main diff --git a/lib/python3.11/site-packages/Flask-2.2.5.dist-info/top_level.txt b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/top_level.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/lib/python3.11/site-packages/Flask-2.2.5.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +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. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +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/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA new file mode 100644 index 0000000..f54bb5c --- /dev/null +++ b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/METADATA @@ -0,0 +1,113 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 3.1.2 +Summary: A very fast and expressive template engine. +Home-page: https://palletsprojects.com/p/jinja/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/jinja/ +Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: MarkupSafe (>=2.0) +Provides-Extra: i18n +Requires-Dist: Babel (>=2.7) ; extra == 'i18n' + +Jinja +===== + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Jinja2 + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +In A Nutshell +------------- + +.. code-block:: jinja + + {% extends "base.html" %} + {% block title %}Members{% endblock %} + {% block content %} +

+ {% endblock %} + + +Donate +------ + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://jinja.palletsprojects.com/ +- Changes: https://jinja.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Jinja2/ +- Source Code: https://github.com/pallets/jinja/ +- Issue Tracker: https://github.com/pallets/jinja/issues/ +- Website: https://palletsprojects.com/p/jinja/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD new file mode 100644 index 0000000..b145ed2 --- /dev/null +++ b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/RECORD @@ -0,0 +1,59 @@ +Jinja2-3.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-3.1.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Jinja2-3.1.2.dist-info/METADATA,sha256=PZ6v2SIidMNixR7MRUX9f7ZWsPwtXanknqiZUmRbh4U,3539 +Jinja2-3.1.2.dist-info/RECORD,, +Jinja2-3.1.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Jinja2-3.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +Jinja2-3.1.2.dist-info/entry_points.txt,sha256=zRd62fbqIyfUpsRtU7EVIFyiu1tPwfgO7EvPErnxgTE,59 +Jinja2-3.1.2.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=8vGduD8ytwgD6GDSqpYc2m3aU-T7PKOAddvVXgGr_Fs,1927 +jinja2/__pycache__/__init__.cpython-311.pyc,, +jinja2/__pycache__/_identifier.cpython-311.pyc,, +jinja2/__pycache__/async_utils.cpython-311.pyc,, +jinja2/__pycache__/bccache.cpython-311.pyc,, +jinja2/__pycache__/compiler.cpython-311.pyc,, +jinja2/__pycache__/constants.cpython-311.pyc,, +jinja2/__pycache__/debug.cpython-311.pyc,, +jinja2/__pycache__/defaults.cpython-311.pyc,, +jinja2/__pycache__/environment.cpython-311.pyc,, +jinja2/__pycache__/exceptions.cpython-311.pyc,, +jinja2/__pycache__/ext.cpython-311.pyc,, +jinja2/__pycache__/filters.cpython-311.pyc,, +jinja2/__pycache__/idtracking.cpython-311.pyc,, +jinja2/__pycache__/lexer.cpython-311.pyc,, +jinja2/__pycache__/loaders.cpython-311.pyc,, +jinja2/__pycache__/meta.cpython-311.pyc,, +jinja2/__pycache__/nativetypes.cpython-311.pyc,, +jinja2/__pycache__/nodes.cpython-311.pyc,, +jinja2/__pycache__/optimizer.cpython-311.pyc,, +jinja2/__pycache__/parser.cpython-311.pyc,, +jinja2/__pycache__/runtime.cpython-311.pyc,, +jinja2/__pycache__/sandbox.cpython-311.pyc,, +jinja2/__pycache__/tests.cpython-311.pyc,, +jinja2/__pycache__/utils.cpython-311.pyc,, +jinja2/__pycache__/visitor.cpython-311.pyc,, +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=dHlbTeaxFPtAOQEYOGYh_PHcDT0rsDaUJAFDl_0XtTg,2472 +jinja2/bccache.py,sha256=mhz5xtLxCcHRAa56azOhphIAe19u1we0ojifNMClDio,14061 +jinja2/compiler.py,sha256=Gs-N8ThJ7OWK4-reKoO8Wh1ZXz95MVphBKNVf75qBr8,72172 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=iWJ432RadxJNnaMOPrjIDInz50UEgni3_HKuFXi2vuQ,6299 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=6uHIcc7ZblqOMdx_uYNKqRnnwAF0_nzbyeMP9FFtuh4,61349 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=ivr3P7LKbddiXDVez20EflcO3q2aHQwz9P_PgWGHVqE,31502 +jinja2/filters.py,sha256=9js1V-h2RlyW90IhLiBGLM2U-k6SCy2F4BUUMgB3K9Q,53509 +jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704 +jinja2/lexer.py,sha256=DW2nX9zk-6MWp65YR2bqqj0xqCvLtD-u9NWT8AnFRxQ,29726 +jinja2/loaders.py,sha256=BfptfvTVpClUd-leMkHczdyPNYFzp_n7PKOJ98iyHOg,23207 +jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396 +jinja2/nativetypes.py,sha256=DXgORDPRmVWgy034H0xL8eF7qYoK3DrMxs-935d0Fzk,4226 +jinja2/nodes.py,sha256=i34GPRAZexXMT6bwuf5SEyvdmS-bRCy9KMjwN5O6pjk,34550 +jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650 +jinja2/parser.py,sha256=nHd-DFHbiygvfaPtm9rcQXJChZG7DPsWfiEsqfwKerY,39595 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=5CmD5BjbEJxSiDNTFBeKCaq8qU4aYD2v6q2EluyExms,33476 +jinja2/sandbox.py,sha256=Y0xZeXQnH6EX5VjaV2YixESxoepnRbW_3UeQosaBU3M,14584 +jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905 +jinja2/utils.py,sha256=u9jXESxGn8ATZNVolwmkjUVu4SA-tLgV0W7PcSfPfdQ,23965 +jinja2/visitor.py,sha256=MH14C6yq24G_KVtWzjwaI7Wg14PCJIYlWW1kpkxYak0,3568 diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/REQUESTED b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL new file mode 100644 index 0000000..becc9a6 --- /dev/null +++ b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt new file mode 100644 index 0000000..7b9666c --- /dev/null +++ b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[babel.extractors] +jinja2 = jinja2.ext:babel_extract[i18n] diff --git a/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt new file mode 100644 index 0000000..7f7afbf --- /dev/null +++ b/lib/python3.11/site-packages/Jinja2-3.1.2.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst new file mode 100644 index 0000000..9d227a0 --- /dev/null +++ b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +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. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +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/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA new file mode 100644 index 0000000..bced165 --- /dev/null +++ b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/METADATA @@ -0,0 +1,93 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 2.1.3 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/markupsafe/ +Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/ +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + + >>> # escape replaces special characters and wraps in Markup + >>> escape("") + Markup('<script>alert(document.cookie);</script>') + + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup("Hello") + Markup('hello') + + >>> escape(Markup("Hello")) + Markup('hello') + + >>> # Markup is a str subclass + >>> # methods and operators escape their arguments + >>> template = Markup("Hello {name}") + >>> template.format(name='"World"') + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://markupsafe.palletsprojects.com/ +- Changes: https://markupsafe.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/MarkupSafe/ +- Source Code: https://github.com/pallets/markupsafe/ +- Issue Tracker: https://github.com/pallets/markupsafe/issues/ +- Chat: https://discord.gg/pallets diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD new file mode 100644 index 0000000..2c8dc43 --- /dev/null +++ b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/RECORD @@ -0,0 +1,15 @@ +MarkupSafe-2.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-2.1.3.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +MarkupSafe-2.1.3.dist-info/METADATA,sha256=Wvvh4Tz-YtW24YagYdqrrrBdm9m-DjTdqJWhxlbU6-0,3003 +MarkupSafe-2.1.3.dist-info/RECORD,, +MarkupSafe-2.1.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +MarkupSafe-2.1.3.dist-info/WHEEL,sha256=8KU227XctfdX2qUwyjQUO-ciQuZtmyPUCKmeGV6Byto,152 +MarkupSafe-2.1.3.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=xIItqrn1Bwi7FxPJO9rCVQBG0Evewue1Tl4BV0l9xEs,10338 +markupsafe/__pycache__/__init__.cpython-311.pyc,, +markupsafe/__pycache__/_native.cpython-311.pyc,, +markupsafe/_native.py,sha256=GR86Qvo_GcgKmKreA1WmYN9ud17OFwkww8E-fiW-57s,1713 +markupsafe/_speedups.c,sha256=X2XvQVtIdcK4Usz70BvkzoOfjTCmQlDkkjYSn-swE0g,7083 +markupsafe/_speedups.cpython-311-x86_64-linux-gnu.so,sha256=7e82QrIqSWEZfAkAJBQHPuVy7ci8nD07GQHDlGXn1hU,53656 +markupsafe/_speedups.pyi,sha256=vfMCsOgbAXRNLUXkyuyonG8uEWKYU4PDqNuMaDELAYw,229 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/REQUESTED b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL new file mode 100644 index 0000000..3bed0cb --- /dev/null +++ b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: false +Tag: cp311-cp311-manylinux_2_17_x86_64 +Tag: cp311-cp311-manylinux2014_x86_64 + diff --git a/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/lib/python3.11/site-packages/MarkupSafe-2.1.3.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +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. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +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/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/METADATA b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/METADATA new file mode 100644 index 0000000..647bfc8 --- /dev/null +++ b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/METADATA @@ -0,0 +1,126 @@ +Metadata-Version: 2.1 +Name: Werkzeug +Version: 2.2.3 +Summary: The comprehensive WSGI web application library. +Home-page: https://palletsprojects.com/p/werkzeug/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://werkzeug.palletsprojects.com/ +Project-URL: Changes, https://werkzeug.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/werkzeug/ +Project-URL: Issue Tracker, https://github.com/pallets/werkzeug/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: MarkupSafe (>=2.1.1) +Provides-Extra: watchdog +Requires-Dist: watchdog ; extra == 'watchdog' + +Werkzeug +======== + +*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") + +Werkzeug is a comprehensive `WSGI`_ web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +- An interactive debugger that allows inspecting stack traces and + source code in the browser with an interactive interpreter for any + frame in the stack. +- A full-featured request object with objects to interact with + headers, query args, form data, files, and cookies. +- A response object that can wrap other WSGI applications and handle + streaming data. +- A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables + from URLs. +- HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +- A threaded WSGI server for use while developing applications + locally. +- A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug doesn't enforce any dependencies. It is up to the developer to +choose a template engine, database adapter, and even how to handle +requests. It can be used to build all sorts of end user applications +such as blogs, wikis, or bulletin boards. + +`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + +.. _WSGI: https://wsgi.readthedocs.io/en/latest/ +.. _Flask: https://www.palletsprojects.com/p/flask/ + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Werkzeug + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + from werkzeug.wrappers import Request, Response + + @Request.application + def application(request): + return Response('Hello, World!') + + if __name__ == '__main__': + from werkzeug.serving import run_simple + run_simple('localhost', 4000, application) + + +Donate +------ + +The Pallets organization develops and supports Werkzeug and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://werkzeug.palletsprojects.com/ +- Changes: https://werkzeug.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Werkzeug/ +- Source Code: https://github.com/pallets/werkzeug/ +- Issue Tracker: https://github.com/pallets/werkzeug/issues/ +- Website: https://palletsprojects.com/p/werkzeug/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/RECORD b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/RECORD new file mode 100644 index 0000000..2b4700d --- /dev/null +++ b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/RECORD @@ -0,0 +1,99 @@ +Werkzeug-2.2.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Werkzeug-2.2.3.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Werkzeug-2.2.3.dist-info/METADATA,sha256=TIyameVEp5p52N9E1mTWWabY6g1sB0Dm25vznZQeXPQ,4416 +Werkzeug-2.2.3.dist-info/RECORD,, +Werkzeug-2.2.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Werkzeug-2.2.3.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92 +Werkzeug-2.2.3.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +werkzeug/__init__.py,sha256=Hr0lQweC21HXPVBemSpBJUIzrbq2mn8h70J1h30QcqY,188 +werkzeug/__pycache__/__init__.cpython-311.pyc,, +werkzeug/__pycache__/_internal.cpython-311.pyc,, +werkzeug/__pycache__/_reloader.cpython-311.pyc,, +werkzeug/__pycache__/datastructures.cpython-311.pyc,, +werkzeug/__pycache__/exceptions.cpython-311.pyc,, +werkzeug/__pycache__/formparser.cpython-311.pyc,, +werkzeug/__pycache__/http.cpython-311.pyc,, +werkzeug/__pycache__/local.cpython-311.pyc,, +werkzeug/__pycache__/security.cpython-311.pyc,, +werkzeug/__pycache__/serving.cpython-311.pyc,, +werkzeug/__pycache__/test.cpython-311.pyc,, +werkzeug/__pycache__/testapp.cpython-311.pyc,, +werkzeug/__pycache__/urls.cpython-311.pyc,, +werkzeug/__pycache__/user_agent.cpython-311.pyc,, +werkzeug/__pycache__/utils.cpython-311.pyc,, +werkzeug/__pycache__/wsgi.cpython-311.pyc,, +werkzeug/_internal.py,sha256=4lwshe63pFlCo0h2IMcmvhbugA50QXQvfLD5VoY5c4Q,16271 +werkzeug/_reloader.py,sha256=hiP0z4bi6p_8UIJOtq7K0BV2dqCik5yztWLsDXeI_WE,14285 +werkzeug/datastructures.py,sha256=v2WYfs1rb1OuQgXyLripHQFwgodrfTNCd5P5f8n3ueA,97081 +werkzeug/datastructures.pyi,sha256=HRzDLc7A6qnwluhNqn6AT76CsLZIkAbVVqxn0AbfV-s,34506 +werkzeug/debug/__init__.py,sha256=wfJ2OmljsO5C0e0sXJpTUiG6bwGU6uHtFDDDMfJfQJk,18877 +werkzeug/debug/__pycache__/__init__.cpython-311.pyc,, +werkzeug/debug/__pycache__/console.cpython-311.pyc,, +werkzeug/debug/__pycache__/repr.cpython-311.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-311.pyc,, +werkzeug/debug/console.py,sha256=dechqiCtHfs0AQZWZofUC1S97tCuvwDgT0gdha5KwWM,6208 +werkzeug/debug/repr.py,sha256=vF3TLnYBohYr8V6Gz13PTJspQs42uv3gUJSzSbmHJBo,9472 +werkzeug/debug/shared/ICON_LICENSE.md,sha256=DhA6Y1gUl5Jwfg0NFN9Rj4VWITt8tUx0IvdGf0ux9-s,222 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=tg42SZs1SVmYWZ-_Fj5ELK5-FLHnGNQrei0K2By8Bw8,10521 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/style.css,sha256=-xSxzUEZGw_IqlDR5iZxitNl8LQUjBM-_Y4UAvXVH8g,6078 +werkzeug/debug/tbtools.py,sha256=6iohJovtBSFRAcgX7_aRY4r3e19PLj3FavYB3RM4CmA,13263 +werkzeug/exceptions.py,sha256=8-KOXguQkOLoBUdN-7x_WyHT92TcAmjTWNwG4t8QYIg,26527 +werkzeug/formparser.py,sha256=DBRbbAnzspYUBzgfxPaZC7MjGAK_m5QTvdWoyvrhw4o,16516 +werkzeug/http.py,sha256=NqJjYCt8tKn2XOEKPApq4L3q8zb8YFq3GFOe5gsonI4,42776 +werkzeug/local.py,sha256=v-HEqr4bLpLHl4upCj97MOfUyCjW10Tp6mcNaFRFyew,22288 +werkzeug/middleware/__init__.py,sha256=qfqgdT5npwG9ses3-FXQJf3aB95JYP1zchetH_T3PUw,500 +werkzeug/middleware/__pycache__/__init__.cpython-311.pyc,, +werkzeug/middleware/__pycache__/dispatcher.cpython-311.pyc,, +werkzeug/middleware/__pycache__/http_proxy.cpython-311.pyc,, +werkzeug/middleware/__pycache__/lint.cpython-311.pyc,, +werkzeug/middleware/__pycache__/profiler.cpython-311.pyc,, +werkzeug/middleware/__pycache__/proxy_fix.cpython-311.pyc,, +werkzeug/middleware/__pycache__/shared_data.cpython-311.pyc,, +werkzeug/middleware/dispatcher.py,sha256=Fh_w-KyWnTSYF-Lfv5dimQ7THSS7afPAZMmvc4zF1gg,2580 +werkzeug/middleware/http_proxy.py,sha256=HE8VyhS7CR-E1O6_9b68huv8FLgGGR1DLYqkS3Xcp3Q,7558 +werkzeug/middleware/lint.py,sha256=1w_UVKkAwq5wjjtCcDCDZwhAhWzPSZ0aDyUmbjAEeXw,13952 +werkzeug/middleware/profiler.py,sha256=7pWYDYPC774S0-HYLkG3Uge58PGUMX7tWp_Cor3etvo,4883 +werkzeug/middleware/proxy_fix.py,sha256=l7LC_LDu0Yd4SvUxS5SFigAJMzcIOGm6LNKl9IXJBSU,6974 +werkzeug/middleware/shared_data.py,sha256=fXjrEkuqxUVLG1DLrOdQLc96QQdjftCBZ1oM5oK89h4,9528 +werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/routing/__init__.py,sha256=HpvahY7WwkLdV4Cq3Bsc3GrqNon4u6t8-vhbb9E5o00,4819 +werkzeug/routing/__pycache__/__init__.cpython-311.pyc,, +werkzeug/routing/__pycache__/converters.cpython-311.pyc,, +werkzeug/routing/__pycache__/exceptions.cpython-311.pyc,, +werkzeug/routing/__pycache__/map.cpython-311.pyc,, +werkzeug/routing/__pycache__/matcher.cpython-311.pyc,, +werkzeug/routing/__pycache__/rules.cpython-311.pyc,, +werkzeug/routing/converters.py,sha256=05bkekg64vLC6mqqK4ddBh589WH9yBsjtW8IJhdUBvw,6968 +werkzeug/routing/exceptions.py,sha256=RklUDL9ajOv2fTcRNj4pb18Bs4Y-GKk4rIeTSfsqkks,4737 +werkzeug/routing/map.py,sha256=XN4ZjzEF1SfMxtdov89SDE-1_U78KVnnobTfnHzqbmE,36757 +werkzeug/routing/matcher.py,sha256=6VvQYCCOjyj1JKUZKuAiVA_U1nXtvvJ70pSbBUdL_1k,7509 +werkzeug/routing/rules.py,sha256=3YsPpI9ZGcNmFiV2Go2Td1DvZ9ZdaMMnvGP1o17aMfc,31836 +werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/sansio/__pycache__/__init__.cpython-311.pyc,, +werkzeug/sansio/__pycache__/http.cpython-311.pyc,, +werkzeug/sansio/__pycache__/multipart.cpython-311.pyc,, +werkzeug/sansio/__pycache__/request.cpython-311.pyc,, +werkzeug/sansio/__pycache__/response.cpython-311.pyc,, +werkzeug/sansio/__pycache__/utils.cpython-311.pyc,, +werkzeug/sansio/http.py,sha256=k3nREBfU-r8fXCfSTKQenys25q9bzUOvdY-OVGrqztA,5107 +werkzeug/sansio/multipart.py,sha256=vMZ85cvLD55clUTcTin2DtBv2GQRGh0_fExklnXKHoI,10055 +werkzeug/sansio/request.py,sha256=SiGcx2cz-l81TlCCrKrT2fePqC64hN8fSg5Ig6J6vRs,20175 +werkzeug/sansio/response.py,sha256=UTl-teQDDjovrZMkjj3ZQsHw-JtiFak5JfKEk1_vBYU,26026 +werkzeug/sansio/utils.py,sha256=EjbqdHdT-JZWgjUQaaWSgBUIRprXUkrsMQQqJlJHpVU,4847 +werkzeug/security.py,sha256=7TVI0L62emBHAh-1RHB_KlwGYcE08pPCyU674Ho4aNE,4653 +werkzeug/serving.py,sha256=XCiHFbMCFCgecKycgajhF4rFsGoemeN0xW1eTQqNt-g,37558 +werkzeug/test.py,sha256=uMahfM81RqEN3d3Sp4SkN36Pi8oZpV6dTgFY0cW1_2c,48126 +werkzeug/testapp.py,sha256=RJhT_2JweNiMKe304N3bF1zaIeMpRx-CIMERdeydfTY,9404 +werkzeug/urls.py,sha256=Q9Si-eVh7yxk3rwkzrwGRm146FXVXgg9lBP3k0HUfVM,36600 +werkzeug/user_agent.py,sha256=WclZhpvgLurMF45hsioSbS75H1Zb4iMQGKN3_yZ2oKo,1420 +werkzeug/utils.py,sha256=BDX5_7OCMVgl-ib84bCEdBG5MVvrxaSlfdg7Cxh4ND0,25174 +werkzeug/wrappers/__init__.py,sha256=kGyK7rOud3qCxll_jFyW15YarJhj1xtdf3ocx9ZheB8,120 +werkzeug/wrappers/__pycache__/__init__.cpython-311.pyc,, +werkzeug/wrappers/__pycache__/request.cpython-311.pyc,, +werkzeug/wrappers/__pycache__/response.cpython-311.pyc,, +werkzeug/wrappers/request.py,sha256=XmpTThXytTdznbPJnIsfdoIAvdi-THzTJQ9DsvARhn4,24026 +werkzeug/wrappers/response.py,sha256=ii1IaN2eUfoB-tBqbn_46fCB_SVVL8Fu4qd6cu0AlEY,34963 +werkzeug/wsgi.py,sha256=-VKI2iwCgLb-VToIZeBpdutkTETxy9HkIwgcFC5orkU,36060 diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/REQUESTED b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/WHEEL b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/WHEEL new file mode 100644 index 0000000..57e3d84 --- /dev/null +++ b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.38.4) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt new file mode 100644 index 0000000..6fe8da8 --- /dev/null +++ b/lib/python3.11/site-packages/Werkzeug-2.2.3.dist-info/top_level.txt @@ -0,0 +1 @@ +werkzeug diff --git a/lib/python3.11/site-packages/_brotli.cpython-311-x86_64-linux-gnu.so b/lib/python3.11/site-packages/_brotli.cpython-311-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..59c5bbf399a2d923fe8636dbe6c1f5ee625fdc0d GIT binary patch literal 6625080 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%0A3zV@feu`aueJmnUWE+Fg|@~~?=D{)ITi8v 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 z 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

f{$;bxLn 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�T88g;##zP6HTtgoM3Xl zC)s*ly!yJkp17w^kjweaj$agCU94lk51H?k!<)#>xjR!*JhXJrb3T7J?|MG0lAJDX zt-Ac_L`p-fkao7o!|M`Gy68RjjFp$ffh?J|lN;xMRyiUFKckeDoQchiLuG zXSkmpxRdO}8p-i`Dt2erdcE7<@vi>bnV*xk%mYkGdP^^FsZV!MT?U&Mz4jFQ`Ja(v zyS8>6dU+Z9FXqvos1J#)z>lWhmX&5fmh-be9Wlcf?7$1o;4rZP#3r49PeJVRxU>F^ zwU_l1Kc>Z|EzM6ojy@X9ddp?WL+*R; zY)!JazkkQw)$h+o%DbP>9+mI$9}aUT^or}*PJLHZZ(G%z1ocL1K5O}iQ*c%*um=

f%tU+c6B&}hLJuPB`x6u%~WkoazCG_cBaY-lL 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

FQ@JOXIWpRivjOf-MRw(Ua?;e1`DX4;W#1C} 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 z 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⩔=V>cbhr@3E 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 Vp+5ph(5awpCwC^C6r=u(nZCd_;*+S&25Q)Q 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�V>c8?nw^u?u+opo)J55Kp(Q~ayEGB_|8@DUiBI8le*7o&YJh} z|LKEC>SAWI+tY^gZK(Iu`C{+WVe2{fd#xev-e1Id_mQOw?CV8Y8t^9a7jO&k4dJ)g z0<{=22){+Y50L9Yc31wAjBSxM&A!9s;%Chg)-P_x1o^zkdt59xJDRTiqx`1;6wa zd$EnUvg*uc+M@^k{bK%o0losh#(=MpADN3E&HZo>;mMp)#-6|_r0`z;4xY^Iugi1B zi83SAHAlhCjiM7qsjr;rCrf#~Qe08W<;s~`XS-+4PL8SGnG@P0w`#@(|91-iquaTv zUGq84CgWAIwZ8jyk$u~Rt@@Jxd!ze!6IocwGuQZe{}3mw!EJ3Z(w$M1WTEd0UR zm3*HDZ@RVT-r47k_uP1N#D2LPUJ-Cg2Aq;+;}-#^WWXg69)_#CiOk0w3{J_gBspo3 zlMCetM)Nsuq2IcE)@pe>xyD^P$^Rchj~z60N^&Tx6I55_hCQp|E`~n{{Dg%&c}fB z(M(i17XAUwM;NXej9b6DntAGES+7TUj_w$lH*t-$;8hwSazMTdZ?F^joe4X3nrFeU zs7I@XAF6@dBxkeLj>*Dp{Px9sZ^VS|Ce^KpR24R`v3FnutkY^>1OSz}!QOolVl*`fQbYH-U7;qxOA~wir1~;X~ zlXcPG!_85eCf4qz<63Y@nK>%m@+pHXz1X)f7fxQiG=oqNOJ}a?j@}!Vh)%-?NMGOp z4Duc7RaLq7(80Un0EA1g>#Oa8MVzF5StPJW`rOT92nYIib{FkQZ5oVuWyXF zqYdoa%%Y*zn3W&!Nj7)h2k_@cI^$RD<v7}zKK+Am(Py(PmTg+(=+4!lUu`oYoBg(Cb;>+ z2kv_Gm2vaIf>%4-zPS1HSh|P)#LXARIV;?J<|Nc{Z`I|H27?)T?qS=!OS3AxKU|W$ z?=(Gqsrp(IKB$#E=^TH~n&mbA`$5>Y*oS_#vy1&Fzwy5FT9Ko66FGsDp1RALpHBSN zx{N&UOJ|*7ea#+YI*?DpIcPnhuU6(kJv-y?*5GDlsDbg<*%|n3@#+9y)qH;UarL5` z45m;C>Tdq7k1btwsJNUwPqA-tzLq>=tou8I0uIjHA3Ez^ckcxGy^q|xMLZuq5c6W{ zu*_Y4uM6&Jk{ORv{7x=LXyX4X%KPM%6Snml?{}j0FMbq`4p;;8A%~6fZ=>V@r|FR~ zYaCzkQugc?cj+-_fS*tP3CBBqaxDD;3nZ=`jB`mkaq&s?(i-A5xFC7s+}q~-L45-5 zHC#{v7nHySsr%R9MQeOO{d4^FgUP*FM)EXdl+8Gbyu<$JH!9&cYG(P?#Km>^ih76J z316RF9Bj99$Jd8D4i~c6{5$$IVt(=UnKw~4SEU}zeo_PKk`J4t9%YUjyMtUWVoLM~ zw2~vzDdrKIsUgn((X(#lZjVa&h_F>}!>IfuzFgRT>*vNTQYnAujx9z8*6=&;*|*Z3 zUtzD#vFBa(yxV>LE!#Mf4U746zn^?lG;tX6|J=PDtUtJavB%(2x@JlD_!JA@U%>Yl zK5?J_=kDP7liRGSA5_(Lt8nLLXj|LUOXID_$k1BkAJ1R-(Aw5L!1E^u5^!k+eJuXJ zeHr69@%))-4kKjGma}%T@ciL1E%nBgIMB*qu9jL|jeWzJYT^0g!`1C`U9V1EzjU20 z?9#(N+?^gSH#Gv@XcW1f9>&Xl!1yt?}bE2Y04e-!;a z(M;9YPaoX5lgR~)6nw}?wVPR_qM`4tNcL1~@o(&Qg&wHrQ>wz+n&04TzxABs;bH$q zKg`E&Htg}DWDABWX-e_HP{D%f72`u^o}uuW!`Q@#hq{Mv{UhCj*Dv7p3l;w0SM2LT zVzqC{#dY2R4<;EgCxG7Dl#M$_kIb{q`XT2WF>UudYn4HBwam2e{GU79v(mO1f9+(B zTp6qs*&PtKrE2$?8nF2&NO|GNiOa?PZzU3&n7MD z-L_|2-e=?gNB$3&nONApz0}V>K#o@wKc2z)n>&kptAH=^UNA`sOi}`qBu8a7 zqy>}Inbi)H#AD1#c?UC_+As?#Up|jDpmIww%VzZcc;CB{-xXFcVS>+iW7=L5YqPL9h=cym+CHlY{) zDL?p@J-*F7!RIHBUX*W1QQ%F3N$xklreTJ4pBeISQS|)cDL;%{$9WN5?A#omF+bYfF5e$;Wi7GkHgPvPCa1;{Tr|_qRQXUCti70)IB% zvyJdM{q_-_N54$onR|JRyp?+itJ9?yZUi|W8S^>in{2ATH=C%-{Q40vf>U6z>agAL zsPypmV!Oq~5R2GpGb_!8nB}+42=$z?=iv(XBKG3%Vh9`&4at2-&;7XdwUv{ReJy>F@|vYtJ|%8>e`g(FwXBP+*_QL^%;~KRr(4_>mF;i^^`rE?rhz8b$>GotqtA7-&;Kv4n{G% zd56~b)=$=0wrU4!Cu?Wx2riVGYftMC>uBpla=EItrnQr`i?zE2 zk0I|f%Do<)EMrCd*!JSwdEB|<7zOf1n@j%qUdR*ks$mjd)`@NoH`C&aU`i(G=-~B6k@C3SgMY`-~y1&ak)fZ5n z;I8gN|8A+K7;!QD?9wa;JVvFN7P#=d$A0t)pGWNEA_DTupL-U(r>)Y^`2KeR5OT!OUFpZZZ92wcZqObvt=B ztC}&J!wVGwFQS^iS>9|eUPN^WeFFRloQU#c>d$H*NAVeUZD8;8>y zG0uE~&7H%K`afrMW7g1rk;i^$wc-jN(cBQ9`33(1Zy|pr6;Gr=?XQ$;Q3oqZxfZi5 zs&M{6ZB?F+ew1sG|B^Fif8|=tHL2^ht(S5wa?@SrT6Dop;~qE5U#Yo^Osvz}(~&3fsg_o(Z^n|fY&x_~!POseOX?%IJo-Q#^? zy#k(2Pfjmirm5cFgKM^#z{9DlHp!_Od3=O5J=b;CQn>S2ReTk=$w2>%)ePE3bK%RPsIb06gwz27jOu^k`dtW50V`xZ~@WQJ|CmXrI`bqtei z)}9Lc;5r(#69z+G6%ltfXB!0y3b(-1d-0U9b<;?H`=>xzm!>8F&PO%u;ldMhd zZshme?EQCh{^R9s&D%7KlHY0JLk##3&2?8xvv48?oQQf1rovj770f^Q)IHfS&&*TG zant-kiH8=Q^3XbGn`KE?^SQ{3k&)n-&PA=1{99b9(ISo9I-gR^ammTdU z`*5Bd80?yQP79YGE|8+7m%Jz+mzTO${_0fm*LCcEoC!5C8;yS_GvC=9CEx#%IWt$Q zk?hU?i&zD`i0XK$yet`Zha+}r51;iUdAODDIa|H>PBv?6HsxI3y8&H(tTo4qTwVjP z)0@+kQ^*5OMS0s&KYmTmWq(-8cgZV};mKqe|2ZG)E8p{^Js)jtX&vK^zyNx-LG{7B z!&ko@or!Cy+|r(J?jD)HW#)N*`CHF+b=K#;i2doxXY><|x7Q2Wt2e#xf9RE#z1Ev& z9!tivOxj*#{Y>)s zDOY-Dc@daI{^S@r&_a!{PkuAQP2D!Td8&Q1=X|G&?W0+g{9v;R>E314k9Q}Rcp2ed z%&0Ev{P=o#Ab;sg`wyQEQ(ZCpQeQD2Z45oO7Wv#Q>owyrGZWc7dNPflG0f$M!pL=e z4j4IpiT+CG0wae%Pu;@VL|X}OTps1SM_8}YMV}4n!P(K)*V?W3xm`<0D$Vuc(!JgdS0-*)a~kQZ-JQz}n83q4(~|tC^M>`9NtQbIOg)8N@=Wi^w>{)+ z;okUA;^j0~W6Akug!Iln|Z(3A^d{)clriHlUrns}6Dsy@A_NtSqlB zj+sC2!D*VZ0hzi;7Vsv1{3f7$cj*@sKiD=*HSGCi|z z+D^U~2fypC+%Ko{f-~x(3-COu)tl8}uMeV^XXLH$Qm!vH$5UJAKb8x@?lTe+(l zMh0SUGCs+GPZGWthE8AAW_0?={JxdQ-wdC%66_KF33czbI1%SF9eO|gw!Jlu4qM&b zKg5i$efT@E4tyj1G}U*S!CxLs4tB8bU)b|rKmR*-FV>jOB?JGU8&~lT@O5J7rkUmD zv3tMQJdgQ&@)^0AlI?(hQf{kXuUH=r*qMB!LVda@FW~bn=QH7P_!XXmzqg)x`Vew+ zB0anRP}oPlD8BkICC&H@Rki3|Sm7S|?Up#iTzGaJCJ)}ZiVHY&`lev=5|})Gcvk|G z$Dk4j+jNa8%O53~5*sXTE8=aH$875W6s$l>EXZvCm4>dd=iK2`0sA?Mi- zSKg0{B28fH%rV8IXiqjJd#}g`?&K_fB72L_5BM-+JwrTLB=^yy@N#?)ecYZAUM_)` zgWoLqZ|b?86JAanslTG=mh(`r^}B~!@N!}U+?{k;gZ*5Utej3}@n`B;&f&U>PG6*X z)6O+hqk%&w2ao&vo%!5j=tP)0+^(7Wni?}bvXwvK>G(D+JTQ8h_|JbKC+-MQ&y(L<+0^H(4=w$IX8etC zKc@Tr(PEe!e!K`%)xsZj&(F;pV%kivrui+tZ&{yT@%byLV|?!pJWQT`<9T18o5vS* z94K{o?kUbR)w86g>I~i?t6f<`On@WB-^ulxiJUrPm^^;T)1rp2+{Jm)R`PV#(zo7_ z`{)v1PVeZu2|oKb>PGl2^>p=ym;LNzZf=AAEXXxXoO9|`SIXJ>$?zX7F@br1e(x)F z^%@zxBTHcrb6F&u?QGFC&JE@bHVZb!na6k-<}G>AyW_SrBMpB$-SANwQ36H4Z5eP| zc6@l;mh^gEd{C$Rr@>L_kF-bYJDcz9)4|SXV%jg4jH5~n^Qd!)T%PmLlN)>Ym7V3` z@=|{!2mi-T+`~20+sW~)#1~nRZ0Kb&e`#u*xyEiZ!}s>^JkO3N zQVdmygIc&k&Gh8I^Ht5mZOTfv-0e|=47 z_JAJOUEIH8=%d*4zXrQE(_MJL**zm)x;eWWYwrK?4v~-W0pI(D1tZ442nmdsx?WwZ zfxEzh5#uM}2>-6Qph><4KdL+z`U~dniZ{s_CDJFT{x#Ec= z-&0}Y;84x(!3!zY3wm`+bIA3;_!+#A^WGG_og zMz`tFa9^Kf556a_cd66fG{e}_E1#(r#P-)>|NW8bc` zp?fL`jF^7PemFSX?{wLW48LWe%H@8Y;xp7iwKlUNhuclV zhQlfiPd>Ddw_A5v4_Yr;AM(Ig@%is~-{?!6owdX6?!}J z+Hbvt>Uq8aPca7|_<_^$Ik_wJta5YH_) zQC{xP4?X{P?Fo)c@pe18f_z5q_A{M- z#E3o2-rUAtyF11}L*|jIoX5Ua#ROF{UG3yyuJE1LT2(y}Bka$XVix|kd8zu@=;d8} z-$TyfO#1i$wruAN2Z3jQnqU5^efrFOgaMNSZgn^eV7ZcrkA>yx^zOrQ;aRQ871uiX zP*^Tl%dC@gUxPg3W^OVfVZ*&Pemy z_;~IX&PaU;nOQ;I@YE^$4wvAW-=SCc;k)#(8!KDW{XE{s@Ps@V-beFA0*q`K@IJzQ z)L_)>=I{)t{Ws-Q+sQj}6qk{emHaN=#}MZr?&=-qg79Af>Aep`y&yn#F%?cTm(ePyl6_qc{XGr%T2V!dn4 z;1~a!eL9yf6LVs3SqV(#x_tgby!xQee#`zx%)~rwsos9^akn{NZ9Lg9_Bvv^-2V;8 z2u?_Sz1`vybssvj!A{rtBQQ4!OqM)0o#4#iu{!fmU{4~hC*XPv``a&Ek1(fIeJZtgZV$n9_a{oZ$vUdo-+C>`a9)r zTXC)y9#j4E_W4vX(0%@`m9_P?H98yva8h^ya^GQ|p?bRc1M0$hI@x8oDV%BaGv5h^ zV|YQlF8?M@fNOD|E{d{AKbsjL?*Uh7|6lia5s&dK|L-fhV}1PqF)szPM7OD{xjQgR zFp70KrluGs$j!?z@*l*P<>UO*OS5igk%p(}^AlKT@NqGK<;lp30}H zMYZ4$`}EqR;+{4fa#PN$DSj0_+LsT+JD<=|bd6j^Cby8QiRN;;MYJ#Y*#e)aly49p z`;1^e7xT>W8Ri1i#@3DcJa3#hNo*mxO9T3-B=kfy%;=c{J z&-f9=IWSy#mzu?-WGn9s!=QGTn!_c&j53@RVIpjG#O^ojP2{8Bi2c6B!kK8kQ4LdTQcVgpP<;dIs3>7V!gd4cbp;ePgrH~vTe>1h%J z(l2sejwaYvaEGEjk$@Ry~4T0nbdctRe0wCI)aZ(S03cuY_uMP zA`I|_B2EX-VZd{!|Dr44Iixcu!G)xq8p6Z&28SWr8_f6*9e)ZYGvF|U1MafllYB1Sene*<#%t+?zey6ZCX`Iyf-*upyq&(NoaoZ$h(<&l{I?z11WXK+m-?m$PV zO}d*y#VJGW{fa|pz;~OkPX?pT+12yCBL{@9BH1a^v&)o@vaiRG>rwV}SFywI-2I)c zH>`K_?#NMR?otnYz5GtrbSK;T#M_sR;*($NPc&;PPXFILDR&=lxcYp9kQ?*{EGaC z$O9FznEX3^+j9TDzoe+#>Gr9Ciy=q8XvR@}mv7mNar71$>F(By~Q%#XS7bh3OYF0s@{yeo9}s z+1**2Z8$8C-DfbsS;2}HdW7|g@R4A|%%?BaTx+;v&9JbCFk))Xlk~5*lY5Jie$TAt zOwWM39BY%i^P&3WHe!Bgguax>r+_Ol?8d%KW>X@b?7_5K4o3c{sF)9e>(Cy-mGRTu zDSH7|rhYrhzm0OYMn}Z6*$91lqtFU)IKN9utcY?y*qIhk5(_>3iwak%6}f}J|E+5uIyP) z_HJKBo1U_|o-fYkS->8Qv~F?=i-}cYcJys}B=X9A;I6}d;R%E@b^dBI_CS5j9>RQe zYU(gwb! zb1OCqFQj?5U3|OYYV*_OX8HW|VZ>wMzmr4EN<0H))am<^YxpTVof#fl^Bl4P93@2p zLnTKeh9nOWPZ9BdFjRJOT5>Si+bwN|m%Rt9l$b(I+Fe|nPKB8=GZr_6=Yf}k8>ou+ z_*p~x$h4fjyK$R)@HGATFV;_#XwFa7f16c5tXC`z7v}d{x%seWOvo~-NpvOS+`+Nr zYpm}&pZ>qp=RM##&a%gN?bN@`WhUo%nZlub`ya_D?oP2;RgGt=nF+n@Zk}ve48Vr= zbY=l;;CI%64_=CV#aRllRCvrXHK0rlup4Hm?OC$qJA1I1--&t&UP@1nzUmzJ8a!2< z?CeKwj`n-Q$^1VHHO->QUunp9HOyGlKgT!v)H7c1oy}e~ho>iW@qur%M@xvo*0l$V zIM0a5tdl!jap6FI5U#jR&m^w6@HRQ3|HLQe9QxdKd?r64;D{3s_TuEsyjQNzDK`(- z-J}=JaYqMJT6=~&P3YU+7GVv&tlC_=!B!J)2%Pa@WR$6)*Dt` zY_u!c{ySgdPBJ}#PpQ_NblcB+$m2p{hBbUwEr(I_4lzG?FFWv79gXp4oN;M>GQ3|fLqEh`gA%sL+=$Zr4LDHiYW`m)C-iU6 zaiM#53EyTZKHaj`^XxN@IQcPWPKUscsq?4gt(k1^GoJ7s!|ACTJ^LnkFeeNzte=ba zYAgESMSHxOJ^r^lx*LBVf1DW$o`WvMA7=(ZsfJfGC!l5)T%8^mG`CV6Q673c89T2S z4vW)_Jput&oOnwwdfpDx)T$P9m$%L2WBBh|*oPXw<_A7a>`{$5+iN}3ab$6#f4iJM zdEVb`K<|7=2Jynhc!Mr4!sm4H@?s8{zw$~wSF5`BdaTH0kNQWd-@hGsh|M^t%d-!- zQ;l*!|HVA?+jssQUWdQZji0^(=R4ru%Tc)h&pNMT-MQb<8+Teu&>IJ`C7x9eY9Y2L z0)9BWcUAK@s^)W51AaI;rT`Iyp`JaO$(8^qEhW?`?<8({{N$Ec+Gq;YpfJ z&sL&m%iP8~tTUW6JE32T-#y)(!JD2{)E_GH(>P4Tb|3h?C+IxbqXhOy{!qQ$9>#nJ z?2$g53T&4=nf>@Hdk%lp;gW$rGG_ztn0?t#?g~Z#uBDsq>e0g~*DIG4=MMhlzFnTS z%9F$>Cy zq^H1%Rb()8nHh{#=V$&dy>mHvNSsf_U7BF;@z054>gs9(dXHPl((?GHlfmc6)?91R z)V$WTs#Z~&{nigJYK9tY4!n}x>Q)EI%x>zDTQ9=qY!uG9AgdZ$UPOlK&Ikf~eQ~!2sN*{^AE~fJ*(f=pV6DP>`{KTvLgsvM9@9$_P-IDahr_QEM zAC2?u|7E8)AipcJc}Lm5rNpn>7P&dzEpuYcO7;E6$csE;-IA%LcF|F`t zZ~}a_%1h}(M%n8^i;T$9i9Cfe6kD4O6+-i!M?ud z9hRZ*r+MdX=(dbbn@jhc<37H{CXIIwcadisM512nWg_pA! zKWptx(C;iy4NuA!)mz~;N-=~*~er@7GYL<7x(?$PlcY8u#(b1(isVpxM zt1aU>&X#|@YDl+v7a4x^MmWWv@I_|$LCDoWw@TJw=SJFJHD$8^rkc-6Uifo&kdruLCyh2oUF!Qh zg=2%e_rJZ|Exd1Rhu*5RFFBC@uGxRs9JLXAO78hD*}VLvnNB?IaK*ysB=9*2e2&>e z_*>kU1LZCkwbr)IAoEX?t%a-~`JWGvv5(08S)OYda^K4)cJn{sOZloJ=%?xMc~yNL zF!THfb41N%)(hjkKPk*H_6#sN2~17`lOr$R0|VDAZ=u6*xUs$Pab)`pG0;|i4;BZ$ zr;3X*sL7d=YER*ClEY$eu=hGAOXGYS{ge8({JFXO?{Q+Py__?DAiVFaaCngWKD<@a z;a7X)Fk8u#tcMOs`2hOg$k0l1FqhLqf0I+)+TUHqPX0@cZwWRv^8P+VKDYHeJ!}AM zjXKD*WLf9+g6D&!k&Eb$I6|1%6klB%-%Tox%-BEqI(xhwHTt#u>u@p7dcObQEQ3+c z)tz!P6U}dA`*64g9Bu)JTiCJa3CH`nIr1Ch-Mh%+g;U)e=9-)We2=}KN#`tMt!Lj? zgp-^fHl)ikJ;whZZPwKod8je4B4hYjW9go;{(c7hLmBY3>7!|NW;MayB(OJRkxUjv z0(;Y`1;E~rld71hmP~+O+{?ZAJ$dr|ok0q8*;g;6sP?cJLTKu={Yh zu-N8`*xTK$S>$R%dwO7|-$@POe)@QQIx5B)*OG}}k&or9Reb->bi*F*-Rag0&j5Rq zz~0D{s>fIZ)}VET82EX1`7^faD|rZ*92l^=Spp;Y6(iW}QDT@;_PJuFO*P+E4;%zH2C!9F^yp@+i! zD!HM}yxSmox!>9=$BF3OCeqt?@-rWGXBJS0dfx9x+}s#4JBF>?K5vKD-CH;rxK6PL zfBh;LuvN&x@%dynpu(pO{K*0Moi+~dNgdq)7ejv4h3yAijQMTwZvF=slfcDzu5NYH zG~j_@cUfjn(7x(Gm(Gwxgo+h5T!*j>J;DgB318m3j&b2L8S(ROf zQ&DTq)C~&QUo$({b~u#;PQ~7I!`P>tezt!X87yZrJWbcYrzG$x{MAVj7b^x(vl}wg z8|lU8Tg^(_<)LXSStx6lDY;qKeZ%FYrlR?iP1(u5U1r~wQJ4Ckzgu5-$dGlPA8d5M^tz$FLwQdQ?Lch|xt7hbS%$?;QR2i&JVekU$D z^FnH7a@NhB8`R^~F8lL#`AyMI&Xr?@%mUZdX9WI|R9Ok6U zy!7GXkxBey99aCtf3X+KvZa?e<2U7gKlXeFq`0`f!@-{W9l45i#6M~vxEm=Nx@}uO z^B(_@-ycq)N8T*-80WpPU3u(%E{{*uLHMmr{>1}q_E+@p_2lyZ`1SAR{pFhE@^qhx zU(U?QBH)*UrG@kLe)#1=)VW)cw^SZ=Z$9QcbjUci`B*k*3VjI|B-bZC^v(x6qlun3 z(JNeduD4SC_H^OB{IQMgt=tX&e1M$}YS(?9-F#rb_ou9-2A9!YW_i)Yi?I8LyQ|lU zb;gS0_psLW9NpGuR-L|C)B7E5O?5XPb|2UCuAh>xP3fHpMHT+6O0MM4*|ML>{mWt) zvnR#JBg{}3$A z=(omsmZtc^qIH?~)Md8Wa6RQy;b(BJ4D0FOO>xbc`BpLCq5_X1AHnCvJ0~9;;2(lM z?+UrR(w`#JGGW$eg3O#uh@xh9aJBw=>f(|LC3(mz(AH3;?w!7a2WV=(vYh!9_`Le zVc*X2OcUkyj$=Q6M{h1qzv7$=`_TVK^RY&emnqiWd|$kCYOOez+@CG^Fy@YjC&|!- z_#Nh>Ltcw{6gFiXy|W(O5^=OJH0qRi5}g4I4ct^a`K_Lj*T})!a`3Pu$-ZpGfz}aL z?2o&HzJA4e)A~qGZ&ho1YX@sDYj113b+~neb(D3Cb-dNKA_w^S);018x4DO}S--Fy z_gT+bFUT>-tHA2EC$u5NpG{^R)(zI9){EBb)~D8&_9AlPtz!Mw+Qw3oGwWV2 zzZLm}CR#n#x%T%OdwZ+(mi3ACqa5Bp#Jj882Uwwq+k<0}1M^;yn+8^>gJXmh(r1d> zQ9SUxoZAOv=My$=KXM5tl)wokW3qO6fxX6GC#TuaOV^{`n(B#8)i3!ha_l(l^b)tr zA?#e_js1mRbA*3~1%|yclPD|Huh?@jP2g95?73Frqs+?rOX7|#$m>@8%wyP{hxjYs z72P;{n&sDi<`FXev}akDu38smhHw z`Z@Glv!6G*)381KM>B$9^7df;ccC*Qmi2S>qq_RxQr-h^omwZ1w6mS;{yy*C9_vi? zn)&ZRc*&kJ`cV5=`&tKDkt<+->p*L~HOY#cPd7T7m*kDU^Er!=lX=O>Ro*|&j$Piq zevLGV*#7#0Wiq_0z}fyLpsCE1+j&uJ1aaJ*=UE5m9-u{|y9OmxmHBwX1f6g}_=4a2hc7Z84-1|JA=lF}% z)Zv!qvv;2jZ6{BPN6hiSGns`mJS$$e&fI{1@*Q@w@VW)OZf1uD?^oi^7{sU6DBq!T z&z6&c!?D*z0(&D*(U*KSY^J`aCcfb=*ugG&ml>TNqR-ux!2iJ;9=d(s2EGqZTQD~+ zz=zOLxqi%+d52B-2l`Vi^0*k_K6?n$R?c>c3#CQC&!%q$MrPQwPObRSv=^RF{oG!? z<1_a0I|rt%WStb}bdDF*GvjTe=SG;BG{szp>1uuQ-sI^XKF}WW?+^KoPxDd@r*yZ5 zvze3PY$r0^6JvDG(@M5*zpBn3eqA24TR(U^*&@Xqc+VA zli9oN$@(%WUQc)6FZ5f>oq3Kv`nCIVhx@WBU2-yAvaoa4YYU%OhhrS2XMI$;FW+f5 z`}GID5bm~syUnaba}L~vHTjd`2RkftNXI;#m&s@Rjc&T)b9do6a(cJl!?zaVOhSBX z>iPN`J@et#bPL~Fz_-T#8Z=)eRr}48MckoN?BT=CdXAXvA$?4H%f_weJU1j?f9FG< z$Vd8-k8}m!Xl?n#ws-k6ANdYv5py#zMQVb5^0X<=8-1H;p4`HpK0=;xUphD1o+ap^ zmH5K3SKur5d}sdsWZ9t@HSOE&8j$jAlJPg8^rT z@9lxnYQvIEA+x0E!i<9%_hh26d9n)VRSni*~UZP$c+RiM;;ZCu8*(>;O;Te?@9$!|RFeAlCsF67IaNg+4d zD)%l@cTVqxJ<8~Nww-1xH*(JXoPWtK!67dF<)QiZsZZbXJUs-Yv{A7VGa! zj+Z2_x6-A5W9Mh`=l1rDpI8rN!{rgC${*+DU7q(-dxmGQ(=XiT-aN@yyNEA-nY_br zXLPkQ+SvEuVe8;X@UW?cjtOxdJ{~qTp&9y?b6U=vH22Fu68(~Fh(AvymuAqj@ny2B zc=A+tY7@^T2Nh?Fm($%RTrLz&S?G$Bb=uNpH3w|qs-_q}hW5?d(X2WmN z7k+jx^Z=22dfFL(?7lBc-yKLEPN46%@hs24M66|hBiHVlV$C(#8XRrq@%HU_Hs~{V zay37{n!FZNuzX2FUb2;}mZs&oe2*X0-RD)Cx}Thnki)u<|Gk{^gfB{7&kDA#fFXi! zvhcW>ZQgJ0PzpniQ+imtgAt86w32UTZa)9MPan6LW<}dE#?Ywn!HAOxxLuckJth za*rF*??dSJ1?1t(K}t?>zhSiEOk8#aUkCa9$l8c~>vtwwyMs&f6Ynm%@&BZJiym0v zX8F80tcR|;Ebl3|Q6GO3W?)--VrjN_3GvE~$-lAF1mZT{J;qPH&fs>QZ>M)86Y{njHv771RmfQZ07f2?f7jt4#*x(v`+s&PBgg|bArkJ z{$%S#@#-7ydg7iwO)h_JcKj0f>S7%Oe#m^U9Nt83&fS@s;-RH`Uhw(*c-ISImE?4B zYt`jXCs7(=g|ux3WkmRAxESU5$u}$ztYS?)L@u3A_Zhi+(;Ztr>N4*N=cCWqJVfg! zKEs3bz};jg)<{m)Q?W0**6rOcz`MGlGe0+Nng^JY^rl|kQlDlWhmX&5fmcM3y+G2(;*nv6D;3%;H#3r49PeJVRl(YVg zb%6CFKc>m1jpL{Og+A)fy2};FL+*R;=0E+Ix5N5;i-=!?*|B?h@_iBD2H@-2k4woB zY)x{Yzkk==)$h+o$~&LW9+e;PAC7V-^or}*PJLHZZ(G%z1ocL1A#3G`Q*c(Rum_v+ z-Snh)`r~_@$K~q8`@74Jh~;7)<_zz=1ii2k{q$!x3YVH*xBy$EZf+lNsL4Zh!6^@? ztEPk_z1OjFzHu(lMtTNxu+eB$aw^^;J1>!8yl7_l2fjt<$n-is>uI(p=I`*L1-xis zhuoT^8{MS$+`M%Dh9QBi%bq7lXt0fdNSkB#oq3VeAiBV)`jILe-P{7 z8&E%zNAZp=`}l=i-k-!Ki+LaXXYy6%t>YKQe*d~?7=LfilAF_p!(AaO zaP)Mm3%ARq#B3+~+#Y+g7af8Z&3UzwgTy~Ok+aCJ_hj1byV7za|3A)nuel#TXXXsk z$I+*o%I?neKJU_%J$X~juhqdbY@DSq@|nINxl;P{8TWZ}&wnrf=pb?xSH; z_;ksK8MU#GSgX zp(tj95fU%f;9kw0AS4MmekEBtIOkenNikd)@K*F?=la4IC&TjD>6bXJWYJF_pv^a-qy*~_6b!wAkuCK1Y99~5knT&+3b z?DVoE_IWy6O*16?BKb6!g@NeD;%@5IThYWBYd$Fb_Y;{|%sqpfNnm_%+xD45pPL<7 z1RQPh_!YTDI2!MVqb)>^w(sc0#mUOz86Li(9sc56VKCIzVDHqpHXwid`tBQi)%VzQyNxu{F{5VEcyDGe67uQd7Ir>j_r)O zySMCD?8P}LZ_3H{cJgK0x*L0?Vrshc0Qw+uuw9t8l7CoTV!H{>uASkD&GhNo%d35N zkGKZ^n!bXdPZIw!T{=xp^gl6o$>;mfbIi-fJIr(8T`6x>4|&RS?(g2hyy)raO_pR6 zPhijQ^1QFh5g#HBn3u16zF50L4{fLpOt15`=B1Zr@;@8!a}9IC8|-Rko~@Y^c^+`6 zg)fR+>{$dnYHC`2{1`gR;`7Uu7I5PgcHJCyKJhAKeIhxp*ze={#IP~22zA=44&!TH z6*-FYrQp}-+9GVsXT-UtXQCQ#u63}cIa!f=HP@_1&u1EY9?aD;SA%@Q!0=~r0J0%` z1o;57$mjxCmrlPUJ_cMu<|^^=zHw&1_byxcE<9y=J#*XveVusZQv1BPd^j#|^$xT1 zGxo^Ytn52rS?Ch;P1t>$p?Yom^unibR~cR_+%RnQP2}-Id%rc`aVS0Wn9q2FejCEa z!hxpWp)b_P!msJ}+#So$2x!?)4{tGoC3 z$IMx5hb!H4xCZ`B6LCJ#)8uPq{?H%U>Ondb z2BkCC00t$|8%|$lY>j-a`?j$2I@_M@Peat?mv(hV*SWVd)707Fr_FJ-l7*(TIMuo1 z9t#Jtv!C-laE_U`Qwuo9)Ix@f8%FXWr;-JJle@IC{ep!Mdl!1yVAAQ=e|onM-1qz3 z<-f|eU0gKOVY2cd>oIn1clPWJvE&H;mA+-X#krp?%60ixRsXiO{X4-rSI&HOI^{%r z(NC|eYCrfy@)%{Ohx9VKcbt5|DfC0Pg=2>g+$!H;!$0JcJ>lnH<){6ftbR>yN4l4r zIom-x6o*-7#w`xBfWu5bO;xX3sdn23k0`g9%Hg^%{hn_EdHjStoyV^4O18f6oP*+u zzx)23#m+DJj&=ARH|CkSt+1nT`}^{G=kpv*zdM^w8kOm%&f8^=`}$vXkty`ib@l?5 zqa0C8F^?zj)Ys)I%6C$;Y`o+9-c_B(tb{>vMXH9LnJLv~WzC;Lf5u;17&#dfmx~s4gPc|5&vKVM=kdhnQG-DbtXn9&hmlFe`E2^b_+tXICPA@AG7OIVsC zRmS)Pr%uH@RJB*}D=sq_5%@R$Y@DY9XBA?~FXwZ1Q}{ivx$|G=_|^Ck zxXr>QYQnh9)GhIuu=hi)Us>Dvp6Au@hS1ZC`uDl?%9U)~+@i)0Y==vWZtsWpjVv!9 zK3Kajp9WU_que|McL;Vy?;bpY{e_)LU}xk$y7|iuydS_G3*ca@h!0yY>U1; z^*%Csso3`)&U&k1lh}!tSy!+F?$y%vb7i{zTQU7O_xwk8V*;D;ueb+tSPKp7gYP#p z$T>ej@BP=A{?8d6=)S~0>ljz#!NJp6lb@-unxh>!ETfQPJj2?mky&diHjkLxO93$5@R(v}n#_MW_=8E%`aDegM`Dg6p z#(BFuv4C~;8IiZ6Uw(A~F~PZNKj*PWFWJYaH)3z$v-a#zbI1M!Z*T(J{405`O+7cf zvAK`ka@p_>^inE5xq|L~i;gx6o{p{v)L{kap!J;bSZA@AnDBC+SBDLTg|sj2@-%py z|N6Nv{oF(R34WlwZ9g91TwiS_4^^-L5I%&V!a}hojlkex}`@KKju8@-L zZ|JDoQ}g82$|9z|-+RN*$<21_msa<5cOJKXcCJ&b$m98UzC+As;Q9(Lx#w{{?GMg# z7e7DCv)#eIp2oHfv3C(86KCEn<@>)%yCZ*G@*nztUvc%Ko^u8JG>y#1aiU zxM|iSuGJ|2^k49d%Xp?Ka?-K4>&2aI=gX-T*Ja}R~5GXOly*w z{yOx|CQ&Zv8Qf?|oQsP`M~|_3DgSFn3%3={I=onP8D6XKvRFvZ0L(@!IXv%{Lrc{r zaPL^KHfowC2)VOsdIngV&fF$g8@w52#M$#{^c1WO{909vC|7FF#<^GUHgKGE`N^&X z-iDtxk`Fl@t_~;M&~7uh0**)=G;G*R=X{VH%LDWHNBvA&=G zz-PkA;JYsQ;=aRzlVL}EkNoyZ_U_Hp+;aL9?nRBT;<+nuGF5XOs{WgfwkI$zW=KJ= zs=G%_0p6|BoGJY|liiOrx!wDYB){fr!j<5xwD-b?##$6pRu-=V@uQ^=JJ!yVK-rC5}bbcF(!3-)6DvSl~q%a6Q{G-pNjliReW8_ z3k=2_y}Wd*ydrOeW9Yzn{ z=?Sie7w8xMpZa*I&#I>0Q!8(EA2xCq{z@-gPw&M#OvRqScEcPF!upvHMi+i5&j+hm z_Sv_|X>X~gHue*!Ev9&^&5dsffe^v}c9s6pWUG9$ev zMy;!n4Z;HS<9X4WWsisYEPP)ud*+nzU&#;LZLgRnm9NLC;*PH83}I>#JgP7hsXMGk z-B}*Ym$}{g&a;2xT~BpSW1rRgK6e5ecDtXAvFdz$_mh1`#ID8lBzp~ea^`cS-d#={qCC+pqt8;*fF)JA^+ULQyiT%T=aIEhY~SVNO^=~I zG5lGU8lO0N0QM>C)ShsN$+K7Km8vrg0f!iS)z9Cpz+d4ia~I%g%=fJE+3Nm#5Qelz zeiEk9zro0;LzU*V4MgiHU)(msxW%XJ)=QUm@?!8O0Z$klZi+{$FZuv*F)jMKC|`1( z2YEg|2Ye$wHP1I68@&x5bz?uXwmX*5eR#vzvzi)LjXti)H{(H&Yd4!Xxt=YN3k{#; z_>;&(oFD#2?_?g6Sies`t5tp=2GYNSkEd||_2Z}d`Tbml&Y$D%tmfTue#xzyiDVD- zhNu^m<*9TG1E&Qab4j*qA^yQ}YIJy% z;2|seT1wb=99MKF%!OGFdfB3VCp$1YaM@M-YN3PCe%u{(`e$kZ2 z>y7amy_A^;)-CswMqj0Dh`TP~-<(A!zeB&iMZ7dyXSioi!n zW91|j?(`M^aLmLl^zcqX_OelwfPuEVv6J-YPmbkS{H za-Lmg0dysBEp+2(vCQZMu0=j)y8oYrIFk#PRp1i`TvlYdF4r_%&&WvirBMNw6?q;d zFMejw2^y;Q{cP`~=f(^LGvMg#zsbj+XKznP&CyG{;o~y8HrK}hGsbsg>)}lTzA-(Y z?$=s!khj?L?b+@T?k{|DSS@ddYv`=M@C}}G_hDD`I-9xgj-TvjU{^YQA8;$`?xV!u z)67AoDPCdh&Z_NQF$HxH~KK;Ao)L6@?(B&?>?3%?H)RV|DNez!d0Eqe{3#% ziP_541il2vS)cFB<(k@MoEP`ASOT6z{nnf@@-fSOKY*To#C^WoyMItL)zJoEXfi#| z=0#>x`Fv`aV#=9hZy);ruhHrIgV*TzV(=RBc2)DJ<#U+63~sxB5@ST*mn>v+1F?oXHjT(%k6sFuLjtI%Kl**__@j{r5?1 z#C5*+Ju-nCMQl))f0;%fx6~nWF?M(C0~9NS@?Ejh!=7(XGBb~Rc}CHr?vMt2S79wb z3$I}=U6ub(?etc{Yrxpm#Nh+UW$t91e90T)hOC&MR5gpdgrDSV51nFm3ZIP}9O+&0 zUFVq?$J1{6YuA{GRXox7^RSY{#1J z^f|aT@J*E$k`-}Yd5K){9RC(;=Vv*aPm4C(bP6vk?sji_vcgQYb_d@F8$rhm$epy4 zYchCa_V(u@<8QXZj_m&@?$(%LJ@O9)%xaaCt91Wa^@NEK)P_*{(r0bT9W{r1xl_tJyruFMIFhQJ*mftf6M327BRW|5dFk(6pjh_M@g;K)e~G8o z&%;T;yi{P!=_hr=@jdj~@b?dPcW$*8OY-Zymp+49xYV8c2mkR&`}3mvIg_qE+q%HI z%rb99&ssJ4*!qbK{Ke|CE|zzAhUR+D`b@PBjzDgXPe@P0UikY=T$9P`=bc{qi|7)# zMR@N4vmqME0b~lUqWn?rDdS7*>b!p;7jP70tes3Xi+YG>TF_q2Rx{dx3@n%GiDpmq zlhDCx=fg(v@20|n%a`(_@G7Z2kCacI#n)@$>M`e8ytt_Sz?Br5d9a5i3`oBkkvmN% z#aanG1F-Q-hN^mn(#NsZ1N`-$ZKIJWgiwn`4lyiD_=$r^lw*`F2P?&qED zX1?QC`;Q+foRzi%exxub?H6;KXY1TyB+MNM<^)Yi#<98Ed9T}?qnN^34Des&amnld z_=8)^!MyG>BR@v;U-DG0pO5sMJz3G+uJF00sP9ENdm>HY3iy%Y9Gpm@=8SP71w9{f zHUT!x++2ERKEE@K?pTA2{xqzoT*zIAv0%&d&ht(6d@vRXjD?uLU!0tJ))cP4su!UO zN1=XY!CA+Na2EDtz`yJ7%gm`}J63XLnLqz+b@4Brp|>Jm;$%Me#qRk{)|X=7 zyZ_q=S7c9cIO)4-u&+3~{BASrGw-2^r>udyq~Ism zQ}TEkeX_813!VPGeCaQA#1QXsm4#!{ObtBC;$Hb7cfFqtXJ^E@kNCSq_~z5S!=e8C z3*Bq(8Sc8epmad)suiAN%NFAU$2#G0`4m1&63ZLR2g?e3o4Wq&_r zx8w%PE8UUB>1g>$xWSyhRv#JK)~}NLnU-2oBUF6v=|j$p*mu3_@FUI>215=hHT#I9 zvR6&AJVQS5E;`R_Np;U&@lV^lD>-Sp<~n<^VLC;>EM64x4~{7F({Yo_ufbI$pRnnGd+<31=o=hOuw&J5 zhu9wfQ^5ZO&r-+xCeOiFK2j`riFyHiN@j+MUDsq>dNx_2G-Ra6Xw? z6~gTn&L=v$RC|OAwbbn43jDW)@5yYAGT?jCBUuJLc<{2N`6p$VZJDRinKOv*DVWIu zyHlF62die`dkXlT0=_3as(#OETlk&=zNdiiDd2kwv#qD>5x%EjK9L$~%^Zjt++~gb zRSPia!K@o|G;0ChQ^5Dc*44}ps(G#&->ha%D6Rqv-xGamZV2CVeGA`H!1qL-)!~2Y z;-GqnoCf%w0=_5n0qf$hx_zpfU0Aoz_5Ua7F2E!!uD5~T-MRO6cirwDb{2==3yTvV zxVr@j5G1%Q!GpUbZKEr*>>^3fh2SoM;K4meAh>IgKd$+H)!&n+vdhkN-&<9uP91sA zdG#Zy1$<9pi2CapFq!Pxy7#O5uDTu?^?>gw;Cs@KupYKB@I3{5PwqXxXW)DCy>)oI zx;w3x4b`j1Q!m}x%RlOcXkR>RX@_JzG=3g9>0rO!S|$J!8pFuIJHFM*p%b+ zIT;5l(&u;j0=_5rWgl#HpZDqu_@4Osee#&&1HPw#?JKaLb-lZ5PQ98gbjA;MJ`!hae9xS4i!;=v z=W;Kl1P%qB5xah+b6*F)Vc_?zG+)x3(m&GPKU zoS`S_rp4&~?VRV0ovQ{v=yrGf|M&_6ViQXl>*&kC4wWyL^Yc5Amkd5dFR)&|@n~|0 z`5fndJiwfjT#cq!#SwJh{$lo1>EI8t%=+V|qEn;oIEkKuLo8loyS?u`U(ZHd+~+U! z8GUNiij7YW^!t0b>!<0p8e^C0(D{%ZKP$uP^viiPoH6WnzUMspbTRjCn~iz`jE$Hr ze>V@XF8ud0to#5wM7@%=Jr;)QD0!3;`=pm|g9|C@J^Q}(-(21icaq)%?jQYKa88qz zJbBt3a3@)TYr*Z%hAC*OvB<>iTE%(dTm9Z!jY+_(B#u*YR^==Vyh`k%rkWAFbnMB= z>=V37&NQsB&wp&a)^ZPg?0pZ?>uNRc@Kc`RI>`9;FoR-H>;#xtgFUsV=d2QK9X4j+ z{Nr8{FYlHAo9t}BV2QW=+V|e+z1N|$`ITzaVwHzJf7b240jCBt6{@{$M{T)Z=BQ3 z-8~nPyS1#%B>q+6OixP1r^ww7=J_xC2D^gC87I)#QT5UCF5Y{7cRh}wWGnv-k0O_% zzakq5|Bili>IRKV{QUs=fal3V(^_m_?jAKe4y~W{k)CHa(JMzs(-JO z3mimYE4I&4*$|GY}+`M{_vd3Uw64)2Ix2&eUtXD)?{|9{?ok!Rg zy?^x4VC%xZbZa(YU*wdmhc$tHNiH|YIxJ^{jiCRv-IB*OJ~G?h!6#mHYmk=_bNrr_D0k<4 zW%3m5@Sn63eJOlm4QIKXY{R$LYYI+{lgf#J8OLC4V}%4oaKn4gg=3C97@Ds>3}@^$@e`- z*L~?OJK|;SP;=iz8Tys`ZB5Tpw~*W`9iVOjMpZ18zKYK-yu+Y% zi#B!ig<(hN6?d6`qletdz4Y;!q64kua?jt3uZR~&?54~Xu8QYZ^0HP}mUix4u8-;Kk4qIcq$5Rqv%1-<%$zUk1q%oPY70cRG;`{hGT%9R<8x zGw5&YzlZo^4fxNp9=#Q{7`PGriN{B7B?LS^_}6RfD?O3fQY!BP9v`+)A3XMW7_~X& zL(gJU;Y+igurA30>3DYg446Q*9OP*GQl6Y%swD3@OG_B5Tfc~>c4^%3A~M3*%7$S zQZltvlZURsT}~x4awvWu?goZF$f*?K??dd}8A+lO_tj(Xx;-*J2F zT*0u$eF{&GZIg>uGMS!>y}!0}hBkH=9PYga{qG7o`hh&?<5A$EuIfur)AOUQ?_4ii zcrpxk31%dPb;{+`^Y9bh_$r-)XGs5B^+wJLo}m!$fa&J38kycp9CBH5{6U)ODbv9v z&Gx4AS0OX!*qh$8R2-DTCDComxf||c*DNAGGC=0>3CU5m6PO!%y`9{`j(WyjKaGxt zwUL8W7hsKGZN%Ve>K|rj_q2*;-qFhp&foo{CzIHS)cvvvQsSj4&3N&hE4 z>j2&eabfnxCf;F|{uh_IKVVbX?`1h8`kfrZrs%Pt#)2ONo04oTkDYk-$2}t=z^&xc zd{pdYYP6S=i!wMEd#cU@7t&PPDuavA%fdK64f?LtV2Eq5`ZaOCseHp!97mrC&yc$o z&(x#FzQKg(Lp}lzk&AJ|%=yl@N@@eiBz#D>_aA%+{F#0m?jZOOeYGnH2;aoP?)=XhA?xL4)88{$D9&{NktQ*1`u)Ouc8Z}<&Z(4hWxP@mp* z@p#tI4?r(mbJ&`Ha2%bmA(_~h9*SIplj*T(=CipN_F2vY&h}zcI_Vvw?HQYrr3vH> zRzr-f)a~N|tC1{5c40OAt5l6=wSE8X@`9WB?uF>L+v&IUtPza59xAQmKV)}rHrze@ z%RPMl0{R`7j~bxKUHfrEG3K|Njn~ZuW+Q>wko9dPhqxD?wZ^}+htYFh*f_yBg-+~Y z`_5-X`U5O}UuNzqIHw>uR0hI+BR%IGT=#ak(wLckF|J1B8jxyuU9YI&=kVX;;9 zky%+Bs1n{Z2Yf#P-;WqfRjp=C-=;cWWkgT^Kwnqcb~V1>RCsnZ-PSYW{Wo#0Kl5HU zS;M8pBZla(yRxS9m%6{nC);assjSCWHCc+T(C4!7-}-!2>~Sdc+HjXvLrDS3}C-m~ye4aP#8NMO5 zcTmF>x^=IciuvIi5~r+o<8kQl@w7<*Q%!8(f+-cSo#sr3ZL~l%a0s0|g z!r@EUz4}vTYzO=ISMif==;BfGeys1ACH8=e$ew5PSjH!ThfO=q2>i6~fg?%aNc4hk z7dz%H_0LUMRVTsS3rnJh64aJG_>wIK2QN=BC@$X=+iQn6{r+O^n+-hYdh0Ic%dYM( zj^KyxM9;vHB%hPB^XT~tJbO2?uE0G!XP>^#2K3x$>G|G(wGunxGwyE>ue9Ei*+qXL zhuf38t>L=1vfmeznFZPIc=~X*_ZRQEALsOaMX4{D#R`hO)h_edU%S6xX2afW=Do># z%$dNZc>e|-KzRuJ(2#$rv8m?vnIYrvKKF7aH{g!k#JrcxD)gXwMtTk3kh;1cjx(fg z-}_jf?Z)c2R8o6tZm}00dtdk`WtomJeGH+`rSEVBGz;S zjrZSgm8;PM z-dM@F$9*#7z4v63jF6pc_@v*-VI4~cv3B*qtm2ldsgJ6wXFJn7$SHZpZPIq~dIpEg z7WW-VNQaWiJ~I|~>g>+wFU@Bz-}Q#vxIN~3!L#|U1LXQ57m5IA7jw89Tj37(U&I$a zn>NGm$rZeYK0JD5`x9ORmO#vv&RjApCGZ+*>&k5CO4sIt)ev78PcP?72 zDsSJK@69JEba~gWuhLi*?D}cjVq}}2{LWJu zTaN6mZ0%NYw##JvqjWYp53bA^+0#B=N*?sqg2nFeAM3~O~^R*!m8exolz&l%XUgeaT$O1nc`F-L zZ!nlF;qG4`%_Co90vDnOP7C)i4m0b&4ZV1&vvrU0vGJ|5G{M**o+)F0<47Z7o(GIG zjVt-Km-B6}HU42dY&>o}YkX*Y>Gr+JxX1XX@v!lT@h{^=<0Io^1;m4$ch!Nysiev+g5<_GxAQotp|_aA^o?(m69NsRNuo4~wG zb;k|Jx%TTRt_{XfwDzG%Py zN!Op459uG4!x#>@%f%YqNy|G++h+}S;*ehA_|fS5Uwb~>3Eavk9m#g46Y&A5L#lLb z7kohQs}+41EBMhXFjVXrcOyQaF2BH)>@s{nda4)tY!+}i`Y9OS8T0tr;>LcGw=b)!&lWQR|7sEvL_#A-~*CZsfmx( z_$M_us9K1<hfxJd6{~^2L!8L=WEuxc};vka%H`+f4zRz$3B=Y*VPaQ zYU{nA@1uP>)!B^vGU`mim)7%_&NLevPNc5CLLIhsHs^92+i05jbS{Rg27}z_4NyD* zONb*V+`u2l5hNx%8|=$ecS5EoPo^(DjBcvWrMvG)HulHl1aFXfnTq^dMQ$yqFU4za zY+!v->pG9M{KlAN9dHKe^;U&Vsf)?f#gA}2890M*4Wx3^`t$ldoI!Bt6*_-FT_<18 z`#t0CnMy`lWMYW!8OYQYIm7d~ncfNoQ|H(O<;H(@< z*M1B8HJ*)FVz0x{$S>eOC)+SI?3qFh_psg!bskGyJZiEyuXPtM!I4zNoWV!VCjK6E z?S&w~8FS$gGli?i-8C8xVEgO~UnGB2>@OZO*&VsIJLODsn#0|eI#)P+_ylVHt$(z) zaQDFUmBK#!CBBqAP!Mw*B!dmyTOAnpx|rDr8)(=)HNYQjbn(f*<)7UpZ*j5Ty~n>r zoX^?pCo-;Sax_`~$$r7hBv%=q@ate@^qDA&d6d;g z4T;t1H|8A*_y6I(18xT5xgrk9&oxK589i!ME!ooz*+yy-#4hzKbJxUP^!(`JMW3I= z&fAd9a*^L#+P$!)GoW@t%&x@dDisT{dtT=6&0yTqk7>c1=_5N-_*3|9#d-4)N@nVmZ&Tp)MtlzhS?t`DQzoV4iTzh(V1t$94SMoSuKB zF+SDX!TZn65BUXKC)P`qoQEHs*?Gyv?bbBnu@YlNKK09T3X`ncRj{Tjc~*x%c$N6u zGroUkw$xGP{({fRfxwOp7u%BGh$q3%BVU{+m(w$grKx*1C3{Vn2JvsQ1k=L@#U1V4 zr;~Frt+0WZ+ii5Sn3g+aDjRj0Jm+MXh=%xWe{zSrd?)&BAN!Db{;I}?#@hOe4kYrUpPVxZ&(y7}gJ;5d z7W9lCtTLJwI|q_si{cJgy-! z+*aGk7k3unN)ot|1g=EBr=e$S3SXcnD;?TnesdY8@ula7pZvhxx(NO9eW{&1QfleF zs$Nvgte-Al(*0jg>w4;sS7$X{>`qTq@_?_1JynJk9j52RN8Bm;7U z0?r>C1LV_peni$z6wlq;bIvjE!93?%wUYJtbrabrKbi0R*5+1g_^r9F4|lP%+|9B4 z{kiEtxD{A)SPys4+2ntF_T#y7$~*cj{vSSat|w)w_*Xheo^sDFg~-hj@mkM%J}w}6 zlBpr~DE!VG?(n(K=*cte(bM)oE=cT2&z`)}wY%8DVTk>K=SPmB(8H)2dU3|fh9$We z^u28IG4|$RIxP0j`lV-g$olNg!IcKTolI5qGuP9~d?t|3^~mN~>KR@!Pdp^W>wK#T z;@TfMw|lsMSMojYXYFFFyhl~cVjb_cRjDbKhsW1BeypdX=Wc^f)zBxkjbEdk9Lu(W z;}17x?XZy?%2Do+5?ytW`(-z>z!sJRD`0Jh#FPh$9=`GZ{Q1}Dixu2G&MAy2j3WID z)6%V%fN7xxM%`=r&w1u5?4HX#_piQtig!JaJ-;g1oJbyHTwpu*Fb*9$XmVK1Tzlwq z7zaL&S{wHTT#6oiQ(}G|PNgDuP{AS9U)*N@*C}N&_l}Ezoyu0*D@(--a=vW|mQ!6r zrndzhG(gv^>+{onj=t^k!0bo{FQUtSY5d;6w95P{mcW7tfBaB^3VEIxl>}F{58f* zb}mcdVL8JqJ?|s(r(Y3ULZ2JsLHoEoo8W!t{%-ReA!|2~JG?t$hPVs8FWw#Xs{?R> z9kuOs_j8@^JOw@%KZpUpB9=QqFQhTHR=i+Tgo!?u%X!3^{=)Y?>K)wc=B*BoosN$u z?C+e#yvpTtj2xrf2rQQU+}?aXCRgA1zOTsM=cUZq%-Mr^w+3T%XYr4vR`EVLf^|`^ zr5`W(fptj^aHk){R(sw%!nyF()Ra2M*JXohue0JBa`i<%!bi}9+&J4D@%4n=$>3#a zre{sA9;>8hVMp9$O6+?ZzD@_jeq`za_TXM*b1!liZQ-M=b>#B-6(1<(H(+9ty`0M- z`d}Zw4-b>PoTpvhK6ibq&n{8n2|A!XZT=A0#wdpC0beLy$V$$XjZ3fCfshm**2J|zbSdgpb0 z?tJ#|r+nGl>7;Av#*@tLdA8#VWCx!QZZ~|_a6kvSkDr5qI5!hhN%bWn7rXoH3*=`h z`|_4&o$WsP#(G7Y^#r=*4)fp4TygW@uF3;$9^ccaN7bk}$Xw3sOtJJ_-ES%2=;7xN zg+I`f@9=|qlQY>dDScECYYD}T?!XJk4onuV(ctbCH+LsK><+xb9oQ6?Kie9>u5__g z@GElYC2vs1wHCT{=kP1ISckj$nVT~`Y@LNsw&};>Jo8wuvz@hjjR)OJUzb{Xi#V_D ztd-gG?mp*9KMDJ=ZmX3#quUX;ysD+1j+ue8WE$2Olv5YgbJw3D%8|h5( zy?4EThmN?|U4w@Q$FTn8?wk>K#(v~xHu0La+-|H4dBEMV5g$77nI)s`LZ94W{Dw~1 zP)u-w7;e9_xsUhRk=)?n33zyLvlilIHT8)#7^q=&z4|)j=9QNc7?%XbMf|Q`+^DHv zSKFTry-Qo+-n>D_!Yi^(?-mE2X6-iQCtPHG&hF_KXO{~u1$_?mLt_`H|8O6wxg-mD zt|tvWa-;YB1H184@220C9@=us_G&fv$E|W}bCTWdjW_Mv-}GY82LvuiKP>j=4)GqO zC+_FhtMe$HW+y(+UcF1)6kkZd??XoqMxCiY(1={`peU5wBe~p~oXxOD`dqlj<@nqU zE766qkN*13J`9Zh1=Ev*+z#SLILHe74{u`pK-bRU952nMTbb>#r}M71kIxv`p~GR4 zGu=l=?B?HLJc_T_#$Vcp9q6;S-6KDm=cCr>0ea?--tz!5vW-3Y%zo$&p;x>l?HCdpsL-saPUiYphAeuQnF2{%5=2_B7w)oTaVVmhzHhvCd|h%tkB8 z2bRQ~%5+a)YYggBr3V)oxu1Oe%RZc$4T#aU*rtPe1q9Cw#ryQg=k$4xwg1Lw&}q1c z!Y!%$#lS^GZW=L`5O5C#+(T^m$@1h=oPBpA-*zkKI~_Aq&3scI$pI_V77J_@-{);P zv0R@Kedn`ga)|FahW>iVnr&&l;9TGu^nIY;U|kYe7kT1J-ZeOq zUcJ1g={wO*hUux#$p(B2nU!br`|vGYY(9L8@0r%cu|+;+I2iH16i-hM7gQ4ORNKO5 z--B;`9o>k_2u8o)$5z!G!>Aj$jPzB4J2zKcMlfo1cV%78NIl>(5_78uTt;-@bf4G9 z+AP_edB!k2ZimgEs(aOg#Tp!LU;6auT?mF}M{%RE z_JHSy}CGOMeG7G2~`RKJy0j(Z9$v?28YIW+1;s~TRn)sy^$V!! z)lt_UZZi9~#a2xtM>{=M7Q?8JnW8w1JRayCn?M%iboiAS|AqhQ{T~v;I#C?x1<$U! zcb6j9pZJ}H$;fWb2kZ(zubk}6w%pZ-7>zsSr0%jluq^aaDS>54U|IBi9FV(6#TxOv z+s9Z_e1N_DQ#!E1ja&F=abu3CvF9TElzqLUtN4#%4~qf7rqy;QqncU39tZasT}Po-d_N z)Zt0AXYu?5JU@Cf=>O?m;d}Hc9MmU6{LsEOjOFD%eogOu9?yzDWAB}l?8Oj$wX3u9 z8h>WU`8mb;`G+{-0({{^ti$eN8IJq{xOciZ!`Q14_fEjQL*JxqsU~}* zg>R=J&We|gZC9}-S9=$|B=ODX{HzikTPl7bFZd>V;zD-Z56;#B-g_?R=lm4Dn(h>5 zQA1Jda#ZPON$=)r2O_x|{O!b^EmjfpxF zYjMB4+~ej3BLp8+R?C6g&Y6J`(j%zqKCQAFY6*;x+;}g0d|F~J^?4{K@IGD6=i9wY z&HrG2+{q)|eu-*G*vfUaq;}`pHDDhl)PO_H9Qwtlh0!#htJvopl^LBKmdL zMt_v9-oR%zq`&06i*awA&bwXQlQ#K9^7`)T@5tfNz7xlf7zREF?>@;~ zzA~pv{Q15);rPLo)O1!dSd?~nu!Q3k?wVhqS80V$6ZB~a@Z*I$zJ{-La&j?!9(!Mk zlXkhaU~Cc?n*_!N4xFqlhJ|Po7WN@DB*vMh_D4*a{e$y;_cWl-!Ca}q2V8qbj(f#f<*5j}2n2N4C$)gv2li}KjdL^B_;ve4##k+GpD>Ysgxd!ewGfx9s&CV;(!lE@ zr-_r%!0Qw6`Z&{S@{Ae26R(fEu`W(fhp($6;qFrlG{c=epnq}-Pl$I!JnIA^$gHzUq|W%6}_HDlqrAIOC@yq_HJP|A}@?u0klnxBx5wT*@U0X<^J;UFx&KE@BO;phlzp9%f-3c#aG^M0vY|=kz zaq4lQ&dQ$;xofU-w@uC)Vz6*r&ccoKuefl);}ZB;di;;TPG<7TZ8aMWck?v;hEv?I z?P5;n@UeVavV!=_j($GDUGN)o+rx7=O!bha&u?L;+&y-7cD!7L`}{ZV>Fw;pt(gSB z&)n|sPqN>)k=F_K?RIA-*2X{TJK>7dDyf-g)70$4v*i5=erzwvZ#dI$c@H?8E|vif zr;DM1!%5(9;Fjd}ol!U(Imw8KEcE28!c^4Mbk)`H%|X`mQS`p$v8`fJ^Ldv3-&y?N zQ+t0pd5iTi3uJ6idTw$1f3NXpvVf;W-^+F~7rOyBi@ntAO^Ogk2L}kuyXPDr4iGU0 zFgjg~DU1$(Wopzp#ma2)ZOPi!#wBQ;hQ|@Z(%X^FgU9iE_&+@t9tY08%?C{7@;h>QsddwbM4skz=VYomt>8|( z%<~?lH}0p0^gh)GyH0;kqX*Ucn8SfFKIq*d2ID|}`*`=E93DOdJiD1VDL>Mrf??o_M-N6)L1qx6$|Bfag0;gS+Q@!Q*74L z4IF{u_3CJPM)^d3E*|?P-1XncEX+#+^U_^=m=}2UDqljai~AGig>R_c`KKAg__T&rx%#PxXr^1}GQ`DV^>(Z_8G6}p4KN`lG zeu9@t;AP+_2a>PM9iI!nzouRd4K`LgtjDiYrx>vyawf2_#xdsdC-QNE=e^Aa|H$)x z_N>X`64Sh^*eQQ_NS>nMyrtm+a)$Fo9;YMzo$7gthm!xYhBzH8iTH0*oE#sKHQ$)d z#@`aglHs>|TFHmrr`P&_j2jg1fM&nlF0kU{Co%6CWzrVNWffMXUDGE4Mo!P; zlkMoNJ;7&=I`HviCjYmsfoKVTS}EY8p&RrHHa@iW=a8j^t$#_3?$61_HBeUaSm8Prv z$=NBmg~;GtWI;Cg#In8al;0 z?11ChM5E?eN%Q2MwBycds{hwp#Am-Wj;H%K&*fXa->JT14fEK{v+>V_CrWa5rOcg@ zsT9fn9J;b25*wUo8ZK>7w+Sm-9NZ#in*-G)$Z7Z zJ?9hqav)iJhD`p!S$~nP{mFeBbG9#g-wWBf`_t9Ov(N6buhGYXMUm6PvF5vBQN$AD z7@bF06unUk`6M+D&O0nhmx}-v#c%g|$Jx5Ie-p*`7IjaaZcol*lRjZz7B}=q!`(Be z*A(tjcImKlz9XH?e}UV}-LX0RB7MMCz;h$6Q2ZO)rI0(M#{;KotoRnZRwu2cT_I6f^b2c1!fbry1%`oI{tao84B zedem_1gdWb9<#!(sC0R05Ab{(Hr>7~IBe9$7XgQjo+LG~#yXp`F5WyMFC_NS(~%o* zxTEpol8FtR!DGqAJIF8(auDsSJ1asO3ZKP?A=kVHn1Y&KU9|-6 zhOVruRqMswH!gv@N#JhO(~VEyZo2vJt;F48PJI*mh66~hZ!jzbyBB*^Z|5u?Wj*(x zlVL-h3mkavgJZ1c0(4#E&e@h;eI{)sN5B-kD?W4Q*wJY3!|j&j`P9A3^{-8jo|_KB zehuOTXcc$MeP2i~&Py*YB_FV~8mW8_9ml0_}*b>SMPImwm6^Z zw6gr&ywNr_?jtKFla)8w6#KeEmnL(Y(4SkI`xSnEil0A1-@i(ZmZH~M^u%1gXLY~# zwL54iEzJiaw$c0HB5{Aj z?>W(keM2MvU*wHGjlH>}*xEVX=^1f_li2g`m@7fzDWJFAK3y}#I=y#1v|O$GeU zx7HK(Cwa~9>`T|<9&+E7t^EKTdPna=+*M@bWOLM4Pkbfl@dS6ww~O(Rm=F5SJ@~dg zYgzN7=(i_(>gujW_#>%!oBeZ!uE_O?rfViz&yKYi@B41^zHj(!k9Yc=bI@b{yRvs+ zf$&#_u3bLS`>f!7E;N7j-Fj}-lZkXQo+35=LGSCTen>S~jhZ^Zx?0N-XI|}0)=vKE z%)t#MFZpk{p#*Lyfg4KThUk{EJ_P-VIw((0yY}io_(8w0CO>=UN!Iafai@*QOVlgJ zvhn73h9-OGea#V82F^|Gn%Mc3`5eg-?$$qe*DvT1d`57>v$%Y2c%Y@rCzN?K4*g??2o-xU?}422gcpUE>^oVQs$4JH_#is=hX@7_rE##xJ{d}jW9FkIyhzTFxO zle-=0zPZITas7mQ*#a}X%ZvVw?llhHg?o!|RKWhN5!pu6C{G3}(t+F{p{H6kl}Tjxiz zEP=nFL-}&f?rP?@AHA1bqg|bcv)mnce8PU2`VD^5c68d^&h%P*hdVsyVfR(!Vtt6M z{u{o6J}JI;rn|18H+RZcgkiOoa5`e8>>u&M7{~0VbMgM@uh%YiNt=3*4da<<(T#dH zvRCQZ@PqxF$DDRD?+?={WCxF<-;H>!3*8l|pY4&BiiufC52P}@O2u6p_~!cZI4gV5 zFT>_OKmBr^*vT&J0F~r^KD(X;GjJBDskHC^h<=3m-{?Kzbi~yL#XRw6_-|)juQD}M z_6|-5KVnUdY@IzdJ>nts5NY$(QdUl;Mn7Y>y5pSZ``PTVFDtwbyH0I2zogf{kGQM; zWWVE`dbfc)DBum!|Edxmpr6^=*m@e{9b2@F?Ntd)w8_Fbk@gA4Pe|oG|4g3XSDbHhN3LUEDj1dohDD#7 zUU9A|uo@XZfR9N&;aAv+L*1H(dz>#A7WG27eaPm*bm7#oXNm1JyWDQ?(8KEL@pkFC z5L=9Q#P{)xA%0^DL5xt#)s9b$o;Vp znbPw&988Y-vgzU&D(9?otm{0_`Dr-!kI?Cd(h)1t4{MOi4Sk-StA}Y8@Djm<=-)?= zA7M=6AK@j!C07b~i2_a{c)JQeUW}f8fQtw?iC|G{V(oSDfZ5n<nA2|8?fGx;;c4Anlk zT?@9qXBs$)+;yG{v$wp@50&(|hQ+dE1FDtb{={C8k`gn*++e=NOCorS1V zCb~0sPUQ}*6ReJN4Uf*dp^?VuBhoqfEybk`M=uhdP&~IP( zRnFCA#wFxrihFNfbHCNOsLDtDhiq1??b6n9&2)%P$bF{bZmNo9O>-~id^$S9{9$hr z*qa3QhF%{~gH#fa_TSFWb?|2Rh4d+^!Z{4Vm!$sGZ^C&VaVNgv*=stF7qIhx>-)!f z_R`+(DCg-s=P17W3^vU;?>3J+`59+ud3V<~*5Yci^ccJ69r`E61>kek4OH-jRruFI z-A*0f(l}!%TuDFgOqTd~>@U5Y3^*NmjUs{5fzzz%c~VQ@bm)7reRl5>o`*Am9aRoGmVaX|t6EQ7LhO(_4Dz&a0DSpPbkNaxlTVhy>}K*Vxj3=2m<`hp zY1oSF;|Zc;D)ck1RqJyF`M83t;0Ovhg4}2IfFlUk++_ZFzg#2U0rUM2%*1iNOKw^| zqf=C^^VR0C97}j7ao(M**Lh-=yV@7{8?iTd2QkG<>5f@sXLk0_FUSG@AB8k+^}QJ# z+AeDJ@a~!1zIR*7xxw`lg1O=Jfi-IdoIc@8XY$us3n$?eF^asKtLIw=d_Do6j~=wc za*<8EO$}INwG#Lh;+^>%J#!WP`6(I4v*Vc+cp|;a%`^7Q#j^w7I08$S!jM$L8SaQv zeE*Zq#bm*r(^% zMEH61|J7&P-fzMGY1#Mf={(s7xomwhvvxAJ)GqF3b0p$YTie4Y;=Mvq~a2miLE|Ng<rvESNgtK zyLr0U&dTB(+gUHT9es8B^{8pUq3FrLHu=gOT^-vBSNr+3WFgvScq{pf_`&JkDc0p# zIs}U-XWwwI;R*_m zxtCyh*lKFI>=PW19B_(zBvbR!AN$eA+`QN|-flU}J=v@G%gIH38*$JRoVVG@@dQ5G z(R}aM_~4P7CE^yZBy0LO=-;3R6nUFSHdZqhcW&_i;6R_I$Fkg@Ilbr|)Nkw6suq*2 zz7Soa9yfV{uKFuI@mv1a!RGiWY<%54n^~V_dCC3Ukz-!?}xQfH!F4zi*ZMSqrw~ybf@3}f;pY+zRC3x z(AUhfVy^8Bvaussdzh`WtGUAFs7=6clC`{Fr)b*GOFZ{G&uzI=52NSaqYK2!)&FO7 zPc9Ce-h)~k8_tfc1kT+p+T638T!1XT^u?NAhxDE%{__(h#yi{A5^Ei>SD%q z_5byN0|?f2JU?i>KAPjjRi^v9d1dY5hg6-kx!>X5S;>HdgyRkB5(~XB;CS5w5A)Oa zCr>+AJJ^~8wuVPp@KdIUJ;I9do$oN8hwbm`WcC|+<0!HQZ=>cLzp6OrL^1JG$o)5C zXX9JVmP8K1Em`Gri+C*seKp3K$GVf-=rcfyG{OjbBQl5OqR=$L; z!nYf61_hi!YW7;;!+dJYM~gQ$y0#78pnx|h;0;pmUJiJJ0^Xp2H^}n_iikb=E^QZQ zm*heHeGxY1yv|0fGr%DP+uhJdq2TN2Yhs-3oZ2(~gXp)jp1bd2Z@qrD=26yVSs4N` z7P-+pf$>ScB3lR0A)A^jeI70&|Kbp0wC%8--+?iYm;^Ci{=GFji~YJ3Ne|ZUWTQ#X zUT4o{_j_gc!k%>Xb7YOq?bah6;10x3r2j-kUuW?(@{OO!n$-h-qJW=BzETZ``!r&H z*7Cb}iquf{)631`9N(u7Q9tLZ`45S0%po5&BkJ^kw!72;XhcbW1sx=-@Y-St!(o;)qYjka)G9uLn-VkE zD-g$$=Ra!hm!$pp8T#d-b2a56v0?^e&F?99;Uwp7FFGDRNj|ZyH)Y!O?f;iH*wbm) zz#6X0xBQ7Lz%3;UI7e_sY%{qN1I|cJZ75lo{*Cn&OR`^&C5z{>Z`9SmFAqA?WqPyh z9V*UAz|BywMXUC2vimuWer>V>J6Mi3`5l?u!ZS{e&+%`U8Hcflo+iJzJL3JA@O8w@ z3$f5by-<~nS<};~5pX7{*MkK&&$;N7hf3Kz}8uu9=+II+_Coa_MGLsw36NE*S)OwT=YD- zVSC{CuurGZv5&J!-lSW{(lI}g{c-M)qvUC4bLZXUemKf``wLrtrq8TO7YBDqWD`2U zJjeOHQ_L^+=li3(>0vhHIL}9pVui?r{~tAAj1m~51jYzwP&t7y(z~^iz!>4j3p8(` z?r)UO>gRF_e{-fkbZ%GkY`A^6W;U+8z)+rrMd(OeNOB9Q9#0uPsGh@J^(Vh~lQqGM zgd?s$%t3!%#Dk@z&G5;^d!+WyBix=bew)%rW*!f0vBFAj$v0 z3LA0%VUQ9Sqyz@Z8Lq)R_KMt0b|P`D+N+7~u(!~1>!IT+&I_^iE~ z<$cd{KITdL@sQ>)4SEu#YIuETLPqAKtG4v~H+}cxzIT3qe#owv%;tRB`|Rvp?xhzO zrq3UxgW!UEUtn{NBu}v6&WrNoJAX9vfGaxm>c+nFbl>?qbDQM69_M@XfKpF33ZIwB zD|FQG>90*5o}#z$F5$fl0q;_Hn=bi8{C%eHTadollMHS!ri0t5S?Eif5S1jcwvUS- zE}(nVVzkzHpXtdn@2P*hJ8W0_^+x-ACtZz;DNG}?YdNDZM#<%AQ{19iJnDQ-;KRWN zx@W|&ovmBhWLr8%o0$_C5EB;nHPlY4IVt0x4)7a;)+~eVroY)wIGDP*A{W`p4wk{Sunf`CF@3Z0{lNrtn+!T70`S;kH|3Uw@zRz93 z{+^zeinjU8@42_ymx?`q*`MdrgO~9$;vU_sf7^Ka_#yYnba%j^fGxtYC3Znq zz!oL2MO_>fY*CjR`bawId3${97DD8s`Ns z9B@Ac+)rXDLu$J1kF)u+_xY7G-E?2G(beDu{f7(n(S_JV)&39r_Yrf=?UjB|#^>3P z{v2#XvCRSY^iG-FowJW;$$O|5$lBq?Qag-smXEZLU-GAy%VtD8Dm*gVoQ$Y7A&dH- zkeeR1fI2=k5_Pf4x|mC^y3_G$L8r^*xwGuU;$$k`V_W-gSfegy)v3Nh?mu*tFf`J zxI;o&jAABvA2i?7AVBMs}hpFVZI zk2kNG?uY(-cJbutY6JN-Vib5I-ANh!#V_Zqm)C0GpX0%_AjwW8BJoc5>H)f_gCM_1F zlk|#}LlzgXp0``ij`iH1jJ(4hfWt8#_;PD^kNug;cl@6-ftx4b=85-L@(#VIuSNJN zEhn%z-TA}fu=~`eIKwB1pB)6}$y;!D>-U{@lArCB+RS20ckoi){c!L76lShay%p7c7`Aa%A!E*8489eSz;kh|a?Y1fPpzmQ5D9 zVi$F1H+;`0bm;ufc`to;s5zWO7EX{OI-H&vGM`EI;YVlxcCs6LcRf~W7ax}N8TY+0 zr-%0kf0bHY-_72Z|LWxrkMb{4J=oi^mO1u&Pc|V}hk2i^$wZl*3zy>E**(T7;?A#pzj|P{jI$PdSuN#m z{U>?*#J+xG9d59%&-nZ)?7iQpl5m=Msl<`nB_cR4)6oXn{?F0B|Sjt``3D=bbFfpEgeX{@qI8a3CxQ-VnE*p zJ?#D7iAIzCekL9M7vo~%7UNUnEBDai#!|*|M&wah%~;Qfbyj;C`x&@t^ogk2^WW6NcQa& z_rdmL<*(kg>`blWOhGkvC2lOKtJuHKJm*nopz1kC8ejYSzdiRwqedpCu|dbMW$uFc zyp!H}#u;2M#@Wa}j86jNg9ABF;CvD|p9Ibarjw2n@9L*BU^9!c?3w@3hbOzwj`!Jv z%^8LV-W`VsIi07}f+epc+q>_7_Sx_0_wU8o@Fl`#_p3wIhlk7!dB20m=+pFJFwQr= zp+m1@AMHW*)x6`wt+Gq2#inepyWPKgvA=4@erkT4E7LU-62s*s@~`J@&e`+{7ruJ+0)5ya98P#+Y%q*!tsa z3OJkOcl4t$j}b$>TR+!|m}BssL4Kvs&qpsW?{z7^HlBSrp#)BdoZvjPTMxOH-gYnj z%+_(11D>aV=Lv@OEE+u3CkY1GJ5P3g^|pm&g;}=N-xwwPHtL!3MDjUR?^{*>S1tYt z8@-)5j5p?i@zY(_zRx66Lu8;K=OxyY=>^69K9rCAm^n@&G0%!U!3x2yIEmMg2 zH@U`kG0Y~zC4~oB9}4Taukn?+{GT(Amk|c5B;KdK+}^}|XyiWm13Tj>>+`w2_|`r= zP6nDKbtZIVg|58C9k`X}?g-m~hf2OIBX#^wx(v3ci#LERl4DnsEdQgPOAq-p;-tl? zGkr(kbNudJ^v3hvG5)y`oX!8ar>B-uws2DoY9k!RAMSUr|75-Qr~5x}ZZ6kne-CG6 zbvjy4VZO{XwnRnUN(hIESN$F4={WlRF8h6ifqzQ<&mhjerd~*yzFXC>DEsnM>lyjz zS2oXxxxgg^Pu+~T204jAm}%8A<^_+GY-!y$weA~R*VEh^_q*FS^KQ%2jVWJdraSV# zbodJF%f$JJJ+t1kt`BGYI_LBeK2yar{z|Uavd=4%`-|z~h`XOH%abM3EbPxddWemK zPb$1>5AaFx8FHMvdB7(X@JWS=pXpZ>jy3Q}>EoeqC_fFKRKO<{@JWf`72TR*`c&Sq zrcS@6H)l;f#W3HC&bJTh!(rSCajGWl1pak0@v`T=Zyj+==@C1m2SyIBJJO9c-aB>% z{aJJ8VmuRNW-S6*2cMdyyb?bAf^LL)RD(Z>*oxhu{)x6I4@^r;L*6dQ}aSB`g65~?$ zA3u>_J*;Mc&tB?}`Im@y3wWx+>TGCv{^UA3EXJ-aPFLw{Ag`#`$=I`4(QD$Ji}Y6Av}Iyt(5&UoBCUm`P8JoiTO(#I}ZpKkbw zPI}yW+;8+*lYPdFQ@b;so|`V`J0O3dFA85lpEx#VM_mWpoOgYf+&$~F_!{LNN&(N6 zbJ6gQxQ*O%ZL!Ypojdp}nC6bW*W6B43Y(m<`_B@$(1SZ2>~cANEME8*=Oyw&d`#AG zV1>EK#Ik+|KFhQ5@|Y`p7Td8Zwo~IH4eQ-zEu5LX*)K1f*Z=72-JPfZc%PPizn5=~ z2Mf-H#*tf+6tH3+r8Y+AHu=Hk>WSt&srsBc!^w)0d{C@qd#TjaLrHfq zzXyYrz+maiRZi%GF8(JX)M2pL%vJT@H9ED1*Q=Mm+($D&ueh%labGWQ?XNeUcg}wx z%h%hpbII{PjaVae8~Hug-tBIk_hwV}TcaQ8k;i@SmF^L`H1Ku#1272AbL=t6R}9xNI3v6#r5#oXi|_AQ=e9=p0{Cp+8XD)7yJy~6WcsH>aV?NbJimB3?(eGlSyNcFwt=dceBGT&cV_tmY@{>Ev} zeZ%|CP2T@#wCTyWvZ{D>FJFA7*jd)Kd45UfJ!wrpmp9wm_mP<}SqxzXy7zkW{A${# z)^!w?HmFl5_^4I+;xpxwa(<9_5!wBXGqJ7b-Q#=SHm8lf`zPL0jaRpqgc>hc>k+rd>l zpY8uy_I)KfY#uS8U|xT5TSc3+-ujmKJ_D0|)={-#t!-|k^+JtsM-`^I=Ri|dOCU$s1HvY zdYRxH^)7$)9?Ofc`0w44gQ;Ixgoh z_U7ACJYrscp?Wg?0`&^C*RXKTgkFN);g59GM)cr2eCzq?m801Ic zEFX-)`)m-l4Zl!dYWah5&-7$JYYY2D>lR{L)7gB}+2xtMS|c3Db~%Nebfa_hwg3Jl zn|N!wYHoY=NZQitrwwbQ{~x`*jOfJk^z8H26Bk#&#TE2D*4JL%&HeEi49t`6x2@?d zSf^rQ+V6yxlD~QKKkd_h-7S}z=jmxXdByu5Mh4{a5|}M<)3SVT1wTOr#$$-Dsy0oC zdy@NqjCqW6_a1AX91+4JV1w924c6Y|lfsS2kex;d;+>w)orD z)9b|VyzSnC<4Rz-U?wVZXhX@;{(Wt7nXv!gaF^f% z6H~9^%c})^V0Z{dBJL^j@D!`&Q^>uVarR}|+Qgot_`u*s;Q*}@J}^D=aedkg*e~&p z40k{&;06oxiL=3h@!i=){Mke4m77II?vtbV1wCFOYq?kzc`7y_^(EI$+fKM#o6Vv0XqGmkk$uOvwcq6>yJ{?Eq zV7%M}>UZ2VFkX5%xc{B4*`2MqOAWEXA^o288E}t1nC9@j@{#uVXX{%P=X%ciUC&o{ zmy0Qvx_yE0iUpiv@_AIa=e5bIp5)0#V$hdndhfsmvi}FYx*!7 zSZqiQUn$@Y3zON6?~?;HN_>DmIk3!Lw&?KGI~K{3)@ma8-NLxocfhBsCDqE@Sdx77 zkcn03y_9~cITbJ3`${R*kG5Z4#C{k!#lmNKMi;f^g<&P#Td`jxKCysL%)CbB7b@L; z)m3_T0lKy-X0ax}v(NoBuk*FOc|7i24)?AHx+fxEzyy1-i~o-O%9r%{FO9#@r*e|T z?&SCu=l5B1{dwZtoX*L-9DdXp=Wj-$l7e`_=K|zar;TtfzQ} zPw@N2nj&^^5BeH+S-@T9ey@m+SGqX#4cN(BSev=s|7vTK=*z;%>7!B6`>3LSN1$g5 z^>gC--s`t?C43yqcCzPZw4ZZjKj7ljuk!Cb7cNe&l|JxUxHvvyp(e8mds0*DQiBnz zck9LB;?y=zW#2c%JlnYM&h+LD_^c+Knek;xTIGwwWP|kHpuSjX>{r{l5Lr?1XzTWZg2ArH;3i!jN~^xm<*7tjKnq-8vo>8jlH>_{yxY3_b=~zEWi3xa{HxR3~pZfI@4FM;~c|f(uuKNxxqfZ$Q^w) z9q>B+atVEc<6Etg+CDnuGV=V0GcfFKkNE8Od zDK=y~?q+>)oFzY{E!5Ajs^n{JzU%39(u4Hc3iR_>`dTfeyqSJ();#tkhNFWSQP08W z|H3ozmf?wSdlp@u;nwz@uyTBbAiiAa(@=v4sPX%T^~Y-$YkI~B-g|y>@scyPwEcF6 zvQOJ|yx4;0f59KW#=dOfIp3tM=-=`gQghGLthAC=-js7n*?0ra=}35w#GOJXeP*rj zlm&jdI=(7??`l|m>|AWUnd(yY5s>FO)P9`HmxqVbo3PAY3-odj@6w~e`@+L{*S22% zaFu+~J3RAYzV7PYC-#S)mtQi`9MvH5onh?g#IO1L|0YYZo-$&~ag_yJW%^VO#hw^) z>Fj7SbFlrgcEZS**~OLT5Z{~;F?woba`DG@SjD@X zT~fO%#@rB#!b=wLl7)9mFqGEg@HCb8|4YF!Fx|t2htGt z!5v_)Pb=vkX8y2P@-0C<@rayeJG^cWV{eZY?Aud(F*qH4yGsd-RX0BkV@0>)D7RKH zR!;vY9Zuhn>+{*ZcazOqok2Wl_`yoCH!V9&%-A|y%U++)KJ4UPIh)KrKwtdJ{GO#> zFZCU_8B^@XpV%{a%ffQTLC){SVo~(En%*-1rqZ=_ag~WnjnaXwWO~+0&KJYf9|_l9 z2>8VUez7RyeEyD}tJ9;tOx9vwCI0QByq&;Uxw!&NNYU+QdcWBCc`&&fuyN&ciqrYe zua21#{J3frH@x3 ze_XZBlj-zU^04^BtTYwV%H(A8aIojp=*CK>X4w2Ll0$#a{rir+I>hh)BZDnv%UqES z$lJ_hNA<(!@aO0WoL%APQd_KVAlCOJ>%t&BWZwL!fVYePst=fFtY=Mdb_JYWF!Z=L zj97Pxvn$~23OKt0&Mv($N5l`yu%~4?yFx9ZzEouLO}1;3Z8C>HmouJX!$yq$D|F=s zSz6pfcRk@9cXX#L?OAGC!=AnqmsiyFv2L6XSP?TF!1bjMwX^ayyM9fwxt?>rvCocL zljwiWWi2+#+Qq?n1I9cno)$M-$iL4E>SUOQ-Vr+hNH0I+Q(p zs{Mrh?bczgl@977lIy#Zck?q!0+md?Vdlbo(Hs)@)C9#WC!O`>flO#^++0 zsdcN%GhjoI3(4d!@ys|ASDEwH&c&kEe0Q=mG-d|dAh5;M=*ul0ZyvG7Dy&ultCbAp zBYe9wfzc9!Ys#ff7fVsk>t{=44gIJ25Y}tz*iJEr^Yv$X0PaalD}zgQ_mNG!W%8_5 zcSD^GQirvxCwCj)8B37W`N$Itl(SG~d6W|vDEE~9N6tJ9R00F#vsFLAsSVEx0|lc# zo?kni{%MDM*sRak`>o7#8|(E69Z)mhrRk!KjGsu(He!$c06*}5_UH;S@HQRxdp_@n zATt!YR*lRI0?*K2we}y?S2Usb+9R|c}v*L5>zlnUopR5s# zlzg~2oB<;RU#)k#?}3q$l0TS)ki>Wg1sHid)ajX_r#!D^IW}T32w8Lz+EM9SN2w2zWs%}Vuuw8 z+!b!(;pAq|--KPaC?E6^vbC=|#3aUAt?T7vea}*ZO`iI!*oEh;nC8jdSzSzR#C@!< zCVO+2yeZb-E++Bqs^skyGlP2)3oOHtbYQ0%;c4rzdInD*AF!HxeX5({5jqr~mN^A| zJ_qr}42DP8aaZ>AtLJYQ3$d3Y-Zl1bTEX7EXpNp^r_V=6l-+mFneR$;#goQ){`*6| z*;HpRA^J~{hQcs{aGY9-&6+Of|*yQG)zpM}2}xVZvuE^#otcj6cudPlgaZfzLc zl-b?MyWtkvv(Fy8Msvq3dmO*!>az{?fz za;f?552uSm9PN7!@Ex0pS3sD#w@LvwSGdXO^dXDzTH<201YS#AtuEfuo4{+q z)lW}0vbIm#x2?s$HgdiqzH4V=6ZK=4IS0r5Kf3M$POj>TANZS{H?nVLB^%oW5<-L| zKyV4}5ZtABup$8hf#BNpO_mrzOVQ#GC|;am#c6?-5TwPSEpCPK|K7KgVd4M(?|#m_ zd!N56=bn4+@0_EY_cvyVdm$E-7-9J05_rkw<^+4F`%ZKdsx_vZna^7%5QEpZU8kJJ z7=O3MgHLzARo$zE{;iJIP*wQ0nx1L0rr5u< z9Xi@Pdrh>hdF0;s;C0%^SmSeu8FCHz_Aq1Me!iRkmQsuNSm@cuo13m}j5KFqL!nHx zp-1$ORrPCe=%Pc+JI~6Ti_>qVte+G^1|JZp`9XYXunNqeNrMNfFIBj{jn zRHy65v+<971Y4%fmBrKJH_H6~P~Y>tKKF6l7OkG=XH;Jo%f^~+JzUj%m^J>f%%8VH z+n{aHPH0zjG&;feoo`-!0lFC7iXK3Zpg*H`&?o3yJZ=dz3=Kyk&?vMVS`Dp^wm@5= z9nd-G0(2qzErQ>S7ND?pcenX@Xk!nc$I-vgC+KtZl`-Kd+;SXR4XtIKJ{T=&?SHs- z^%5D4{UTql);{o@$LX%bJ2StWk*vz*Y@EJxxAHxr(9PzuGr12RzKd+k#)DkR_oq7l zl+5{0bEq@)?|sQ?!8Y|eV~sdpi8x>85inBbi2(-&OM+kIqmz_X8@gI~%~2lLqr1>w z(Cg@3^bz{e_l5CbW3(-rg|0?-`sN#a-%Y;nF_9oQP*3;cp9?+XbMnqie2=|VvJQUo z4>*dw$kD<6dwuHxSL)l_Yjd09%WTKUTQT09BTKLW!@ptb$jY_+_0u;Pn+K6~_IC|T z9ZX4k^dY(GXgoyBu_V};6s_U0eTzo92DVPgmig4Ev)qw(ep_2h-K@xQIT&rtd>_&9L{_!zJcJ}!cfi{Rt5y*ly5W~oEyU-fkyUU!Xt zafGsb#`|84=f9x-mUW*4%&9{EIf`7{que*d^T%0l3)th0$(JqO^<{eg1C0@M(8j45 z=6mhr2AI`C%&r4YOW!@(e37pcm?zi`Wdr9H!MUaW`rzF7v1}vTh;i>8VV?6pyfMg| zzjmJ!J+IMP(cZoRo{UUgvUX2aGv6Jc4IE0g+uWRZUwsUA433MxP~QwY#^-!7f*n(< zu>b0Lf_mPKmggvPF1sx{w3w`#V2Xacfn6Z@KajeplB>!{)+jHH5h9SGsv^CxpbZ`hMZw8Bt97Ia5)hlEaBfXwO0}! zED;~fn5_?x83)IFnP%xrl=;@~bAQ~;M>qLeT?Jb}xGH`m3R)E$GrC>-fT@aLs_4SR zPRGF>AXnT^)|*AI`n!BfSfA6@%W!vd+0*C5`(Uf5Z;K_yAM7mHj2w(bN3y;)7-ELK zp`VMLNOxOj&Q@>zZx%gqi#6IdehS*GKZ?1OZ!g`5=Nq5dwsiQ$medb9ER`5(MdKP< zE(A-ZKKVpbPViLxL(&=BzJz|%KVYgNn5tA(ho@qHIgk9_-*@!4ZUx=sxiA_L3{?a} z1y|ao&BZ~#3WJ~5*7$UD@4dC*qm*?i+s1Z07EcRa$#)-T&Jg_22fZWQ6selL?0v$W z;ijySvq|$#a8vX^WpX8csy^YTXm{8El5sXMRvwQc?dED@*qhq(1Y`4y#?B3t(J*Cn z8BAl7_k1zeWe$`}eR!Vi-7fdsS-A#!$3{UfBQYXkejRd&`MX$2_{Z0HhxlZ8 z2%kgR?9R@C!Q$W0dbsunhZVtLu~RHWa9FVMwW+;69F{BSZM{1j7M*1i{pUcE#vpso zlWU81B7?F$)9-rtL~V<%iCbVha%@D!o^f9|stAsXj}Gxny@U8>iC6%1B?W$D+M{pC zm51R|XOrR9BDaR|v6YTYT(d-6vqW4oeuPU2jHI=ydgJps=Am{hKS#jfeP#YRN!d5qPDFdqb^p$K!}@45y3OJ6Xv?D2(JqK}4_T)_+o=K800!s} z1FYK)veq*nA7WoXhu5afTyBgL7n{zc%NlHn3_X*N0QSjvZNOrQgO*&UU(s!*J}?9B z0uBof9R{5&)_*Gtg4E+5^YC}_8{WT+b_UZ!Z&=_<9ez??&l=&JzbUh2 zw4?2{T{tZLv^Ijn;-is0k#+}zWnNXLt1nyg3l`e?vvFe+atR#@+t56GM}fbSVj>n> z>R&@FHgT|LTJP#0N3}&8$DR68ncY)=}i+v z#*SoFoo%x^ghlh%`RqpqYS!oC zA4z5pbF8b(aTaQi$D;q>I~V9H!}Nn0+R=T+%!kxJ{1hD~pP-%vKSdv%x9-jk+jt|k zS|YX@U1Mjmi*_08tLWdw0f7I|r}Ns)iG}tkp<}s;9{D`2>KNnv!+5|%@=4IM4AYOqqKwN zw2za`!B!<>h^Ll_r)I6A%>T+f@%&~+HS}NiWjd@iw@3eWF8mZcW{z!9oA%rSGpA3f zrzf<5$CS_6qZU?9R0(?+0F`jA5kAGs*DU7>ty1hn>(jV5H>d zg*mOYTu~Z5<8nOX4SJAkyvK`l5YKC?zh)ErJ88HR{jkUmr=Rot(=p8t?@L}62gCjO z)q#g+D+SYXleT{_9(bhpdMW7BjjLzs_kU22n`uYKE9ZXnwV_-mk!5@ATLxdf(!F4o zBA6xX4SW$R1GuFKW+{SMieQ!^n5772Nw1)XQLig&ukcDCu0&~V{cQ@FV4=EeQFjlZ zL&%Fy`wsY|2tLVrS0RE;GA?(EVLdRlp9{8854mn08B_eTqz8$AroWXE@z3ZQ%Y62f zt%26T2sI?)pYdsvhv}l*%eRZ`2}_1QcB@-)&iGvvSKjsFp{dVO(k(3>n)}X4;3esV z%n$Sh80OL<^5quV-j==@zA4p5!8fsmsMU_xZmBoeCRorCA5mrcp$78G0DA5DsZZfm z$UWorzkd40`S|~nwyPJ4^!YH2c=Z|hY^(ltDjsxJE@rP^OUCU^j@E}yBRe;lYZUd# z4fLOZ>iz}W;QM)=esE~Mmd}-1z6|vTed2ZW9U69`O z%)>jykS8C)$D#G<7IsFR=sxr?dKLYE29l$;M?0Zi(UIsRbha^m9c_DEG#mW~eTVwt zC0n9B(2?jk^cyr6U4ouKucLpW5Ad5c@td{Kj%ZIb5B&!vj%|cCM_Zt+&|Zi=jd^K3 z99F&i)$`3#5BJyOf4@!fvp@BVK10L1Dk4B@l)J8I4Bb|FceZ3!> z+kVFUe&)LU$lgtkH^DUf9uNw=v>Yvb9aho)CN0m zoXK^2pIqt_(Yk^;Wzjk|+Y|gQhvx@;a;tu~L9T;84Sr#?WwtQZ48>;Dh64_6vbNQ% z4Q{3#jUult)IRveDP4-bQ)j2u%px=8@gr-&$h;xgJVkJEq)9P(JQFUC)WTPxG3_>V ztbPR(7s15w`IML^im{=O!Nu{jP>x{Y*jkkNVk}#0Cl!z*VB+wZdiDtYtT)e#HuNmE zj@I|O*(!G9$M|x-lTME;uAfddMo;s;SDH78;m6PFIp(P1vLP6_Xu9_dYv8bRWZGgH zHwku*-E=~~1e@!9VCVP+n*oPwex0u)5i~^0KC1UH4j)gZgKy*aq9eqtQzjke{XO*d_#?iOk2}N} z6uU0hMTab|hI9Uz7t7liHr%}AIsEEUykaW9Li}aZZ56CZ)Fyo2B(Mf-&C7|HeSE6q zV4z{Fj2*!Tz&6^})o~qJd?rkxSS!YwV7vGmbs*jz{4F0NNW48*|27zIa$ikbX|y&5 zA8zi>2N!--XD-MuRO#7V7ylGFYnGkKrpALSq@P5qlDovr6OWRwa(cI`yu%jR_C)Nw zbd6ukyyUgG)%sU#F4d~;J5wJ~mlZmU%{llCGHKkEJf+MJ&*ijz?UcTEbN3U|j!#?m z5c&4fyu29bF+PgFK8lA#a6%iAo2?=QUl;JIC4IBRFH*O;J%7X6340#n7yk{~#C-F# zZHx=-E0WPUSOp|L9$z*5YlSvw8~nhXLgo-3Pg^XDB~-^xOnq{%@oYFvMT2kKliaWu zI*fdJ3*FUMDENb16K#bKK)49G^Ue=`78e?u;qB-~i*O0GY0NKpJ9;Rwm-L~l z^&gl!a#_7OUW0dR;J2v}j{97FHgEn?&~C-Q^X-v#7h)M*OFmtiJowqUJB>JkjaAL4( zqhjRoQCB8^m)T#}S;wr0!)P!coMWv;JYC~FU#w!Y%!fDR*T3->gC1=ym+zE4*Q_>-Tm2e7Y4gcKF#AIMY+`E<=p7TcT~zZ&9$>X+!O(3w5K{(bs4P-+qnpbrtWwI%+|o zEczQWH%7nnOObLVJY^G(YU%3$lZc-BvgftE==a zL9ZL^#dnX}#CjF`Dy~ia-^1@kQ}E-NczaoU4(qhvYr{==@iO||P_z*VDoZw{k+3dG z2a0bVs!tT$`)PW+tMG`E_#LhzH+GV31I81+4;G$%C!TM0IfCz_7w)#^-eNtygZ|E1 zx_Z6MHOJEP)soq^_MQR%W0EayN^9~F{&k7;_1f}>^Z~FsrOV^4bZzNW>m56&6KfOj z-1C%2r#{6#QQw?vP2&>n8XnL4*V6TpHMKo>JYQw@tKQ-9=zQz=scT5(et10J)J`64 z#lyt2XY+4@)5GG;}Cb!{(Y-7cgsN*B5jvUb=-cOEx7=A>Z!M>&Oq%!zK zOjocOx#LQGrVb558)~z`H}K8)@}9mc#1RmykWRiQS)RVnS`fWOOm~I3MkZ$3Gu;Cc(%32JW@Av0(%4;Sy`ISJYTXH5a_9AkMS4dq1ALvOah} zUa_+8gjq9gvRBpC;npI!H4<5;^`ip(F~8Y`JiF2&Jpz59>qhIBOQPxe-a!3rAN`A$ z^?;3K=PY({%)cq#CPMI@P;hiud){u5Z2N6ZN`>F~3K<-bB0mD%ZuA*m?LJ zoVT`guzI{fnTm~=;<@%EGyEglWL#^(N3HGS+Xot7#$-BET=9|k&|G}yYyDbhfW6C= zPRGk1^PIr@O3M2y<$Z#0phqgbr;M8MoEOm-*&h1Y9KKd0@6E90*@EYY&*S;xA0`tV zgSWFL)fMa%Q>^V{#;OqWd>d_ZX0{{n+oYL{Faud%O2kG?Rwr+4Zf%?ICpPxt1p2n+ z=qYy2c9;**4|yI;U34=U!<;qQk^W+Lx}`ABTS{N+(jJzABVg%hp4(#lnPKf09#}tK zxd6|X>(pOc#DHr_9;NdS@dw{Dw%%ksri)2dvi2cnAxv<$`A3}k;yorG!`Q~=3+(#o zVXh-n4>vBam^t%ze)D|qa@y3#_$B|O zVxGoqJYc5WcWcjlLb>rd!`8Gd%6R5p#-Xdx+u_~yr_c3)kH|QudG1EmzJrYtt7p`a z`YHG_$DbA5$F#Vc9aalpm+i@2WaI7Wp!Pvi&`Ib*bQuaZ?2TmO!T99@-^1&KZ%V8+ zC#7wTGcVHLW_HO*aYVe}#xJ>yi7tyKbd+#SXx zHlumAsD(uA!K4-+6?;$})h2(^=k~|*p2X{RBs;wCeZ?Mx-J8Ldsm>VHo`^pPN7VtZ z5R;?$?=ogAhj%oSfk!AW`0P|(IF{_Qr}Ft4586<_KF9d-g7nJye)MT`VILAWCUKX^ z-LQJ8FA+Gs2u_bZq4we(#TR5BJ0r!nXS9$16xvJg!-_7iUH-)!;g7!MU&=|G!Q>$C zF3w;Y^ZiD0)4|5pq1y9&ZD}*Sc)wUXh+D*e%Ug%YmmbZxmyXmAf}ceAJ$ilXNXCX* z<9h$R^=b7xMSFdmOeU6KvW(|FPv^I+_lB#W-{Zf;Twn)!7s9x?LC*SG9&V4_Gac6v zsFi<)q00U#-wA(b4TFC<>j$uRbi44FWZ7U(u}J;F-O>H=OF(YiPdjYF&j%y+AjXf9 zI0~iGIC2iJr1U6ts&JHZ`sM&gHDhiV>`g8_6#t@!0i!D_cW8 zZ94b`7Tc3v={-DfJ@tO5I{mwGUJS!T48w%oC;W4lvA>0U8?*mlo0!Ytp>)D97dgD> z4(;w{a?M-nyR1(=67!9Z7oLch-<_Yy7eZXR3J;#@J?=!i8vB0h-7myL&(#;iEKI~K zg!`UjZHKSPTx;^I_WF170gNDfUE^k46!SrhPGcR6Af72UoAwJMsJ-&bqL07`!s6G_ zC)Qh2s;4&yRwN`$<78N`gAt5w^jsLhAfH>G?Fsf};#IK&i21OBF{kqu?~G0(E+pa} zCY$3U+oPQk+rC8HLt|NOvZ=l*?jf8)t+n@B_U8$Fasn&M-69hAkZnha?+QL%QSj>` z?qMSCVIuBfBJN=#?jaeh%=V)U<5f;zE5+t4yB2T3r^G$vm$;5Caa|(rA=}-$MBGER zy!G%&_2#qnFm$u6gB44=87I%j2k!P>JeKe=&{|raO<04mXT2Q!iuTk=j=3-rHteU2?czI2*)c4q+|3olq`EW0r$ zmV&nZly#)@^nWoA*;K+K`4%w`)#reK3)O#H$x7CVw4JBuGQ>ShjLr#cbaEITyQMKw z+(YrE$cgG3#!;P_Bjfilj(i=|TIZc<&dQIqcRod1zgs{32z{c>Z)m)zx1EcE-{yYg z1hK8GyYYF!&qqdo{k^`rE1JSKd>?)F82YZs`s*>??M`;*VmX*c<>@csRrQZ+5MNH> z#_-`5m&KmqzgV4oL(Ut9A6;yH;!}Ndn6|%xGG5KR>s9TD?2?F|$Y7>voY%6!dCTj^=_5pc$PqFd1K@Tou3!wj)*d8Ow@g|2AF?0misa@u>2oxSnX zoCOvj#C6apd-z%B*Uh(`EH<}Fd0GaYJ`mDVBJV@4_jK9J(Mlg+0>c0Sw zTgr8Zz$OLk--5U+tV5W$w3oIjz`^4i4;T~ZZ&JPP?&hp_(7%RtUl=a+UQ1fJ6ecdLvP|;BhiW|__017orcav=b`h_jpz^bHT)OB?>5lGHdtqDAn!Ls zADF$qiWZ^|%nL5ohu@&rx)Be&0^Mf+cG}t~Qrf51S}-SL}GUkC#keW?vCGME0JGChEN*d6oX zjh`N%4NWs%?H+fK75G{p-)HpGsmghC?e^8MZsHvpTxZR>bP&B~;9s-Quhq#z&ixdH zIq$LL{6zaa4#AnxjnCjOT7ObclkqBe$_Sp)C_a}QaUNY-yRlxZ1~Sj}>gRRin0S#1 zom$jYD2cV+lj{H8&$UO};UP=m8(*M5YTxHt$NE&eKFRuEh#_=|daXkt4l|$jbmjH@ z=hcf5$);L2l z%w+^~$wrbLj(fsfS{qB~XcN4%L~bhS`{MhlFPKXh&@z6?uFjYVbBW*9nQPY5t2e3H z{@P6c2=0;(v;m$m&-pWh?UT6Zoz`i)%qMa%p}y7kiirtFQZ$#LPeWp2CSqcWON_l3 z6U4-%?w@IX!qc(y0w0HQ%O&Do20z5)U9kdfZ$SNx>tbHQ zoE7OWig+}iYh>;Mz9r^m8jB~yB?-QPVLQoiVuiaqY-j2V1h!Ktvsr{?*jYcy(3vSU z>y)uIRJJ{i!FgKaOa$6hz*qVf~k6mKKE|D+XJgm!1v8UPd=znkct|icm^kY-$ zjcc_lvKYKM9j-r`!CLlo$Z3W->j$z|jraV+6)ie$(lyXm6uD#Ae**^CwWBq~~iEsD)k6z{v3 zh+~;RqbFaXxAl?rl)pHZ;zIIC?wB~1@H~8}YC|ikm+jFt=oz#W`RZ#VjwMVby)81% zi-TQC#IH;iYHQ+GCgN8bkIHeyvO17@TL1hga|Ay)Sdm zrHvzppfBuOQrlfKhAYkSqvF0VyVtVXa)>Rptz%yq111@J6TFPyZZ=)#kTdvy@Qt0u zv{&(>f#w9q`j%Uby&uYNiwCJQ*Y}uTK zeN=z#es$+R>$!hcFI&cOvZVRUUE~w-Ea5a}@YT?kOwY49)~9BmZ}g`_^@ZkqTj?76 zkIA(ryV4(gt8I%_sa@u*lj=L(eOL7uVp=Rv#vgjW|9YS4#(|Ud({q$ZS)Y5~cYLV+ zpEMfr zPV=3FEdxKm+84YkU!rZ%KjRiYRK(Ua7rjK;OfwGkuyNnl_1)^@w78QT&<0o48e*JB zo5Xw`<;D6Tua)Wa)>j`eB-S3f&0S-2sT>SE|AzWJ3~L0#8aRP5dL`Gz?jUc>>PX%&lDuNv2r;PJ$xJuk zsqoy!l-gvRHr?TQ>l?SHnxE}K7d27+*OMEwc+R@M{T_4GFpjR_ov&lxIgT#xdOEm8 z-sd9omy>es$)Ct2`{PUFl=EyPUSuL(WYUEvi5JP2Pbc0Vi#yT^uMqRW5W~>UFb)+; zZxm*fE})xkubD%u&;>ihW>Y^6Hmxse4_W7bWX`jDJ`W?pmmz-lxMzy%NH^0i&PZo+ zg7SgWBzwTkAZ-x_x+Pur3Uvsp8NKMcU^UsL*IP3?heXyLu(_qb>N8JiTO-xw3hHB3 z^OV)p<$mZ0?P?Qi@E@p;leFb}ZBnerM65{mb+P$IPM>U}V{aF`FHYAWH`2$?S4Ru= z!*5Z&dxv%RfG2zzy@CEg&SS3zbCK{{S2C9}UqFr8^{FV#AHGFH99sshg3d%2p#^Ar z^4Rat<>&_T*eq>uv%oiyIfeNb>;($GUH3+ZqGPqujrEt`psUfxXeu4bMd()aD0&9H z>buv`r`AQ?h=)}3jC#HW>q~R211)L(u_F=>-mxY+$9b?2opg2WrQOUUtihFj%Xe#7 zqia=eYiWn?=fxSM0hmMjNm>~tT5asc@yT^7Vgs++W=eDs2w*(aG&JQCbCu&pEpfx_jn;BN5Orv z=N#Z}10uN32<}tMpDz`&IfT8&E8sq1lxwYPb{WUb^X%W3thEt72iF;OXpf7$`o;1Su@1iZPK@Of~-+cKgcBC2onMXM1c4hq!?c{a5 zexP~GKk1s5#Y66k*&sUadi>)(a_j%R)BAY+edw>~OZtSj=o8F6V6*$_6S1`neyvF@Qp8$>sG|Ouhizn;-m*DB+HXC{zYyRi!%|6lb*CYSzg~|=dbO;C3^px)ZHhj zS-*PJ*tVi}J=FWXtAB{oNl%&3p@ZDKgmSX>c$=y$z;2Y!1c zUN5$0au8m&P#io#M>l) zwkHq7t@MK})<^jNrla}576WmDXAHa|@I>Fb5HH-yH|=PlNJHYpf#hHAetarhq-!`^=Z(j10 zwV}t9%`vd?qs=R}qH8!xxxYXz_}G1)cCB?qcCkgeRpXp?w-M4V;S-ZYTut(D2~N12 zoQK5Fg!Snm&%nkj&zr~QVidEeG2^*g*U4a8I!` zllSTUJ|({$>zke+FASgq&f*V4l*@)Soz}SW(HikA9L>8J=VLtS2W@Y@@%Pm~IihGrs$CZEyp^S^Ux>Z#{rAwff;@A!b|4O?*pRjAwZx~Zcw6Q(;&8%W%`^{g zvq@@L~iz@!D){fu0J zPNt)@nfembG6^v);n2iB>fzg<#oXH(BKhNJZNyqYihJC^{9%GJ-o>@k3Nz_=Vwjj% ztT-_O$SHpzbF`wT$ru}=&Cs!QdWpG*2p#x$e>&R!)(QLL-~CHlE3XFSwVit1AKjsS zh-sNDjSqAwpI6j}n3i<-v-wVIPj1kE+O^3Ovi0zzJ=V3^mgu9G{dpjt>XqA5d53D0RLsiUii1v&j($lc_Vv3yyzkIEUqQK*_Fmi zoK({xHeH)O)?V7iJ3OuK+wssaj~9C~5qr|yI1%%?KG}h<34ZO#s;$up&Y9_)xA1~> z(0!Zfr+j8xtP4gW|1D!{(ReRBR^SQC(M|^f$bc#CJ zQ@g%f8T`fedF}gP@0BZv`;jNBXg{!X*7WLOar)ts*1Gk{M||tEaRNe+q>>hpjee%kU(jTjjtbA6Px08i# zF~49xMXoEc=_tX*Sr^ea68-Wb+uv&Y+i3S|kh8bZ=I4^FLmVyo;%Fp38T^Y5!lS-$ z-*M;()TO>}rbj;%ud>Ef5<`yN!wfOl#T&*aVB8|OF0xELUo;I?I~t;2>jPWjzc6lm zNaWx!bI~>0FnpUhs7VCh2Jcs*GcMES)v=MQCn@(=R_&$7^LPk(WJi5wH)FzJdgUp` zWU&wuWp9m@JzkDvjbPi1|6+P0*fzNPA{&d^2)0dKB@t{}1ltzDwx#h0VB7fWV84i9 z+ftv^!4?{>jsBCZGm5mcV2=dX#vZ5aUHL0UFm153;>pmZ!nBe7>%xj-`t9&+WE^qf zeFsdNYZ`1DNGAQ@&zk7k=CV`k2(kS5ZOzeR(&!5A!a2z4K_Eq zR2Tn_viwY&IYfQtmGMj3ff&R1R6o442_J4UKW%b;fBOfJj|Lcz2jGnZ$V3DA*Be9@ z9^~eON@|Nv9san`Dpp&}|3*xo*9fjtyUYM} z6({0?l1uSZGR1C%QgofX_@Hnat?)47TIBg?F-L!tJUo=#vn3g-*1E|L#=gIsM{Xs3 zjehuv=N_P+-ONU99pm7U>iy5Y<3@V!RXr0<&6;Pz$Eo?IHW>UT!>RFW(vtcp_!D{N zIb;9Mt|2$VUx+iKeZZqd@My5PZ2Yxncr-Cxy3$zYVO?yxwlGFpfI&-rLIn)ky4jv| z4hC~3CRR6nRg2ieZR|y3V_Gi6ox+C-soeaSHRV?Ntxh~{fPF&|+whV(C!fRo%aO-E z)A!f+eP`k)|2CHo{@N$tCBv;rwS?a5-dn^uc$Y#lURj#Yh$GyBkF-T=n2*mfc8MFB z`U-i$`N!jPMe6~uYjn}22zJd}Ts(Vy40g@BJ&lO6sdL>e>h3Sv1PohrQOtJ58qucm zaBK90{ALvL)@?eC?TyjFc=t3k-Msf?W85dM*@K)D)<(ko;92vYL&zU&MoWM7P2=fg zjxi6Iq|TpECcna)--wH1KkzZ6KKN>8iz0p;{_-_GWx=)dTQV{Ga_e)s2$n6f9*oDa zGgDWvY<%R@rZ$nVY!NJ*`FcsL-X3EOKQ?4hHk;PfXYeJ{hJSa#MwL=O4E#?Udzzy0 zDMxJ6PFvXanRB}zEE|7JG_Bb>v3h#o0b{aXArXI+uk0@NPwnQx;>&51U%TcAc#n0= zqy9^-6mOKxB3nCioByfjZ_E|$F|Hh^9qfk!UhaJJLb2geJ<$*JhI7sJhBv<&~?q=r>SH< z##b4-06!2j)O@J~Z(C0ChDQfv38&wY~Q~$QoE_ zH2HT|-w^8`N9+Gn^^L>Gqub)K+rc$2>D!KqTC5|ru(4_>{mpZN|B|)PQ{<&k#XctE!iK(F*z?i6X__{~f=Zto`zFmh#+Xwe4s1gJ0okQ}L_ywMke%_=9%w zpYqW-&uhe+dd%w&a2~9m`4_x`x?LI17(@nw^$R{hQ@<2&emGVKzYW&Z^@SUi{eF3C z!}#F(`Vc=)<_GQKj1@}Ddao|!u^axdi!ynL+%b)8@M~>OpJPiAligaQ=kS#Mw6{_C zI9(pw$UL1ie|E@NOxHidoS`kU#=w^&zwKn6f8p5+<92#HehPh0(DmJ6j1PExu{p`E z)`ZYi>R)WmWNGDbP`|1#hI)OW3v&si79@%@oc{Y~wmt)FPz zm}IP4hzIN(^FQw$_Ocb{GZEuc{KrBf#wQ$YVs4)p50j)_yKO*Xe2TqLPWsVVt?b?C zxy4-JuLo_VzZ|5E@kMGqx@?TD(|78%ui5Zo?4$6GJ;|v-8rhp}MJ!N0{@ITpYud)O zo@77m{M=k8TeKGPnAmHDLiB#VP}%_fQJ>#l9UhMEM=O|nTf5K}YuUqE>yf?!y`rve zSI6^}*;?LZS9Bt}1&y=sbo3bd%DcX&FD#)v4?w>`U!sZL{eJYAwmrl*9DuHq{$3x+ z`<^RMqx3*@tTAOj@@W^kT75Jj*nPHe=aNgMsCiHgKG{KcH58wExsWqnv3K^JZN6`S_Id|?|JMRvGur$r+UA|gKlnaw z)Zb%c;10G&=S%SA)^B~^erOtc7(M4(zwv!*`nIsP7UJ$4rT>rjZ2?30j_=vbw_U)G z-4yShasM6h#A0aA<^ynu^vsF5Y?At=hC^hhUD9uZMNv6&4>E3@ep{c8hj55A%T4S` zoA9Z*Y;$sSv_<7vYwd;I2)Y-KSOZU5!TToOZx!!%2Abi0)>rP6yi>q1PQq)?HXc8T z7Z&ijQSx)q1npLg)MP9YBQ**3+0UC7ijgYrcw(KaBo5eIIsyJ_wYz1M8=Jn;%efA7 z@jN?|LTMP@@Pl{S*8618S?DcoWjbQFU~P>}r}w*089wV>U-q6GddFB9zHfZERX-Ph z)!dc`nrsK#9=>SIBgU)4z@Nw3?w0e``1!}$!+1Py3f>3zC?+zL0G|!9&{a?&$Z?U;ladE|b)hZ)50Baj4>?KsuZ%7>uEYP6O*)iY3oL@z2KbRUspRw?F}zx% z<+c4_|8_uue`<89@3_nyZS*VTx(4=< z4Zf?voW6lCmnQb*O=Q%j=s|7m8NBKFLW}t+KLP3(c2SJTcGysJQoNeZh)%&6V4Q+U z6qBu8e3G_k&3v3JffrvFmtgYdvvY~*Y;xu<{8pP2!zo&~5*yQ;>n>$sjh1X9o(;O! zdh&b9Ydl}qwb~1;VFYVvzRC|2`3la^8fB8k2Zb}F&ooaUs|Sy9aE5%x)WNKY*^A%| z&F`8bI74ncGDnIvp8G1)} zLGtu$@?a_PwMklm5ksphWy zlY6JN>6^t)Ww*qh%l$sjwHYt?jdZ@)smamOZ)zK2ry3*4DB1;Fq3_SpJMv|(EEm}W zSIA$Gm|p4zt}tS^6u}IdPj#^eZl{}LtBQ*@83#6XY!7nHG;1rcg8Uco14yQRfbRM+ zeFUx?#)b>oWRtylx|k1u!MZL)zU4|WBKRz!(6P6e!V`*S~u8TDQ3_>)T}KvpowT5 zbOyRm+v=~3!<>6it^;PI4R6h*GRAhw>2c+{BEEFGIlyk}U}t@43-h7z^eDl`2_}$^ zC$D`L()nQUVGIul8_J%@cO0ip^Z!+9&UJ~0-jW=LpWdO)676fWZw`KXexS1uw>9|> zp8H^~J!;D5#k8A4Mr9XmK9kc%-$V80&X;QqpP@e~pMB`khVojnJQ?L3^87SyX&PA& zW;{AQ*A^AXQV-$#w;GquCe!Sqo$Vg;v8gY1dB4rIr-#h7_f@X%y9S<+Ot7C_C|C={EUz z##eq5w}}nTk4KI@AwB>%XbxUB2G3+i!ETJM<79lsT0!Y9Yfh&shjud5nt1HZ=v`y) zO~$l?@Sp2obcR^_I@nl8Cu1IvEB!&e4JK1;5x1A_Gsip*?>?D4aI<$3Pu7@PG{;KB z@hF+^mJ;z~=@;t6dh3DffG73*z{6hjJss||zxH~A`hE{zT)xl}Y*%0lXIYo9#$)^% zMYnOLXNn^WPh5c8Du{QVB#&9Q+s(KKdq=+Q-~(SwLFET~2m3c$t%_4mS3<|Yb|Kb= zV;Equ<@AGo`o?OWxr6q8ratm%z75`>GvJ$&xn#-_#^(U6aUuMFVYtNP5!<}Or|C2S$?Pf=tmRrV!byTA7vw6Y%*9m zoTd)S-sLp>0UnO;@7P`8CcQf>9NlRW{1@@3nsZM+;H-&=Bb$D|II`v_>+r#Y zlv9{TjwK7=qWoa6pVn^fM2C@Uw^d(nqCZ*lztxx+bUZ_}*D-Wjm*{WT>l4OjG7kU# zaVuMucD8~u)Kr)8y}fj<{&Jx5hf%|~YUxJVnCf>hYH7TcxACfa?F3FO)qTLJ1;6ub zMT>k5@-H6RoGpA>6!iUM=mOlG4lZ4+^Al_yyhiEEpPYb$P5**cr`W_^ku4tkB*%DaURj+kw{ zcq{G)^A^Fph54vhHbt=*>0h;5YZ=zBdi2>GyhINEz&y>n97u-|u+^I>JC-rlS%rNeS1 z{$op}F4RhH7nip5zWWEf&u`5yzBDErr%tU5D%&n|b2dqFXA)u}T|;mEwLVs+Beb5H zh@(qp=;C`THs|F3j4U(C_zI85ZnPGjCP`yyz~jOBz%qN^=|-}XjbBCmMQmC)FaF7u z*|TJZ@6nO!9_Ea#Z3p{~92;=!(&i@vt;>I{p8ue&z}mq;xA5U3jxWA*32fNDo_QKQ z$i>?AefUZ(d4TPmGHoT7ilyY4!6y?uoi*}yxS|feP529=*A!Eh-=JI~rfedfY%(R^ zmVA-ViLsZ1iEb}Fmuo5A?;XbJJ3o+NVeI%m>53+h^G~d4;d_*Cd-e8DGFZK@<~hx}1^+TyLZea{pcY%$!Nh#&w3ph* z*=smA*c>e59mSwc#Gr*&m}l--$2PYiIuHjq%ZR+G_6`S#m#Am!xz`&{b8$aBXde08 zdb9oF#wOy%szZF&I|cu~VXgRC?QM~IIm!DS;r%vs?|r@76!pFeynxui;;7*5dA_Lh zQTVbg}GomtW9Q(-KCoO z`VfEcc;mmd@lWya5R>X&G}oBEo4#$VA|saBq}1_mP!IQd4m<*!cb<=J?XX?j6X%sq zHA(R;;=ICo)U%JBmxT4dx3yPsUadXMw${v+K$*ps|;-D5_F$x|0Pqsx%8=DR`CW-mV?`=Oe`g4=D)Yd-eOXYRAx(r^o#-Vl8 z;|gTTA$mMC8wsbsbpObjjw1u42Jlxu&>Gx8`{zf?dKSE51h2?mC2?)ShPf_+S7ZxN zuRi9$K(@dr#pWoj_-+dyd98GH=F9nne##uwH<(vg_palcsSXAQ4|Hz8#7rPZjWXVc z*xbJ%6aOXOQtHB(e*uqOQ=LUNqaiwzX>&PVff%vlQ`^B}wzr~kLCK)?^rCo|K zo5XaR3-pCk^{sc!*N2jM4$&{HKa}3i)uwixFS@rek`E|;%=D3Zw4XXGc)zFc@&^3q z&Ky68`13Jwce?KKf;rU2+RbU%0qi*D!Pbbuh6mhejyBeJ6v(;X<`cf!Vsb-w@{D(a zCyd@TzQYr;RTe)JFAyg-x!JSNAcrrZ9!8Ko#EcC-2>3MWq*sWOd+?DHjI|}-(@)*k zd(Z31Z6kfhIdqi2w>HtP&1~bGvE-{=^dC4rehORpC`qhi&m>Rt?`LiN8pq)I*k89r zZ|Bbs7;`v6{NBAzr<>mezX@{KAY<>B`mk87sV^ikTFns?_PnqG-b3uxR2Op+o*Bl0 z_lz?;t8*AWesbEQ$=dGGbTTWdpDFpyVV1})QJ)tURvY!-R-D=bt*R}HH%pF+jrXnmw(&osy|0pO z)VBJ$OF!dSQ?xZ%EyxuxhJ4tGKZTFL81nhk9c}9yhWG|CXA?1J*%R@FUSN-mPDd@~ z#*fn_{S$p{oL?L5h<=6kM$^%i{7by;3GdOFe1emmWUN?{&SQ-Jzn$^vojAc);)INw z>>Kkzoh$I6T1*C#osPmg#H%IGm-zsxGbYp};?>eoG$rEITCW_Cj3m#CiAEpYDaKqG z9)FHC?v`j}?fN`C?pWJ7_|1~^0R#2f{f()|!=O!89@i;b*ch>d;Cl;vGT;SphkSgq z0W`M39g2aOxK{}epeaFchsL%x7}Wxqvs1t53_jM(>tT3m+Do&{=f#mthN};8WW)T2 zEnSl~K3D(X&%#(Erfk9vL;S4P()q^CDdy_K^gVH4*&y`j^Ck1ivNig1lZ>aX;hnni z^mE8l*2tri$$)S8=6`yB_(43q$tVIZT_`8PSCSa8>==5?m)lEc;nfdnoBtu-1(_SJ zkZ%*V*7=UqmPPE=WLaghp=Xq|s}HoB`^l+S;iaGA%`^3(;Mb?#wYQN8S67~^TQj`D zy_Z&wpP0LyfES;xUO%UkU($W{H~)+2E4MbjKSyU4d}#5lM_*EJ%xyGY4T$J&6Y))> z>16eQV}l=rTPuorQXA35N3er*JU!ZK7n{=@pT=ZMas<1i=yr22aZB}~LLzRdc3Dis zE!9R~EwveOOT}ETgX5b`H{QmExi-a!e}_j7HGf)5om`EA-x9WIso%sYculYY7t=KO zs0gwhTcwf^5%E8q9nf3{^~j z0JEfi=f?JHi!bZbAL7XilqF0d3;~>_Z-3U91W#z)e}-NnHZgt5hT8BJ+8ykkx}IUK z9b5Yr2iE&vk?$`3$@_^r%GN3$b?b|-6q=OH9P8Y0o7(9x*9^i>KFa5Vf9TR@Wd22X zCtYUYBwyXRW&zc=}5g7)?g zYu;aJJAW~*TxyQ8oA*2vU4WO5^`3t-)*r2$U;-nUKzhVB{$OKxqBxCd)=%(h(*lC zgT06LFdZ%HU5+-!?5^x?BIjSKEy4swm+3zjYYWr#hwb#fxjt z_=UE+BDrOIeBvgu!qa%?cG}so`8awUcd&kv{EF;6*16)5k~hk9^gV%pu-9vgTF8N~ zvWYxV-#o@#s6qL`{h1fn@*$T*WLSQC#Z0t)9^XEgKJj*Cy+1wtarr@Hh)%JmXRwP_ z{>lLEFW7)uXU|!C%Hwy1M4VFoTk_(e@O`SU&@sV0TSN7&|1&QtyLQEVdvbNI8;+(> z+Q<0WNv>H!9qyse1)La+9^0Ore%zka(J_jspbqkMB6;|3zANeN?$=g6cl{FTZl1ck zOBoN=Uf2z?k2r@M*eyg1*})_a}K9x{k8-XXk9^@htrGT^!OO7i{SLw^)}cx zn4QlfqsLOQF+FD{u58>FMlXWVgAXf2FnX|}bk52hMh|{nEF*pX3uSwyw(uqy_e=Bt zGrZ$xaeMT5-aOlQ1z#6U@lK~GTd_uy;l_;%wcmNZX|GIqV!w#%o+BEs{In*jpE?DE zV@ml}0GO!$)QK`jrJ11iYCZ=WPHEX|CIO2t|3Q!0kntqIR54$s~m9z4v2{kPiIhXHFe9ul5>%qGsM zD~EJ6;Pj0HGPUjrr}0z`ih&DS3lXoO#jBC!aa|d$qX16(oy|AYs(C*6#Ia1WKf!EtUqig zncmuIR;=UQrzYGd)0|!2rGuV2NqV{bC)aS+}ykVc$;PGBaUtc$uZ{mk)H%)?weou z-NL>JVc)tBHb={#!L6s;w^H*zy#2U`nxheD@cr9|eQUjMUypnnYTh%H$I65MZC}mo zm72c@MY2ls7io6lkf}#ci!!UG#rd7HKSo1q!xgIyI?lJ<@o;lA4-LI5T()|;@5Mhg zM|Ys1ABTNwr2AfbtT}oR4LK~zteM{JxhI;VXV4NmJd}%;^Ryuc9(hodSuZW_uO0Xt z4LLl@te<}QdQUb-E2AYoar$Fl)y&W7f<@n>G%%lNJ zE7rCD+#F3r(URYJ%1+nyR&~t?r)D-Qoa^jig>P!2$xhiPoHl%h+`X04qUXbD+Z2Xf zW#?56UxtQVAoGUA!f<}H)Kb^?-t%gi@OSA~i(hZ|#_)PWo@$N;qVxq8pIj3?;?8^2 z4svq(0=qe57ZikyV zjoeV~p2as?oPZfl|1x{k4*Qi8R()FOqG8+0>>;rms+8FC*Y<0=@e7~k zoKwPiOCI8?5sORg!EoA!x&MaK&T!yrr(A`GO_Od-vaRRIDeXpI$ z!ya+Mr%wG(I6Yc&sBA;!RdP{y##-6^ROql(9cX^0IU0n9jg?tXVjUEX2-mD%xu#}u zV$|YiteySc;_H9y^n({)-y<<2Tt6~gKY8)>ixbuB*U6^OzRRh1EWY*)iACXB+-3pB zT`GQ;rUUye6$8U86$6JGH8k|0k#(5?9x?j)-@U~SSoPpY-p$Hnb`&F1tuAdowlppSN9(6J#zJC;mEjS zqwF>5P&@9xD0^-1a2yRUvFM3T^IR+VZdktCN4H8$y`i_sy;3XVZ<*C{u=4Tek~Kw2 zQxBQGylY<=yp43cPP)JFiOybAQ@Bqq7v~N;>Nvpt{9WN#rg(GM#Dy=zDVh8&Ay<?P8nAoJJxc>oo{Q-6%&aMR-U8@g=Nn6SV0 zo2d@=9~jOnB7g61kPO`24E`7#|p&*ucwmB-G`Y8t=<%)H}zVGC}Kn>|oa>f>6-;U2U zN1LIB&mVHR+&igPN`g``Xie8_KVS`Wpti(mgNAJ%$GCj~!m;mQ8yc=JeV1 z;TDI!*c|PF2F`M@X~-!KT$XawiGOL1)awBT60skgOcq6Y&@y=;jS+-C5nj!bsS zUZ{CO<&<~Aiw_AGt#{+%iyHqFE?POg;8rJJ7cSVl?*%UT-X)J!3ZN!hDLkjWdGJ6D zxbd&b8V%;}AzEExRTM>o?ouRgE?E4K{li1f&K+*&;4l5`=cK*DRUgP)D{(={ERxyv zrRHcyH24LXb0oS$=24lyNIZ!KhMNr~n@8Kc+#F3pOVr7P@*g@xVwOEK(9kh5FH1Zf zPFXoU<bB7 zpe%;ny!gwW4_~(X(7}JP_h^TIjRrp{^PI#}A#%bqV(cXm5XucM_oLyA-#B8 zhc`p%#WzY^8#3YI_ay#_Lb0wSzqnYl(bRDLx=ZY?4-Y=rkueLKqfuz^uVl88m=rSG z${a0mWXNnJGhbpJ8W^r$;uw3b2l2EmdY)QOJ!IkH72~Yzs&OW=|{fl)Ynn^k@-cmVkrH{;)ak3PhI=X=4cg^Uff-+)HnOQ@&bpi zL+QoYw-jf{gp1o{&OrW_e8`)Ocsv&!RPe$N%Vhu29DVKJ(5Gd7D>D}j{hQ22|7?y{ zM?>G1c}3!pkoiQW^bT3!ZJF<7R(`iR8iNLfYI(Q%T`N7|yAB!hPX&`!$JqD0O`uSs z3niWlneckYzuz1kfzogLfn&B|fkijna$nkysEi;o=QGY>w7M+H2r76RT`s z){`zjvT2O(O!>{@PP!8{mv8HBIe|en?|u7EnO<(SL-h{PpTiy2Os_uUqvq&n)V$~q zKV8r~q3_kvpuo90D$S`Tni?+OV9*8O1p@aP|8a9P7Ny*42Z`-aG;9k+xWK7Hw~;v0 zuIXs#9x`7^e1eubD4bHcuUSR{4+#G=X>nP_opWaZqO|rH%D2NR>3>f9`R=Qgh~}`UXDj_WRrAm(ENseK7&64S(+&x68#Vr1D`b3jDk>@Q?g3 zjA#>?M0wDtbnKnDS~zD^I_6H?Fr-JPW9`Ik(sVk;uC;C$V@IcB>sniev31N_;YRB= zhH-yPI+U)LgnN!jhtc&Je@Umq=LWrL5P7n7GQv5_7(zEr_l^xre9YP5R-2|{>X>Ik zdb2b=ZkYq4%ogcrs<#Ku5O(aG?&!T{*WUCi;hNohPaGRMWH@i1KIiS*=e+%T&r5H9 zP@i)S?oFr9KcqLk-wy8k>)v!av>)1=PDk^@(&<~Jgu_>*C0tV}=d|1d!|&Z2jqeQa zIJzMeOD1&e-m)LPQrOX3_M_Jg>E5y*Jtyq`?0;{nik%; zG#$!ye40wXZn?A+b(E2(xO8CevqPsIecgp&$Eft#ifUl`7NbuMuQ+h+us0h24&_L8 z)nP&6%Z7e9YP#%%^w_dT5MXO^HJOmhE;qTFUhaTuQY$9O#L>IkRwd*WPwADAcetas z$Db9R<8S)9B;+6y*Ss(|=q9qoR2*jU8^qzbR~*jvio@I(1<94i`ydY68N^|F$M4eX zQt>)h%=XH~*%=O$DPiDD|$)@(oASvxk~V^6;Lpx@f( z!@=~7@DnAkABDfgLmP9RT$<*l@e%_&!jaN$u8o%*klwO%>1df@wc(n^s3u$#kI9C6 z`L2&#T3*UKSh=9CdcoU{_H)77BfMTA;Hk2bZqi_t(BE+;_Dx;l4+> z!@;N@(SEfR!#Dgtsm()$Wp*4AYAiFN6h1X$ zhPv4nVIlui14CtMH~jS8hWlpa=@3E3qH4Cw%<^pj~Wy9m*y_J_^sjeIH`WE>~jv+ zg`T#cp?~AXHTG>K(=eQEb9kdGLuTpnPBJ6v+d^h^vath~)(1}AFuo~#-ZfD}sJd`c z`c6wl4dHtZ_$i+aPiR;+>%mbR_Sc;^R;sb7@fw+?FcLQo0EzHdznsr%9GGS@O@|$H zV$?XOoVI`{8!l=boShc#5-#k2;CMTRH0|lSh5@VkqQ;?v@07Xk>eYug{7&LMXAMlt z>5M3TS!U4XKEH9v!Qp_?@c+xdti_L?{svT%s>!m*FaLteWfM*`46PnA)xR~XsgPLD zLQC)8zLjn7W`CQ>=z!jA_4mN&U{Iea)qDgfNLK6&soxPj%x64A)&;NS3mYdaQ*X&Aq4uJZ3(fMiafuJiItj-98%qIeH<@z3BJN%Ko=1+n;aVt7PA|{Ul9)_VW{} zxi2cIuhQ+e^gcgSkA+SfGK?+LtjU**mOHCGroF8-@7bZ*&9Yrb0xoly)6FQLV8kW%j%vT($p?~cg^gU**(qe>38om zwfL%iGND689AX=$&=fQ^bBy0(QQyDgevw~%?0EZ6s2)2pb5fe_%5-ODq^X|ju~}*A z{Axb1l%M{tN^`%@T%B%j%={s9TjriL{YSs|X70;8nt4L%$#h@ub$_m;pQ>zw(C}>L zxy%cF&Y?ERy!5mD%az=#wy#x>{8Q?kO77is`+nx5%*Sc!)6D0Yz&^jM9RD`mepku; zx3c}Avc-!t3=>nnviSS@)ihP|LE!2AvsCtf{f)2gn^3b-H62b{S#GtT?ODBM4fzew z5ok(!?C6@Q=@xHDx5w559vNBe55M7Wx>QiL{qpau>b~F9%&NJ#lDn+3y}WvK@pVD# zcQd*b-Cpy@ntOkC#)CBvRr8P3JSP2kH6OTd6#c!Df3;>|^@tu?Nq=Yi-!%PWWlv2u zpAFX)(%+Ek`&X>&t<5%6QvI?6s%H+Wq=r=Y3{6v`v#VxTms+Q?f8%t!NhPc?Ze(%oS(`P?{Q|{sHBk8{9)87}eFJ}Le{j2m# zX+GTdZ)xi9>F>hqqU;;hBfU=zzi(Fdz4fzWZ&z~f_u2blHT|#be=6xuE8EYi$HF~7 zm;0i+=d0{DmGt+vKUDYsZ*eLP*DU^n3h`GHLq$~o3evUJd{Rl(#f_CzQ`|pI4f8uZ zO)XtHGBVwcuH+Wqa7>zCrn+}*H8rl9GI6Y?myMUJq$k8H#4A!nZro!>f<+eaOSN84^?a1!m5?DC`8tc8&j6VBkN}q$~^w~Ezp4TVWd(FA=dGQ7IUjBa_3CDXEG#^cm zJ(2!C)#tpY<7d*`vwimU-j!OqvhRg-yD)w&em#D(dfvP7d+~?yN0t1?>Gofh+`r>b z($uGw{Ng+QwEfJH&#OnjjlYY(k8A0sjq$m1t}ad0=NfX2X)5d=B-LEag+0B0OXWt` zI}(k~jmwSy#Tm=ymdh<~-hJ1aNe})(Nm;OOLJ#b_eIf}xwGWXuIy>awdOj~^trj~)9p=_Ba5GT z^DpuXs`)?UZp+=CvjEfQj}||onB^!V?0h!;eI@xrMn!xleMRR`z~X*+$Vf zxo@R^2v*POUxo!sopgPEP=0WJwA7f&k>2CIzhnFCTTXfdvUIX-^=J+*>`NZJ+99g$5+zRtNTunIz7#ukv}ut zwxqwU`8L~*d}o^Ly?0k7-JPG2pCvsf&7arjjBC>LwdwEO)%}mZQu|mFkgj#hcaKJJpohlKwXT-|C+4^FLJ6|I7cFhhB^F1@=mn zzgnqMp{|mzFZ7ohP#ENQSY=;0ad=^TpPWARv)o3N+$Pn%n^jZ2kJ(E8tU_yLZ)c(F z7sta{-PL_FDyg38p5D7e(S_-ri>v!Dk-7@~zPcxhZYuKT6+U%|BT9Q#Jiq;je|iRdTNt7FGB6z3UtHzFByydhDGv^+7csMgJ;% zQTRswyFUB+-k~@B-#$lw=#vgd|5x}i>?uM=Lq>!>4SpMo{nB((`WyC!zk$`aWab$5+HK$KYFH;;>9A8|kx_6y4wP|rP+evA9tLm{R+B!{dTim|5LuKzymF=&J zdlmOC?$hVo-uH>3{fm>+y$2Kzt{y!kP5ruflX_oOX?{-e!k_K`ZSh+9 z8_-FwH$v+4n;6#Y*b0KRe6PvHaiq>|0cP zy-#lOH@;!tTh;yVR8#L(Q}0Q=k3OpIS$ysPYx|#Hob_q(v+ADDrM{@-zAS!S{HA)O z_fFsS$^R%F*2qb8epzY!fBtG~liE^kIXzzQw*fV!x&D3!ph0Qwr^}a;A5lB9c9iYt z%CS{#!=l-CwLAIUIo-Qw`Wvp>OKP8LE{gW;lMcuCt39ChpxQ%gkErZF@)yU$IY0d! zogST9dra*#spI;bdr~ERa-V%aT^CZP)Sl|tY3cFPYtOcA`PsRhwO#Tv(|tX)VY%p{ zG#yrvFGV+^n`-Y!_n8Z%+xybr`~5zEUa0*)jC}`uPv`f4Iu((Sgdhn?j1VM5$dp7R zWRs9cM5Y9Ztu586z1J62tM*>CwMJ{ys#RNUReP_ZYV`lU=bn4=+z7Ls&x~{AwX>ZUrMW+fUoQS9C0BsgNL?>}1AMdiE#Pg`o#J;Xx3YRv{4pzSt#PwWjgv%DWD{yBoh$?d?vP5_X*0TXY@7YaeFU4@ao-DCZKDIIAo@w-WBq zRZulccv4ymScjCAl~)Px67`||*at8hJF6T-y1=q;kOtNMwY_7bgeY$d(D#4k#=NA!MC2Sn*B50*GA z$q`b=#Oo8sExeYVP_mOHPLsPtsJ*Ip4RxIyzABmZy$rln;*Kf5YjXEWJP`jx)HA5( zCH}_m_rN>o<@iYS$0hL_NKD5k9AC?#J)vrms}1xj=_{Qes9dQchFmOR9HEs}o08d3Iqc-ptn!fb zQqta{zk=#3PG9jg`$6ELq=%IpRdO_^|0_9x)I^~6-!&HlWfuNTm{{5w-!QTW4BllgqKrC2mJp zbgfO&>y7y0%{LJ~zxB7cI`3-!G^$F&a)~8q*JN|BcUXqK}e~`XnebxFJ)OG3L zcF6j+;_xm_lhb#5@K*NF`myyBq|e^!JXewziZ-t6AIe@?zb1a8PvCRJ_*6ZPVuZzk z_-q>=wx#S@I}kfcM;oYUa>g1bN~@KsUdqGNuTiQdyeDOK22VG_j?leVfQ7oaUEZg?+g68)BxZ>@`HebNf~oG520*qsd2>L@Wj+o zvrEl|o=1Luspa4mq`xP`eJ1c`)<2c{nblTiyiQeWN2y=P?J2ci(gUK7h|;g)c&U?= zoGNu1e6G}aauVM8teQmyG)!$}-vT`)^7@M(_j8k&l>ex(xpKLS5 zW*XuAP4qsV%^*l415jG+qM_ifmKII@O(6MC-$G&ey()%bK?F3vfj2|OQ#>J z{>%exhe;3jVr@s-juJlxYJxap$BDMfDO>YaN1s?L`8uc{*=@1?NpfSSZMMHqw$paE z?OxkomHs*C^R^d&7i}-u{z;viO5fPQ;J=mLOVMv^|J8MAV-AmWOXD{j(D4!Y6V}B` zTSJv0XJ6U@T#0mL!lKo#rK^^%hO9d0HHquURNc}(rR$6HCG|V|v!!oA-6?$+cn@`- z^9SIEtRFEyEB&JMKc(Nm{af0q46eG&2SB`;giupuSd|5rleB`UimaTOUCLCFp0*y3 z&&9j3a%c7^<0U=6G6A9kNd*Bz%7m5)2gjC)E0X|jj><+EM-J}PPVGQH95Lla-g+}CCLvF=}HAk-k#5b5e`hmjvaH~~0=)T}bI z!Ar_42d+SUk6MMo8*>OXwH9g}x%HfFkRHCiS#MObpUZ43v%SoYGCPs&l6+5@z0mu_ zA0u^+{YBO!6Fz#eve z?E3TEK<2^BLzss$Ys-g0kF*OA-Y>pR2`fKTn7+x^3- zw)Ul_?KNdfsHxJT%0StP(|Y=0FPVcV+nk(bdSCkn_I~yO zN*W?MR1}}esxgvq`zF8`R4OXXKEpoSJ`YMgzO$cUKTFAGv!25|S9%LXEwo=`zZh<* zBt<(evtN#M1$Dlc{z_7-*srl)E1mWBo9ws3ZA0zgbeDATP73H>?e_r>aC%Vb7M=H9 z>V(DQN%E)cPZOWB=;Ghql-#zzV}H;7k^K{-f1#e5y7;bF{A>F+aQJ6*qc*dQ#a5dh-q&Fuco=Fp`H_VB+$iWV4wHd1l@!m< zI?Q#L=P+N%7C62F+uA01_UPE>rbz6G( zNj)HZMEDf=9QB$UUM=8wUju+}@p#g!DLb*#(Ulr3XQ^mz>(BrjXGqG&u9 z!`iv5i;@8P^NWn(#QQ8tlP zOXg%|^Uj7#MYj!2qysZa>SFKg>orZshk(sTV@)R zYbY8Y$SW5N*Gx%bM8}HKwvQth4@}^^1vnqozFY@Nx|i$C9p!RZeu2)Hrta6}`oRw< zH&D{S<%X0S3O5Wjyxa)jDCvzaH%atlQBz6H5N|&3!vDyPsm0V^%2Vr1(;La{G-cYl zJ>~XN_AB8&;DK@{%AEwCqD0^OtfJ3DUn+N*k}JS#q;3Fjk;3a%<({y53VzNSzY7P) zdyXG~KPIj3jpx(giklL9I7dp#11mVXJ5~jIIM$#{TUXQ36S|K0Mx;W;8+$jVBplex zG0HI-9LF=Mj%^&V5`vAY>^ee~yPyi>q(gvVq$0{kmTwBxj2vDCWNyQ( z?~qDWeo2N1s| z#%gEzUF1)cKUrS?@UNBCpXINVzls!}-<1QOyp`jA`3L16ihm6CwESy)EEK=<+sa1! zpoDVRRw!*s%80WQrH?znm#yGfp#s>YLM5PEh3XbF`lLsN8kE;0tSvKMqP#2ACGEpW zLt;N*BTn?4Ldb;z!%&SYG~sRpxOs&Z?2JE7BKhPBtxb7`$!W8h6|yR1D`_t4P8B*U zsj(~WVOHoac@I`SCBZuiNPk|T7iYaId{Lnf^j9*|x55DELF9)3*K+4a@J7~Kn74wr zvDU6(yXYMiei4nIqZNK7x39wf3I~qg+v ziV;djKVxLYrb-r7F}h-N_{54Sl(w#z3C<#&T``B)xYAt3DyzR?J&Ab+@nYbTia&COM+v0%0DrBxPtu~Z9!GYf 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%0A}#@hnT=Z|G2GIeT|C@3%j_mz$&A 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℘)=2wZ-5CN0eKciJy1J-Bm1%9 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 z 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�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

M9noY6{9~C@8C(psZekvMLG6Y7_EoWlzleS3tId zqaS|WQ!8yqmFEDdJo4eEts5VH+S(&t&B@<&Hj?whPgu~3{O}VDsx9;I6U!iKiHD!T zkQ@M>l5EifWG6J@ne$_`24qg7gMg}foD%+N5-|^msGy`ia|Q+5Wu7@__D@vy?T60b z&QGEj0O22gOD56nGzRAA_>{I4L1ldkZCg`3g|=-P>nSvzAzi|e&G3A!9^5#bqRBf10@hvVtjP zX4pWT&J*=yz?ZO5Q&~wV>!^DG={!YQUaF}ah5(T=+k^;oq5)Q&i;PAi$4Awdy^c?bN&{_v`xjr}P%r&IcB(4+O^Fi?nhe;h_3y6ts*N;>p;YSblu zOO_XW`!$(?Wv^twGp}B&Q!aQW8+Mc6nJ@VK4!#)T7Ez(uU#C&C36M7iGPd*O(GB_n zRQAY#>|7!pnm;!!7MlQROr)bFA5SytCO{e&>1@kHZqbJ7yQ&nLI7Go0ko~8Ur}&g0 za{c0_v6*w>aI13AsFP%WnT*o~gyqQilrL06VI4>JropdN!dlbTQU>acsfeFT*Pvj( z&+#c=tukJ(sq8HQk=2S%2`Y;pH*BNx#h|eR3ef2GFWsB?l$4-X`I4twieTNf2-FG-G_0xUJ$;PL&?3RyDi80{p7^9i2m^vSSzO=1_2 zC8R}dCtU8FzN%9IZ;Rx47T;odwX+W|yN0Enpgw(srt*D+JIa@*M)UyRq$t_&&D8JK z%qKD(;8ztT`)r9%`6c}@%yY%?)ee}C!ef4yxlWhU|C^T8F5pcG)dM_KU-3y)$V-4v zN-z7mfWMzmJwQJ2gm{unQn(}FtUm${-_W!WpOWVBp(W4_JHW=Lw0he3l=oU+TfJ?3 zN+GfBDB?j1jcu1lW83M`*mf83DMgmGgU6?^3sEVZ_>}a6J?iwK_>>|KJe|V?eiRBy z=qo1hqfk(CYm(6l{3zw%S84Z=V2eZXDTM@Qo}eUFP4IZMRFe`MTB=FO!;_3*HNn%R zZA?f})Aj_1#C8OS#P$OlpHc+bZs2gSyab00WeNL(gXA3c}UYer|9Qc|}WC7JtTq+sSWW2zupCRSf(nqfieH-u8s5e=c3 z)QbYysqUylfMGWxJ|)GZo@Ns>l#;rdm1Le~C6#01=|W5r>NTS?O)06{jFQan^DrTGnlV*KT&B;*&s3A)*}VSKua@!S zRi_h5s+)9gcaOB+T3~9uCGDdY07+APN)W$LT8&Rh_TcmcZvk*ada5V!Dao9Xk^P#? zlQVLAP3E$U+*XshJR>{x%Qf>FP32=W;9C-^_Z|iRQPbcRU>*>L4hKvs+yF^qd`dFx zErrf5E`qXCHs5ve!mrX{dmb-*Pc0kcQ>Kh+Ey&rVVisLICv3h}BPIKK6H;>BO{Ln! zO^h52@|{=eLMR{12AoB85jB~d&;_J#$gM9R_LOk|h>n4OsbulFa&jm>C2c27@hL(4 zR86n(Daqyr%+Y|G(zuud{Bd%U#HUP|)X+KG1m}8tvchKj=}-(`wU&xcd9c#0N%VxA z1ao8>)IC7jBbV_@#;1gSow5kGP#T{S)G?VmAl&yoJ|%~nGgJsSog4;n26#4mbPVuz z#5IqS12#ZN`R_b!qFFwMjdj}WRF`U};*jes385W3m28)$t@}byoQzu+C84JM_ZsE! z22JHn0w6jp8=n#$h;HB7HPI(2fpz=VuA!g=q3v5c;zW*)PiZwM;!|1$iujaP{@C#; z@ffM=v5%^Cxsz~-s_J?r`?97j-+^KbEOW`_aN?57;k48xm*v#NpUjazVMo)N@}=Ta zVhlJt#%NX=M$gZ5Qk9z=iBC!HH)*Qv0x}VdiciVJ!b^*#CJboj(u}tVc)p@W#HX}m z@>$f5x~h7V@<0`5b!aL*UJ0L)^ymUUE$JcgDaoMR(5Fu;zp<}n&1X%^pU;|BMEP0M z%HcK@+zsAxqB%1RrrZ9&pX{a|}!`f%F=JWf#~9&X)9iy<31Hy^5mcS$1V0TC5; zX8Ldo6l|AyxCQgWmATA)DLy4QSUJbcX6l6rY6W%lQ5GoFDjsD~fRM2sWnp#F*3Q&+ zgpj|VHtvjM!5$#LsSod@{P>g)*Gi|Q%5#8J9{Ehs){V~;ZEeT#%?e^`=VywrpcVO< zA{bO#=9wavLDUk4YzA^)t?+zJoA+hpE>AY<0ls30(0Zp~dZp65xkbCNCil+F6p%S6 zNZ(jqS4Sz#6c0_u@A%i3$)27rM0$WsW20WTRV(#3#Kb^bERC$hs3sVSFOCn>SRXP? z0lxI_nvo8QL!S&BmYO&8Q4{eYz>o9qsmhzW5;mu-S%ka`H?Z=r>Ezks z4*!5c#usxtE*p^f`uo!8yRlE^Uhi*^O~{O+rfLwRS}ON?!y0S7^vCd-UX)Nn~S#xCMM{D=!AnMbzBa#d&&A5w>uj5u^;8 zml$d8H3Kr=Ris3e1zf2kSloe!SU5y8K-P!Ijk$^GNVxsP%uIq}l450uRmp5mE5g}; z&rPUJfJ|+|joFQfEpj8n#3poW%^WAqV!C6di&e=yM`t*x3dp1K zMr}9{q8!^G=^23ZH(6QP#IW>k#Kq}G}dYiESk+y`sCcFSy62n@q-R^~& z3KgA_?k7}ZbUKM~w5?{l(&~1AbU)!nr(vdlEdY&|P4)7f_M5MH? ziUAv~XCfuOxm0~4$ejZmg_q=%W2cT-8JAt0x05>uSdskJ`b%PJi1W2e-1v9n+}}IjCmn;h6Dj;y;GU_%#_+xMcjAcn+(KU(?zy=UIfY zoqRH|MiG>4t)Of(1ZDLTR2F0*M&zMs5nlj2I-xfIo`RbbY5}mXsPI{FM&6yQzV^*0 z9dX3$hV``_!p?PfXOd1sDu<`oX^MVUlFDB$+*XiHRG5;Mc^lr6%3UB!GFg_b1!oG0 zPD7_=P>a;zG#vR6{Ygc`wP^zVcA8Zs>LVGpZE|}Ecu;a!4{&Qj&EX-^D1r=KQIJO# zW^TuGL_tz%8Q^r1wFrnBq9h<)NVb^>PifT!L?8FVd~nJH->9sIG>@5nkTy9zz#l6r zd^3M`b=R6aW|S$HA#i1CQV;MdMM>Y4Xo>e(Q(UGn1 zL-V}Cd~$9&CU@bwa+KVO@NG6*&<(^?yqTLM3P}LmmhipGKohzjF69k zn*f=oBOPNM3q>Rurg0Gh$X+$lVLJ>Lkz|;@r7|GajC5qMr_k9sInoUqZ#c)Yw|~0V z*-{#4OKFQOWec~IdT%LJEUt2g^|86D3s?6XSMTy%y{otamjU9qde@+AUe9s$u7Ts~ zU4zmPJ;&9%29B$D4N8;s99Qoely>Ynt}cTz7Qaae+bjO7o~FiS4yseBd2RJ(`p&{8J&b~)C{H(pUo}DhmHxiNfm_Icv!mYwM2q%CqxgrTZ&QL;S;MRY%w4Uzvn00@A+K zLaNMXjxN|oaUJTsTG@mbzWTEnP*-FLfJivLE#bgpW~zf`PdVYh>RyK&xZ$v4_Nz9m zKjf&+At(I!wu6+VZQ?|0cg1%UzUcFn&@QIn?UDoDt|s8^LIK_`4B+=hS6LRVnu4+# z3d$-M)>EAqShWOYRT7ldCgj;~-YxGt0a>IctMmK5=c_}s*1A-C4iGL!RcD-6HEvyd z!ok6m93F-9sNn@55E^=Dq7PWL!_w;4qLgE$|%yHncgk^%*k8)~%^Q z(dO_YAbwjE2`IoA8zaGZ=2)IeG=MSf=*i?VuF;k^?YcGhUQ_hc&Ln-DG+1QyZSwE1 zk~lhMm7cgbdCAXdB%~p^L-TnIkbP=HXq_AKoY+2*Pi}zhQ$uC{oo`irM5}!~Ri6X= zyrSYuUo!AqS8WugdpnYvu4HA#7s6Jm+&x;E>#Nyge+!|_o0hVvA++y?*gKJp;hK_* zq+5YOl~vNMHe4VjvwyIr28m7X84AZROHgNPNs;T^cg05Q{*SR60_d-~PoJ zIMmC(D(lwZP%)RCQG>%!2e#C{V6b7`U61M(ic5UVVZ|Y|s_XbqilfMWBILYalQo5I zv8Y+vtZD~It?b%ptTlyh5+5_@W)y6QogUe#=+FnMQG)_Yt|Xz6_OU3#ife41NPuTC z;oAjxd+!0B!w;K4@YcYseR9(2VQIW<0_62aytJ}9$}!BUCn&3#psZ4YvigMl2laW# zm(qimML^6VA2fEyPeES&f7E(6Xxf^KLBXf>TVjt>Ree%0+eL zH<3{3RNd7*I_>Tj0U3z0R!L8sJ++h)7%XbVt(vy_8z>kp^V@ZY(|vT7aX5{dfSUQ# z^4ecqBD<;NG#Jv>rab?89XzTZ6m78Kf<)n&qm!(O_z_00s!MhE`l__CT?BkxLUjQ- z`i`6v7-p933TgI9>yNr`ZJDo-9vll0aivOKrQ2*{M*5Qbj3^uI^xbpMhx?RNoRnNU5z>lHOoU9ugR zFFP~gIqJ-bYdFa9(FQ#Ig^x7g*@W}`1w30`wzc42p!-<9*Mhh0oUw??wl(~E^AFb# zJ*%PZuhE8v^Y9P>1+@M^vBZpFLK&7hL@i_KtffZLS<8*0vz8o1XDvI5&RTjDoi+68 zCPE}}B3s3H;3=cbOTk4-5L|Tfu!|_VIPr)fdGgaJ3SKap2SvEMa5DvT{P0WQp?*LC zzCIxIgCPn^=miJU3x=p{AMmMc5Adn1|9vX!eV@wu-luB0HiFaD7BxDao)o(jOYp=D z#iZVM`;y9iPEnFgR40xh()qeQUFa1;x3org!FF~vEgTH6s))X`)yJqcOC2nJiyd7)QJ} z78D?lz~Xyx-eIx!2%Q}e&bJ!tsgQr3Ufo`uuAaMq?^BfAqD|Fg{!WqdV{r-5jJ_xr zoC5s9v@K1K(!P=RM}T`26@`$wB_SnVH1omMyqN&R46(9p-DEWx_g0uUulLRGvoP%C zswam~J4=B_4}^j*X@BBkYkT}A1W9kP#8bXe_y zSwX{2rd&dc=fXS_!R%)zvu`?2+je1U0cm=qvu%$^+a0BkC#|YNuV6x}n0x@SY6;3J6>6f@)yXJ}fG8?8 zt(wj)P5Z4(RuYG$*D@f^R1fNF8M0Vb1kiwIWz7J$C0{>lP?LF4rn3!o)UB$ms=;G5 z4Ic?F81*)$^Ax2zSJN4p122}BG32x2Wq9G>&(1|!@mZRNnO}~4vup2GgW9G=GR*

(=0qoXgHA8hl_&o29>&p$*(aj4b_D1`2_(NE#_CJ17i%kkm5m zFR!>esW<$UHhqbJT#c8A5puh9zzGq@g9P@l>pFGPowVU*?znp)Fi_k$Ua(>WWfSA$9ch zYo1LFQs-uDVhU|Z9ipif6q33+5Z;6zANp;yRIU%@Z)ECqHOw4|&4nU_|DhFD%fUEZ z19ZcF1J8G$(vB- zab9hRXl_1ub?<1Ce-Vr>$Ei+S-C612tqS0+9^kDq;M?{H@Mw)heXES1tR8~0DhSF- z7nBto^7qqM8gu!v2;d_XH6pm~!?hT)k^ALGC}B5=SO7#+*n;Uj6DZiqK}7#zc`=`a zJu}SDQ0B59mEgL~V`Ffza?V-J{R~V{E2yJSjX|MS5nPu7goMot8i!q~`;r%{lPDott*5pYg^lKd~?rjYvyrCknq7K;OgIf;7&7gD4bvyX|>>pE1nMKZ^gROLrPkIDeUIs2<7D_=tZ<-R9;#ne~d4jQ}7@ z$I8W+4T!imDYZ=}rG`W8s@I4=E$tTnKc!Nv~K+I@?d?o}u zT~SdjGMf`!7x18eYzZRsU_~ZDAReX#A_(w`PqY}2xlWOZ0f>)kfiM81t3^$1e+az2 z=$TIE*pWKNAa{;E{g;-`+v7QJPa2K*OBC8Mc(MBCquHZ-`j1lY;25FY)BnC27b8X_ zR(eu4^Pc`r&0wuai8;QT?YXD_^M7iLduU#4{NTDbYb*1B+`@poHZ3$oM21eq)P_Ar z1=qE7qOu=c7ePS!6V|w;Smn?RtN8(@5!I29_ZA4 zV6iLn>dMMw#X5_XU-PW8=E&f>)@IQ`)Mr|XNHVN6<1RYBj$4s|V@C$pMMIV%Q6{fT zbQf7~N`}P}w70=^mlVBG*B22DczHr~0k24?MZi;anh^s6UYJm41J37_y|5183X&!wBC?b0pd5IvR;!dtSrxLWSjej=KsT# zcEF95zjp*H`Mg5OW51;G7v^*6zF@4ddZ zL)eKe)tRKzkjmj{RB&BLNJj+M-KaX!GH=5>QCTW?fh@^nS+*9ODR?;zoti-)sl#bF zxGwsWiiT@zGEdh=3i8OB4BIxjJp_D1a##=WM+r5Dhe)FcGIYf#!Zx}cTo;{4rDcFG zPqG#PQA3mjqzlRS5QLKoFF^EhzM3@JEf-uDGhLFD>H$7SQQ;j^2(C*WGs=|95ZI7* zyFI`MC`$Tn6I{34@pf5|I%%`e1!UHf>P^60)*sdvF#_P1bV*9IAeaD!)-E=QmWkmD z=|ZCi$mSt6!7e(92}{rMx&(~tP*c0La{JD~?0j$_3MIBTg+ zg;aW~H}REJGQ96S1~X^Wg|jg-Kc;pu!F55Sk~1?-PQ!!L5jD9Q4y0b=N~*9`GXFfH zVosl4fgDol=7v$VVkL#7j<~6cx#R_EB2V*@YAjZcQZuv2BXx*oS5Zjnh_jpee^>qI z(gfIL>wQH!`E}{iSLS(+9q}X5w9}kkKkz>pYn53U7o9VrE4bqD+2_u3ct9K1bL-ZV1?;1F+-Zdyq z)^l9FYf##;=eT-rgX{iAX9M;?GP5(NKbFS%0w8JnMGuHiD6RgYhwQ&+7J!rK6M+QR zC39p(_G>Z^%E;|CnR7C7TTSNC8F@)f<`P9piva&jQTj_AvaeEfSdM{lRd`s+;KJO_ z>NhI5ZfV}ln3q&S6#~9j%_U)LXKOP5nryfk@U~3XsmUCkjBv5UL)6UuGjg&fvneB| zYBJBv$myEQ%QJGOCWC2WaNW{2BZKQ=i+oI&1ElxKT(xt6HL@H*S~-!@&J^)BOV+#Q zR?Er@uCxMWzC<>uY+KNP-YrysbYr;k#7a9nwnRIFrIdlxVr&x_42!yJ|{sUGhgKVT*vY zZ=B$|)VaH|X$98>b$pfph=l*j;JSQA;fp?B3GHGE-Yz-d?P>zvE)?MH!T`P)9j%?9 z)m4@|tEQl=hJv!n3CijvD65j7tTrLfe)D~K-wDVfy+m-`H)*Z+rrL9Wa2YGOF2so3 zr{KD~Rhf4tr4|5DuJz+*P^fUM+*>RkCpJdNr3zXfJ9eB{=ag7g=zW#y-G1*14pB=4 z*M$vj4sF#Jub^mi_*D?U0*^ntqJWldj0EGEV|gn1T^EdL$NxxhUHUj_u!#Py-VTXo ze7;6^qMW>%n7QQMlFws+>{A;;%QWOUu`Q-Wq6^4AHB=rIT(_sy&Pvti03Vaq7%3~UlzfNc52V$93m`IPoA{|y*R_vD8CG0l_jSDo&tk&2 z3-I>d13ZTxHi6*nh-~dWD|GsD8ZVmwdHoSDt*nl6472J9%4#MktCXOuJ|X{qwC#^i zd$mPC%pxB&MhDmZW3Bf@O#5=U90$r;JQ}tGFmRXvluPcs$P=kct37%UAh>l^Gzi5 z#4qZu?#F3&w+P5Ul(lM!;JPTjT6v`oA!hZFIx98ROQvdzn1%gYAWg&}RV z!F9o-`k29Wu_oe27`>|Qq`TK+)5dlY@VJEP0&?^nIVUj3S+*&-u4SHr>mp)yu>=5LZgB&;c;OQ^i+=G9Tns=wB;MwxBtp(48FW+myhaubkR|eO$Z4JNP zY(>tTm1i}y{T|x(;V2nGKmn~ULU9NUWmv`yN-K2MQlsdsU`avE+j4=K?QcCUQ1?IQ%dT#q$CSpN34xYDyJo@3W>`_P+{be zdhO^;Q%dT#qa<_R)D+B|c1#sS%SBMh!F3s0yiAs_D~u!F8w(1MM_}>2IPb7ndxXvo z2*E3h?Q;YCN;P&=FRJU^ZP6eyGHfo5Nc;B@aTb1@TJ^#zX|4=r=pa5!<;a5yb>*sz?! z*lqtE57^PPrab+Xj$-QTBxAtYH3og3ZtfCQ)w6XJJV(=3a9vRBNn6IG%eB*O%HjE% z%8xw&(IH$zEE!xE9*8c3>rw*iGPo`!2;IBjx>kd*DH;l{YZYh+@?pES^2ZLYi^oVE zk2QDPOcKmcP0Uwt+yWqJdWr+$j!LUfamcRC zEC5Mka9uK|WIDjDii*K?$!yEWeof}p8M(bCb4^BWtI2#QBQL4Rd|8q5zy@%SqV&lQ z*`F#ptoFdHpkXIdE}_M9VV;R#_8+91w@sCDpVCwo>H}&rYcq1TCUdMJ{hLNE2C7ol zJYw;>+^wt7%s%aFygL4ayBn>7Pmt*FULg6onwBGcK1 zI_g%{k5q%7Xu5Q8-CrryZJH8XmwZ-yL~z|1ohfG1LY#u@f?Ay>lP(}^f9v47Y_m=` z+bz?@;>HQuyQD2-5Ab&tH6pmKC3CL5s_JOvfhr@v(%n-DPfU7r0Z&SLNN`;;C^trM zUCWy9Ziu7gX<#cUaE0BxGp%P=1*tc8XS^y*%?KH#}BTHHgFFyvNX6ZCI@{0bLgMmQL$D+DS~9zu zQc|}iC7FLU1QSxHC94XF%Uuo8c}cx?bfzgKb=y&r`By_QA$8g@RY+X!YN#{K_#pLL zLMiEpmQYOU2iK*P)NKicq@g9P@l+gyWpGV!zsxWDLtD7=BK6wm)fJ_vLh9)0*F2jV zq|VLQ#1z_+Iz&?|C?s`tAiN1bKJ?pYsazjcl_hf|HW!Kz4)mkKaBy9)f2pM=xGrc^ zc7CfcF@*$DN0s)RdXfX^Nhq6VN zYgH$%?yPk1Rt4}@5AaqQ@NIhpc(g{MzEwt0Ru4g06$E9a3(5)(`A=$8tba?`j2i`Da8S) z@*E(Q<(AnGu50TG;mX?9b{yZ_bKBZExGpScMGmeD2Gy1cu8U<5wS*y?JBlakA@+Pt zgWb-p$vrzAaeIJFI1Qm4LJiYj>K?J9H>rVkV@+KZba z?3*%IKxVy>!F4O`N82@BF1YTUmF`SU{ouL|m2HvCaV1sxk^g6lrq=;fT}#W5Yo zx=Nmd>w=+SBf9WDGN5{v;{J5yUi!rO3F)cx0^qy8*o-8(cN-mCx2!);{X2iAsV^~e z0gqNx6I_=Zf<^?_Ek*PYLCw*@b<4_gwz9O(53XC*U3BV>4z63)-$Z>3B4G#tu|^YI zmmDp0;uTiaL)2*yNpRgi{l!G(?tPna9mWQ=&_y~h;O*2uVv?KtWDZoMyxh~^x?oT} zlB4lE+C0eojUr_u0Ep7DaxrEDBJNE}ZBqw(xi()o+|Vb3))F=iu%+e=ebhv}(0RiD zQh8HXA}W?O_c6FGGJcxdaoK>(FF%z=-;I4T-A^}2dAipG*9AeU1+(>{Qa*jS#%v8@ z^FO!vKUFhWOe}h1vJ^gyNHU+!UcPKVX8+F)sW)4LxRVyhS3bapT;GyU=B0{E%>eNV zEf5BP-)J)+^Zi8E1$@KjT7t-YPLW9vh%ak_2m(C*3oQm@&QN4x0OCw75C(vBwP--w z*#d7bxUSPVcBIa6d-bYt+|xg@blx7%d3*Yf^L7mGqP{s()5!B?&ES}byjX365hD^S z{XCm_Pyd+DHzvbckrHz}Guv}d{{_0pyd^I-esJ9#+R8j2w=f`2Pm@a#k)cyDwPDXu z!F4U2sO$&Vg%M*$PFBx+?AoeA3%m{9Iy{7_adG*kflhJ$?Fo` zMb?{=VX*}5ZE)QsMSn}z7ZDA(MpqXx4dC$!wFvmdgz5rL>C7XSQGnmclhHK;GAner z3LW6x6RL}cSU5y8K-LE_-Zg1%VmcCT2k8vY%p@p4R)$!W%w@@JO@)e1N%s?~F*;p*EXj7I z)$IW3e!`7T$I>b&`X4srr5N__L?yo1>}z)^Tf zPC0h!h?Q~Kt94Qk1H{nF@h)*-cS->EODxdK#CFA9R+XhhxUCiT@ZXkvv>?hP59wLn*$j}v|2;1m(a9tE6 zm6idnPqG#PQA3mjqzlRS5QLKoFF^EhzM3@JEf-uDGp$NW^#JdnsPK*{1lJ{x8D+|4 z2z(^h2K;A5N#AXP>y|s-E(_92(`KOy$gC&To8Y>vKddie1i;7VONxdT1QVdp+QlaE zWny@&Zd0XIfNUO86YQdsn6UI*mo7EBfGj|X)^2JOce^U38n&MiT$c`o4`qlQs#a&Z z5)@!-<|=zn@mkgf*F_f24{s}g@1jCAxGq_GvIf^BOP38C>~tP*c0La{JD~?0j$_3M zIBTg+g;aW~H}REJGQ3Y5gPAkx!r2&^3u+e=To*JdIWyzrG(1QhQIo6TK>(P z?c@;^bNciO$7RH&rp09I7VrG%u;fV&y0`GmAV@hiG;cg`|!+yQzPM z>i=(=3SYL~$LC3nF1;ZgsJrZlznbn*yL4!#9pS~+_wjjNVLo|rIwp7RjN&xTx@kE7 z3DrKI95(?nT4jrTb-KT%i4jSL$y}bq12Tz6I*gEyftvuCrz0I>9ScPy8K!X&0?1x9 z(qTIc7m;L`zNIoC){Jyyu&2=3IXTh|8*ezrvUhyC|JhO+XiI5}EoBS0lzML|RV=P@ zhxM_!>kC)+99Qr1T)it@GvQwuAb>4bOVC{H=lECX09&r!HE>+LYfu`Z=eT;;z;X4i zL20s{ z&gwTRxNd3Q&6t-|LKOm@n%W`3b;+EsNTCCKai;6kWUk7{iJHu(GIFve^Sz9ms>!TS zBS^^H>6*;?jGU>-V44_Qx3rBDkG1(754On1ggHQZpUhP|2UsJ^5u}w9DeX)VZ?j~* zYi_lyyx>YJQ07ZylghRQ4d~rM1xPoR8#O@ml!{hM=iaUTgCR5|O+Oa`@p2uV`g0+& zS=Dq^{fFvPkqCHNa%y3J{Er0JrH_*ai!2#j_a3?v z<>b}G%q91G`8)>5KD8nA#u+EJ8}rExkbP>X?7#D^s(;mL|2I{i1N=`##h1Qh;JGis zb*;?!LfA@`yGJW?AA{>!u{pRdvN2o^t_ucLhJx#Y#3uV1To+fO=(64Ek-CNBJl@32 zCHGVIuqfCMc_vpsYS2|22K+^8eCYt<6Lb)Tgb`kp6Yt95M7%49)2OX%^G4Y6vcYv>NLy`iUGS(rW^i4s ziTDvluc|le?)3v{W4j1=Z9;VcIr@&A6PV*H+Z0^aGEc#E5%Cd~Iuu+NB=ViZbl8FFre`Ro8+g2NjL!Q;p_P^DJ z4u|3p0t#q-5sE`-D8n*tP+Fn0mKsH8EjNnJT5=Sfwd^Q5Yw1yRZL0^^h91e~c;NC; z=B3~jN??PKh}9^1b>h(uLLvkdyk#^Gig0(~W(w%|!@+e$2nG1s1lJV`O6Ubncv_*d zeZZ%(J;0~3{`aY@_kAksd!H(Mwt=RrZEAEpJtBe%#iZVM`-vG!N!{lZC7B;V1tz4< z*X`*-;_?wxU`Oh;WOg;Bq;5+}GCzU}Oh}!UtSTff7eR%QN9whsGfgR}+m4dVeN$5~ zbJ{Ug5G@x$B?s4KXz?;xzOFEicyBByKpug`_u{<6V(k$+J0P5IHFh+F{2TNrcYV5g z?gD;UQF4nmRg?LaBIU>85?mL3Q7$+I_^oMMnjWS7I`5AFtMt7|gpj#YLP~I5=7WCT zOaNkrsG)5g!F4fjUhkXVXJOd4tDYP}?JNZzJrD}Mlp8S3UY0U+z_ikn05R+mRz_1S z`@hM`RYgPS8O|sPW}uz_q8+Gp*Z_rxmN{%VoH%SaoR&IlSWaQ=wu9@!j;1x`O9j`( z7;tutLEopFyF^vBpN@h%Xxa*{3yM8y%b0YzcDhr#Tyy$h~uH3*xcq2Rh!frcO-wreYY?BKe1jMVX1bH~jj!3@>J%q92dc?tt$ zHu-IX>pn$?Q?02yGlAvnle7gu()1Ju#2b}XpW=|cI}k(bnDo}fr+IpBGU(kDA)pRee!+5@wKhMi2ggci?* zc_xC{FG*(K^b&3G%TmK7xGotCC9C&rP38m1YTivF7Xwu(YaX$9U2Z;a?V|wfBa%#( zH4jMBBb{w~M7HOU081ZFT2+N!!Gu;Z`2b?o5|mXc)I_W6lTj7{QB-PLHJw|U_FI{( zBt}fHWk5V#J*cl`$YNO$Km&GW%>ZAUd@aFs$-E=e*@immR#jg$c%G(92iLt^sa~up z!F9=J#YY6!eT7!sscD$`XVEu=fLu*CBu2<_`Je)LpM>fGa#J`uxUS{r+~~poWaVF6^-zE`??%rKB74Jy9{Y_F zLcu{w;M{9bbf?6_+-p&Ax6wQ(qR~N2D@f<8TsTpLk!^5YA))B^M`=RAkjac3YqII; z|7tJ6SR<~6C?@qTA|_@iC3P<%N;3ay2qvV?_H(+Bxct=+>`1+q%&w-C)NM&g=3foL zgw$!tszTy&S3`7OQm-AIX-Y}mc9dlP)euZbopwwW5|_Ig>P#~}Nd1;jN;;w?6qEYF zbtxrvTS6geXh~~46+a=9!8O7CGQaE(ZQ;s`)N7wtSCpa(siUV~^K5F6IyYkzQ)o-- z5KXP1kkr+I@Fx8D&~Kxqa(!4;mdugZTqr_#dkuFn99$Rd;aX~f>w-pQ=eG(IQ%E3n zRB6wt4^UA#{zey&s3P*)^fDwzms=p-5sMt=ab9f*iklB!-8LDnrf}pH)L0Q2ezgZuNT#z4&01gy2BDn6KXfb3X z_sdUG!t;`d1wcfFEtuXjfr70ZM3xG!3-hNbbJ>rk;JV;o<(#vc`x%&^R!~Qu8iPWu zBDgLE2nm}PG#(jT7ps#lvju&THtzMwf;~XupM)^2{-fL1Xr*1L@*E(Q<(AnGu50TG z;mX?9b{yZ_bKBZExGpScMGmeD2Gy1cu8U<5wS*y?JBnX&h}CUfu-mzHhogX|azNZq zK_;Ar&<>%7>0juU^QD>w+Kn~2S1DGQ0y1SagqCU3DH*`W>-DUL%q4r@bZgrKWY!xQ zT=ykR^x74c3$D9c>A$V1A6(a=vMrK1uB7sU>y}hyc)6?Xmuc#)t zE;$5^2(DX-=plldql4>~mFH|_X`dflx2(J9)EymMx2(U3`WQsQ5CUS2Cb%v+TIj?p ztg0`l(;$-Ix<6k&xGuHOMLICx>(oDDlAHTvUav@bxu?N(!Jv91N8<;6HFcYt`(z%f zNZAMgqI9fWjM;#Qdy`Vz)WOz&DM`AaPX?_eY#Lxo%^UitiFl#&gdeWFsVfl`%bNQb zTo)P7&+WKuK;|#LoEmpypUfUb%G13jxGo4%Etsuur21DHHmP7z5#QHT%ztD5*P6j% z5lMUTVMLPIlD&M{fXo$&Ou|6CIk|rx@C#pSwU5k^UpLxGx^y_xZoe>#ymb?VevYrA#tJCig8@nmffL4a3&qs4&AwTes(KwPH{!T^w=7B#hl zE%2UbHr=5nXK-v!gQF(8A-V2*%HZuu!<=}D>^*5V5-&k+UwOC2=DHlwJ6gQ#TK-$$#vHheZKB5A{y|W3DpO@GNBd#pQy`>?Am~@OQ`q(AX?aHnMD<9Q#WhfPRvjm~F3NEXl92(( zc$1x#LkwG=_!RIbX_U=b1EeFiFxrIuo7EEbLE#0+mKgSOrMkZkKcQk!GW>*Uj6oMa zmgKn78g_sTKjFrpV`~)@xl#=5N)Z*e5sDlM7qJq_cCBdCHi3&s4o8GgIs+2ID47aD zjGd_v(MUNQspd0K;>BSqB+}(HMdyI?`Zlr##cHByj=*Hk#R$?YNF$5RXkfVW67oFzh(Q3Mr+ViaMG zZYS48CrYsl@V!a=0w8LLl7I{$c^`ssO5p{FKF(W{M!QkTb#c?1l2QY}KT}lrjwvM9 zrH&hA$z=)*lKTdLXDdp^Zj)TMJn{C~kPc6Wg+3swo^)>#=Cc2=zlak6f2vzjq6NVM zD71F7Nwh2sKh|TaSOv)8A(>z|oy3H#XLCAR^a0s`60JSdChm4uNQzW(q#Vl8=xy2#VKq#BErqtx^a@+cjmnT<43 zI^yi1eo9xl3(^AE=jeT9dh+Wtq(7S1IZnh+OUq850nM@_I`Yi&({x$dXFa)7dQ9%y z6~!^mhH1FIpxWmr$3;M9s~nMcru%D5j7Tah=8}8^kVQPw;e`AcxCqEP9qE|scqk&N zu#AfkK+dX>4&ULph@`^uEu8`JW~8HnKZVY&$&qf@dBZify(`mzSSlT~RQh76v~a1^ zd#O~hxXK;Y$JWj(LOpOoz3PQ}HC;0iUzs3)tx!wSTpj1cSLgs+pRir1va&O&zmw+qJRoKIMGuI*N~^!HvQ#FuEGea$PFe;b_*Y@XoPmCvbvE(b}Z%BGcE7u4n~0T2nl$>h4cN8yb=Zwc*Y3f^ux z;O%Y#-fk4&?ZyD!M5CH$odm6}vfWuV1!Xl9lvPepRxd$Wl>}wA33bk!U&`lBKsM<$ zlIwm_dwn7Go&|)BiuIi*dQF*2^{)9rACQw#XL8*S z>L$%A#jahfS3!AY+Sa`X${x*M$z*`Ym{}va?o~z~=TlzwP49C``h_H^5BMcT#oszm zL5-p0x**YQ{N%b;JU{NWI`HFOt45hz*Xpv*$#qfb8a2P2To)YbtYjCKT+cwwW zP|i!POB+ty=j6I5jv}q(x}eabm0TAT;@#xBG@{!+C)Z^_e@vY^R&rhYu_)7uYwS1c zeh;3_gm)L+D&f)6dd;Sp?+kk9cWib(F_2tDc~&W`eRx3Cijd z>Q7hOUzW~l3xK#qUTAbD*L|M$yG+a0S_}$4BU0v6)eDu!i<2$`Ky+#)*98UpF_Y_B zA!Tx1E3+%PE(&1hTFG^xLD~IDu4^?flIvQFr@C9E&({_JnTWDit&v=JMmyd@%hq@U1)~x9t{hI}yK*>n9c7!(fGsbZ zTo;DeYLn}NNA)q2>*7tscR0POPSVrsqtd~40q}7N)d%F!w{uNkjk9c1a$UZvNZ91erS>oRpa{s4KW=i}gY>(wQ`2XB zeZWU1)BupL$wImdVBYMI)n6mA^ zGP$m`)u!T*&uXy!F>3p8Dh?r_0qcuY9701Io^g}X3Z3;-7oGK77oGKF7oGKN7oGKV z7hT)y0k)|}ayt z)+V{GP|(6CaMIHXl^p{-m5skoWuxy?+1UG3IkF8jRc%tI6X}i&Dl}7i@9ih1 zX{B^Orzpw%3@R|8blz@H6%t2hP=Ot#XUWVaS}9#iN-{r#3QQ;+OEwk~M`ci9=23cf z^rmQ~bnPg~+;3_MW{w?`1<|MsDml3>Q;RQ?+?0kj}pw`0%C?YiCVZ-6X!-m6Yt%nWEDa_q= za$VSATGPH(a$TGOXV)2weTKP9R8?=#S@36Cwvy|D;!N6dCPS`W{)uvUivcJi7Z`7-wd#Ck#9+vk_(&hmv)2BEfPEcC?6o=}mnFSzaOs-4i zyi5nUtf=_O4wXO2$mN>K2Q%`Ln#%5syttr#1ern81R>Q>b)RD;`S zxps2hLzU`IT9RCsdRDw6x$a%Gr2mt)p5&2h_)v2bvL z_LOvl8~{FEQ60&3EtzxeRaK8v9;nj!mhQ1ict+Br4>+InkmR~lP;QLmx|TKX-z

    EahIN(1d)Bup1!tUg{mY;K@2mh;-e{t1A1Jb-3Jv)i)4HtU6 zp-Tu2f1w1nRu9cEgIg}&4VV44q{qKI%nj*ncLgMJFA=puRmdtFTmD07OB=fI^ zU_$9wvaygj>S~C=OX=Cso1&G{wWB2SuZCbk>DVz@NE~%F)SF^{Q2Lh8O4(rv&6Iv} zU0Nw!OK7AFmbB(m@e!{~t_kj!`DK5wg)1*g&pxlOC`A`aM^C@!7J5)RH)9i%XiMo3 zO|GYr($#_VCj9u&x6x9$F{~;}=16QV6d|njetS5%F4%Wzt4Xd48kL>jDojiwfznZ> zy{3LnMdkb(eL%8`$ZyljlpK9-f%uMC&5uU9)0Mgw`o-#;HNA3x^jp?o6(W*C|IFLGP%%@0&b00DQ2bLYh|pquYBZ#eGueSwK3=Ewi6o z*Y*{{4Ylp<1ircFw!NDax|MuB4GXMjTAnK{U{GyDa$P)ws5Knf+)@0YKEz(3W$@ei zHMKXSN8AA*3r<65r%=Q6ck~AJa4iGv={2>Z)BWlIkR_`jv`m{p$ppSqyKBl^s-MhU z0a^7rlj|O)ljKje9F<)6eoA+tmVRfOSP1J7Vw(yH8V->-MW+Omi_1Gf4}RR{*p5n@R5pY zlIv1KP)BmzQp5le^z2TqTXvqcoy9&sxo+8a!RgzbT(|7MNPiq6X$S%FMw48Z8WuYF z3aje(HE0k?a^1`RYoc<`zRkQ2bAw*!A_ExkUK$^9$@R-r?yE@oa!-@%fiAg z=0W9)ij;!@AWFy1#heX@cs41uO#|$`YQAvTy-WqIC2bmDOU>QOsEK%?^Mt=kdDB-i zDwaJDFu5)=4&IX{+GQ(Le&<^Wxp$e$Rz=FEdrfj(5R}?5Q$JrRUpw4mrUvoCZ@2ir zN-KCwJi0e|iWo*DmG9>$U$#Q!n15|}CM`gmqz&?x5AgTD(~?i+J&H^WK)g>IgaP2M z+6<^{__u~@IF>5-aV?|zRDPt$BnZUM5`#Iw&3jv#QhAml69W(zYJ+GB$WV(K*ufTf zd&za3!LdCJj(g|9v1j=qW$^ZR!P~R!1aJGwDH@v#wG=J)EFYxKB`^{B#?qsEmhsZ< zzMH(XXZbX(;H}slcf3CPbI`Ydyvsw8)&n$a(CfBt-ivglPBRe9gu+xmY>G(RHgA4-OnOqkQ*@{G&ye~0a zWWOmH7F*E1Cf8k4^sm#|?rgvZ>Xsv}0o90|AM%*rGv7Abay*p}9>l`MCxbg?UykLn61T>)A2q$^+^WJRXakQaavXzXWB@YWWM}0N z!`3H01$=25Wpma5>4+_iHet^hg?&(X0kS2AyN>-A>t71+`OAY_4JwAmdD^0EwGW*{I1wgY4=&IyCnU&3}g} ziP}b8Fk&KHDx6JaT->mHkcQ`Xv=roy6=KH<5h-n`B2OEcNJ(ryl}|7`RtOYPlBXQI zbi~et?1Q=}M1{(gVqjN_NM|DyIT9{nC6eu05$SB;B9bT)Lg@@h2%}^w1Tl7|LPR6w zaHN{gK#3QJsgOvQ(-fW8POkg+x_A(>@srLn^$5)PJ&7MvW&EB@Dnc@TPa=m`#_wtU zp6hJF_)cCrSf>ceS}Q1PhM=r|g35v{#Ee`_`}#cKQxfW|7by6~gqjDuQc)(k?g>ZL zb_zT1YkKP#G?eo2)RkNp63UL`y1&+8h-Kb^ccQXX?gm+s$+m1gI9>2^44s@tAf>}; zIJqwRQ;LR%)l`m9uM6_#_~wL~B|?-@1Qmv26k&~SC)Y(MO0f*^ z;Yrp4AZmz`fD9pdAA)d7;RT33&Rdg4yHUw?ann7LQUkza6&1c?3dwb;<3?F>nF8O+ zy#arqC>gs=a^3R8+h;?1PdY600a^8=dy`z3{fGTUoB;T;d`Z#Jf?xp@TD#dKzAOwc z(POGu1<2tcnP4}a#DuNq+H|SW2V?_EwDwS&xZ7PR^|0fN$9vkQ8_5jb|7fU};G zRbF*tqA6RYCUo&WnNiM>o?Fy>4=-GSW8Y;7kQeORAaGnl$xGF9;HJxvynzhN1Q#>|1tWf z$NfG>@6CBpV@MCu19hJh@h{RnYM%kkvLiZj^nF=gS6ENpogS0>c13ZFvtb&p?^P@E zlj9;FvsI4BJJbC&CPpL`7IR6y0mvdA>2N}R3|s_cosM+ObvzW2R9MDE2q0(GNQdum zTtre~`IgRrcr(&b!Jk5B*W^ey?7ZO`+ur6hAeKr8EtS4lDlJ?p^l#UoUpK4>R(Tn##>}S&{A+*Hmtmkr&le?vWOtdB77CrN7jn`Y1(*?HHI)g%3-aT)5lW z{koFtmhL?Z_fkr#Lck{`izT@(l`9k}bb#;9biJC&=Q47lrt<$Xa$Qa3X31SIoUEzb zH6y2LDi6=d>6!|ziOF?K-#GbLo8R%^i~N`{3&`k`wQ9!--pFzUY2`#pyHdp4EZOgx zTP-UugwhI>^%B{Xa%@2ZMz>G_GK}R$4G=x0qt(*6cWeJ(2n{LI&xJs|S7)dGT!?B` zHCwMnNhKPUT=(-z_s?3AT$lQnlduIq z>>DS!E`7eLY+A{6L0y|A03zWxnOv9mD7?|Oe-59_Zv!itq zw7SZ6XVnyx)lg7YIYC*y1Z7ncl+`BGId48WpF08Bq}NEUd#3h!V(L8$2$!*v>q3mk z14^#Dpvs(^l$r-bxz>-LL7~FYa&Iv@Pi#!COBb|0`oNOwqW9UVcl&!+aENl21>PgT z2AhMe`o$|KYz{v?;#c7Di&q-3?DR-5o;yZU$v2=d#*Y7%0ut;_>Vu4~2SM9B6V~LW!ayhtrB4;dmZza^_Nd zmA1D#Ztp<-^^T!TY7FS#ylIB}no>!LV{w36$B zLXTE*T~LU3lk3umZu^{EmjOMiP8}<`uKie)X~i}6F}mM_XEWj51$cY!0iK5+4uRn9 zjBK4fD|EUv&6h<$zW#`pR#r!O472J9%4#MktCXOuKB4|g{m|vM>8!Q@h+E`^Mt5@E z_1f>ZwQQ}$px`qiWlmLXP#(8Vx(oo(sg+z86zs=Lu4{#q$#t#FuH?EXfSqe4*M$aU z_b0io)x1cqYZdQEu50x!v*mI+i^+AZ>Lq#3_v0qlWr$Ha??l2#e5s!5{w$sD766%u zvRAE=^K=>QB_^M7kq`3eA+>d;5uLS}EPnDM~Uwg9=P2 zowwUlg~ZVrRA5KxSu(SUR!Y~BlFZMb0uxHdl8uGLQ5jU2d6b?Vy(wBLT{}uL_nVr6 znPbOfK{P6ZN=~lJ)Z)uzdAq_q;(KF30rC-8{9c^zu-JQq&Q1vDU5%X$q5g4wbhth} zLi7QDrl^?qmCCObDL)pMz3p-3}+Sf|1 zi!S&z>$7=lk2`xr_>r%Ns(*fQ>AA{m2 zJ5=tOk;^reM`z?EHI=7kHI+*hDV76Xt|(QcF=H=DYww# zb74Lc!R>EKZeQG~KKNTLWurc*rh=nla$PE4NnZ1A8o3y#N?CJ=CF*kXdBZXaz&;|W zWLa~7m>%h@?Gf2tLjo*gJZV)GdIc9+#pDHuRZCD-sn8Rxu1`)`07OygY1MRYY1-e) zWF>K8`dS9WYc+!UwG34}D*`ZJSJn*h?^3KKxh|D|%5>IHN8PG=vuf}cTCSa3_nk`h zZY@c!OFb*zkzDtE+HsebVddB4x}g3}n`D^-gzbJO*X5Y?D|6hkV=Nq;p#6M0LJk1G ztEi6Tx|Ynj_NuBcD-TrZd`tIrCA==_(Fgoa(nFH#QbD;flIvR5ynnO&dH-fbjGtT= zNqbb|c5+>CNX@U#`ZYKt=eEs-!Q&^_MH{$>99f!N7Zd_xQFUxh|vOpVjm= z5^^=ekQ^b8%NMzTa|ty7;rPD(t?y%r6R=;lEaMh7viB%L#I;Y1Tow#jvcgr=n~O=uW$nUP~%HdRe4JDk;V zHAFL|cM&l$O)I5)5mA!)S3@wNbdH}>g~ZWUL$IUtEScFvE2V2mN#xhA+@=9m4!7OuP~J^Q@Aq7+>y9XA|3qAjIEG`XHeN>>Nc zoABd9-$qO2#;~d^nIo~eP=xT_nnz(cxh~iTX{$-D3mTQ3-zrQ@B7xFTrM;$}t)g=N zjXoe*MdbI0WlD}dw?KSHEOJ=K`D#N@+PW8pa&3mJ^St~DCA>U| zm1t)7YwS6NUn=#5VeLQn>&i%(L?{?S_Z$JUsF3;vGRZj$b!=l z+9}j9{VP2qzDLVIdwNan1Bw-lnfZ z$bjxyiu==*J$eCo$iFw!M)q02C;X&A$-P^5a^1539R08Q0W8l1{Ia5&QzNXhF-smU|&QGoj zBj$`eS-s}1hgB6?5N+@_;2}+o!{bjnctrd-JiL<>$4aj`m-!WBo%g=aW@@b$8(TDU^|oRq9I$6D3kZ4JETE+cFC~V zg7!7J?wX=slg@T$1AaE4`heFa)B@m3b(s+d0{(46Z2^3pu0LY#t`#cpSEO880e&^1 z`b3C@NH$?W_J_!gwTb0OxP9ELOoC#OVrPh5sXQ+22wMPW6KWBVrA@f8y0NfDZd6#< zgzkE?#)*^Ca+g=QT`Mem16|>yDLQfQ&cUSvkb8^@&db z4^H!J&Ke*cv4znl?5|Wy7;C}{aGj2|u$L=%RzhuIP%`|4YK%b_KbGXU(i(Pv3_sz< zpkr$l6yuMP7Bthr#}ayU}W zXQ0H3!&FG5%V~{CPs1bu-=K@1C~$dBDwzGRbvMJgT-+ z*m+;mTgRZGl!vFTWa;VJJos*64O}U38)p%K*Qa z#4iA%hA0Wh5R&&H2&WWYfav4AHEFaPm0TA$eJCk40Q{(;!gov|xh{3wC`&F=U|VwE z0Pqq;$=Gd@>y{_pJ{!_Q(qW+w$f_sZn}oUSKkP5!1i;(s2{X}xU;z|byV)dK7KYpC zMTJ-e$l)QGU^kt_gstaUdY}-2fNVgC)*fmTce^X49(J6OT$cew3}uRaT4Tm?B`Cnw z%2ke@;%ix(To+jcKYUvO{CO3s$#tnRk~O(5RfcTfV3+fNv+H@l*#$k|2pl_3z*$fA zDx@+}y@ju&lIeZo7|fhm7oLrgIi*v;B-aIvO3uo-ZVDchj;M8;;6UjaS5nCcw|?@7 ziZy*|J#r{zm|ITkH_%Awh?}ffOBk=7<|WlwtQ@7LXOKtf5Y23)k|A?3x_uhMhNDW81qn4Tz=EK})4CmP!kkO1+m#6^pCfVSQ|E zdlBk^6Y5nj)T_l6xJ(cy)RHt;hXU~xI>1(_S67@+udbAi7&xI`U2#Ianl6!uuSf>O zbrQnW6)HK@11Hq`nq2q6>Rir1va&O&r_%9a9*{Eqq6fr`(&{gIs2-JB06t7n@s~PO zo{*8tHIq@R$y7w&HODU-e0e_+^tE8=+si_>E>^KYX6h#SLucmT#Mo!dJF3QMtHI+AH>PS;d$O-!y^`ld6vF22Z*3A2EVJ{jmcR`5oaBSu*W7AZ zc_EZmpsbh3rj%m~8ceDALIrqKLTv#=Pw8m2bne~SKNvzo%Jg#~5D(YcsXrH@npI6# z)ir#J861D({ed8q8 zrO(rqO)I%BsApvffJpdFCfDUX3UBmzOK3M!@OH}qZ+8>$c5el5HwN&<>}Z_?t*)}^ zSTzM@H58OpPEb}aL0OdqWwi-)&YM5W=T1O2={1t;{+sstN$Ncd2$!*v>q3mk14^#D zSC#o;QfeL$}289Yo%e}?uJh3skE?v<2=mSfxi{3v_z1!crf@g&bO+r&~E=bb)NE}=xxk;Cbh`W(*lc#|`i+8y#! zIv@`p4WS)Q&C!bWohN!tnM?JN`9U9$lTl}K-LL8<%`3&OU949@d2QO(y$8x3&A-TG zfXJ9xBf0KgqmT0`ullC<110@QlGF$MnWExv9jKtjP;y<6=r(?GT`Qg+_gWqJaj#XQ zOs;En+2`cCsPrQ>znxqc9O~s?`u1yZsF>R}*WggjORh^BPTc3@x+sn!t>n6((4&=H z7Zl>%UHh>p(~4{CD|NpI&t}5A3-I>d13V8u90I}Hb)$9m ztkCI@^wrQJAYXsPODn6RJce2I1Z6c7lvPSlR-aJ+UuyeX(^+i+5Vyz+jqc>Suh)KW z*Rr)1gM!b9lsQ%PM&ssb1xh^8Msnnt5x*(D7JWPjEnU$)^b&;8S zcO=(k(fp3ya5Xt|sr@+Jd-VZX^2bfCdmmly&r8dGAMhy&H2_>yR7iIL%$psO-0~pD zOB?Wv7jEvszeC--TTAd9c{$dCU(|Cf?`y$_Dck-llj~YrZ7L4=tOncvKn)#E#UTVV zV11E_LuhEjGj38^p|hUqqO+dsqO+dtqO+duqO+dvqHB9Sz&7~b#+k5B@e zghaeX)1woQb`laHpkc9_2Tg>#2r~@~{Nd!fB7_EFZIbH>1ucvMCq1oD*)iZ#*%9DV z+4%cZHu^r5jlEBmBilez)jieeM7kq`3eA+>d;5uLS}EPnDM~Uwg9=P2owwUlg~ZVr zRA5KxSu(SUR!Y~BlFZMb0uxHdl8uGLQ5jU2d6b?Vy(wBLT{}uL_nVr6nPbOfK{P6Z zN=~lJ)Z)uzdAq_q;(KF30rC-8{9c^zu-JQq&Q1vDU5%X$p?-#54Q|g@gn*YSDyDs< z@)||TkHsaqF8ZQe2nz67=~$XRN_$s69|7)ER1`wxQwb@_by*LN$+u2`xFL47){$Hn z_vZb+`F$3ST~a-H2(_yec=SLh_)>1bG-p}b&;i%VNCL#MYj_z=@$CO3FIN?YFfyE3 z65N2Duhaq5de{I(gho7UIGlLca5$~?uwglcx!X>z3p-3}+Sf|1i!H|6pKB{Faxh^Qqq%CJMjiL(x!jU8_JtkRP^dD}U_dx0fUu50-@H+t~jtNe?r9vYD5-RRj#WN*08;{#nnX!y7iIQLpKeJb%V_gXZ3shbB) z7#+m4l620r3no~E;Dkh%ciRTt?Y1C$JG$cl-@FP8AYIUk$;I(z9e{6Rni4B_)}EH3Sn%$C8bO#8Fp63|>mlj@}fll&&2m znSV6|6H3R9$wK0&tD)W$^Mlg2gjUK9OK7I_lk3t-=~_Y~Ww4|*pNgN5$>f^gewknP z2V1!EqV(+Z`ifF?p>*{0dv2izrE@bjF^RU64$WA4}BXgl^esVvSg0L z=0Xv|zt{Wi;pDntKc}rGxh`l_c7CfcF^L39N0s)P`U4e}^KbM4$tohhO)pb&^tlE4 zcs_)(j`P)qi00;lukIafaw=PN`IYL#)t!|N-l_oJ>H*#=1HSE#0C#I7>RV+5W%Ur0 zRY6czx}dD!P~V^*iQGAVECP6MMRg?C{Vi>Vtn<8lJ0(0UiI@jOR5*g^JrgL{%7e&S z$#r3VM`bSO(Ue>l9ITw@tmb|OCa4wE(NB#*p;nPxmj;A{!wVXBCfCL5lp~Iy4_4!5 zlLrTY=O`+qY4tz4eT-7{Q|DPgI?FAypIq1W6~Ya*?d=4H6^=ErZ|Auc>_?tu6yV7MzCAPN9bB1M~*Wf8mCvzvRpXe2Su)^ZYnHt0!f8OH%F0J4(@#x;OAwV;D>5+v z@mg&V27nB;=s-Kz0&g$5t}{5cr@?W09vpj?pHK#Gj~Bc>%TDmNubiu~d2Np9p5^f84y!7(All$$P zfZtB2ML?D|;l>uh!WOwvVPO-x?PiS=C$ZeI(#5V+zNIUibOmJ5ldgbykQJFuLtZfA z%xIE3x|52T8Nv@D zQI2Dfj0`}=o9wI{V%Yk`r+{xsqioI^ARV!V(I)IUqp%MOFF>}$u$SxZ`0wc?vxPy) z@Dr*r23`DElH*Ei*a0&9gd2m7tyNHrKSo;6Ot(|ERY6^?C^lCy36OCnRDi@ysBF~a zGC4=>P*;jQ@hzgY}#lWr@srLn^$5)PJ&7Mv zW&EB@Dnc@TPa=m`#_wtUp6hJF_)cCrSf>ceS}Q1PhM=r|g35v{#Eg7F+Un;4U!G8B zy+OebCe%FOwTd#ybx%5~wo}-7U(;L1prMq9r>^9>kWh9c*Tt1s<{fw^Dof>VkR_RH z%hrR_1uw_Y$!P>qI-G`+>!LrUXn0s!Kp&=F7v$kJ6^?CkdkA=83fKVf%7mIFLX=Si z6^3FIVU2Dl*F`}}u?+A@N!9`&YKW463?X?Rf^bUV1&BV*Ta!k+QOR|2(_@lS1Hgfz z!gov|xh{3wC`&F=pqEa&1HhXrO2%%JT(>;&_SulGNr#0#Agi8qZ<6b>|FFM^69C_; z&)bO>1Ph?h+RY}>vM~Hby3iN^a(GB4*i9!fVe7dmU260J*?^LL2 zE(3}f$`o7Fn6X?53b3_um7}NlTGl4lMHayi-&O#ht3oxoE>%XdCfB9PkPRH{avpGY zJr6j$pa&d*W5)?N>#1IaR7R?|@Rd|Dy-ym0nKSFcvoSLNSp8y>>w-olXJuSB1rJI` z)VfV@p!AF@sbt<-KY2vOnm)B2Ig~Q5ET{DwXry$+O;)TWi|Qgz^O9;TR*q8BGsvTK zh-Nm@Na={Phx+%b{&!9bV4tJ+v+|4&ULph@`^uEu8`JW~8HnKZVY&$&qf@dBZify=SEXu~a%}sr1EC zY2i|-_fn~1ag{r)kF6b4gnHnFdesZ{YPx13zA`}oTcMVuxjN2?uh0RuLcO};gnD(Q zbi}|3_3DZf>eZFfWdkSFt1G1+2TrK>HM#CT>1x0kNLF?x^&h8sJ`YHle$fMBhtldV zdZ@lPvjF@TMa5t0Q29|tF4t6UsVj(3UQ$!JS4Li3Q#m#xFRH0LCM`hofb)vdU+PeO znxeyY3{0rPhowv|-0kdsUCDJz_nw7&DJ4}Q;7gMmB)Kk?_aq;l1^D?)*Q=@gAR{Mg zDjSn$UbwENa&$&c)>IyukyAC5CuQVxO$FD)KCt|usQtnh+l!n$ylH|HD#*Y7% zjS(w8PleZWf<6@TkM z1vQ3}>w-kL@ssOX@%*^g>cEeCtr}%=U8~DJC)Y)#7peK}n6(5bq|}r4ilsIk_$a`T}+8Sjlzm$D&LtuCX`k zeh;3_gm)L1}DgECTZNN4&JMI?7|1RZmb>GeKFU1ZDLJ z_1mlMC#1950w8XY7aHBkb?>VE?x$sIEd~Xj5h-)3>h8+pzDbt>AUd^@>w<#)n8|gm zkTSWhmD!bC7X`3$t>n7UpzQu6*R`4#$#t#b9m#dA-etC2PG>Q>u2sDx&-s4bRGuQ{6|?>23j#i70#38p(BcX~!$IY>hWiFdC8X%Hc%5D~D6pQMUQ4+VZl= zbzz9DHn}c%R39_BF5X0ZhtsR-yZRRP7g`D-;I9&@56Gi$=bFG8XW6FYx|VrLu8WAC z9;b(r>w-kS^DrGwWmc*t*F|RT-H}|EMe{j&By4i#QhP~0C<3zNkDFZgBf8vQpO*bT z;Lj6k0La&5A>9QqZ+1v>%Yz&@`QRBZ+}wlb5dKtkGkA`?9BaXUPtUQuuLU2bZ2PZF zu4`?zsW{}b8f^bBwS71hhY-+!^+hTUp`i`WxJhY+&U&hg&U&tk&U&(o&U&_s&U(6w zuI=>z+teeuod|rk%e^#wNeOHc67d>MUrjvPNl1i%hVOOrpowr7VWxqBKb%}wgwQ~& zO>$kKpoLN3q^A`sI|h6zI|6(v8-Jh5M&GBhvG=KRWE*Iz`a5+xk?zQ#LNlfJ-hN`5 zR!aACijvIFpaK(0=k4}XA#rpD71&XFmdtFTmD07OB=a+Gs9&d#4hN+}WFPPlMa8tQRPLlm`LVbp*F|5H3qb+?_so%r|Dbdi*ati{-vv(A zR34v@l3bVd;L3cM0K^SZLu(z$b#ZUr@0;Ie;n?r1o;-x2Y~Jr1dh|dj^rhT@Y0k2= zp#!d!kpzfi*YGl$;@SU6Ual$(VPrV7B)9=P4^?-!9yUM`p%D)o4ksQq98POJY*%LRh?{B6npm|t+J4u@dq)eaUfcTEm>ZdqVug@$1DPwY7 zDhH*z`+2})6cs<&q4L;_T&}4+JtHrvsa%$k7uQr?nUNRORNkgY`M?Hnr=s+e9jgDJ z=&;)ZvxA0{Ou2;?p9}Mu2yXvSa{J=d>Z>nkDI4`cH5D8clj~CXMe?q9)5yg@Rmz$} zEK!%6&l{Fe0QM0{CCi!v#PmpKZI8(I8WLa`<4LQk&?~smDkd*LtXhJyN`;oogmZtr!OjZ&nrmtl{{EbFXzm}njXGH)8>`viY0Q`E2wItW2@*kPb8tSN9 zRadG8AJ=m2-Yri57QBH0JvVS*gBHyS~BO_tEzskY*D52E!~YuxGvx80Zt`7B)KjXlp7p zH_M;*Z&t+k$#s!bsmAT(y5NwSU!C=9a7fN=n+t=-Pp*qLa1S}MG`TJ)1jeQ&xh^Oi zJZ5rTM#F!mGv~Ih<6yJYkt5`pIpBcLPN)GOH-+8FbuB;VMi2haSN_FS4-H83ZuIOz zZEv{H<568gXgEU&oO>;r9-nxado3EC+|7d~j1FR2Njhib!igrFY?JE>2~8JwX+p!0 z%ZwcBvZ?AW$_{6BTn*7o>0LxjOw&r~UPP2+{?!mnD4pZyR3UNn)e!6`JxgXb(MsuB zQj+;sLolIqEZJB{9CbCs;HC8J=uOc|>Dp0}`By_Qp>*t+EF_M)8tP3kKPY`mXr=71 zgl0-Vxh}1gt|c^521{D=srU(5I4g3$%rEH{r*JzKxd3jbT+;GDl)_p$OsWnnz(cxh~kVwbdlo1&zwiZxtpc zkwEFF(q2<9QBgVnMjw!@BJ$hxG9^c!TOht87CEfr*Xar^C~iLZ>fX^Nr?N$tSE){% zJ*{-`Rt4}@5AaqQ@NIttxLYGp-zp<0tB0Vh3WBoI1!V(YRbaCkxE&g8myoiYgQ_>wmS>7UfNZzm590Lgz6(zN;?-F{6w?Macm9570yZL$nNj zJHMv(D8LXc=fvuc>_{txp3$maK-b%`m{tpkx9+ORr}& zWiHj{rd!(qAgf+ya^0(SrF)zXg;B|M_bUAnO7ADvb*QXGvc{EEUUJ=%%1f^MTdEIw zInVPFm>y(@DS1w=3nnv|wJL`pe1Ht-o~5`yU8#QEOqUb2lzkTPMK^2qak+QvPOe+_ zpQHcYiKf5g%mw_pqMGEo)DYB>T(=Z4Km@`!CWT zhe#SiK)lf;*QJJqPQJpbx{U@6B1x`$!mlPO_w3uu>oCyhg)TCH0l%T~5tm%QOy%2( zlrQ%*xh@z~kK|~)yezAp#Op$UB07U87*-n61k7tuo+cdzQq~;5U-OE(aTGFNg zw$$9cjGBlSI#2l7%A3BDQL*fKfXQ`{@ekRK%T}oTW0l;vcbUpzy#^_t?lsAEK~QSL zOno<{eAsZ0nHt31bEx+&KS(QhOgy?bd5RcDB$YqOQNC=2%C(A2T7dX&3jZA7ZKhiG zQF($Q69W)W)&_Y^2>7lx11cX(bbY`Jr(1%k{Fx$?AP{fU1`z~!)A|+zDtDY2io{F} z;s|XJ27nB;=s-Kz!t(1S*L4QR_B1%YnFq(7^=AJGbd5z0Nwk5=E{#E8U8pU!UHvwVYA@K&V69gkEGMdYGxGB3!Rjh|e%uR}CX z$R#G^9n$D3GBWfkmNxv^m0Z`-iFST+T^KQEnl5x73*wPe$O+@o}I~ctdx`T9EV2u+e0kYD?u2i<^3MX9wS@fhUU>;;e zrqhrYj5srzHO}Q^4bOpAaf*fS|C2(I)J#RZAFa!V8csG3@0!>|Us) zP%$VOenK_Ipo2}JtDyZ`m#pWu?0y55o3Xr%7 zm5rJ_G|2gcM~CLVq51DHB~km34yl+3mkMW785cJ!e?%97f6R-9e}7IN&+&3gbLx5!V3_6oVO-TNJb^s#Z6yJ zN(}(NrKs>7Q%J5$9XHC7%M`dGxo-gYr;3uX+a%X5PrQ9Lq$i}qLLZP-Pr5hBb=iN| zU&IN3C+Jgjq6NVMD71F7Nwh2s$LTRutODflkW8?fPGZ8=^Xhb|(FbG$O0@P+o4DIu zDfO_Ei{!ctC}Jp6?0XtBmMcL4wpOlk^b}vq+T^;(BKYCk3g92AP))8&m65E;b*VCB z0|&dD2b^8c1I{k!0Y~82aRSbIswc;?=C+2B>MeXFmAmkjWX`M$&&J3+N@bhmx}Z_X zSsB+&!GqEfwQds}C_Up!DjDI{PaaXRrcbR$4yDX1%W3@v8YvxdlND-A=dh+Wtq+%eV*ul#UoUpRey3}8uge?GK-#E#2>GQvoO)I%Bs8?qRfJpdFCfDUX3UBmzOK3M!@OH}qZ+8>$ zcB24qHwN&<>}Z_?t*)}&Sv3V^H58OpPEb}aL0OdqWwi-)&YOqihiO1I={1t;PHV4& zQ}0>8#AS?BwRIv^J_nRscSf1qGAT6=h;pqTKZ8PrqvhUWbe`ClT$e65>gWSYu8ZC` zSH0WcyMja18p(BGgU!KK{o)lAHiw@c@hk9{T$ctcJ3SJN=Z?`-l3W+Y*zwG}Ij1&+-aO-pZC8GB1LT|Na`$Lu9$<1^D>f(BMK+Gh$#ub?%20A$koe?4lj{;n z6dgI7?yb+^JdZaybE!QjKcxfm@X-+3;nWp%rH zhLY=oMBezxb**@Q+-r5<$GujKGP$nRWuKGlqSCF@{C09(aHyAm>D#Ztp<-^^T!TY7 zFS#ylIB}no>!LV{w36$BLXTE*T~LU3lk3umZu^{EmjOMYP8}<`uKie)X~i}6wR+_T zp3Q`J7vSx^2Y4QSI0S;X>qhJBS)tR3X}&B1^7Ti&w6Z$NW0+M>P*yWRS)~MJ^$GR= zqqct{U3)G7;ud+K(VblP{o3y;En90bDEN#>nNw9CR30Box(oo(sg+z86zs=Lu4{#q z$#t#FuH?EXfSqe4*M$aU_b0io)x1cqYZdQEu50x!v*mI+i^+AZ>Lq#3_v0qlWr$Ha z??l2#JYG+AgLJxE0AwP{UbRMY-P5$=W-VLe4HS$<k?+dk)OD0?etBYf+2pz~ z#8#VJ7d)zunOqldBEG}vRrNeQy}lwHY!?7ul~8>^9(_C41lBmqHYL}!%u{k*L|ma# zhmz}pM85Md9ZqFdswUS(X71gQT$e?2N{@t1&RlA@$p=M1mi%#(>-KfI-=3EJKH$p} zY5@2VMTK-1z`WTZ$t@3ZytDz&c;V(A{HN8uH)si-BQM8V@GsDFEbnWY}rr>!P!s?4q-t?V_`u?xJgZ zJ-{~gNNy(rOI_}z;mJy1laPqlXnK0$(N01l1T?&$n+HvVy9hH44E*8bx*~)IVr`P^ z3I#2U0w+DKP}woyQ`r&VQ`z|YR5toPm5seml_T3gQ`KYD=|s9Cg9^=*-h2CrX<8}W z&nZeWKZ6QPD4n<4Q-#FQ8B}0L=~*(fiB?M2l9J5NpaK(0$C8bO#8DYkn0b_*9la@9 zDP22CGWVOBf|+B-WI;44gG%$6P8g0%Ext^aw=2vezBd*WARmFn@5T8Ji@ita?1XUM z)!5k(>KE$8;VKu1RUhzeijrHj$(qW$6)8U!m*l$Wi*g|-z%NY4()3Z<=koao@M=Xx zAymGbkdj=N^n5m1J15982b!!m#C_~qO;&zTDFqwg5pftawbErU4C6T{HvDoV-G-d z2-gs6Cf9`rqRZsEw7|Mdu1gC-_bs`u)gT;-hLY=A1sa03l8aGZR=|kfhB6Ql?LFKs-lj^-~r<3;zqqDyXhvRCQ#mocH<$-JRZ;rM4%InD zhut2S9Wt8ma8yjLOXU?x>EASRF;JDV<`7HN z<>vE-WfXvYL{iDJ<^VB0(plRhvb}}`SjKqLsw(sfF0_it3lOW8psZ4%Ct9s0rz`-X zsPwdII=3|KZ)LKQI5B-K1L9#CLH$~WDxMVq81U4r8Q?QgtR=ZFmE}xl4RzG5s?Dmw z8CtHLTz5&S&ef9Sy417c9m#c{tR0`KWmx$&xh|+@Xp<~+fUw=~sm7B+N-Kwt~^ks^DW&gmGHGmk3QfZCp{#&E)|p;Be||+&HFdY zpZ9N8#Q4c|k#xCg+)l0w4ypOoS-%E{w-dHY-*D0g2KUL zCf8*&yjV?NBOzBa49OAls~m8^$#ixa0CH2y*H`*P`jWiHEt@qTy%VJZQq`Af}b1b4D(lXu`=hxvr4Vv?;mFXhOq~ z%ZwcBvZ?BQsyEK+xEi9F(z}S5n5LD|y@)8u{Hr0DP&&uYsY2rDt0CA?dX~&=qLtFM zq$KmNhG0VJShBH@IO=MM!At4c(VL=`(zT-`^RI?rLh0BsSx6jpHPoA8eo*?B&`Q~1 z3C)y#a$Q;}T}x=B43@O!Q}KH=nOqaxFZ0X(U<+4Xl%9QFUr~xKl#ZT$&n@(zbZ*8b zCefDCA(~uIBc-bY=}q|Yp>Lz5a${IkmdugZTqr{LO}*b9POb~~2ij_q>w-pQ=eG(I zlSrU+RB5lNH`lxyIsZl+&I#b)2s@L^L-ae0A?=lT+EE%NdDOR330a>ydLd&!nluY28w7aIvr8=E{r859z z)$2^Id!DXz-_UYYa^2@E-QQ^GC)ahTtVOcMl~i7G-IB^nuKSlpFXwq)0@H(Rr;_L7 zx?nJ@V+bE01G;A^?oU@AObyoFK3iHixj=CShj-!oJCOOzq@EI0yLV zggP7W{RuS(n6)et2I7pSEVUe<ixR3|vMUs6jAvw?o%+rJX6@!ncEtn_ z?4GGia?imnH6Gb6cL{BjN&kIyGfg*WDK-M0^BQLGIe<@4R0!{UP3@JL5b!lagw$?- zdEy9ojG`Kj)Sj9N0bi_ZU_+SH?*`PMdnLo>05>IlmjE#(aGy(tU6u&}F{L4-_Me#$ z5K|gLYL85YEdjO-oAd4gs;V$$fGKpAmrbu+>GnlxDLBo->G8>gGXUF8nN3c4StbO; z4Z+sgni?UN`2~m@8bWG>SO@{Jt07G4w}HZx1x%r{IAx7g^6)D7EW&3YS$Za5+a-(1 zC6{JGK%5W^SWGTCDuw?{K%CGJQo{si=~KO%({y#Vs{aRC${_^su1Tx20q>De^MLnE zsIwWmHzw3PAOV!@o~X$96%?+dY!2mBb)+hFUSfDI4t#Y+;i`Kj=bVd-?1ppUO}Q>{ zKU$@@;hs!n@RIEc9&UM@vRlj^1w{GyYM08^WJwlWc$l9NcV@PgZ~+T4_DN5bzyZ$b!bf;NzQ4;Q!-8# z#Lzb)ZP+I#^>+zH8XRwo5^Lkq$dn&uBL*UC7(Lri?a|L*y%L#o~o94BV6~H3L0G0jx_2A9B^L+ z2Tuc|j3=k6wy73K@J4d9;XcoAj*%y689qFD@KH6@2P#^&LclYJDXk~gRj`CGd@1+9ZF~tf;z)K(1CVa(_jZv@F zvQenh(89<$jD)Q$UAwoz^$O)0kyP5EI?mZyz6!iu^6CI^-N}s|@-H#~PAV!GF{r7n zduS$9@JeyXE`TLIh)62P32M)}!<@NasTiCt zF9!gB?>>!{!uj$G9(%v0@=`6QWrupM9$>L1s&Ii?gsiY_0e?c}hJ};yg_J;N#dxpWoA(SzA%5bw9T!YfgQvKC zuQ!|aZnN4q-iz242o=&8B|(4SU#rJO*45kYsRm}B_W@t2O_A>PTFHUv1LC7dhm#n2 z5lMwbE@%VHXpDqZ7@C0)_&GX4Wp@E&(8j)07!08=aLc_{d+xouaBu!v^qabxQ%=du zddT7Rr`3yiYh$$>rrhg#lC7v_9^#^*#yjX@&Pu*P`W<`Z%$*NC_VB{kp^gNXvL{M@ zN!56b#%D^-{3qSMwle%T`7p}mt8^|fR^%uENDxn`j+H%3tUOW{{%PPNw)58u=vMWf z&EpZ>iMwzHBh=q) z5AGO!a76Dk8Kp<`S+Te?2P!*ivGbw|wl{W|cT>Z6%I7s!)S1 z|Nmz-WK#@Jd(M`EVyp-4E#d|R?P)Q>Ns-cS2N6lQTa$ac7vk+jh=dVv-Lv8Cg$**to7=qb-=2P3*B&uVYqISg$2LI;lLPop z_ib>Z^xmyhj#OkI1U~Y_7U9uadA1I>*qaK2KlBD}`Ec)6DwKhcf$#wJYrp}2=7BBI zRIX8^j4Z$t^=Tq%L*>Eg5u*>-3e?`MtWIysbbzh#w|6VCdu@K=+PjqsQ#WYs#B=Xf zXDi*iwH>Me>$)Am@R(-*7^B24NCSRij^pLqsC-b7a+3gfY!2h)+o(KJkwORf-h`S1 ze1@)iLbX=3p8bF(T0#c+T1ADxoc~M>9Dx)%z^|p4&JjLhCBGRZQiMfN*4M%dPrvra z#(jdaehlAu49}LeJp01z+0|_;T4CslMXPB|V7#`+F8W78Ye7UZuoy!TX$^}=OuIr& zi%4snXnp#x+zMSk80v8qbF87kUv zjSAwVu~9bF@E~$@cpL+X=Wm^lABlzlFrJ1OFt`|5LyZK1GsaLONFwBkwgDSrU;{VQ zXuZNA(p}SaMaNTD=#&g24)_gen)U(b(kbp7z$Yiv+*1@}tq#n9cO|lO00}^Qlpm!N zJm7$t^s+z$GWF$(9q^?(<)cuAUzwJHJ|Gd5o;HqxB6^pm!{RxB#4PZ)F$y?B!*UUD zHX`j&`VBoF-~}1%mtDZPYfbjcE^sFMWf!0+YQ^qWuZTpk)?~lzf|fGo+eYg+?_bs6ca(77bM5BO4*BOLZ@rGiFblKfZ+ zrc`>s0k_2OaUAjv75C9B*3q&0tTrQ6>~nS>uV+=Uo&6$<06a2z@SKv}IhI|xpPN@E z1ZG3^=9ynNe=9dCH(0gX#^ELJDJ%=;)rF@;9GA9lM0#?o!U}OGy@^}=H%+NvkvoPw zh2%DT^?5Zs>E2+iN}+yd9XSkIdF2a8XGtJ=)z;~ml|#!lSr{Cv3?7;$KpzkWqWty6 z2y8C%bAP0^6!^snY3*3udXrXek-08xvjgUyS${xG z%f!}$z2rY=-PqIZZ&k+iN!Bdj?riI>tyI3HNcrFzux0Bm$5vU~<^Pd$m*X1;hGpSQ zg=ds!z#-?yEu3{~phJJkUQ5P4_idQ8IN$=Y5)j42n`?Rl;gQa29+9X_>8UQiyW3uu zy#+}xO0Rc&v9V0rZSbJ4_q!*>vTh=Vw*IUL~uE&4P`d~ZztA zi!@*>fIHK0{!SXs^MEKIHtzHc-&u_D=`_0YRB$4-z9947DBdDb{ew=)gX9)bK6ZHB z@6h@E z2`vTn6*J`pMO;u^Q1GOboM{m(Wt{zrLdMypjI&D_#pjjlqXf19Bz-$Ai(3FOP<**# zt2HqqKchPRla_KJ{r0WX&#rEN?2$D%lnf~@B6)TdeHJEeLD>_10l8r9{Tr@e4A4A)C1c`y}ObGx>{Ue^Wsj zp6blshE1@c>|!^y9{nj@J4!O&jz*7Wrw{OFbQ%#E(e+I__WnvsS*ZcjKnSjsd2?u* z5nos0X;}~hp8EGP6F^3hoRpLa0sTf=^ZS5It4wS>Df6mVh5JD)$+Kt{YlQG2Zvc4pDJY8aVgX$yymc8EyUo9RGJaHQ^2^ zBz?ea)#6ba1IqRCPh6jL`y+Zah{O)WMFV`FqJoyk9#d2OgrdX#4*Z#fD-W+>bVcvs%}`c&@=?i? z^J!2gRTAo8Mad5^<=

    $|;!+a3Rz6YAVmn$cdWDi!*XvP383&IayPAXGTudR6d%K z(=`>mAX=_3*0d^_oJWeE;9Z;*7X0vsm*^69C*bV4vj8b&%HT|focvQ@fQ&7n0wj*| zFbIe-LIubgBUFug`M)s%Tr*9Q(kLI2=O1^J41W+z8Tlo(G}KfdkcL9i{}1*Rov1V?C)#atX@A$6 zdJaS3r^v2%s&;&+maTMfpdO)3Vi6#0kCIc>t?xEn-Dc+0d*8ac&mp%y_V#zXS#|7D zhaAy6WS)}_TXJngih)WH=sjr0JqxZSuxyzqZSlOF+pT2}RPhTJG1D*4o z>qHgOSR85IjmTk|uk^T57nHr#ciuV5cd&Xp&!-U**zFhS_cNu@mRgQ!yNmnua2n?g zA73lTRR-_g_%K0GRzSNauQb{>2C(2Rz1=nrFH!fZ;=O1@j?-JN4y*#sZGvZm#QgdT zijN5ztd-oWtPr10-m&NiT*IN6XdIW7)UIzzGRF;=HLt4>uj^%^^45%(9)hy3JOpK5 zR5>%eTgH4TW4@FzU&<&po@N!PswWydGPY^q^cgGAL~3Of3$5c3!1SiRc=GC15IrEj+T2;Z|IK9Z zl67RY*e6`F^0UX1Y^`O#q;?jkUhi_X+}>3L;sEca=XqDVcfsDm|()3RUl~ z3&o22$g1~#C8Ctui!{I#n5byXCKjC5P4QJeeL#TQpk|?M|lAN{8L5AOt|p^D(K`q6-`XSjB+fZpqRBST!g^{b#5ca z;Nl0|G@_pT(@{5G@Vd!@t`q=!dV0f1u6xv>mktHUatmuUlou;ySl57Gmcmku=V0l0 zU5n?wUS;`D%TwI5tMYY+{PbEj&|Rtpzul4ShHw1!5mm+SD*2fVc>6O-@YecH?l0@$ z9`O$Mh$@`$Co^q9&ng}?E&`{{oyT- za{EhsBmP*$>_#upr-VI^+F7 znvpCWt*(OVR?(^#9RJ*6Ks8vaWP?RdG-$9^i3Yn*ddO9c^^|ZCtfPlu9X$l==pk6E zM|ck;|BLHu4%y6ptSoOlHEftwb$k5{dss#I5&Ii|w`mKwT4B64?h3TFrm}KamkG-H zOHfu#L0K&YWt9|^^{1esy{-SOtzuYTtd0R^l?*tmWx!cA1J3Fha8}WPYbhB))wDD4 zGIOk|g0h+l3Pqi{%0Q6EVyn7zw3-XbDlVuFy*q|$m}>6S5v0Levtv#ZJlPoEApfp&=-$Lu?Em+6jf_3~Y zSVwQcT7QQxVB~)t<0LFOR_lPXItQH9IN+?l0cW)hIIC;GSxu{nTSZ+rR_E$TnNl8f zf2M0{^^j)$oUS&>ed%O9(E7Pr3hDU@zCg>#>eN$?te>Z8GC0~zR=;~{`H(#^fj2&> zC*UwfO0T+f@;$7z$)$6ivnMO$UDJ|Vj>7mDBWazYoDkC&;o=5+JN4cP$%}ylZpOzA?LVK^1Z6fQt_ie{*V{ zev7t^uv6mV*eO`YPQf~M3f8exu#TOAb?g+ZW2aypI|Xa)48J{IS53;tdh!M;{NG06 zn8*GZ1d*o~*>8y;HVKOGQHEVvV|Ozx1w}ZSH-aK+*dZuFh7p1yUX+5`cVoh|x7Gxl zH7DS(gEB4|#-M<+76qI&Dd4P40f#Y^0k`i~$q<&%TDuyowXDHn6J>+7;cBqfz6NV8 zY_QhG28(r+4c6K@T{%N~ zRUQ1Fd+*F-G9(a4AR&YhNg_`r;UV}WR{M#7I5U~#8z2t_t5!*b@DPy9M5T&v5NfGa zE>-`EeqvKarJvQ}qZ(VQ_$X>^Emo{ltzf@eD7NygefIk8bMD&f+)OZP|NZ|*$zFS% zwby&?z0c#G7&XtS23!l;7&kmg{*P(OeBCoAmr>6Kibgo>7 z&XtS27wtx_L+8qM=v=wTV+++}uS4g`b?6+qt>VMFf_z(B=S!bP zUD3Hwefj}yLx_MsthjI^Y+4?7r~mJY4{z~V7Je~UvNHdCT#3G|tt@kZKTwo>SnGw^ z*br!|fLxA3Hf-f>y7}jx!ljRVbogY|(7YWF-E`}B-+A9xPgMroVB;4^`U}6v+H2|hAyf^Z- zit{yP-nW}Nv2<=pEqK&hgYpkJbzbthTm9O8jc}X7)@u4 zYzDPvA)nUSI}T<<^Q@AY-#UXZq;(j#iVxzvr==~3vt$$*otr_HnLB@4B0qyHmGd-A zCsV3V26g^S4gIFJA%lSL#tAwp(*F;|_nj2)Rib~3u3axEvVQhUfzi zX%2c1`?ZRr_2`Y-IvMB@Wph|g8x00C>9|83$4k}N!A>Fh zBiH65v+D9jhWfHYy_yUA<6Pf$482T^b(eyCWLOO5WpX1nXqo+WZdG4@PTNo}z+Y4x z`)2wFs8W5Gh`V&~1KP?G0oc*;jr(S+fXueYhHalE!j8_D2$+3Eb<36r4j^qNO9WzR zo0f?3M~N{0j%pCx4t#&Yt?mNvqb>`}1TbL;TW4TO#@jl#3yzXqP8E1WS;FT;erj8J zP0Pu#YF(vQ<8lJ&2|7fV6S}7)~ndmXVFlzHRuOrVe#nloRc3p`QJ@RNtGe z;_vl75+-=ua;jg<26)I2_^y4 zhD8RLwq2a!;GX2*);PGQJGj#v+?ff7%jLBq%kt76oIQ8{0}np*Q7eyn%<7XK|74V; zl|2a{?XLx8i=wp~z1wp3g2J?d8vv#i+%Pb$;N}3+3T_@St>6{_(+X}8FsHlLQLAS%DzKQ-$l@t`%p&lc*U0aT zUyNU1zMzr$6^hwFUGpTUBg&c`xx zn^Mcx!xD7{A)*cJ?O&^Xx4uW?K5fNe-pzTB?#}!fNz4C{_OI0^PtQF)-e-}ESb$GE z1Jq`~(-UeP;08s-pVrY^d1e|5IC2(ua>BPG>AhRAl4F4Fu{t5WgA^+Y0zN*WHUmDp zXDq#MR)h&$TNl#O-ja!=HsEs=744(7y{i=~z6QLhhmhW3FRAgQvtE&rC%vC3R(Jx= zxv(yr-tvngRtN#FQB>qe@63x6A>bv7iiGq|yCe|;K3`Fh@R8O;(>QA7POTZaG!95L z$Y*>3DTScRM3)}bAcTOFLL{U|H3%Ufr4R|}k@`XiNZv<6dMWjbjR~w(!9+K&f{k7k zOmwLNl3GLqlF?B#J(5}o0ZD1e@Ao_Tz0t|<_fLEIJ<-kcd!v`%6J002-#_i;_e3|( z?~Pu5PjvJA-st7`L^sdxjb46Fbo2b)=;ilrzd_rS#xuZ^=^sp)J_dNS&i7$nnxez{ z5TZWTrAH-{q;$ydNJ@_sFG=Z;;gOUcNnVoDA;%*ry%*`cUy{;!M=j^ay7Wl&l9Ud4 z9=Xz6pc8#bN{3Y-lG39pN>Vy+dtNm^j&#w8DnRcY zby7OiOC+T?s!Ku1l@4VPN$LH0ZGD)cLm@;`dLPlnpyWztZf)Wp>(ZlaN>Vx>=^>>j zFV-rvxFn@R-9!cG-K1+rNlNEiwFPCYOOGlmN$J#=l(FpU)eLHB1|*c*S5mo+15#n4 z(=~3njeF&G&6HPeFR6xNnNdlc z!^jJ-0BePe7_ke08l`T9aOBUF(+Cq*q$k zx}`OlN{eNxRDjO6(s|4zAXQh=(P7~V@t^cc@LIP7C%qDsfH);M>6PHMQ(g&9W}CoL zSFZ#ov%OtO>XqPR+TBrgB`F<>E_#3-RacVIq39whJ*uuGr9;t0QhHQfNlJ&Ji=_0Z zx{{Pmy#y!o64b9D6~&w_ab;bst)wg9Qbl!&%cr|^)>U+X=Oolx%s)}rYvE>>L!Lpi z`1&XOs$<{R6|z>$4{mq%n-6Yxc9surZ;wUmYL)lkc4zr|aJ#cFd~iEEKuSP7{NQ%# zfc2(CI?K$1+nojF!R>cl5LJ3u+j2OagOV%90f|PZ*f!mzQ@MQHS&AOq?kqYFZg-ZK z2e&&}{NQ%Nct#52xRb&UZg-OP!R=03KDd2SPt-}v(&{SA5sFXrS*-lPJ^aYM`Y$6W z3etqRU*3RuXNwN$B45n|WR@@KI90znUBlXBlSzi!R1y@4^i9n&K|N|bM)!r<3MxO# z-emJis5o@xup~e8;a$ceWyfvZ507uVHRDdr?s4>8{o`{GGl9F{3AbBa_-8p45Q-<0TazWWt6%>g|8VU;V$(oU+fNQkFX|>RikxYYvvZ*I1 zn?d30A~XMUlI^yXY_*B%>M1APZfn`x5>u|8BD>fs$n6op+T3;Z6e-7UyBzGyT~|+$ zV=VI}C7my&HGeH2*D$3dZfntDL(nOvZ)?%1&4yP`IkVx_Q_gI7^^`LkUY+GgsijSc z5=m097?((A_7dru7A&wOC5gdOS|XjP>gp+*2=RwM7Q5$tn>GW*rPsE)c9I$>rUh#g zC(<%&F=5S;o!GkNLJoo}jFAaF5-yR0U;`V;>5+b7dr_ z#~hi+L2#-V$?1{Xi5vv^9m(mD%~5fBq;aIB$2^=^gWx)5B&Ww!P5HXYjnhLR7GSuZ z8R_XUjaKwvm@SiF5bS9qBYMoFi5vu%H!BHXD62FC1Y6-KfgS~y$U!g{M{;^h#)%vR zvvVY;M?EHT5X{_>oF4mzL_YKS+p5btSud4;dv@+tBFRP;@e-L z(uTK0+8~xl8>SLzgHa-_%S)tnY>Bk)E0O(N_bPQ(wHI2;a=$>AeOa0SXQds$Bw%d^ zaK{vivX2z;cTDB$v2%{_8TIy8lGms2*Ei@^>W7mUuE&17TG6|n)O z2H|yB#dlO|5?Wqf+B#}QQQV|=L2(iIx9F8%@)CT`+~Y29>9vdnWqCTEZi?)!vhqMV z>_`Ja!S3_vPG$Bf2w~^gE_W(nhuMOH9Tp498Y_wEu#0ZD93$2;Z46QIPa2?k8j$e2 zksV#QelB6xJUM^si6~Y6eM_k-C#^++TauI30={2S;VFLkV&5N|h3iP2oLLcI2M;wftsd zCOdFwrO13CMJ8bBRZ8W*-)OyCy>x5xR+eda=+e{UncbVTmB&;7->!?$X08dq zXQZ1y)88OXU@k38{yH(s^o`UfJu52m3T@?S4M5gg`5?PI=Q$t`Y7T@}zE2cDX^uX! zRU9;bdF!%@xjhIATJH-JIn|=%ALH5Vc1x?nL_+IW)M~v=L-sG)dPK!%^&nAl%x)Dw%!u4Q z@H>_4V@cpRAYx>Hc1?ETrIBjgqT@cC#*YEQM>cMNJuKW%Zm@_ zU#57mgH`0}w2EY>o~;7eX6k7*~WVf#LQga%=DUF{1gpX{r0ee`|p>@m{O8hIL?2S?# zdA~A;EB}t-09vQm#E3^YQUW7VFH@smnT#I;M3M06*t1r4QG(W)Lu4w{Q2m>>erdJ~ zo+RP9M{%&txlW6NT+4SP1|vSFcdct=fV6H=wVaVzg0(tF=~)@AqpDTCw?C}UbaI

    lw?#!M?nq6F_Z>h;{=F|?^h=|oYy<37i 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

    jNcJT~%lFem2vgG=ur3kM2e@PZhYGhH{ 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 F;_R8z+%Fqe`hOJs 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 U3YaV|*4l6TT0<-d2ovg;&A;@J4tmbo(_0!$>Cl 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 literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/_distutils_hack/__init__.py b/lib/python3.11/site-packages/_distutils_hack/__init__.py new file mode 100644 index 0000000..f987a53 --- /dev/null +++ b/lib/python3.11/site-packages/_distutils_hack/__init__.py @@ -0,0 +1,222 @@ +# don't import any costly modules +import sys +import os + + +is_pypy = '__pypy__' in sys.builtin_module_names + + +def warn_distutils_present(): + if 'distutils' not in sys.modules: + return + if is_pypy and sys.version_info < (3, 7): + # PyPy for 3.6 unconditionally imports distutils, so bypass the warning + # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 + return + import warnings + + warnings.warn( + "Distutils was imported before Setuptools, but importing Setuptools " + "also replaces the `distutils` module in `sys.modules`. This may lead " + "to undesirable behaviors or errors. To avoid these issues, avoid " + "using distutils directly, ensure that setuptools is installed in the " + "traditional way (e.g. not an editable install), and/or make sure " + "that setuptools is always imported before distutils." + ) + + +def clear_distutils(): + if 'distutils' not in sys.modules: + return + import warnings + + warnings.warn("Setuptools is replacing distutils.") + mods = [ + name + for name in sys.modules + if name == "distutils" or name.startswith("distutils.") + ] + for name in mods: + del sys.modules[name] + + +def enabled(): + """ + Allow selection of distutils by environment variable. + """ + which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') + return which == 'local' + + +def ensure_local_distutils(): + import importlib + + clear_distutils() + + # With the DistutilsMetaFinder in place, + # perform an import to cause distutils to be + # loaded from setuptools._distutils. Ref #2906. + with shim(): + importlib.import_module('distutils') + + # check that submodules load as expected + core = importlib.import_module('distutils.core') + assert '_distutils' in core.__file__, core.__file__ + assert 'setuptools._distutils.log' not in sys.modules + + +def do_override(): + """ + Ensure that the local copy of distutils is preferred over stdlib. + + See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 + for more motivation. + """ + if enabled(): + warn_distutils_present() + ensure_local_distutils() + + +class _TrivialRe: + def __init__(self, *patterns): + self._patterns = patterns + + def match(self, string): + return all(pat in string for pat in self._patterns) + + +class DistutilsMetaFinder: + def find_spec(self, fullname, path, target=None): + # optimization: only consider top level modules and those + # found in the CPython test suite. + if path is not None and not fullname.startswith('test.'): + return + + method_name = 'spec_for_{fullname}'.format(**locals()) + method = getattr(self, method_name, lambda: None) + return method() + + def spec_for_distutils(self): + if self.is_cpython(): + return + + import importlib + import importlib.abc + import importlib.util + + try: + mod = importlib.import_module('setuptools._distutils') + except Exception: + # There are a couple of cases where setuptools._distutils + # may not be present: + # - An older Setuptools without a local distutils is + # taking precedence. Ref #2957. + # - Path manipulation during sitecustomize removes + # setuptools from the path but only after the hook + # has been loaded. Ref #2980. + # In either case, fall back to stdlib behavior. + return + + class DistutilsLoader(importlib.abc.Loader): + def create_module(self, spec): + mod.__name__ = 'distutils' + return mod + + def exec_module(self, module): + pass + + return importlib.util.spec_from_loader( + 'distutils', DistutilsLoader(), origin=mod.__file__ + ) + + @staticmethod + def is_cpython(): + """ + Suppress supplying distutils for CPython (build and tests). + Ref #2965 and #3007. + """ + return os.path.isfile('pybuilddir.txt') + + def spec_for_pip(self): + """ + Ensure stdlib distutils when running under pip. + See pypa/pip#8761 for rationale. + """ + if self.pip_imported_during_build(): + return + clear_distutils() + self.spec_for_distutils = lambda: None + + @classmethod + def pip_imported_during_build(cls): + """ + Detect if pip is being imported in a build script. Ref #2355. + """ + import traceback + + return any( + cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) + ) + + @staticmethod + def frame_file_is_setup(frame): + """ + Return True if the indicated frame suggests a setup.py file. + """ + # some frames may not have __file__ (#2940) + return frame.f_globals.get('__file__', '').endswith('setup.py') + + def spec_for_sensitive_tests(self): + """ + Ensure stdlib distutils when running select tests under CPython. + + python/cpython#91169 + """ + clear_distutils() + self.spec_for_distutils = lambda: None + + sensitive_tests = ( + [ + 'test.test_distutils', + 'test.test_peg_generator', + 'test.test_importlib', + ] + if sys.version_info < (3, 10) + else [ + 'test.test_distutils', + ] + ) + + +for name in DistutilsMetaFinder.sensitive_tests: + setattr( + DistutilsMetaFinder, + f'spec_for_{name}', + DistutilsMetaFinder.spec_for_sensitive_tests, + ) + + +DISTUTILS_FINDER = DistutilsMetaFinder() + + +def add_shim(): + DISTUTILS_FINDER in sys.meta_path or insert_shim() + + +class shim: + def __enter__(self): + insert_shim() + + def __exit__(self, exc, value, tb): + remove_shim() + + +def insert_shim(): + sys.meta_path.insert(0, DISTUTILS_FINDER) + + +def remove_shim(): + try: + sys.meta_path.remove(DISTUTILS_FINDER) + except ValueError: + pass diff --git a/lib/python3.11/site-packages/_distutils_hack/override.py b/lib/python3.11/site-packages/_distutils_hack/override.py new file mode 100644 index 0000000..2cc433a --- /dev/null +++ b/lib/python3.11/site-packages/_distutils_hack/override.py @@ -0,0 +1 @@ +__import__('_distutils_hack').do_override() diff --git a/lib/python3.11/site-packages/apscheduler/__init__.py b/lib/python3.11/site-packages/apscheduler/__init__.py new file mode 100644 index 0000000..968169a --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/__init__.py @@ -0,0 +1,10 @@ +from pkg_resources import get_distribution, DistributionNotFound + +try: + release = get_distribution('APScheduler').version.split('-')[0] +except DistributionNotFound: + release = '3.5.0' + +version_info = tuple(int(x) if x.isdigit() else x for x in release.split('.')) +version = __version__ = '.'.join(str(x) for x in version_info[:3]) +del get_distribution, DistributionNotFound diff --git a/lib/python3.11/site-packages/apscheduler/events.py b/lib/python3.11/site-packages/apscheduler/events.py new file mode 100644 index 0000000..016da03 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/events.py @@ -0,0 +1,94 @@ +__all__ = ('EVENT_SCHEDULER_STARTED', 'EVENT_SCHEDULER_SHUTDOWN', 'EVENT_SCHEDULER_PAUSED', + 'EVENT_SCHEDULER_RESUMED', 'EVENT_EXECUTOR_ADDED', 'EVENT_EXECUTOR_REMOVED', + 'EVENT_JOBSTORE_ADDED', 'EVENT_JOBSTORE_REMOVED', 'EVENT_ALL_JOBS_REMOVED', + 'EVENT_JOB_ADDED', 'EVENT_JOB_REMOVED', 'EVENT_JOB_MODIFIED', 'EVENT_JOB_EXECUTED', + 'EVENT_JOB_ERROR', 'EVENT_JOB_MISSED', 'EVENT_JOB_SUBMITTED', 'EVENT_JOB_MAX_INSTANCES', + 'SchedulerEvent', 'JobEvent', 'JobExecutionEvent', 'JobSubmissionEvent') + + +EVENT_SCHEDULER_STARTED = EVENT_SCHEDULER_START = 2 ** 0 +EVENT_SCHEDULER_SHUTDOWN = 2 ** 1 +EVENT_SCHEDULER_PAUSED = 2 ** 2 +EVENT_SCHEDULER_RESUMED = 2 ** 3 +EVENT_EXECUTOR_ADDED = 2 ** 4 +EVENT_EXECUTOR_REMOVED = 2 ** 5 +EVENT_JOBSTORE_ADDED = 2 ** 6 +EVENT_JOBSTORE_REMOVED = 2 ** 7 +EVENT_ALL_JOBS_REMOVED = 2 ** 8 +EVENT_JOB_ADDED = 2 ** 9 +EVENT_JOB_REMOVED = 2 ** 10 +EVENT_JOB_MODIFIED = 2 ** 11 +EVENT_JOB_EXECUTED = 2 ** 12 +EVENT_JOB_ERROR = 2 ** 13 +EVENT_JOB_MISSED = 2 ** 14 +EVENT_JOB_SUBMITTED = 2 ** 15 +EVENT_JOB_MAX_INSTANCES = 2 ** 16 +EVENT_ALL = (EVENT_SCHEDULER_STARTED | EVENT_SCHEDULER_SHUTDOWN | EVENT_SCHEDULER_PAUSED | + EVENT_SCHEDULER_RESUMED | EVENT_EXECUTOR_ADDED | EVENT_EXECUTOR_REMOVED | + EVENT_JOBSTORE_ADDED | EVENT_JOBSTORE_REMOVED | EVENT_ALL_JOBS_REMOVED | + EVENT_JOB_ADDED | EVENT_JOB_REMOVED | EVENT_JOB_MODIFIED | EVENT_JOB_EXECUTED | + EVENT_JOB_ERROR | EVENT_JOB_MISSED | EVENT_JOB_SUBMITTED | EVENT_JOB_MAX_INSTANCES) + + +class SchedulerEvent(object): + """ + An event that concerns the scheduler itself. + + :ivar code: the type code of this event + :ivar alias: alias of the job store or executor that was added or removed (if applicable) + """ + + def __init__(self, code, alias=None): + super(SchedulerEvent, self).__init__() + self.code = code + self.alias = alias + + def __repr__(self): + return '<%s (code=%d)>' % (self.__class__.__name__, self.code) + + +class JobEvent(SchedulerEvent): + """ + An event that concerns a job. + + :ivar code: the type code of this event + :ivar job_id: identifier of the job in question + :ivar jobstore: alias of the job store containing the job in question + """ + + def __init__(self, code, job_id, jobstore): + super(JobEvent, self).__init__(code) + self.code = code + self.job_id = job_id + self.jobstore = jobstore + + +class JobSubmissionEvent(JobEvent): + """ + An event that concerns the submission of a job to its executor. + + :ivar scheduled_run_times: a list of datetimes when the job was intended to run + """ + + def __init__(self, code, job_id, jobstore, scheduled_run_times): + super(JobSubmissionEvent, self).__init__(code, job_id, jobstore) + self.scheduled_run_times = scheduled_run_times + + +class JobExecutionEvent(JobEvent): + """ + An event that concerns the running of a job within its executor. + + :ivar scheduled_run_time: the time when the job was scheduled to be run + :ivar retval: the return value of the successfully executed job + :ivar exception: the exception raised by the job + :ivar traceback: a formatted traceback for the exception + """ + + def __init__(self, code, job_id, jobstore, scheduled_run_time, retval=None, exception=None, + traceback=None): + super(JobExecutionEvent, self).__init__(code, job_id, jobstore) + self.scheduled_run_time = scheduled_run_time + self.retval = retval + self.exception = exception + self.traceback = traceback diff --git a/lib/python3.11/site-packages/apscheduler/executors/__init__.py b/lib/python3.11/site-packages/apscheduler/executors/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/apscheduler/executors/asyncio.py b/lib/python3.11/site-packages/apscheduler/executors/asyncio.py new file mode 100644 index 0000000..7d45d6c --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/executors/asyncio.py @@ -0,0 +1,52 @@ +from __future__ import absolute_import + +import sys + +from apscheduler.executors.base import BaseExecutor, run_job +from apscheduler.executors.base_py3 import run_coroutine_job +from apscheduler.util import iscoroutinefunction_partial + + +class AsyncIOExecutor(BaseExecutor): + """ + Runs jobs in the default executor of the event loop. + + If the job function is a native coroutine function, it is scheduled to be run directly in the + event loop as soon as possible. All other functions are run in the event loop's default + executor which is usually a thread pool. + + Plugin alias: ``asyncio`` + """ + + def start(self, scheduler, alias): + super(AsyncIOExecutor, self).start(scheduler, alias) + self._eventloop = scheduler._eventloop + self._pending_futures = set() + + def shutdown(self, wait=True): + # There is no way to honor wait=True without converting this method into a coroutine method + for f in self._pending_futures: + if not f.done(): + f.cancel() + + self._pending_futures.clear() + + def _do_submit_job(self, job, run_times): + def callback(f): + self._pending_futures.discard(f) + try: + events = f.result() + except BaseException: + self._run_job_error(job.id, *sys.exc_info()[1:]) + else: + self._run_job_success(job.id, events) + + if iscoroutinefunction_partial(job.func): + coro = run_coroutine_job(job, job._jobstore_alias, run_times, self._logger.name) + f = self._eventloop.create_task(coro) + else: + f = self._eventloop.run_in_executor(None, run_job, job, job._jobstore_alias, run_times, + self._logger.name) + + f.add_done_callback(callback) + self._pending_futures.add(f) diff --git a/lib/python3.11/site-packages/apscheduler/executors/base.py b/lib/python3.11/site-packages/apscheduler/executors/base.py new file mode 100644 index 0000000..4c09fc1 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/executors/base.py @@ -0,0 +1,146 @@ +from abc import ABCMeta, abstractmethod +from collections import defaultdict +from datetime import datetime, timedelta +from traceback import format_tb +import logging +import sys + +from pytz import utc +import six + +from apscheduler.events import ( + JobExecutionEvent, EVENT_JOB_MISSED, EVENT_JOB_ERROR, EVENT_JOB_EXECUTED) + + +class MaxInstancesReachedError(Exception): + def __init__(self, job): + super(MaxInstancesReachedError, self).__init__( + 'Job "%s" has already reached its maximum number of instances (%d)' % + (job.id, job.max_instances)) + + +class BaseExecutor(six.with_metaclass(ABCMeta, object)): + """Abstract base class that defines the interface that every executor must implement.""" + + _scheduler = None + _lock = None + _logger = logging.getLogger('apscheduler.executors') + + def __init__(self): + super(BaseExecutor, self).__init__() + self._instances = defaultdict(lambda: 0) + + def start(self, scheduler, alias): + """ + Called by the scheduler when the scheduler is being started or when the executor is being + added to an already running scheduler. + + :param apscheduler.schedulers.base.BaseScheduler scheduler: the scheduler that is starting + this executor + :param str|unicode alias: alias of this executor as it was assigned to the scheduler + + """ + self._scheduler = scheduler + self._lock = scheduler._create_lock() + self._logger = logging.getLogger('apscheduler.executors.%s' % alias) + + def shutdown(self, wait=True): + """ + Shuts down this executor. + + :param bool wait: ``True`` to wait until all submitted jobs + have been executed + """ + + def submit_job(self, job, run_times): + """ + Submits job for execution. + + :param Job job: job to execute + :param list[datetime] run_times: list of datetimes specifying + when the job should have been run + :raises MaxInstancesReachedError: if the maximum number of + allowed instances for this job has been reached + + """ + assert self._lock is not None, 'This executor has not been started yet' + with self._lock: + if self._instances[job.id] >= job.max_instances: + raise MaxInstancesReachedError(job) + + self._do_submit_job(job, run_times) + self._instances[job.id] += 1 + + @abstractmethod + def _do_submit_job(self, job, run_times): + """Performs the actual task of scheduling `run_job` to be called.""" + + def _run_job_success(self, job_id, events): + """ + Called by the executor with the list of generated events when :func:`run_job` has been + successfully called. + + """ + with self._lock: + self._instances[job_id] -= 1 + if self._instances[job_id] == 0: + del self._instances[job_id] + + for event in events: + self._scheduler._dispatch_event(event) + + def _run_job_error(self, job_id, exc, traceback=None): + """Called by the executor with the exception if there is an error calling `run_job`.""" + with self._lock: + self._instances[job_id] -= 1 + if self._instances[job_id] == 0: + del self._instances[job_id] + + exc_info = (exc.__class__, exc, traceback) + self._logger.error('Error running job %s', job_id, exc_info=exc_info) + + +def run_job(job, jobstore_alias, run_times, logger_name): + """ + Called by executors to run the job. Returns a list of scheduler events to be dispatched by the + scheduler. + + """ + events = [] + logger = logging.getLogger(logger_name) + for run_time in run_times: + # See if the job missed its run time window, and handle + # possible misfires accordingly + if job.misfire_grace_time is not None: + difference = datetime.now(utc) - run_time + grace_time = timedelta(seconds=job.misfire_grace_time) + if difference > grace_time: + events.append(JobExecutionEvent(EVENT_JOB_MISSED, job.id, jobstore_alias, + run_time)) + logger.warning('Run time of job "%s" was missed by %s', job, difference) + continue + + logger.info('Running job "%s" (scheduled at %s)', job, run_time) + try: + retval = job.func(*job.args, **job.kwargs) + except BaseException: + exc, tb = sys.exc_info()[1:] + formatted_tb = ''.join(format_tb(tb)) + events.append(JobExecutionEvent(EVENT_JOB_ERROR, job.id, jobstore_alias, run_time, + exception=exc, traceback=formatted_tb)) + logger.exception('Job "%s" raised an exception', job) + + # This is to prevent cyclic references that would lead to memory leaks + if six.PY2: + sys.exc_clear() + del tb + else: + import traceback + traceback.clear_frames(tb) + del tb + else: + events.append(JobExecutionEvent(EVENT_JOB_EXECUTED, job.id, jobstore_alias, run_time, + retval=retval)) + logger.info('Job "%s" executed successfully', job) + + return events diff --git a/lib/python3.11/site-packages/apscheduler/executors/base_py3.py b/lib/python3.11/site-packages/apscheduler/executors/base_py3.py new file mode 100644 index 0000000..7111d2a --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/executors/base_py3.py @@ -0,0 +1,43 @@ +import logging +import sys +import traceback +from datetime import datetime, timedelta +from traceback import format_tb + +from pytz import utc + +from apscheduler.events import ( + JobExecutionEvent, EVENT_JOB_MISSED, EVENT_JOB_ERROR, EVENT_JOB_EXECUTED) + + +async def run_coroutine_job(job, jobstore_alias, run_times, logger_name): + """Coroutine version of run_job().""" + events = [] + logger = logging.getLogger(logger_name) + for run_time in run_times: + # See if the job missed its run time window, and handle possible misfires accordingly + if job.misfire_grace_time is not None: + difference = datetime.now(utc) - run_time + grace_time = timedelta(seconds=job.misfire_grace_time) + if difference > grace_time: + events.append(JobExecutionEvent(EVENT_JOB_MISSED, job.id, jobstore_alias, + run_time)) + logger.warning('Run time of job "%s" was missed by %s', job, difference) + continue + + logger.info('Running job "%s" (scheduled at %s)', job, run_time) + try: + retval = await job.func(*job.args, **job.kwargs) + except BaseException: + exc, tb = sys.exc_info()[1:] + formatted_tb = ''.join(format_tb(tb)) + events.append(JobExecutionEvent(EVENT_JOB_ERROR, job.id, jobstore_alias, run_time, + exception=exc, traceback=formatted_tb)) + logger.exception('Job "%s" raised an exception', job) + traceback.clear_frames(tb) + else: + events.append(JobExecutionEvent(EVENT_JOB_EXECUTED, job.id, jobstore_alias, run_time, + retval=retval)) + logger.info('Job "%s" executed successfully', job) + + return events diff --git a/lib/python3.11/site-packages/apscheduler/executors/debug.py b/lib/python3.11/site-packages/apscheduler/executors/debug.py new file mode 100644 index 0000000..ac739ae --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/executors/debug.py @@ -0,0 +1,20 @@ +import sys + +from apscheduler.executors.base import BaseExecutor, run_job + + +class DebugExecutor(BaseExecutor): + """ + A special executor that executes the target callable directly instead of deferring it to a + thread or process. + + Plugin alias: ``debug`` + """ + + def _do_submit_job(self, job, run_times): + try: + events = run_job(job, job._jobstore_alias, run_times, self._logger.name) + except BaseException: + self._run_job_error(job.id, *sys.exc_info()[1:]) + else: + self._run_job_success(job.id, events) diff --git a/lib/python3.11/site-packages/apscheduler/executors/gevent.py b/lib/python3.11/site-packages/apscheduler/executors/gevent.py new file mode 100644 index 0000000..1235bb6 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/executors/gevent.py @@ -0,0 +1,30 @@ +from __future__ import absolute_import +import sys + +from apscheduler.executors.base import BaseExecutor, run_job + + +try: + import gevent +except ImportError: # pragma: nocover + raise ImportError('GeventExecutor requires gevent installed') + + +class GeventExecutor(BaseExecutor): + """ + Runs jobs as greenlets. + + Plugin alias: ``gevent`` + """ + + def _do_submit_job(self, job, run_times): + def callback(greenlet): + try: + events = greenlet.get() + except BaseException: + self._run_job_error(job.id, *sys.exc_info()[1:]) + else: + self._run_job_success(job.id, events) + + gevent.spawn(run_job, job, job._jobstore_alias, run_times, self._logger.name).\ + link(callback) diff --git a/lib/python3.11/site-packages/apscheduler/executors/pool.py b/lib/python3.11/site-packages/apscheduler/executors/pool.py new file mode 100644 index 0000000..c85896e --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/executors/pool.py @@ -0,0 +1,71 @@ +from abc import abstractmethod +import concurrent.futures + +from apscheduler.executors.base import BaseExecutor, run_job + +try: + from concurrent.futures.process import BrokenProcessPool +except ImportError: + BrokenProcessPool = None + + +class BasePoolExecutor(BaseExecutor): + @abstractmethod + def __init__(self, pool): + super(BasePoolExecutor, self).__init__() + self._pool = pool + + def _do_submit_job(self, job, run_times): + def callback(f): + exc, tb = (f.exception_info() if hasattr(f, 'exception_info') else + (f.exception(), getattr(f.exception(), '__traceback__', None))) + if exc: + self._run_job_error(job.id, exc, tb) + else: + self._run_job_success(job.id, f.result()) + + try: + f = self._pool.submit(run_job, job, job._jobstore_alias, run_times, self._logger.name) + except BrokenProcessPool: + self._logger.warning('Process pool is broken; replacing pool with a fresh instance') + self._pool = self._pool.__class__(self._pool._max_workers) + f = self._pool.submit(run_job, job, job._jobstore_alias, run_times, self._logger.name) + + f.add_done_callback(callback) + + def shutdown(self, wait=True): + self._pool.shutdown(wait) + + +class ThreadPoolExecutor(BasePoolExecutor): + """ + An executor that runs jobs in a concurrent.futures thread pool. + + Plugin alias: ``threadpool`` + + :param max_workers: the maximum number of spawned threads. + :param pool_kwargs: dict of keyword arguments to pass to the underlying + ThreadPoolExecutor constructor + """ + + def __init__(self, max_workers=10, pool_kwargs=None): + pool_kwargs = pool_kwargs or {} + pool = concurrent.futures.ThreadPoolExecutor(int(max_workers), **pool_kwargs) + super(ThreadPoolExecutor, self).__init__(pool) + + +class ProcessPoolExecutor(BasePoolExecutor): + """ + An executor that runs jobs in a concurrent.futures process pool. + + Plugin alias: ``processpool`` + + :param max_workers: the maximum number of spawned processes. + :param pool_kwargs: dict of keyword arguments to pass to the underlying + ProcessPoolExecutor constructor + """ + + def __init__(self, max_workers=10, pool_kwargs=None): + pool_kwargs = pool_kwargs or {} + pool = concurrent.futures.ProcessPoolExecutor(int(max_workers), **pool_kwargs) + super(ProcessPoolExecutor, self).__init__(pool) diff --git a/lib/python3.11/site-packages/apscheduler/executors/tornado.py b/lib/python3.11/site-packages/apscheduler/executors/tornado.py new file mode 100644 index 0000000..3b97eec --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/executors/tornado.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import + +import sys +from concurrent.futures import ThreadPoolExecutor + +from tornado.gen import convert_yielded + +from apscheduler.executors.base import BaseExecutor, run_job + +try: + from apscheduler.executors.base_py3 import run_coroutine_job + from apscheduler.util import iscoroutinefunction_partial +except ImportError: + def iscoroutinefunction_partial(func): + return False + + +class TornadoExecutor(BaseExecutor): + """ + Runs jobs either in a thread pool or directly on the I/O loop. + + If the job function is a native coroutine function, it is scheduled to be run directly in the + I/O loop as soon as possible. All other functions are run in a thread pool. + + Plugin alias: ``tornado`` + + :param int max_workers: maximum number of worker threads in the thread pool + """ + + def __init__(self, max_workers=10): + super(TornadoExecutor, self).__init__() + self.executor = ThreadPoolExecutor(max_workers) + + def start(self, scheduler, alias): + super(TornadoExecutor, self).start(scheduler, alias) + self._ioloop = scheduler._ioloop + + def _do_submit_job(self, job, run_times): + def callback(f): + try: + events = f.result() + except BaseException: + self._run_job_error(job.id, *sys.exc_info()[1:]) + else: + self._run_job_success(job.id, events) + + if iscoroutinefunction_partial(job.func): + f = run_coroutine_job(job, job._jobstore_alias, run_times, self._logger.name) + else: + f = self.executor.submit(run_job, job, job._jobstore_alias, run_times, + self._logger.name) + + f = convert_yielded(f) + f.add_done_callback(callback) diff --git a/lib/python3.11/site-packages/apscheduler/executors/twisted.py b/lib/python3.11/site-packages/apscheduler/executors/twisted.py new file mode 100644 index 0000000..c7bcf64 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/executors/twisted.py @@ -0,0 +1,25 @@ +from __future__ import absolute_import + +from apscheduler.executors.base import BaseExecutor, run_job + + +class TwistedExecutor(BaseExecutor): + """ + Runs jobs in the reactor's thread pool. + + Plugin alias: ``twisted`` + """ + + def start(self, scheduler, alias): + super(TwistedExecutor, self).start(scheduler, alias) + self._reactor = scheduler._reactor + + def _do_submit_job(self, job, run_times): + def callback(success, result): + if success: + self._run_job_success(job.id, result) + else: + self._run_job_error(job.id, result.value, result.tb) + + self._reactor.getThreadPool().callInThreadWithCallback( + callback, run_job, job, job._jobstore_alias, run_times, self._logger.name) diff --git a/lib/python3.11/site-packages/apscheduler/job.py b/lib/python3.11/site-packages/apscheduler/job.py new file mode 100644 index 0000000..445d9a8 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/job.py @@ -0,0 +1,302 @@ +from inspect import ismethod, isclass +from uuid import uuid4 + +import six + +from apscheduler.triggers.base import BaseTrigger +from apscheduler.util import ( + ref_to_obj, obj_to_ref, datetime_repr, repr_escape, get_callable_name, check_callable_args, + convert_to_datetime) + +try: + from collections.abc import Iterable, Mapping +except ImportError: + from collections import Iterable, Mapping + + +class Job(object): + """ + Contains the options given when scheduling callables and its current schedule and other state. + This class should never be instantiated by the user. + + :var str id: the unique identifier of this job + :var str name: the description of this job + :var func: the callable to execute + :var tuple|list args: positional arguments to the callable + :var dict kwargs: keyword arguments to the callable + :var bool coalesce: whether to only run the job once when several run times are due + :var trigger: the trigger object that controls the schedule of this job + :var str executor: the name of the executor that will run this job + :var int misfire_grace_time: the time (in seconds) how much this job's execution is allowed to + be late (``None`` means "allow the job to run no matter how late it is") + :var int max_instances: the maximum number of concurrently executing instances allowed for this + job + :var datetime.datetime next_run_time: the next scheduled run time of this job + + .. note:: + The ``misfire_grace_time`` has some non-obvious effects on job execution. See the + :ref:`missed-job-executions` section in the documentation for an in-depth explanation. + """ + + __slots__ = ('_scheduler', '_jobstore_alias', 'id', 'trigger', 'executor', 'func', 'func_ref', + 'args', 'kwargs', 'name', 'misfire_grace_time', 'coalesce', 'max_instances', + 'next_run_time', '__weakref__') + + def __init__(self, scheduler, id=None, **kwargs): + super(Job, self).__init__() + self._scheduler = scheduler + self._jobstore_alias = None + self._modify(id=id or uuid4().hex, **kwargs) + + def modify(self, **changes): + """ + Makes the given changes to this job and saves it in the associated job store. + + Accepted keyword arguments are the same as the variables on this class. + + .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.modify_job` + + :return Job: this job instance + + """ + self._scheduler.modify_job(self.id, self._jobstore_alias, **changes) + return self + + def reschedule(self, trigger, **trigger_args): + """ + Shortcut for switching the trigger on this job. + + .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.reschedule_job` + + :return Job: this job instance + + """ + self._scheduler.reschedule_job(self.id, self._jobstore_alias, trigger, **trigger_args) + return self + + def pause(self): + """ + Temporarily suspend the execution of this job. + + .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.pause_job` + + :return Job: this job instance + + """ + self._scheduler.pause_job(self.id, self._jobstore_alias) + return self + + def resume(self): + """ + Resume the schedule of this job if previously paused. + + .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.resume_job` + + :return Job: this job instance + + """ + self._scheduler.resume_job(self.id, self._jobstore_alias) + return self + + def remove(self): + """ + Unschedules this job and removes it from its associated job store. + + .. seealso:: :meth:`~apscheduler.schedulers.base.BaseScheduler.remove_job` + + """ + self._scheduler.remove_job(self.id, self._jobstore_alias) + + @property + def pending(self): + """ + Returns ``True`` if the referenced job is still waiting to be added to its designated job + store. + + """ + return self._jobstore_alias is None + + # + # Private API + # + + def _get_run_times(self, now): + """ + Computes the scheduled run times between ``next_run_time`` and ``now`` (inclusive). + + :type now: datetime.datetime + :rtype: list[datetime.datetime] + + """ + run_times = [] + next_run_time = self.next_run_time + while next_run_time and next_run_time <= now: + run_times.append(next_run_time) + next_run_time = self.trigger.get_next_fire_time(next_run_time, now) + + return run_times + + def _modify(self, **changes): + """ + Validates the changes to the Job and makes the modifications if and only if all of them + validate. + + """ + approved = {} + + if 'id' in changes: + value = changes.pop('id') + if not isinstance(value, six.string_types): + raise TypeError("id must be a nonempty string") + if hasattr(self, 'id'): + raise ValueError('The job ID may not be changed') + approved['id'] = value + + if 'func' in changes or 'args' in changes or 'kwargs' in changes: + func = changes.pop('func') if 'func' in changes else self.func + args = changes.pop('args') if 'args' in changes else self.args + kwargs = changes.pop('kwargs') if 'kwargs' in changes else self.kwargs + + if isinstance(func, six.string_types): + func_ref = func + func = ref_to_obj(func) + elif callable(func): + try: + func_ref = obj_to_ref(func) + except ValueError: + # If this happens, this Job won't be serializable + func_ref = None + else: + raise TypeError('func must be a callable or a textual reference to one') + + if not hasattr(self, 'name') and changes.get('name', None) is None: + changes['name'] = get_callable_name(func) + + if isinstance(args, six.string_types) or not isinstance(args, Iterable): + raise TypeError('args must be a non-string iterable') + if isinstance(kwargs, six.string_types) or not isinstance(kwargs, Mapping): + raise TypeError('kwargs must be a dict-like object') + + check_callable_args(func, args, kwargs) + + approved['func'] = func + approved['func_ref'] = func_ref + approved['args'] = args + approved['kwargs'] = kwargs + + if 'name' in changes: + value = changes.pop('name') + if not value or not isinstance(value, six.string_types): + raise TypeError("name must be a nonempty string") + approved['name'] = value + + if 'misfire_grace_time' in changes: + value = changes.pop('misfire_grace_time') + if value is not None and (not isinstance(value, six.integer_types) or value <= 0): + raise TypeError('misfire_grace_time must be either None or a positive integer') + approved['misfire_grace_time'] = value + + if 'coalesce' in changes: + value = bool(changes.pop('coalesce')) + approved['coalesce'] = value + + if 'max_instances' in changes: + value = changes.pop('max_instances') + if not isinstance(value, six.integer_types) or value <= 0: + raise TypeError('max_instances must be a positive integer') + approved['max_instances'] = value + + if 'trigger' in changes: + trigger = changes.pop('trigger') + if not isinstance(trigger, BaseTrigger): + raise TypeError('Expected a trigger instance, got %s instead' % + trigger.__class__.__name__) + + approved['trigger'] = trigger + + if 'executor' in changes: + value = changes.pop('executor') + if not isinstance(value, six.string_types): + raise TypeError('executor must be a string') + approved['executor'] = value + + if 'next_run_time' in changes: + value = changes.pop('next_run_time') + approved['next_run_time'] = convert_to_datetime(value, self._scheduler.timezone, + 'next_run_time') + + if changes: + raise AttributeError('The following are not modifiable attributes of Job: %s' % + ', '.join(changes)) + + for key, value in six.iteritems(approved): + setattr(self, key, value) + + def __getstate__(self): + # Don't allow this Job to be serialized if the function reference could not be determined + if not self.func_ref: + raise ValueError( + 'This Job cannot be serialized since the reference to its callable (%r) could not ' + 'be determined. Consider giving a textual reference (module:function name) ' + 'instead.' % (self.func,)) + + # Instance methods cannot survive serialization as-is, so store the "self" argument + # explicitly + func = self.func + if ismethod(func) and not isclass(func.__self__) and obj_to_ref(func) == self.func_ref: + args = (func.__self__,) + tuple(self.args) + else: + args = self.args + + return { + 'version': 1, + 'id': self.id, + 'func': self.func_ref, + 'trigger': self.trigger, + 'executor': self.executor, + 'args': args, + 'kwargs': self.kwargs, + 'name': self.name, + 'misfire_grace_time': self.misfire_grace_time, + 'coalesce': self.coalesce, + 'max_instances': self.max_instances, + 'next_run_time': self.next_run_time + } + + def __setstate__(self, state): + if state.get('version', 1) > 1: + raise ValueError('Job has version %s, but only version 1 can be handled' % + state['version']) + + self.id = state['id'] + self.func_ref = state['func'] + self.func = ref_to_obj(self.func_ref) + self.trigger = state['trigger'] + self.executor = state['executor'] + self.args = state['args'] + self.kwargs = state['kwargs'] + self.name = state['name'] + self.misfire_grace_time = state['misfire_grace_time'] + self.coalesce = state['coalesce'] + self.max_instances = state['max_instances'] + self.next_run_time = state['next_run_time'] + + def __eq__(self, other): + if isinstance(other, Job): + return self.id == other.id + return NotImplemented + + def __repr__(self): + return '' % (repr_escape(self.id), repr_escape(self.name)) + + def __str__(self): + return repr_escape(self.__unicode__()) + + def __unicode__(self): + if hasattr(self, 'next_run_time'): + status = ('next run at: ' + datetime_repr(self.next_run_time) if + self.next_run_time else 'paused') + else: + status = 'pending' + + return u'%s (trigger: %s, %s)' % (self.name, self.trigger, status) diff --git a/lib/python3.11/site-packages/apscheduler/jobstores/__init__.py b/lib/python3.11/site-packages/apscheduler/jobstores/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/apscheduler/jobstores/base.py b/lib/python3.11/site-packages/apscheduler/jobstores/base.py new file mode 100644 index 0000000..9cff66c --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/jobstores/base.py @@ -0,0 +1,143 @@ +from abc import ABCMeta, abstractmethod +import logging + +import six + + +class JobLookupError(KeyError): + """Raised when the job store cannot find a job for update or removal.""" + + def __init__(self, job_id): + super(JobLookupError, self).__init__(u'No job by the id of %s was found' % job_id) + + +class ConflictingIdError(KeyError): + """Raised when the uniqueness of job IDs is being violated.""" + + def __init__(self, job_id): + super(ConflictingIdError, self).__init__( + u'Job identifier (%s) conflicts with an existing job' % job_id) + + +class TransientJobError(ValueError): + """ + Raised when an attempt to add transient (with no func_ref) job to a persistent job store is + detected. + """ + + def __init__(self, job_id): + super(TransientJobError, self).__init__( + u'Job (%s) cannot be added to this job store because a reference to the callable ' + u'could not be determined.' % job_id) + + +class BaseJobStore(six.with_metaclass(ABCMeta)): + """Abstract base class that defines the interface that every job store must implement.""" + + _scheduler = None + _alias = None + _logger = logging.getLogger('apscheduler.jobstores') + + def start(self, scheduler, alias): + """ + Called by the scheduler when the scheduler is being started or when the job store is being + added to an already running scheduler. + + :param apscheduler.schedulers.base.BaseScheduler scheduler: the scheduler that is starting + this job store + :param str|unicode alias: alias of this job store as it was assigned to the scheduler + """ + + self._scheduler = scheduler + self._alias = alias + self._logger = logging.getLogger('apscheduler.jobstores.%s' % alias) + + def shutdown(self): + """Frees any resources still bound to this job store.""" + + def _fix_paused_jobs_sorting(self, jobs): + for i, job in enumerate(jobs): + if job.next_run_time is not None: + if i > 0: + paused_jobs = jobs[:i] + del jobs[:i] + jobs.extend(paused_jobs) + break + + @abstractmethod + def lookup_job(self, job_id): + """ + Returns a specific job, or ``None`` if it isn't found.. + + The job store is responsible for setting the ``scheduler`` and ``jobstore`` attributes of + the returned job to point to the scheduler and itself, respectively. + + :param str|unicode job_id: identifier of the job + :rtype: Job + """ + + @abstractmethod + def get_due_jobs(self, now): + """ + Returns the list of jobs that have ``next_run_time`` earlier or equal to ``now``. + The returned jobs must be sorted by next run time (ascending). + + :param datetime.datetime now: the current (timezone aware) datetime + :rtype: list[Job] + """ + + @abstractmethod + def get_next_run_time(self): + """ + Returns the earliest run time of all the jobs stored in this job store, or ``None`` if + there are no active jobs. + + :rtype: datetime.datetime + """ + + @abstractmethod + def get_all_jobs(self): + """ + Returns a list of all jobs in this job store. + The returned jobs should be sorted by next run time (ascending). + Paused jobs (next_run_time == None) should be sorted last. + + The job store is responsible for setting the ``scheduler`` and ``jobstore`` attributes of + the returned jobs to point to the scheduler and itself, respectively. + + :rtype: list[Job] + """ + + @abstractmethod + def add_job(self, job): + """ + Adds the given job to this store. + + :param Job job: the job to add + :raises ConflictingIdError: if there is another job in this store with the same ID + """ + + @abstractmethod + def update_job(self, job): + """ + Replaces the job in the store with the given newer version. + + :param Job job: the job to update + :raises JobLookupError: if the job does not exist + """ + + @abstractmethod + def remove_job(self, job_id): + """ + Removes the given job from this store. + + :param str|unicode job_id: identifier of the job + :raises JobLookupError: if the job does not exist + """ + + @abstractmethod + def remove_all_jobs(self): + """Removes all jobs from this store.""" + + def __repr__(self): + return '<%s>' % self.__class__.__name__ diff --git a/lib/python3.11/site-packages/apscheduler/jobstores/memory.py b/lib/python3.11/site-packages/apscheduler/jobstores/memory.py new file mode 100644 index 0000000..abfe7c6 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/jobstores/memory.py @@ -0,0 +1,108 @@ +from __future__ import absolute_import + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import datetime_to_utc_timestamp + + +class MemoryJobStore(BaseJobStore): + """ + Stores jobs in an array in RAM. Provides no persistence support. + + Plugin alias: ``memory`` + """ + + def __init__(self): + super(MemoryJobStore, self).__init__() + # list of (job, timestamp), sorted by next_run_time and job id (ascending) + self._jobs = [] + self._jobs_index = {} # id -> (job, timestamp) lookup table + + def lookup_job(self, job_id): + return self._jobs_index.get(job_id, (None, None))[0] + + def get_due_jobs(self, now): + now_timestamp = datetime_to_utc_timestamp(now) + pending = [] + for job, timestamp in self._jobs: + if timestamp is None or timestamp > now_timestamp: + break + pending.append(job) + + return pending + + def get_next_run_time(self): + return self._jobs[0][0].next_run_time if self._jobs else None + + def get_all_jobs(self): + return [j[0] for j in self._jobs] + + def add_job(self, job): + if job.id in self._jobs_index: + raise ConflictingIdError(job.id) + + timestamp = datetime_to_utc_timestamp(job.next_run_time) + index = self._get_job_index(timestamp, job.id) + self._jobs.insert(index, (job, timestamp)) + self._jobs_index[job.id] = (job, timestamp) + + def update_job(self, job): + old_job, old_timestamp = self._jobs_index.get(job.id, (None, None)) + if old_job is None: + raise JobLookupError(job.id) + + # If the next run time has not changed, simply replace the job in its present index. + # Otherwise, reinsert the job to the list to preserve the ordering. + old_index = self._get_job_index(old_timestamp, old_job.id) + new_timestamp = datetime_to_utc_timestamp(job.next_run_time) + if old_timestamp == new_timestamp: + self._jobs[old_index] = (job, new_timestamp) + else: + del self._jobs[old_index] + new_index = self._get_job_index(new_timestamp, job.id) + self._jobs.insert(new_index, (job, new_timestamp)) + + self._jobs_index[old_job.id] = (job, new_timestamp) + + def remove_job(self, job_id): + job, timestamp = self._jobs_index.get(job_id, (None, None)) + if job is None: + raise JobLookupError(job_id) + + index = self._get_job_index(timestamp, job_id) + del self._jobs[index] + del self._jobs_index[job.id] + + def remove_all_jobs(self): + self._jobs = [] + self._jobs_index = {} + + def shutdown(self): + self.remove_all_jobs() + + def _get_job_index(self, timestamp, job_id): + """ + Returns the index of the given job, or if it's not found, the index where the job should be + inserted based on the given timestamp. + + :type timestamp: int + :type job_id: str + + """ + lo, hi = 0, len(self._jobs) + timestamp = float('inf') if timestamp is None else timestamp + while lo < hi: + mid = (lo + hi) // 2 + mid_job, mid_timestamp = self._jobs[mid] + mid_timestamp = float('inf') if mid_timestamp is None else mid_timestamp + if mid_timestamp > timestamp: + hi = mid + elif mid_timestamp < timestamp: + lo = mid + 1 + elif mid_job.id > job_id: + hi = mid + elif mid_job.id < job_id: + lo = mid + 1 + else: + return mid + + return lo diff --git a/lib/python3.11/site-packages/apscheduler/jobstores/mongodb.py b/lib/python3.11/site-packages/apscheduler/jobstores/mongodb.py new file mode 100644 index 0000000..5a00f94 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/jobstores/mongodb.py @@ -0,0 +1,141 @@ +from __future__ import absolute_import +import warnings + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime +from apscheduler.job import Job + +try: + import cPickle as pickle +except ImportError: # pragma: nocover + import pickle + +try: + from bson.binary import Binary + from pymongo.errors import DuplicateKeyError + from pymongo import MongoClient, ASCENDING +except ImportError: # pragma: nocover + raise ImportError('MongoDBJobStore requires PyMongo installed') + + +class MongoDBJobStore(BaseJobStore): + """ + Stores jobs in a MongoDB database. Any leftover keyword arguments are directly passed to + pymongo's `MongoClient + `_. + + Plugin alias: ``mongodb`` + + :param str database: database to store jobs in + :param str collection: collection to store jobs in + :param client: a :class:`~pymongo.mongo_client.MongoClient` instance to use instead of + providing connection arguments + :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the + highest available + """ + + def __init__(self, database='apscheduler', collection='jobs', client=None, + pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): + super(MongoDBJobStore, self).__init__() + self.pickle_protocol = pickle_protocol + + if not database: + raise ValueError('The "database" parameter must not be empty') + if not collection: + raise ValueError('The "collection" parameter must not be empty') + + if client: + self.client = maybe_ref(client) + else: + connect_args.setdefault('w', 1) + self.client = MongoClient(**connect_args) + + self.collection = self.client[database][collection] + + def start(self, scheduler, alias): + super(MongoDBJobStore, self).start(scheduler, alias) + self.collection.create_index('next_run_time', sparse=True) + + @property + def connection(self): + warnings.warn('The "connection" member is deprecated -- use "client" instead', + DeprecationWarning) + return self.client + + def lookup_job(self, job_id): + document = self.collection.find_one(job_id, ['job_state']) + return self._reconstitute_job(document['job_state']) if document else None + + def get_due_jobs(self, now): + timestamp = datetime_to_utc_timestamp(now) + return self._get_jobs({'next_run_time': {'$lte': timestamp}}) + + def get_next_run_time(self): + document = self.collection.find_one({'next_run_time': {'$ne': None}}, + projection=['next_run_time'], + sort=[('next_run_time', ASCENDING)]) + return utc_timestamp_to_datetime(document['next_run_time']) if document else None + + def get_all_jobs(self): + jobs = self._get_jobs({}) + self._fix_paused_jobs_sorting(jobs) + return jobs + + def add_job(self, job): + try: + self.collection.insert_one({ + '_id': job.id, + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': Binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) + }) + except DuplicateKeyError: + raise ConflictingIdError(job.id) + + def update_job(self, job): + changes = { + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': Binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) + } + result = self.collection.update_one({'_id': job.id}, {'$set': changes}) + if result and result.matched_count == 0: + raise JobLookupError(job.id) + + def remove_job(self, job_id): + result = self.collection.delete_one({'_id': job_id}) + if result and result.deleted_count == 0: + raise JobLookupError(job_id) + + def remove_all_jobs(self): + self.collection.delete_many({}) + + def shutdown(self): + self.client.close() + + def _reconstitute_job(self, job_state): + job_state = pickle.loads(job_state) + job = Job.__new__(Job) + job.__setstate__(job_state) + job._scheduler = self._scheduler + job._jobstore_alias = self._alias + return job + + def _get_jobs(self, conditions): + jobs = [] + failed_job_ids = [] + for document in self.collection.find(conditions, ['_id', 'job_state'], + sort=[('next_run_time', ASCENDING)]): + try: + jobs.append(self._reconstitute_job(document['job_state'])) + except BaseException: + self._logger.exception('Unable to restore job "%s" -- removing it', + document['_id']) + failed_job_ids.append(document['_id']) + + # Remove all the jobs we failed to restore + if failed_job_ids: + self.collection.delete_many({'_id': {'$in': failed_job_ids}}) + + return jobs + + def __repr__(self): + return '<%s (client=%s)>' % (self.__class__.__name__, self.client) diff --git a/lib/python3.11/site-packages/apscheduler/jobstores/redis.py b/lib/python3.11/site-packages/apscheduler/jobstores/redis.py new file mode 100644 index 0000000..5bb69d6 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/jobstores/redis.py @@ -0,0 +1,150 @@ +from __future__ import absolute_import +from datetime import datetime + +from pytz import utc +import six + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import datetime_to_utc_timestamp, utc_timestamp_to_datetime +from apscheduler.job import Job + +try: + import cPickle as pickle +except ImportError: # pragma: nocover + import pickle + +try: + from redis import Redis +except ImportError: # pragma: nocover + raise ImportError('RedisJobStore requires redis installed') + + +class RedisJobStore(BaseJobStore): + """ + Stores jobs in a Redis database. Any leftover keyword arguments are directly passed to redis's + :class:`~redis.StrictRedis`. + + Plugin alias: ``redis`` + + :param int db: the database number to store jobs in + :param str jobs_key: key to store jobs in + :param str run_times_key: key to store the jobs' run times in + :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the + highest available + """ + + def __init__(self, db=0, jobs_key='apscheduler.jobs', run_times_key='apscheduler.run_times', + pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): + super(RedisJobStore, self).__init__() + + if db is None: + raise ValueError('The "db" parameter must not be empty') + if not jobs_key: + raise ValueError('The "jobs_key" parameter must not be empty') + if not run_times_key: + raise ValueError('The "run_times_key" parameter must not be empty') + + self.pickle_protocol = pickle_protocol + self.jobs_key = jobs_key + self.run_times_key = run_times_key + self.redis = Redis(db=int(db), **connect_args) + + def lookup_job(self, job_id): + job_state = self.redis.hget(self.jobs_key, job_id) + return self._reconstitute_job(job_state) if job_state else None + + def get_due_jobs(self, now): + timestamp = datetime_to_utc_timestamp(now) + job_ids = self.redis.zrangebyscore(self.run_times_key, 0, timestamp) + if job_ids: + job_states = self.redis.hmget(self.jobs_key, *job_ids) + return self._reconstitute_jobs(six.moves.zip(job_ids, job_states)) + return [] + + def get_next_run_time(self): + next_run_time = self.redis.zrange(self.run_times_key, 0, 0, withscores=True) + if next_run_time: + return utc_timestamp_to_datetime(next_run_time[0][1]) + + def get_all_jobs(self): + job_states = self.redis.hgetall(self.jobs_key) + jobs = self._reconstitute_jobs(six.iteritems(job_states)) + paused_sort_key = datetime(9999, 12, 31, tzinfo=utc) + return sorted(jobs, key=lambda job: job.next_run_time or paused_sort_key) + + def add_job(self, job): + if self.redis.hexists(self.jobs_key, job.id): + raise ConflictingIdError(job.id) + + with self.redis.pipeline() as pipe: + pipe.multi() + pipe.hset(self.jobs_key, job.id, pickle.dumps(job.__getstate__(), + self.pickle_protocol)) + if job.next_run_time: + pipe.zadd(self.run_times_key, + {job.id: datetime_to_utc_timestamp(job.next_run_time)}) + + pipe.execute() + + def update_job(self, job): + if not self.redis.hexists(self.jobs_key, job.id): + raise JobLookupError(job.id) + + with self.redis.pipeline() as pipe: + pipe.hset(self.jobs_key, job.id, pickle.dumps(job.__getstate__(), + self.pickle_protocol)) + if job.next_run_time: + pipe.zadd(self.run_times_key, + {job.id: datetime_to_utc_timestamp(job.next_run_time)}) + else: + pipe.zrem(self.run_times_key, job.id) + + pipe.execute() + + def remove_job(self, job_id): + if not self.redis.hexists(self.jobs_key, job_id): + raise JobLookupError(job_id) + + with self.redis.pipeline() as pipe: + pipe.hdel(self.jobs_key, job_id) + pipe.zrem(self.run_times_key, job_id) + pipe.execute() + + def remove_all_jobs(self): + with self.redis.pipeline() as pipe: + pipe.delete(self.jobs_key) + pipe.delete(self.run_times_key) + pipe.execute() + + def shutdown(self): + self.redis.connection_pool.disconnect() + + def _reconstitute_job(self, job_state): + job_state = pickle.loads(job_state) + job = Job.__new__(Job) + job.__setstate__(job_state) + job._scheduler = self._scheduler + job._jobstore_alias = self._alias + return job + + def _reconstitute_jobs(self, job_states): + jobs = [] + failed_job_ids = [] + for job_id, job_state in job_states: + try: + jobs.append(self._reconstitute_job(job_state)) + except BaseException: + self._logger.exception('Unable to restore job "%s" -- removing it', job_id) + failed_job_ids.append(job_id) + + # Remove all the jobs we failed to restore + if failed_job_ids: + with self.redis.pipeline() as pipe: + pipe.hdel(self.jobs_key, *failed_job_ids) + pipe.zrem(self.run_times_key, *failed_job_ids) + pipe.execute() + + return jobs + + def __repr__(self): + return '<%s>' % self.__class__.__name__ diff --git a/lib/python3.11/site-packages/apscheduler/jobstores/rethinkdb.py b/lib/python3.11/site-packages/apscheduler/jobstores/rethinkdb.py new file mode 100644 index 0000000..d8a78cd --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/jobstores/rethinkdb.py @@ -0,0 +1,155 @@ +from __future__ import absolute_import + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime +from apscheduler.job import Job + +try: + import cPickle as pickle +except ImportError: # pragma: nocover + import pickle + +try: + from rethinkdb import RethinkDB +except ImportError: # pragma: nocover + raise ImportError('RethinkDBJobStore requires rethinkdb installed') + + +class RethinkDBJobStore(BaseJobStore): + """ + Stores jobs in a RethinkDB database. Any leftover keyword arguments are directly passed to + rethinkdb's `RethinkdbClient `_. + + Plugin alias: ``rethinkdb`` + + :param str database: database to store jobs in + :param str collection: collection to store jobs in + :param client: a :class:`rethinkdb.net.Connection` instance to use instead of providing + connection arguments + :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the + highest available + """ + + def __init__(self, database='apscheduler', table='jobs', client=None, + pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): + super(RethinkDBJobStore, self).__init__() + + if not database: + raise ValueError('The "database" parameter must not be empty') + if not table: + raise ValueError('The "table" parameter must not be empty') + + self.database = database + self.table_name = table + self.table = None + self.client = client + self.pickle_protocol = pickle_protocol + self.connect_args = connect_args + self.r = RethinkDB() + self.conn = None + + def start(self, scheduler, alias): + super(RethinkDBJobStore, self).start(scheduler, alias) + + if self.client: + self.conn = maybe_ref(self.client) + else: + self.conn = self.r.connect(db=self.database, **self.connect_args) + + if self.database not in self.r.db_list().run(self.conn): + self.r.db_create(self.database).run(self.conn) + + if self.table_name not in self.r.table_list().run(self.conn): + self.r.table_create(self.table_name).run(self.conn) + + if 'next_run_time' not in self.r.table(self.table_name).index_list().run(self.conn): + self.r.table(self.table_name).index_create('next_run_time').run(self.conn) + + self.table = self.r.db(self.database).table(self.table_name) + + def lookup_job(self, job_id): + results = list(self.table.get_all(job_id).pluck('job_state').run(self.conn)) + return self._reconstitute_job(results[0]['job_state']) if results else None + + def get_due_jobs(self, now): + return self._get_jobs(self.r.row['next_run_time'] <= datetime_to_utc_timestamp(now)) + + def get_next_run_time(self): + results = list( + self.table + .filter(self.r.row['next_run_time'] != None) # noqa + .order_by(self.r.asc('next_run_time')) + .map(lambda x: x['next_run_time']) + .limit(1) + .run(self.conn) + ) + return utc_timestamp_to_datetime(results[0]) if results else None + + def get_all_jobs(self): + jobs = self._get_jobs() + self._fix_paused_jobs_sorting(jobs) + return jobs + + def add_job(self, job): + job_dict = { + 'id': job.id, + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': self.r.binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) + } + results = self.table.insert(job_dict).run(self.conn) + if results['errors'] > 0: + raise ConflictingIdError(job.id) + + def update_job(self, job): + changes = { + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': self.r.binary(pickle.dumps(job.__getstate__(), self.pickle_protocol)) + } + results = self.table.get_all(job.id).update(changes).run(self.conn) + skipped = False in map(lambda x: results[x] == 0, results.keys()) + if results['skipped'] > 0 or results['errors'] > 0 or not skipped: + raise JobLookupError(job.id) + + def remove_job(self, job_id): + results = self.table.get_all(job_id).delete().run(self.conn) + if results['deleted'] + results['skipped'] != 1: + raise JobLookupError(job_id) + + def remove_all_jobs(self): + self.table.delete().run(self.conn) + + def shutdown(self): + self.conn.close() + + def _reconstitute_job(self, job_state): + job_state = pickle.loads(job_state) + job = Job.__new__(Job) + job.__setstate__(job_state) + job._scheduler = self._scheduler + job._jobstore_alias = self._alias + return job + + def _get_jobs(self, predicate=None): + jobs = [] + failed_job_ids = [] + query = (self.table.filter(self.r.row['next_run_time'] != None).filter(predicate) # noqa + if predicate else self.table) + query = query.order_by('next_run_time', 'id').pluck('id', 'job_state') + + for document in query.run(self.conn): + try: + jobs.append(self._reconstitute_job(document['job_state'])) + except Exception: + self._logger.exception('Unable to restore job "%s" -- removing it', document['id']) + failed_job_ids.append(document['id']) + + # Remove all the jobs we failed to restore + if failed_job_ids: + self.r.expr(failed_job_ids).for_each( + lambda job_id: self.table.get_all(job_id).delete()).run(self.conn) + + return jobs + + def __repr__(self): + connection = self.conn + return '<%s (connection=%s)>' % (self.__class__.__name__, connection) diff --git a/lib/python3.11/site-packages/apscheduler/jobstores/sqlalchemy.py b/lib/python3.11/site-packages/apscheduler/jobstores/sqlalchemy.py new file mode 100644 index 0000000..716549b --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/jobstores/sqlalchemy.py @@ -0,0 +1,161 @@ +from __future__ import absolute_import + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime +from apscheduler.job import Job + +try: + import cPickle as pickle +except ImportError: # pragma: nocover + import pickle + +try: + from sqlalchemy import ( + create_engine, Table, Column, MetaData, Unicode, Float, LargeBinary, select, and_) + from sqlalchemy.exc import IntegrityError + from sqlalchemy.sql.expression import null +except ImportError: # pragma: nocover + raise ImportError('SQLAlchemyJobStore requires SQLAlchemy installed') + + +class SQLAlchemyJobStore(BaseJobStore): + """ + Stores jobs in a database table using SQLAlchemy. + The table will be created if it doesn't exist in the database. + + Plugin alias: ``sqlalchemy`` + + :param str url: connection string (see + :ref:`SQLAlchemy documentation ` on this) + :param engine: an SQLAlchemy :class:`~sqlalchemy.engine.Engine` to use instead of creating a + new one based on ``url`` + :param str tablename: name of the table to store jobs in + :param metadata: a :class:`~sqlalchemy.schema.MetaData` instance to use instead of creating a + new one + :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the + highest available + :param str tableschema: name of the (existing) schema in the target database where the table + should be + :param dict engine_options: keyword arguments to :func:`~sqlalchemy.create_engine` + (ignored if ``engine`` is given) + """ + + def __init__(self, url=None, engine=None, tablename='apscheduler_jobs', metadata=None, + pickle_protocol=pickle.HIGHEST_PROTOCOL, tableschema=None, engine_options=None): + super(SQLAlchemyJobStore, self).__init__() + self.pickle_protocol = pickle_protocol + metadata = maybe_ref(metadata) or MetaData() + + if engine: + self.engine = maybe_ref(engine) + elif url: + self.engine = create_engine(url, **(engine_options or {})) + else: + raise ValueError('Need either "engine" or "url" defined') + + # 191 = max key length in MySQL for InnoDB/utf8mb4 tables, + # 25 = precision that translates to an 8-byte float + self.jobs_t = Table( + tablename, metadata, + Column('id', Unicode(191), primary_key=True), + Column('next_run_time', Float(25), index=True), + Column('job_state', LargeBinary, nullable=False), + schema=tableschema + ) + + def start(self, scheduler, alias): + super(SQLAlchemyJobStore, self).start(scheduler, alias) + self.jobs_t.create(self.engine, True) + + def lookup_job(self, job_id): + selectable = select(self.jobs_t.c.job_state).where(self.jobs_t.c.id == job_id) + with self.engine.begin() as connection: + job_state = connection.execute(selectable).scalar() + return self._reconstitute_job(job_state) if job_state else None + + def get_due_jobs(self, now): + timestamp = datetime_to_utc_timestamp(now) + return self._get_jobs(self.jobs_t.c.next_run_time <= timestamp) + + def get_next_run_time(self): + selectable = select(self.jobs_t.c.next_run_time).\ + where(self.jobs_t.c.next_run_time != null()).\ + order_by(self.jobs_t.c.next_run_time).limit(1) + with self.engine.begin() as connection: + next_run_time = connection.execute(selectable).scalar() + return utc_timestamp_to_datetime(next_run_time) + + def get_all_jobs(self): + jobs = self._get_jobs() + self._fix_paused_jobs_sorting(jobs) + return jobs + + def add_job(self, job): + insert = self.jobs_t.insert().values(**{ + 'id': job.id, + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': pickle.dumps(job.__getstate__(), self.pickle_protocol) + }) + with self.engine.begin() as connection: + try: + connection.execute(insert) + except IntegrityError: + raise ConflictingIdError(job.id) + + def update_job(self, job): + update = self.jobs_t.update().values(**{ + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': pickle.dumps(job.__getstate__(), self.pickle_protocol) + }).where(self.jobs_t.c.id == job.id) + with self.engine.begin() as connection: + result = connection.execute(update) + if result.rowcount == 0: + raise JobLookupError(job.id) + + def remove_job(self, job_id): + delete = self.jobs_t.delete().where(self.jobs_t.c.id == job_id) + with self.engine.begin() as connection: + result = connection.execute(delete) + if result.rowcount == 0: + raise JobLookupError(job_id) + + def remove_all_jobs(self): + delete = self.jobs_t.delete() + with self.engine.begin() as connection: + connection.execute(delete) + + def shutdown(self): + self.engine.dispose() + + def _reconstitute_job(self, job_state): + job_state = pickle.loads(job_state) + job_state['jobstore'] = self + job = Job.__new__(Job) + job.__setstate__(job_state) + job._scheduler = self._scheduler + job._jobstore_alias = self._alias + return job + + def _get_jobs(self, *conditions): + jobs = [] + selectable = select(self.jobs_t.c.id, self.jobs_t.c.job_state).\ + order_by(self.jobs_t.c.next_run_time) + selectable = selectable.where(and_(*conditions)) if conditions else selectable + failed_job_ids = set() + with self.engine.begin() as connection: + for row in connection.execute(selectable): + try: + jobs.append(self._reconstitute_job(row.job_state)) + except BaseException: + self._logger.exception('Unable to restore job "%s" -- removing it', row.id) + failed_job_ids.add(row.id) + + # Remove all the jobs we failed to restore + if failed_job_ids: + delete = self.jobs_t.delete().where(self.jobs_t.c.id.in_(failed_job_ids)) + connection.execute(delete) + + return jobs + + def __repr__(self): + return '<%s (url=%s)>' % (self.__class__.__name__, self.engine.url) diff --git a/lib/python3.11/site-packages/apscheduler/jobstores/zookeeper.py b/lib/python3.11/site-packages/apscheduler/jobstores/zookeeper.py new file mode 100644 index 0000000..5253069 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/jobstores/zookeeper.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import + +from datetime import datetime + +from pytz import utc +from kazoo.exceptions import NoNodeError, NodeExistsError + +from apscheduler.jobstores.base import BaseJobStore, JobLookupError, ConflictingIdError +from apscheduler.util import maybe_ref, datetime_to_utc_timestamp, utc_timestamp_to_datetime +from apscheduler.job import Job + +try: + import cPickle as pickle +except ImportError: # pragma: nocover + import pickle + +try: + from kazoo.client import KazooClient +except ImportError: # pragma: nocover + raise ImportError('ZooKeeperJobStore requires Kazoo installed') + + +class ZooKeeperJobStore(BaseJobStore): + """ + Stores jobs in a ZooKeeper tree. Any leftover keyword arguments are directly passed to + kazoo's `KazooClient + `_. + + Plugin alias: ``zookeeper`` + + :param str path: path to store jobs in + :param client: a :class:`~kazoo.client.KazooClient` instance to use instead of + providing connection arguments + :param int pickle_protocol: pickle protocol level to use (for serialization), defaults to the + highest available + """ + + def __init__(self, path='/apscheduler', client=None, close_connection_on_exit=False, + pickle_protocol=pickle.HIGHEST_PROTOCOL, **connect_args): + super(ZooKeeperJobStore, self).__init__() + self.pickle_protocol = pickle_protocol + self.close_connection_on_exit = close_connection_on_exit + + if not path: + raise ValueError('The "path" parameter must not be empty') + + self.path = path + + if client: + self.client = maybe_ref(client) + else: + self.client = KazooClient(**connect_args) + self._ensured_path = False + + def _ensure_paths(self): + if not self._ensured_path: + self.client.ensure_path(self.path) + self._ensured_path = True + + def start(self, scheduler, alias): + super(ZooKeeperJobStore, self).start(scheduler, alias) + if not self.client.connected: + self.client.start() + + def lookup_job(self, job_id): + self._ensure_paths() + node_path = self.path + "/" + str(job_id) + try: + content, _ = self.client.get(node_path) + doc = pickle.loads(content) + job = self._reconstitute_job(doc['job_state']) + return job + except BaseException: + return None + + def get_due_jobs(self, now): + timestamp = datetime_to_utc_timestamp(now) + jobs = [job_def['job'] for job_def in self._get_jobs() + if job_def['next_run_time'] is not None and job_def['next_run_time'] <= timestamp] + return jobs + + def get_next_run_time(self): + next_runs = [job_def['next_run_time'] for job_def in self._get_jobs() + if job_def['next_run_time'] is not None] + return utc_timestamp_to_datetime(min(next_runs)) if len(next_runs) > 0 else None + + def get_all_jobs(self): + jobs = [job_def['job'] for job_def in self._get_jobs()] + self._fix_paused_jobs_sorting(jobs) + return jobs + + def add_job(self, job): + self._ensure_paths() + node_path = self.path + "/" + str(job.id) + value = { + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': job.__getstate__() + } + data = pickle.dumps(value, self.pickle_protocol) + try: + self.client.create(node_path, value=data) + except NodeExistsError: + raise ConflictingIdError(job.id) + + def update_job(self, job): + self._ensure_paths() + node_path = self.path + "/" + str(job.id) + changes = { + 'next_run_time': datetime_to_utc_timestamp(job.next_run_time), + 'job_state': job.__getstate__() + } + data = pickle.dumps(changes, self.pickle_protocol) + try: + self.client.set(node_path, value=data) + except NoNodeError: + raise JobLookupError(job.id) + + def remove_job(self, job_id): + self._ensure_paths() + node_path = self.path + "/" + str(job_id) + try: + self.client.delete(node_path) + except NoNodeError: + raise JobLookupError(job_id) + + def remove_all_jobs(self): + try: + self.client.delete(self.path, recursive=True) + except NoNodeError: + pass + self._ensured_path = False + + def shutdown(self): + if self.close_connection_on_exit: + self.client.stop() + self.client.close() + + def _reconstitute_job(self, job_state): + job_state = job_state + job = Job.__new__(Job) + job.__setstate__(job_state) + job._scheduler = self._scheduler + job._jobstore_alias = self._alias + return job + + def _get_jobs(self): + self._ensure_paths() + jobs = [] + failed_job_ids = [] + all_ids = self.client.get_children(self.path) + for node_name in all_ids: + try: + node_path = self.path + "/" + node_name + content, _ = self.client.get(node_path) + doc = pickle.loads(content) + job_def = { + 'job_id': node_name, + 'next_run_time': doc['next_run_time'] if doc['next_run_time'] else None, + 'job_state': doc['job_state'], + 'job': self._reconstitute_job(doc['job_state']), + 'creation_time': _.ctime + } + jobs.append(job_def) + except BaseException: + self._logger.exception('Unable to restore job "%s" -- removing it' % node_name) + failed_job_ids.append(node_name) + + # Remove all the jobs we failed to restore + if failed_job_ids: + for failed_id in failed_job_ids: + self.remove_job(failed_id) + paused_sort_key = datetime(9999, 12, 31, tzinfo=utc) + return sorted(jobs, key=lambda job_def: (job_def['job'].next_run_time or paused_sort_key, + job_def['creation_time'])) + + def __repr__(self): + self._logger.exception('<%s (client=%s)>' % (self.__class__.__name__, self.client)) + return '<%s (client=%s)>' % (self.__class__.__name__, self.client) diff --git a/lib/python3.11/site-packages/apscheduler/schedulers/__init__.py b/lib/python3.11/site-packages/apscheduler/schedulers/__init__.py new file mode 100644 index 0000000..bd8a790 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/schedulers/__init__.py @@ -0,0 +1,12 @@ +class SchedulerAlreadyRunningError(Exception): + """Raised when attempting to start or configure the scheduler when it's already running.""" + + def __str__(self): + return 'Scheduler is already running' + + +class SchedulerNotRunningError(Exception): + """Raised when attempting to shutdown the scheduler when it's not running.""" + + def __str__(self): + return 'Scheduler is not running' diff --git a/lib/python3.11/site-packages/apscheduler/schedulers/asyncio.py b/lib/python3.11/site-packages/apscheduler/schedulers/asyncio.py new file mode 100644 index 0000000..8bcdfda --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/schedulers/asyncio.py @@ -0,0 +1,66 @@ +from __future__ import absolute_import +import asyncio +from functools import wraps, partial + +from apscheduler.schedulers.base import BaseScheduler +from apscheduler.util import maybe_ref + + +def run_in_event_loop(func): + @wraps(func) + def wrapper(self, *args, **kwargs): + wrapped = partial(func, self, *args, **kwargs) + self._eventloop.call_soon_threadsafe(wrapped) + return wrapper + + +class AsyncIOScheduler(BaseScheduler): + """ + A scheduler that runs on an asyncio (:pep:`3156`) event loop. + + The default executor can run jobs based on native coroutines (``async def``). + + Extra options: + + ============== ============================================================= + ``event_loop`` AsyncIO event loop to use (defaults to the global event loop) + ============== ============================================================= + """ + + _eventloop = None + _timeout = None + + def start(self, paused=False): + if not self._eventloop: + self._eventloop = asyncio.get_event_loop() + + super(AsyncIOScheduler, self).start(paused) + + @run_in_event_loop + def shutdown(self, wait=True): + super(AsyncIOScheduler, self).shutdown(wait) + self._stop_timer() + + def _configure(self, config): + self._eventloop = maybe_ref(config.pop('event_loop', None)) + super(AsyncIOScheduler, self)._configure(config) + + def _start_timer(self, wait_seconds): + self._stop_timer() + if wait_seconds is not None: + self._timeout = self._eventloop.call_later(wait_seconds, self.wakeup) + + def _stop_timer(self): + if self._timeout: + self._timeout.cancel() + del self._timeout + + @run_in_event_loop + def wakeup(self): + self._stop_timer() + wait_seconds = self._process_jobs() + self._start_timer(wait_seconds) + + def _create_default_executor(self): + from apscheduler.executors.asyncio import AsyncIOExecutor + return AsyncIOExecutor() diff --git a/lib/python3.11/site-packages/apscheduler/schedulers/background.py b/lib/python3.11/site-packages/apscheduler/schedulers/background.py new file mode 100644 index 0000000..bb8f77d --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/schedulers/background.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import + +from threading import Thread, Event + +from apscheduler.schedulers.base import BaseScheduler +from apscheduler.schedulers.blocking import BlockingScheduler +from apscheduler.util import asbool + + +class BackgroundScheduler(BlockingScheduler): + """ + A scheduler that runs in the background using a separate thread + (:meth:`~apscheduler.schedulers.base.BaseScheduler.start` will return immediately). + + Extra options: + + ========== ============================================================================= + ``daemon`` Set the ``daemon`` option in the background thread (defaults to ``True``, see + `the documentation + `_ + for further details) + ========== ============================================================================= + """ + + _thread = None + + def _configure(self, config): + self._daemon = asbool(config.pop('daemon', True)) + super(BackgroundScheduler, self)._configure(config) + + def start(self, *args, **kwargs): + if self._event is None or self._event.is_set(): + self._event = Event() + + BaseScheduler.start(self, *args, **kwargs) + self._thread = Thread(target=self._main_loop, name='APScheduler') + self._thread.daemon = self._daemon + self._thread.start() + + def shutdown(self, *args, **kwargs): + super(BackgroundScheduler, self).shutdown(*args, **kwargs) + self._thread.join() + del self._thread diff --git a/lib/python3.11/site-packages/apscheduler/schedulers/base.py b/lib/python3.11/site-packages/apscheduler/schedulers/base.py new file mode 100644 index 0000000..444de8e --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/schedulers/base.py @@ -0,0 +1,1026 @@ +from __future__ import print_function + +from abc import ABCMeta, abstractmethod +from threading import RLock +from datetime import datetime, timedelta +from logging import getLogger +import warnings +import sys + +from pkg_resources import iter_entry_points +from tzlocal import get_localzone +import six + +from apscheduler.schedulers import SchedulerAlreadyRunningError, SchedulerNotRunningError +from apscheduler.executors.base import MaxInstancesReachedError, BaseExecutor +from apscheduler.executors.pool import ThreadPoolExecutor +from apscheduler.jobstores.base import ConflictingIdError, JobLookupError, BaseJobStore +from apscheduler.jobstores.memory import MemoryJobStore +from apscheduler.job import Job +from apscheduler.triggers.base import BaseTrigger +from apscheduler.util import ( + asbool, asint, astimezone, maybe_ref, timedelta_seconds, undefined, TIMEOUT_MAX) +from apscheduler.events import ( + SchedulerEvent, JobEvent, JobSubmissionEvent, EVENT_SCHEDULER_START, EVENT_SCHEDULER_SHUTDOWN, + EVENT_JOBSTORE_ADDED, EVENT_JOBSTORE_REMOVED, EVENT_ALL, EVENT_JOB_MODIFIED, EVENT_JOB_REMOVED, + EVENT_JOB_ADDED, EVENT_EXECUTOR_ADDED, EVENT_EXECUTOR_REMOVED, EVENT_ALL_JOBS_REMOVED, + EVENT_JOB_SUBMITTED, EVENT_JOB_MAX_INSTANCES, EVENT_SCHEDULER_RESUMED, EVENT_SCHEDULER_PAUSED) + +try: + from collections.abc import MutableMapping +except ImportError: + from collections import MutableMapping + +#: constant indicating a scheduler's stopped state +STATE_STOPPED = 0 +#: constant indicating a scheduler's running state (started and processing jobs) +STATE_RUNNING = 1 +#: constant indicating a scheduler's paused state (started but not processing jobs) +STATE_PAUSED = 2 + + +class BaseScheduler(six.with_metaclass(ABCMeta)): + """ + Abstract base class for all schedulers. + + Takes the following keyword arguments: + + :param str|logging.Logger logger: logger to use for the scheduler's logging (defaults to + apscheduler.scheduler) + :param str|datetime.tzinfo timezone: the default time zone (defaults to the local timezone) + :param int|float jobstore_retry_interval: the minimum number of seconds to wait between + retries in the scheduler's main loop if the job store raises an exception when getting + the list of due jobs + :param dict job_defaults: default values for newly added jobs + :param dict jobstores: a dictionary of job store alias -> job store instance or configuration + dict + :param dict executors: a dictionary of executor alias -> executor instance or configuration + dict + + :ivar int state: current running state of the scheduler (one of the following constants from + ``apscheduler.schedulers.base``: ``STATE_STOPPED``, ``STATE_RUNNING``, ``STATE_PAUSED``) + + .. seealso:: :ref:`scheduler-config` + """ + + _trigger_plugins = dict((ep.name, ep) for ep in iter_entry_points('apscheduler.triggers')) + _trigger_classes = {} + _executor_plugins = dict((ep.name, ep) for ep in iter_entry_points('apscheduler.executors')) + _executor_classes = {} + _jobstore_plugins = dict((ep.name, ep) for ep in iter_entry_points('apscheduler.jobstores')) + _jobstore_classes = {} + + # + # Public API + # + + def __init__(self, gconfig={}, **options): + super(BaseScheduler, self).__init__() + self._executors = {} + self._executors_lock = self._create_lock() + self._jobstores = {} + self._jobstores_lock = self._create_lock() + self._listeners = [] + self._listeners_lock = self._create_lock() + self._pending_jobs = [] + self.state = STATE_STOPPED + self.configure(gconfig, **options) + + def __getstate__(self): + raise TypeError("Schedulers cannot be serialized. Ensure that you are not passing a " + "scheduler instance as an argument to a job, or scheduling an instance " + "method where the instance contains a scheduler as an attribute.") + + def configure(self, gconfig={}, prefix='apscheduler.', **options): + """ + Reconfigures the scheduler with the given options. + + Can only be done when the scheduler isn't running. + + :param dict gconfig: a "global" configuration dictionary whose values can be overridden by + keyword arguments to this method + :param str|unicode prefix: pick only those keys from ``gconfig`` that are prefixed with + this string (pass an empty string or ``None`` to use all keys) + :raises SchedulerAlreadyRunningError: if the scheduler is already running + + """ + if self.state != STATE_STOPPED: + raise SchedulerAlreadyRunningError + + # If a non-empty prefix was given, strip it from the keys in the + # global configuration dict + if prefix: + prefixlen = len(prefix) + gconfig = dict((key[prefixlen:], value) for key, value in six.iteritems(gconfig) + if key.startswith(prefix)) + + # Create a structure from the dotted options + # (e.g. "a.b.c = d" -> {'a': {'b': {'c': 'd'}}}) + config = {} + for key, value in six.iteritems(gconfig): + parts = key.split('.') + parent = config + key = parts.pop(0) + while parts: + parent = parent.setdefault(key, {}) + key = parts.pop(0) + parent[key] = value + + # Override any options with explicit keyword arguments + config.update(options) + self._configure(config) + + def start(self, paused=False): + """ + Start the configured executors and job stores and begin processing scheduled jobs. + + :param bool paused: if ``True``, don't start job processing until :meth:`resume` is called + :raises SchedulerAlreadyRunningError: if the scheduler is already running + :raises RuntimeError: if running under uWSGI with threads disabled + + """ + if self.state != STATE_STOPPED: + raise SchedulerAlreadyRunningError + + self._check_uwsgi() + + with self._executors_lock: + # Create a default executor if nothing else is configured + if 'default' not in self._executors: + self.add_executor(self._create_default_executor(), 'default') + + # Start all the executors + for alias, executor in six.iteritems(self._executors): + executor.start(self, alias) + + with self._jobstores_lock: + # Create a default job store if nothing else is configured + if 'default' not in self._jobstores: + self.add_jobstore(self._create_default_jobstore(), 'default') + + # Start all the job stores + for alias, store in six.iteritems(self._jobstores): + store.start(self, alias) + + # Schedule all pending jobs + for job, jobstore_alias, replace_existing in self._pending_jobs: + self._real_add_job(job, jobstore_alias, replace_existing) + del self._pending_jobs[:] + + self.state = STATE_PAUSED if paused else STATE_RUNNING + self._logger.info('Scheduler started') + self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_START)) + + if not paused: + self.wakeup() + + @abstractmethod + def shutdown(self, wait=True): + """ + Shuts down the scheduler, along with its executors and job stores. + + Does not interrupt any currently running jobs. + + :param bool wait: ``True`` to wait until all currently executing jobs have finished + :raises SchedulerNotRunningError: if the scheduler has not been started yet + + """ + if self.state == STATE_STOPPED: + raise SchedulerNotRunningError + + self.state = STATE_STOPPED + + # Shut down all executors + with self._executors_lock, self._jobstores_lock: + for executor in six.itervalues(self._executors): + executor.shutdown(wait) + + # Shut down all job stores + for jobstore in six.itervalues(self._jobstores): + jobstore.shutdown() + + self._logger.info('Scheduler has been shut down') + self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_SHUTDOWN)) + + def pause(self): + """ + Pause job processing in the scheduler. + + This will prevent the scheduler from waking up to do job processing until :meth:`resume` + is called. It will not however stop any already running job processing. + + """ + if self.state == STATE_STOPPED: + raise SchedulerNotRunningError + elif self.state == STATE_RUNNING: + self.state = STATE_PAUSED + self._logger.info('Paused scheduler job processing') + self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_PAUSED)) + + def resume(self): + """Resume job processing in the scheduler.""" + if self.state == STATE_STOPPED: + raise SchedulerNotRunningError + elif self.state == STATE_PAUSED: + self.state = STATE_RUNNING + self._logger.info('Resumed scheduler job processing') + self._dispatch_event(SchedulerEvent(EVENT_SCHEDULER_RESUMED)) + self.wakeup() + + @property + def running(self): + """ + Return ``True`` if the scheduler has been started. + + This is a shortcut for ``scheduler.state != STATE_STOPPED``. + + """ + return self.state != STATE_STOPPED + + def add_executor(self, executor, alias='default', **executor_opts): + """ + Adds an executor to this scheduler. + + Any extra keyword arguments will be passed to the executor plugin's constructor, assuming + that the first argument is the name of an executor plugin. + + :param str|unicode|apscheduler.executors.base.BaseExecutor executor: either an executor + instance or the name of an executor plugin + :param str|unicode alias: alias for the scheduler + :raises ValueError: if there is already an executor by the given alias + + """ + with self._executors_lock: + if alias in self._executors: + raise ValueError('This scheduler already has an executor by the alias of "%s"' % + alias) + + if isinstance(executor, BaseExecutor): + self._executors[alias] = executor + elif isinstance(executor, six.string_types): + self._executors[alias] = executor = self._create_plugin_instance( + 'executor', executor, executor_opts) + else: + raise TypeError('Expected an executor instance or a string, got %s instead' % + executor.__class__.__name__) + + # Start the executor right away if the scheduler is running + if self.state != STATE_STOPPED: + executor.start(self, alias) + + self._dispatch_event(SchedulerEvent(EVENT_EXECUTOR_ADDED, alias)) + + def remove_executor(self, alias, shutdown=True): + """ + Removes the executor by the given alias from this scheduler. + + :param str|unicode alias: alias of the executor + :param bool shutdown: ``True`` to shut down the executor after + removing it + + """ + with self._executors_lock: + executor = self._lookup_executor(alias) + del self._executors[alias] + + if shutdown: + executor.shutdown() + + self._dispatch_event(SchedulerEvent(EVENT_EXECUTOR_REMOVED, alias)) + + def add_jobstore(self, jobstore, alias='default', **jobstore_opts): + """ + Adds a job store to this scheduler. + + Any extra keyword arguments will be passed to the job store plugin's constructor, assuming + that the first argument is the name of a job store plugin. + + :param str|unicode|apscheduler.jobstores.base.BaseJobStore jobstore: job store to be added + :param str|unicode alias: alias for the job store + :raises ValueError: if there is already a job store by the given alias + + """ + with self._jobstores_lock: + if alias in self._jobstores: + raise ValueError('This scheduler already has a job store by the alias of "%s"' % + alias) + + if isinstance(jobstore, BaseJobStore): + self._jobstores[alias] = jobstore + elif isinstance(jobstore, six.string_types): + self._jobstores[alias] = jobstore = self._create_plugin_instance( + 'jobstore', jobstore, jobstore_opts) + else: + raise TypeError('Expected a job store instance or a string, got %s instead' % + jobstore.__class__.__name__) + + # Start the job store right away if the scheduler isn't stopped + if self.state != STATE_STOPPED: + jobstore.start(self, alias) + + # Notify listeners that a new job store has been added + self._dispatch_event(SchedulerEvent(EVENT_JOBSTORE_ADDED, alias)) + + # Notify the scheduler so it can scan the new job store for jobs + if self.state != STATE_STOPPED: + self.wakeup() + + def remove_jobstore(self, alias, shutdown=True): + """ + Removes the job store by the given alias from this scheduler. + + :param str|unicode alias: alias of the job store + :param bool shutdown: ``True`` to shut down the job store after removing it + + """ + with self._jobstores_lock: + jobstore = self._lookup_jobstore(alias) + del self._jobstores[alias] + + if shutdown: + jobstore.shutdown() + + self._dispatch_event(SchedulerEvent(EVENT_JOBSTORE_REMOVED, alias)) + + def add_listener(self, callback, mask=EVENT_ALL): + """ + add_listener(callback, mask=EVENT_ALL) + + Adds a listener for scheduler events. + + When a matching event occurs, ``callback`` is executed with the event object as its + sole argument. If the ``mask`` parameter is not provided, the callback will receive events + of all types. + + :param callback: any callable that takes one argument + :param int mask: bitmask that indicates which events should be + listened to + + .. seealso:: :mod:`apscheduler.events` + .. seealso:: :ref:`scheduler-events` + + """ + with self._listeners_lock: + self._listeners.append((callback, mask)) + + def remove_listener(self, callback): + """Removes a previously added event listener.""" + + with self._listeners_lock: + for i, (cb, _) in enumerate(self._listeners): + if callback == cb: + del self._listeners[i] + + def add_job(self, func, trigger=None, args=None, kwargs=None, id=None, name=None, + misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined, + next_run_time=undefined, jobstore='default', executor='default', + replace_existing=False, **trigger_args): + """ + add_job(func, trigger=None, args=None, kwargs=None, id=None, \ + name=None, misfire_grace_time=undefined, coalesce=undefined, \ + max_instances=undefined, next_run_time=undefined, \ + jobstore='default', executor='default', \ + replace_existing=False, **trigger_args) + + Adds the given job to the job list and wakes up the scheduler if it's already running. + + Any option that defaults to ``undefined`` will be replaced with the corresponding default + value when the job is scheduled (which happens when the scheduler is started, or + immediately if the scheduler is already running). + + The ``func`` argument can be given either as a callable object or a textual reference in + the ``package.module:some.object`` format, where the first half (separated by ``:``) is an + importable module and the second half is a reference to the callable object, relative to + the module. + + The ``trigger`` argument can either be: + #. the alias name of the trigger (e.g. ``date``, ``interval`` or ``cron``), in which case + any extra keyword arguments to this method are passed on to the trigger's constructor + #. an instance of a trigger class + + :param func: callable (or a textual reference to one) to run at the given time + :param str|apscheduler.triggers.base.BaseTrigger trigger: trigger that determines when + ``func`` is called + :param list|tuple args: list of positional arguments to call func with + :param dict kwargs: dict of keyword arguments to call func with + :param str|unicode id: explicit identifier for the job (for modifying it later) + :param str|unicode name: textual description of the job + :param int misfire_grace_time: seconds after the designated runtime that the job is still + allowed to be run (or ``None`` to allow the job to run no matter how late it is) + :param bool coalesce: run once instead of many times if the scheduler determines that the + job should be run more than once in succession + :param int max_instances: maximum number of concurrently running instances allowed for this + job + :param datetime next_run_time: when to first run the job, regardless of the trigger (pass + ``None`` to add the job as paused) + :param str|unicode jobstore: alias of the job store to store the job in + :param str|unicode executor: alias of the executor to run the job with + :param bool replace_existing: ``True`` to replace an existing job with the same ``id`` + (but retain the number of runs from the existing one) + :rtype: Job + + """ + job_kwargs = { + 'trigger': self._create_trigger(trigger, trigger_args), + 'executor': executor, + 'func': func, + 'args': tuple(args) if args is not None else (), + 'kwargs': dict(kwargs) if kwargs is not None else {}, + 'id': id, + 'name': name, + 'misfire_grace_time': misfire_grace_time, + 'coalesce': coalesce, + 'max_instances': max_instances, + 'next_run_time': next_run_time + } + job_kwargs = dict((key, value) for key, value in six.iteritems(job_kwargs) if + value is not undefined) + job = Job(self, **job_kwargs) + + # Don't really add jobs to job stores before the scheduler is up and running + with self._jobstores_lock: + if self.state == STATE_STOPPED: + self._pending_jobs.append((job, jobstore, replace_existing)) + self._logger.info('Adding job tentatively -- it will be properly scheduled when ' + 'the scheduler starts') + else: + self._real_add_job(job, jobstore, replace_existing) + + return job + + def scheduled_job(self, trigger, args=None, kwargs=None, id=None, name=None, + misfire_grace_time=undefined, coalesce=undefined, max_instances=undefined, + next_run_time=undefined, jobstore='default', executor='default', + **trigger_args): + """ + scheduled_job(trigger, args=None, kwargs=None, id=None, \ + name=None, misfire_grace_time=undefined, \ + coalesce=undefined, max_instances=undefined, \ + next_run_time=undefined, jobstore='default', \ + executor='default',**trigger_args) + + A decorator version of :meth:`add_job`, except that ``replace_existing`` is always + ``True``. + + .. important:: The ``id`` argument must be given if scheduling a job in a persistent job + store. The scheduler cannot, however, enforce this requirement. + + """ + def inner(func): + self.add_job(func, trigger, args, kwargs, id, name, misfire_grace_time, coalesce, + max_instances, next_run_time, jobstore, executor, True, **trigger_args) + return func + return inner + + def modify_job(self, job_id, jobstore=None, **changes): + """ + Modifies the properties of a single job. + + Modifications are passed to this method as extra keyword arguments. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that contains the job + :return Job: the relevant job instance + + """ + with self._jobstores_lock: + job, jobstore = self._lookup_job(job_id, jobstore) + job._modify(**changes) + if jobstore: + self._lookup_jobstore(jobstore).update_job(job) + + self._dispatch_event(JobEvent(EVENT_JOB_MODIFIED, job_id, jobstore)) + + # Wake up the scheduler since the job's next run time may have been changed + if self.state == STATE_RUNNING: + self.wakeup() + + return job + + def reschedule_job(self, job_id, jobstore=None, trigger=None, **trigger_args): + """ + Constructs a new trigger for a job and updates its next run time. + + Extra keyword arguments are passed directly to the trigger's constructor. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that contains the job + :param trigger: alias of the trigger type or a trigger instance + :return Job: the relevant job instance + + """ + trigger = self._create_trigger(trigger, trigger_args) + now = datetime.now(self.timezone) + next_run_time = trigger.get_next_fire_time(None, now) + return self.modify_job(job_id, jobstore, trigger=trigger, next_run_time=next_run_time) + + def pause_job(self, job_id, jobstore=None): + """ + Causes the given job not to be executed until it is explicitly resumed. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that contains the job + :return Job: the relevant job instance + + """ + return self.modify_job(job_id, jobstore, next_run_time=None) + + def resume_job(self, job_id, jobstore=None): + """ + Resumes the schedule of the given job, or removes the job if its schedule is finished. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that contains the job + :return Job|None: the relevant job instance if the job was rescheduled, or ``None`` if no + next run time could be calculated and the job was removed + + """ + with self._jobstores_lock: + job, jobstore = self._lookup_job(job_id, jobstore) + now = datetime.now(self.timezone) + next_run_time = job.trigger.get_next_fire_time(None, now) + if next_run_time: + return self.modify_job(job_id, jobstore, next_run_time=next_run_time) + else: + self.remove_job(job.id, jobstore) + + def get_jobs(self, jobstore=None, pending=None): + """ + Returns a list of pending jobs (if the scheduler hasn't been started yet) and scheduled + jobs, either from a specific job store or from all of them. + + If the scheduler has not been started yet, only pending jobs can be returned because the + job stores haven't been started yet either. + + :param str|unicode jobstore: alias of the job store + :param bool pending: **DEPRECATED** + :rtype: list[Job] + + """ + if pending is not None: + warnings.warn('The "pending" option is deprecated -- get_jobs() always returns ' + 'scheduled jobs if the scheduler has been started and pending jobs ' + 'otherwise', DeprecationWarning) + + with self._jobstores_lock: + jobs = [] + if self.state == STATE_STOPPED: + for job, alias, replace_existing in self._pending_jobs: + if jobstore is None or alias == jobstore: + jobs.append(job) + else: + for alias, store in six.iteritems(self._jobstores): + if jobstore is None or alias == jobstore: + jobs.extend(store.get_all_jobs()) + + return jobs + + def get_job(self, job_id, jobstore=None): + """ + Returns the Job that matches the given ``job_id``. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that most likely contains the job + :return: the Job by the given ID, or ``None`` if it wasn't found + :rtype: Job + + """ + with self._jobstores_lock: + try: + return self._lookup_job(job_id, jobstore)[0] + except JobLookupError: + return + + def remove_job(self, job_id, jobstore=None): + """ + Removes a job, preventing it from being run any more. + + :param str|unicode job_id: the identifier of the job + :param str|unicode jobstore: alias of the job store that contains the job + :raises JobLookupError: if the job was not found + + """ + jobstore_alias = None + with self._jobstores_lock: + # Check if the job is among the pending jobs + if self.state == STATE_STOPPED: + for i, (job, alias, replace_existing) in enumerate(self._pending_jobs): + if job.id == job_id and jobstore in (None, alias): + del self._pending_jobs[i] + jobstore_alias = alias + break + else: + # Otherwise, try to remove it from each store until it succeeds or we run out of + # stores to check + for alias, store in six.iteritems(self._jobstores): + if jobstore in (None, alias): + try: + store.remove_job(job_id) + jobstore_alias = alias + break + except JobLookupError: + continue + + if jobstore_alias is None: + raise JobLookupError(job_id) + + # Notify listeners that a job has been removed + event = JobEvent(EVENT_JOB_REMOVED, job_id, jobstore_alias) + self._dispatch_event(event) + + self._logger.info('Removed job %s', job_id) + + def remove_all_jobs(self, jobstore=None): + """ + Removes all jobs from the specified job store, or all job stores if none is given. + + :param str|unicode jobstore: alias of the job store + + """ + with self._jobstores_lock: + if self.state == STATE_STOPPED: + if jobstore: + self._pending_jobs = [pending for pending in self._pending_jobs if + pending[1] != jobstore] + else: + self._pending_jobs = [] + else: + for alias, store in six.iteritems(self._jobstores): + if jobstore in (None, alias): + store.remove_all_jobs() + + self._dispatch_event(SchedulerEvent(EVENT_ALL_JOBS_REMOVED, jobstore)) + + def print_jobs(self, jobstore=None, out=None): + """ + print_jobs(jobstore=None, out=sys.stdout) + + Prints out a textual listing of all jobs currently scheduled on either all job stores or + just a specific one. + + :param str|unicode jobstore: alias of the job store, ``None`` to list jobs from all stores + :param file out: a file-like object to print to (defaults to **sys.stdout** if nothing is + given) + + """ + out = out or sys.stdout + with self._jobstores_lock: + if self.state == STATE_STOPPED: + print(u'Pending jobs:', file=out) + if self._pending_jobs: + for job, jobstore_alias, replace_existing in self._pending_jobs: + if jobstore in (None, jobstore_alias): + print(u' %s' % job, file=out) + else: + print(u' No pending jobs', file=out) + else: + for alias, store in sorted(six.iteritems(self._jobstores)): + if jobstore in (None, alias): + print(u'Jobstore %s:' % alias, file=out) + jobs = store.get_all_jobs() + if jobs: + for job in jobs: + print(u' %s' % job, file=out) + else: + print(u' No scheduled jobs', file=out) + + @abstractmethod + def wakeup(self): + """ + Notifies the scheduler that there may be jobs due for execution. + Triggers :meth:`_process_jobs` to be run in an implementation specific manner. + """ + + # + # Private API + # + + def _configure(self, config): + # Set general options + self._logger = maybe_ref(config.pop('logger', None)) or getLogger('apscheduler.scheduler') + self.timezone = astimezone(config.pop('timezone', None)) or get_localzone() + self.jobstore_retry_interval = float(config.pop('jobstore_retry_interval', 10)) + + # Set the job defaults + job_defaults = config.get('job_defaults', {}) + self._job_defaults = { + 'misfire_grace_time': asint(job_defaults.get('misfire_grace_time', 1)), + 'coalesce': asbool(job_defaults.get('coalesce', True)), + 'max_instances': asint(job_defaults.get('max_instances', 1)) + } + + # Configure executors + self._executors.clear() + for alias, value in six.iteritems(config.get('executors', {})): + if isinstance(value, BaseExecutor): + self.add_executor(value, alias) + elif isinstance(value, MutableMapping): + executor_class = value.pop('class', None) + plugin = value.pop('type', None) + if plugin: + executor = self._create_plugin_instance('executor', plugin, value) + elif executor_class: + cls = maybe_ref(executor_class) + executor = cls(**value) + else: + raise ValueError( + 'Cannot create executor "%s" -- either "type" or "class" must be defined' % + alias) + + self.add_executor(executor, alias) + else: + raise TypeError( + "Expected executor instance or dict for executors['%s'], got %s instead" % + (alias, value.__class__.__name__)) + + # Configure job stores + self._jobstores.clear() + for alias, value in six.iteritems(config.get('jobstores', {})): + if isinstance(value, BaseJobStore): + self.add_jobstore(value, alias) + elif isinstance(value, MutableMapping): + jobstore_class = value.pop('class', None) + plugin = value.pop('type', None) + if plugin: + jobstore = self._create_plugin_instance('jobstore', plugin, value) + elif jobstore_class: + cls = maybe_ref(jobstore_class) + jobstore = cls(**value) + else: + raise ValueError( + 'Cannot create job store "%s" -- either "type" or "class" must be ' + 'defined' % alias) + + self.add_jobstore(jobstore, alias) + else: + raise TypeError( + "Expected job store instance or dict for jobstores['%s'], got %s instead" % + (alias, value.__class__.__name__)) + + def _create_default_executor(self): + """Creates a default executor store, specific to the particular scheduler type.""" + return ThreadPoolExecutor() + + def _create_default_jobstore(self): + """Creates a default job store, specific to the particular scheduler type.""" + return MemoryJobStore() + + def _lookup_executor(self, alias): + """ + Returns the executor instance by the given name from the list of executors that were added + to this scheduler. + + :type alias: str + :raises KeyError: if no executor by the given alias is not found + + """ + try: + return self._executors[alias] + except KeyError: + raise KeyError('No such executor: %s' % alias) + + def _lookup_jobstore(self, alias): + """ + Returns the job store instance by the given name from the list of job stores that were + added to this scheduler. + + :type alias: str + :raises KeyError: if no job store by the given alias is not found + + """ + try: + return self._jobstores[alias] + except KeyError: + raise KeyError('No such job store: %s' % alias) + + def _lookup_job(self, job_id, jobstore_alias): + """ + Finds a job by its ID. + + :type job_id: str + :param str jobstore_alias: alias of a job store to look in + :return tuple[Job, str]: a tuple of job, jobstore alias (jobstore alias is None in case of + a pending job) + :raises JobLookupError: if no job by the given ID is found. + + """ + if self.state == STATE_STOPPED: + # Check if the job is among the pending jobs + for job, alias, replace_existing in self._pending_jobs: + if job.id == job_id: + return job, None + else: + # Look in all job stores + for alias, store in six.iteritems(self._jobstores): + if jobstore_alias in (None, alias): + job = store.lookup_job(job_id) + if job is not None: + return job, alias + + raise JobLookupError(job_id) + + def _dispatch_event(self, event): + """ + Dispatches the given event to interested listeners. + + :param SchedulerEvent event: the event to send + + """ + with self._listeners_lock: + listeners = tuple(self._listeners) + + for cb, mask in listeners: + if event.code & mask: + try: + cb(event) + except BaseException: + self._logger.exception('Error notifying listener') + + def _check_uwsgi(self): + """Check if we're running under uWSGI with threads disabled.""" + uwsgi_module = sys.modules.get('uwsgi') + if not getattr(uwsgi_module, 'has_threads', True): + raise RuntimeError('The scheduler seems to be running under uWSGI, but threads have ' + 'been disabled. You must run uWSGI with the --enable-threads ' + 'option for the scheduler to work.') + + def _real_add_job(self, job, jobstore_alias, replace_existing): + """ + :param Job job: the job to add + :param bool replace_existing: ``True`` to use update_job() in case the job already exists + in the store + + """ + # Fill in undefined values with defaults + replacements = {} + for key, value in six.iteritems(self._job_defaults): + if not hasattr(job, key): + replacements[key] = value + + # Calculate the next run time if there is none defined + if not hasattr(job, 'next_run_time'): + now = datetime.now(self.timezone) + replacements['next_run_time'] = job.trigger.get_next_fire_time(None, now) + + # Apply any replacements + job._modify(**replacements) + + # Add the job to the given job store + store = self._lookup_jobstore(jobstore_alias) + try: + store.add_job(job) + except ConflictingIdError: + if replace_existing: + store.update_job(job) + else: + raise + + # Mark the job as no longer pending + job._jobstore_alias = jobstore_alias + + # Notify listeners that a new job has been added + event = JobEvent(EVENT_JOB_ADDED, job.id, jobstore_alias) + self._dispatch_event(event) + + self._logger.info('Added job "%s" to job store "%s"', job.name, jobstore_alias) + + # Notify the scheduler about the new job + if self.state == STATE_RUNNING: + self.wakeup() + + def _create_plugin_instance(self, type_, alias, constructor_kwargs): + """Creates an instance of the given plugin type, loading the plugin first if necessary.""" + plugin_container, class_container, base_class = { + 'trigger': (self._trigger_plugins, self._trigger_classes, BaseTrigger), + 'jobstore': (self._jobstore_plugins, self._jobstore_classes, BaseJobStore), + 'executor': (self._executor_plugins, self._executor_classes, BaseExecutor) + }[type_] + + try: + plugin_cls = class_container[alias] + except KeyError: + if alias in plugin_container: + plugin_cls = class_container[alias] = plugin_container[alias].load() + if not issubclass(plugin_cls, base_class): + raise TypeError('The {0} entry point does not point to a {0} class'. + format(type_)) + else: + raise LookupError('No {0} by the name "{1}" was found'.format(type_, alias)) + + return plugin_cls(**constructor_kwargs) + + def _create_trigger(self, trigger, trigger_args): + if isinstance(trigger, BaseTrigger): + return trigger + elif trigger is None: + trigger = 'date' + elif not isinstance(trigger, six.string_types): + raise TypeError('Expected a trigger instance or string, got %s instead' % + trigger.__class__.__name__) + + # Use the scheduler's time zone if nothing else is specified + trigger_args.setdefault('timezone', self.timezone) + + # Instantiate the trigger class + return self._create_plugin_instance('trigger', trigger, trigger_args) + + def _create_lock(self): + """Creates a reentrant lock object.""" + return RLock() + + def _process_jobs(self): + """ + Iterates through jobs in every jobstore, starts jobs that are due and figures out how long + to wait for the next round. + + If the ``get_due_jobs()`` call raises an exception, a new wakeup is scheduled in at least + ``jobstore_retry_interval`` seconds. + + """ + if self.state == STATE_PAUSED: + self._logger.debug('Scheduler is paused -- not processing jobs') + return None + + self._logger.debug('Looking for jobs to run') + now = datetime.now(self.timezone) + next_wakeup_time = None + events = [] + + with self._jobstores_lock: + for jobstore_alias, jobstore in six.iteritems(self._jobstores): + try: + due_jobs = jobstore.get_due_jobs(now) + except Exception as e: + # Schedule a wakeup at least in jobstore_retry_interval seconds + self._logger.warning('Error getting due jobs from job store %r: %s', + jobstore_alias, e) + retry_wakeup_time = now + timedelta(seconds=self.jobstore_retry_interval) + if not next_wakeup_time or next_wakeup_time > retry_wakeup_time: + next_wakeup_time = retry_wakeup_time + + continue + + for job in due_jobs: + # Look up the job's executor + try: + executor = self._lookup_executor(job.executor) + except BaseException: + self._logger.error( + 'Executor lookup ("%s") failed for job "%s" -- removing it from the ' + 'job store', job.executor, job) + self.remove_job(job.id, jobstore_alias) + continue + + run_times = job._get_run_times(now) + run_times = run_times[-1:] if run_times and job.coalesce else run_times + if run_times: + try: + executor.submit_job(job, run_times) + except MaxInstancesReachedError: + self._logger.warning( + 'Execution of job "%s" skipped: maximum number of running ' + 'instances reached (%d)', job, job.max_instances) + event = JobSubmissionEvent(EVENT_JOB_MAX_INSTANCES, job.id, + jobstore_alias, run_times) + events.append(event) + except BaseException: + self._logger.exception('Error submitting job "%s" to executor "%s"', + job, job.executor) + else: + event = JobSubmissionEvent(EVENT_JOB_SUBMITTED, job.id, jobstore_alias, + run_times) + events.append(event) + + # Update the job if it has a next execution time. + # Otherwise remove it from the job store. + job_next_run = job.trigger.get_next_fire_time(run_times[-1], now) + if job_next_run: + job._modify(next_run_time=job_next_run) + jobstore.update_job(job) + else: + self.remove_job(job.id, jobstore_alias) + + # Set a new next wakeup time if there isn't one yet or + # the jobstore has an even earlier one + jobstore_next_run_time = jobstore.get_next_run_time() + if jobstore_next_run_time and (next_wakeup_time is None or + jobstore_next_run_time < next_wakeup_time): + next_wakeup_time = jobstore_next_run_time.astimezone(self.timezone) + + # Dispatch collected events + for event in events: + self._dispatch_event(event) + + # Determine the delay until this method should be called again + if self.state == STATE_PAUSED: + wait_seconds = None + self._logger.debug('Scheduler is paused; waiting until resume() is called') + elif next_wakeup_time is None: + wait_seconds = None + self._logger.debug('No jobs; waiting until a job is added') + else: + wait_seconds = min(max(timedelta_seconds(next_wakeup_time - now), 0), TIMEOUT_MAX) + self._logger.debug('Next wakeup is due at %s (in %f seconds)', next_wakeup_time, + wait_seconds) + + return wait_seconds diff --git a/lib/python3.11/site-packages/apscheduler/schedulers/blocking.py b/lib/python3.11/site-packages/apscheduler/schedulers/blocking.py new file mode 100644 index 0000000..4ecc9f6 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/schedulers/blocking.py @@ -0,0 +1,35 @@ +from __future__ import absolute_import + +from threading import Event + +from apscheduler.schedulers.base import BaseScheduler, STATE_STOPPED +from apscheduler.util import TIMEOUT_MAX + + +class BlockingScheduler(BaseScheduler): + """ + A scheduler that runs in the foreground + (:meth:`~apscheduler.schedulers.base.BaseScheduler.start` will block). + """ + _event = None + + def start(self, *args, **kwargs): + if self._event is None or self._event.is_set(): + self._event = Event() + + super(BlockingScheduler, self).start(*args, **kwargs) + self._main_loop() + + def shutdown(self, wait=True): + super(BlockingScheduler, self).shutdown(wait) + self._event.set() + + def _main_loop(self): + wait_seconds = TIMEOUT_MAX + while self.state != STATE_STOPPED: + self._event.wait(wait_seconds) + self._event.clear() + wait_seconds = self._process_jobs() + + def wakeup(self): + self._event.set() diff --git a/lib/python3.11/site-packages/apscheduler/schedulers/gevent.py b/lib/python3.11/site-packages/apscheduler/schedulers/gevent.py new file mode 100644 index 0000000..d48ed74 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/schedulers/gevent.py @@ -0,0 +1,35 @@ +from __future__ import absolute_import + +from apscheduler.schedulers.blocking import BlockingScheduler +from apscheduler.schedulers.base import BaseScheduler + +try: + from gevent.event import Event + from gevent.lock import RLock + import gevent +except ImportError: # pragma: nocover + raise ImportError('GeventScheduler requires gevent installed') + + +class GeventScheduler(BlockingScheduler): + """A scheduler that runs as a Gevent greenlet.""" + + _greenlet = None + + def start(self, *args, **kwargs): + self._event = Event() + BaseScheduler.start(self, *args, **kwargs) + self._greenlet = gevent.spawn(self._main_loop) + return self._greenlet + + def shutdown(self, *args, **kwargs): + super(GeventScheduler, self).shutdown(*args, **kwargs) + self._greenlet.join() + del self._greenlet + + def _create_lock(self): + return RLock() + + def _create_default_executor(self): + from apscheduler.executors.gevent import GeventExecutor + return GeventExecutor() diff --git a/lib/python3.11/site-packages/apscheduler/schedulers/qt.py b/lib/python3.11/site-packages/apscheduler/schedulers/qt.py new file mode 100644 index 0000000..890a44a --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/schedulers/qt.py @@ -0,0 +1,50 @@ +from __future__ import absolute_import + +from apscheduler.schedulers.base import BaseScheduler + +try: + from PyQt5.QtCore import QObject, QTimer +except (ImportError, RuntimeError): # pragma: nocover + try: + from PyQt4.QtCore import QObject, QTimer + except ImportError: + try: + from PySide6.QtCore import QObject, QTimer # noqa + except ImportError: + try: + from PySide2.QtCore import QObject, QTimer # noqa + except ImportError: + try: + from PySide.QtCore import QObject, QTimer # noqa + except ImportError: + raise ImportError('QtScheduler requires either PyQt5, PyQt4, PySide6, PySide2 ' + 'or PySide installed') + + +class QtScheduler(BaseScheduler): + """A scheduler that runs in a Qt event loop.""" + + _timer = None + + def shutdown(self, *args, **kwargs): + super(QtScheduler, self).shutdown(*args, **kwargs) + self._stop_timer() + + def _start_timer(self, wait_seconds): + self._stop_timer() + if wait_seconds is not None: + wait_time = min(int(wait_seconds * 1000), 2147483647) + self._timer = QTimer.singleShot(wait_time, self._process_jobs) + + def _stop_timer(self): + if self._timer: + if self._timer.isActive(): + self._timer.stop() + del self._timer + + def wakeup(self): + self._start_timer(0) + + def _process_jobs(self): + wait_seconds = super(QtScheduler, self)._process_jobs() + self._start_timer(wait_seconds) diff --git a/lib/python3.11/site-packages/apscheduler/schedulers/tornado.py b/lib/python3.11/site-packages/apscheduler/schedulers/tornado.py new file mode 100644 index 0000000..0a9171f --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/schedulers/tornado.py @@ -0,0 +1,63 @@ +from __future__ import absolute_import + +from datetime import timedelta +from functools import wraps + +from apscheduler.schedulers.base import BaseScheduler +from apscheduler.util import maybe_ref + +try: + from tornado.ioloop import IOLoop +except ImportError: # pragma: nocover + raise ImportError('TornadoScheduler requires tornado installed') + + +def run_in_ioloop(func): + @wraps(func) + def wrapper(self, *args, **kwargs): + self._ioloop.add_callback(func, self, *args, **kwargs) + return wrapper + + +class TornadoScheduler(BaseScheduler): + """ + A scheduler that runs on a Tornado IOLoop. + + The default executor can run jobs based on native coroutines (``async def``). + + =========== =============================================================== + ``io_loop`` Tornado IOLoop instance to use (defaults to the global IO loop) + =========== =============================================================== + """ + + _ioloop = None + _timeout = None + + @run_in_ioloop + def shutdown(self, wait=True): + super(TornadoScheduler, self).shutdown(wait) + self._stop_timer() + + def _configure(self, config): + self._ioloop = maybe_ref(config.pop('io_loop', None)) or IOLoop.current() + super(TornadoScheduler, self)._configure(config) + + def _start_timer(self, wait_seconds): + self._stop_timer() + if wait_seconds is not None: + self._timeout = self._ioloop.add_timeout(timedelta(seconds=wait_seconds), self.wakeup) + + def _stop_timer(self): + if self._timeout: + self._ioloop.remove_timeout(self._timeout) + del self._timeout + + def _create_default_executor(self): + from apscheduler.executors.tornado import TornadoExecutor + return TornadoExecutor() + + @run_in_ioloop + def wakeup(self): + self._stop_timer() + wait_seconds = self._process_jobs() + self._start_timer(wait_seconds) diff --git a/lib/python3.11/site-packages/apscheduler/schedulers/twisted.py b/lib/python3.11/site-packages/apscheduler/schedulers/twisted.py new file mode 100644 index 0000000..6b43a84 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/schedulers/twisted.py @@ -0,0 +1,62 @@ +from __future__ import absolute_import + +from functools import wraps + +from apscheduler.schedulers.base import BaseScheduler +from apscheduler.util import maybe_ref + +try: + from twisted.internet import reactor as default_reactor +except ImportError: # pragma: nocover + raise ImportError('TwistedScheduler requires Twisted installed') + + +def run_in_reactor(func): + @wraps(func) + def wrapper(self, *args, **kwargs): + self._reactor.callFromThread(func, self, *args, **kwargs) + return wrapper + + +class TwistedScheduler(BaseScheduler): + """ + A scheduler that runs on a Twisted reactor. + + Extra options: + + =========== ======================================================== + ``reactor`` Reactor instance to use (defaults to the global reactor) + =========== ======================================================== + """ + + _reactor = None + _delayedcall = None + + def _configure(self, config): + self._reactor = maybe_ref(config.pop('reactor', default_reactor)) + super(TwistedScheduler, self)._configure(config) + + @run_in_reactor + def shutdown(self, wait=True): + super(TwistedScheduler, self).shutdown(wait) + self._stop_timer() + + def _start_timer(self, wait_seconds): + self._stop_timer() + if wait_seconds is not None: + self._delayedcall = self._reactor.callLater(wait_seconds, self.wakeup) + + def _stop_timer(self): + if self._delayedcall and self._delayedcall.active(): + self._delayedcall.cancel() + del self._delayedcall + + @run_in_reactor + def wakeup(self): + self._stop_timer() + wait_seconds = self._process_jobs() + self._start_timer(wait_seconds) + + def _create_default_executor(self): + from apscheduler.executors.twisted import TwistedExecutor + return TwistedExecutor() diff --git a/lib/python3.11/site-packages/apscheduler/triggers/__init__.py b/lib/python3.11/site-packages/apscheduler/triggers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/apscheduler/triggers/base.py b/lib/python3.11/site-packages/apscheduler/triggers/base.py new file mode 100644 index 0000000..55d010d --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/triggers/base.py @@ -0,0 +1,37 @@ +from abc import ABCMeta, abstractmethod +from datetime import timedelta +import random + +import six + + +class BaseTrigger(six.with_metaclass(ABCMeta)): + """Abstract base class that defines the interface that every trigger must implement.""" + + __slots__ = () + + @abstractmethod + def get_next_fire_time(self, previous_fire_time, now): + """ + Returns the next datetime to fire on, If no such datetime can be calculated, returns + ``None``. + + :param datetime.datetime previous_fire_time: the previous time the trigger was fired + :param datetime.datetime now: current datetime + """ + + def _apply_jitter(self, next_fire_time, jitter, now): + """ + Randomize ``next_fire_time`` by adding a random value (the jitter). + + :param datetime.datetime|None next_fire_time: next fire time without jitter applied. If + ``None``, returns ``None``. + :param int|None jitter: maximum number of seconds to add to ``next_fire_time`` + (if ``None`` or ``0``, returns ``next_fire_time``) + :param datetime.datetime now: current datetime + :return datetime.datetime|None: next fire time with a jitter. + """ + if next_fire_time is None or not jitter: + return next_fire_time + + return next_fire_time + timedelta(seconds=random.uniform(0, jitter)) diff --git a/lib/python3.11/site-packages/apscheduler/triggers/combining.py b/lib/python3.11/site-packages/apscheduler/triggers/combining.py new file mode 100644 index 0000000..bb90006 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/triggers/combining.py @@ -0,0 +1,95 @@ +from apscheduler.triggers.base import BaseTrigger +from apscheduler.util import obj_to_ref, ref_to_obj + + +class BaseCombiningTrigger(BaseTrigger): + __slots__ = ('triggers', 'jitter') + + def __init__(self, triggers, jitter=None): + self.triggers = triggers + self.jitter = jitter + + def __getstate__(self): + return { + 'version': 1, + 'triggers': [(obj_to_ref(trigger.__class__), trigger.__getstate__()) + for trigger in self.triggers], + 'jitter': self.jitter + } + + def __setstate__(self, state): + if state.get('version', 1) > 1: + raise ValueError( + 'Got serialized data for version %s of %s, but only versions up to 1 can be ' + 'handled' % (state['version'], self.__class__.__name__)) + + self.jitter = state['jitter'] + self.triggers = [] + for clsref, state in state['triggers']: + cls = ref_to_obj(clsref) + trigger = cls.__new__(cls) + trigger.__setstate__(state) + self.triggers.append(trigger) + + def __repr__(self): + return '<{}({}{})>'.format(self.__class__.__name__, self.triggers, + ', jitter={}'.format(self.jitter) if self.jitter else '') + + +class AndTrigger(BaseCombiningTrigger): + """ + Always returns the earliest next fire time that all the given triggers can agree on. + The trigger is considered to be finished when any of the given triggers has finished its + schedule. + + Trigger alias: ``and`` + + :param list triggers: triggers to combine + :param int|None jitter: delay the job execution by ``jitter`` seconds at most + """ + + __slots__ = () + + def get_next_fire_time(self, previous_fire_time, now): + while True: + fire_times = [trigger.get_next_fire_time(previous_fire_time, now) + for trigger in self.triggers] + if None in fire_times: + return None + elif min(fire_times) == max(fire_times): + return self._apply_jitter(fire_times[0], self.jitter, now) + else: + now = max(fire_times) + + def __str__(self): + return 'and[{}]'.format(', '.join(str(trigger) for trigger in self.triggers)) + + +class OrTrigger(BaseCombiningTrigger): + """ + Always returns the earliest next fire time produced by any of the given triggers. + The trigger is considered finished when all the given triggers have finished their schedules. + + Trigger alias: ``or`` + + :param list triggers: triggers to combine + :param int|None jitter: delay the job execution by ``jitter`` seconds at most + + .. note:: Triggers that depends on the previous fire time, such as the interval trigger, may + seem to behave strangely since they are always passed the previous fire time produced by + any of the given triggers. + """ + + __slots__ = () + + def get_next_fire_time(self, previous_fire_time, now): + fire_times = [trigger.get_next_fire_time(previous_fire_time, now) + for trigger in self.triggers] + fire_times = [fire_time for fire_time in fire_times if fire_time is not None] + if fire_times: + return self._apply_jitter(min(fire_times), self.jitter, now) + else: + return None + + def __str__(self): + return 'or[{}]'.format(', '.join(str(trigger) for trigger in self.triggers)) diff --git a/lib/python3.11/site-packages/apscheduler/triggers/cron/__init__.py b/lib/python3.11/site-packages/apscheduler/triggers/cron/__init__.py new file mode 100644 index 0000000..b5389dd --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/triggers/cron/__init__.py @@ -0,0 +1,239 @@ +from datetime import datetime, timedelta + +from tzlocal import get_localzone +import six + +from apscheduler.triggers.base import BaseTrigger +from apscheduler.triggers.cron.fields import ( + BaseField, MonthField, WeekField, DayOfMonthField, DayOfWeekField, DEFAULT_VALUES) +from apscheduler.util import ( + datetime_ceil, convert_to_datetime, datetime_repr, astimezone, localize, normalize) + + +class CronTrigger(BaseTrigger): + """ + Triggers when current time matches all specified time constraints, + similarly to how the UNIX cron scheduler works. + + :param int|str year: 4-digit year + :param int|str month: month (1-12) + :param int|str day: day of month (1-31) + :param int|str week: ISO week (1-53) + :param int|str day_of_week: number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun) + :param int|str hour: hour (0-23) + :param int|str minute: minute (0-59) + :param int|str second: second (0-59) + :param datetime|str start_date: earliest possible date/time to trigger on (inclusive) + :param datetime|str end_date: latest possible date/time to trigger on (inclusive) + :param datetime.tzinfo|str timezone: time zone to use for the date/time calculations (defaults + to scheduler timezone) + :param int|None jitter: delay the job execution by ``jitter`` seconds at most + + .. note:: The first weekday is always **monday**. + """ + + FIELD_NAMES = ('year', 'month', 'day', 'week', 'day_of_week', 'hour', 'minute', 'second') + FIELDS_MAP = { + 'year': BaseField, + 'month': MonthField, + 'week': WeekField, + 'day': DayOfMonthField, + 'day_of_week': DayOfWeekField, + 'hour': BaseField, + 'minute': BaseField, + 'second': BaseField + } + + __slots__ = 'timezone', 'start_date', 'end_date', 'fields', 'jitter' + + def __init__(self, year=None, month=None, day=None, week=None, day_of_week=None, hour=None, + minute=None, second=None, start_date=None, end_date=None, timezone=None, + jitter=None): + if timezone: + self.timezone = astimezone(timezone) + elif isinstance(start_date, datetime) and start_date.tzinfo: + self.timezone = start_date.tzinfo + elif isinstance(end_date, datetime) and end_date.tzinfo: + self.timezone = end_date.tzinfo + else: + self.timezone = get_localzone() + + self.start_date = convert_to_datetime(start_date, self.timezone, 'start_date') + self.end_date = convert_to_datetime(end_date, self.timezone, 'end_date') + + self.jitter = jitter + + values = dict((key, value) for (key, value) in six.iteritems(locals()) + if key in self.FIELD_NAMES and value is not None) + self.fields = [] + assign_defaults = False + for field_name in self.FIELD_NAMES: + if field_name in values: + exprs = values.pop(field_name) + is_default = False + assign_defaults = not values + elif assign_defaults: + exprs = DEFAULT_VALUES[field_name] + is_default = True + else: + exprs = '*' + is_default = True + + field_class = self.FIELDS_MAP[field_name] + field = field_class(field_name, exprs, is_default) + self.fields.append(field) + + @classmethod + def from_crontab(cls, expr, timezone=None): + """ + Create a :class:`~CronTrigger` from a standard crontab expression. + + See https://en.wikipedia.org/wiki/Cron for more information on the format accepted here. + + :param expr: minute, hour, day of month, month, day of week + :param datetime.tzinfo|str timezone: time zone to use for the date/time calculations ( + defaults to scheduler timezone) + :return: a :class:`~CronTrigger` instance + + """ + values = expr.split() + if len(values) != 5: + raise ValueError('Wrong number of fields; got {}, expected 5'.format(len(values))) + + return cls(minute=values[0], hour=values[1], day=values[2], month=values[3], + day_of_week=values[4], timezone=timezone) + + def _increment_field_value(self, dateval, fieldnum): + """ + Increments the designated field and resets all less significant fields to their minimum + values. + + :type dateval: datetime + :type fieldnum: int + :return: a tuple containing the new date, and the number of the field that was actually + incremented + :rtype: tuple + """ + + values = {} + i = 0 + while i < len(self.fields): + field = self.fields[i] + if not field.REAL: + if i == fieldnum: + fieldnum -= 1 + i -= 1 + else: + i += 1 + continue + + if i < fieldnum: + values[field.name] = field.get_value(dateval) + i += 1 + elif i > fieldnum: + values[field.name] = field.get_min(dateval) + i += 1 + else: + value = field.get_value(dateval) + maxval = field.get_max(dateval) + if value == maxval: + fieldnum -= 1 + i -= 1 + else: + values[field.name] = value + 1 + i += 1 + + difference = datetime(**values) - dateval.replace(tzinfo=None) + return normalize(dateval + difference), fieldnum + + def _set_field_value(self, dateval, fieldnum, new_value): + values = {} + for i, field in enumerate(self.fields): + if field.REAL: + if i < fieldnum: + values[field.name] = field.get_value(dateval) + elif i > fieldnum: + values[field.name] = field.get_min(dateval) + else: + values[field.name] = new_value + + return localize(datetime(**values), self.timezone) + + def get_next_fire_time(self, previous_fire_time, now): + if previous_fire_time: + start_date = min(now, previous_fire_time + timedelta(microseconds=1)) + if start_date == previous_fire_time: + start_date += timedelta(microseconds=1) + else: + start_date = max(now, self.start_date) if self.start_date else now + + fieldnum = 0 + next_date = datetime_ceil(start_date).astimezone(self.timezone) + while 0 <= fieldnum < len(self.fields): + field = self.fields[fieldnum] + curr_value = field.get_value(next_date) + next_value = field.get_next_value(next_date) + + if next_value is None: + # No valid value was found + next_date, fieldnum = self._increment_field_value(next_date, fieldnum - 1) + elif next_value > curr_value: + # A valid, but higher than the starting value, was found + if field.REAL: + next_date = self._set_field_value(next_date, fieldnum, next_value) + fieldnum += 1 + else: + next_date, fieldnum = self._increment_field_value(next_date, fieldnum) + else: + # A valid value was found, no changes necessary + fieldnum += 1 + + # Return if the date has rolled past the end date + if self.end_date and next_date > self.end_date: + return None + + if fieldnum >= 0: + next_date = self._apply_jitter(next_date, self.jitter, now) + return min(next_date, self.end_date) if self.end_date else next_date + + def __getstate__(self): + return { + 'version': 2, + 'timezone': self.timezone, + 'start_date': self.start_date, + 'end_date': self.end_date, + 'fields': self.fields, + 'jitter': self.jitter, + } + + def __setstate__(self, state): + # This is for compatibility with APScheduler 3.0.x + if isinstance(state, tuple): + state = state[1] + + if state.get('version', 1) > 2: + raise ValueError( + 'Got serialized data for version %s of %s, but only versions up to 2 can be ' + 'handled' % (state['version'], self.__class__.__name__)) + + self.timezone = state['timezone'] + self.start_date = state['start_date'] + self.end_date = state['end_date'] + self.fields = state['fields'] + self.jitter = state.get('jitter') + + def __str__(self): + options = ["%s='%s'" % (f.name, f) for f in self.fields if not f.is_default] + return 'cron[%s]' % (', '.join(options)) + + def __repr__(self): + options = ["%s='%s'" % (f.name, f) for f in self.fields if not f.is_default] + if self.start_date: + options.append("start_date=%r" % datetime_repr(self.start_date)) + if self.end_date: + options.append("end_date=%r" % datetime_repr(self.end_date)) + if self.jitter: + options.append('jitter=%s' % self.jitter) + + return "<%s (%s, timezone='%s')>" % ( + self.__class__.__name__, ', '.join(options), self.timezone) diff --git a/lib/python3.11/site-packages/apscheduler/triggers/cron/expressions.py b/lib/python3.11/site-packages/apscheduler/triggers/cron/expressions.py new file mode 100644 index 0000000..55a3716 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/triggers/cron/expressions.py @@ -0,0 +1,251 @@ +"""This module contains the expressions applicable for CronTrigger's fields.""" + +from calendar import monthrange +import re + +from apscheduler.util import asint + +__all__ = ('AllExpression', 'RangeExpression', 'WeekdayRangeExpression', + 'WeekdayPositionExpression', 'LastDayOfMonthExpression') + + +WEEKDAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] +MONTHS = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'] + + +class AllExpression(object): + value_re = re.compile(r'\*(?:/(?P\d+))?$') + + def __init__(self, step=None): + self.step = asint(step) + if self.step == 0: + raise ValueError('Increment must be higher than 0') + + def validate_range(self, field_name): + from apscheduler.triggers.cron.fields import MIN_VALUES, MAX_VALUES + + value_range = MAX_VALUES[field_name] - MIN_VALUES[field_name] + if self.step and self.step > value_range: + raise ValueError('the step value ({}) is higher than the total range of the ' + 'expression ({})'.format(self.step, value_range)) + + def get_next_value(self, date, field): + start = field.get_value(date) + minval = field.get_min(date) + maxval = field.get_max(date) + start = max(start, minval) + + if not self.step: + next = start + else: + distance_to_next = (self.step - (start - minval)) % self.step + next = start + distance_to_next + + if next <= maxval: + return next + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.step == other.step + + def __str__(self): + if self.step: + return '*/%d' % self.step + return '*' + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, self.step) + + +class RangeExpression(AllExpression): + value_re = re.compile( + r'(?P\d+)(?:-(?P\d+))?(?:/(?P\d+))?$') + + def __init__(self, first, last=None, step=None): + super(RangeExpression, self).__init__(step) + first = asint(first) + last = asint(last) + if last is None and step is None: + last = first + if last is not None and first > last: + raise ValueError('The minimum value in a range must not be higher than the maximum') + self.first = first + self.last = last + + def validate_range(self, field_name): + from apscheduler.triggers.cron.fields import MIN_VALUES, MAX_VALUES + + super(RangeExpression, self).validate_range(field_name) + if self.first < MIN_VALUES[field_name]: + raise ValueError('the first value ({}) is lower than the minimum value ({})' + .format(self.first, MIN_VALUES[field_name])) + if self.last is not None and self.last > MAX_VALUES[field_name]: + raise ValueError('the last value ({}) is higher than the maximum value ({})' + .format(self.last, MAX_VALUES[field_name])) + value_range = (self.last or MAX_VALUES[field_name]) - self.first + if self.step and self.step > value_range: + raise ValueError('the step value ({}) is higher than the total range of the ' + 'expression ({})'.format(self.step, value_range)) + + def get_next_value(self, date, field): + startval = field.get_value(date) + minval = field.get_min(date) + maxval = field.get_max(date) + + # Apply range limits + minval = max(minval, self.first) + maxval = min(maxval, self.last) if self.last is not None else maxval + nextval = max(minval, startval) + + # Apply the step if defined + if self.step: + distance_to_next = (self.step - (nextval - minval)) % self.step + nextval += distance_to_next + + return nextval if nextval <= maxval else None + + def __eq__(self, other): + return (isinstance(other, self.__class__) and self.first == other.first and + self.last == other.last) + + def __str__(self): + if self.last != self.first and self.last is not None: + range = '%d-%d' % (self.first, self.last) + else: + range = str(self.first) + + if self.step: + return '%s/%d' % (range, self.step) + return range + + def __repr__(self): + args = [str(self.first)] + if self.last != self.first and self.last is not None or self.step: + args.append(str(self.last)) + if self.step: + args.append(str(self.step)) + return "%s(%s)" % (self.__class__.__name__, ', '.join(args)) + + +class MonthRangeExpression(RangeExpression): + value_re = re.compile(r'(?P[a-z]+)(?:-(?P[a-z]+))?', re.IGNORECASE) + + def __init__(self, first, last=None): + try: + first_num = MONTHS.index(first.lower()) + 1 + except ValueError: + raise ValueError('Invalid month name "%s"' % first) + + if last: + try: + last_num = MONTHS.index(last.lower()) + 1 + except ValueError: + raise ValueError('Invalid month name "%s"' % last) + else: + last_num = None + + super(MonthRangeExpression, self).__init__(first_num, last_num) + + def __str__(self): + if self.last != self.first and self.last is not None: + return '%s-%s' % (MONTHS[self.first - 1], MONTHS[self.last - 1]) + return MONTHS[self.first - 1] + + def __repr__(self): + args = ["'%s'" % MONTHS[self.first]] + if self.last != self.first and self.last is not None: + args.append("'%s'" % MONTHS[self.last - 1]) + return "%s(%s)" % (self.__class__.__name__, ', '.join(args)) + + +class WeekdayRangeExpression(RangeExpression): + value_re = re.compile(r'(?P[a-z]+)(?:-(?P[a-z]+))?', re.IGNORECASE) + + def __init__(self, first, last=None): + try: + first_num = WEEKDAYS.index(first.lower()) + except ValueError: + raise ValueError('Invalid weekday name "%s"' % first) + + if last: + try: + last_num = WEEKDAYS.index(last.lower()) + except ValueError: + raise ValueError('Invalid weekday name "%s"' % last) + else: + last_num = None + + super(WeekdayRangeExpression, self).__init__(first_num, last_num) + + def __str__(self): + if self.last != self.first and self.last is not None: + return '%s-%s' % (WEEKDAYS[self.first], WEEKDAYS[self.last]) + return WEEKDAYS[self.first] + + def __repr__(self): + args = ["'%s'" % WEEKDAYS[self.first]] + if self.last != self.first and self.last is not None: + args.append("'%s'" % WEEKDAYS[self.last]) + return "%s(%s)" % (self.__class__.__name__, ', '.join(args)) + + +class WeekdayPositionExpression(AllExpression): + options = ['1st', '2nd', '3rd', '4th', '5th', 'last'] + value_re = re.compile(r'(?P%s) +(?P(?:\d+|\w+))' % + '|'.join(options), re.IGNORECASE) + + def __init__(self, option_name, weekday_name): + super(WeekdayPositionExpression, self).__init__(None) + try: + self.option_num = self.options.index(option_name.lower()) + except ValueError: + raise ValueError('Invalid weekday position "%s"' % option_name) + + try: + self.weekday = WEEKDAYS.index(weekday_name.lower()) + except ValueError: + raise ValueError('Invalid weekday name "%s"' % weekday_name) + + def get_next_value(self, date, field): + # Figure out the weekday of the month's first day and the number of days in that month + first_day_wday, last_day = monthrange(date.year, date.month) + + # Calculate which day of the month is the first of the target weekdays + first_hit_day = self.weekday - first_day_wday + 1 + if first_hit_day <= 0: + first_hit_day += 7 + + # Calculate what day of the month the target weekday would be + if self.option_num < 5: + target_day = first_hit_day + self.option_num * 7 + else: + target_day = first_hit_day + ((last_day - first_hit_day) // 7) * 7 + + if target_day <= last_day and target_day >= date.day: + return target_day + + def __eq__(self, other): + return (super(WeekdayPositionExpression, self).__eq__(other) and + self.option_num == other.option_num and self.weekday == other.weekday) + + def __str__(self): + return '%s %s' % (self.options[self.option_num], WEEKDAYS[self.weekday]) + + def __repr__(self): + return "%s('%s', '%s')" % (self.__class__.__name__, self.options[self.option_num], + WEEKDAYS[self.weekday]) + + +class LastDayOfMonthExpression(AllExpression): + value_re = re.compile(r'last', re.IGNORECASE) + + def __init__(self): + super(LastDayOfMonthExpression, self).__init__(None) + + def get_next_value(self, date, field): + return monthrange(date.year, date.month)[1] + + def __str__(self): + return 'last' + + def __repr__(self): + return "%s()" % self.__class__.__name__ diff --git a/lib/python3.11/site-packages/apscheduler/triggers/cron/fields.py b/lib/python3.11/site-packages/apscheduler/triggers/cron/fields.py new file mode 100644 index 0000000..86d620c --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/triggers/cron/fields.py @@ -0,0 +1,111 @@ +"""Fields represent CronTrigger options which map to :class:`~datetime.datetime` fields.""" + +from calendar import monthrange +import re + +import six + +from apscheduler.triggers.cron.expressions import ( + AllExpression, RangeExpression, WeekdayPositionExpression, LastDayOfMonthExpression, + WeekdayRangeExpression, MonthRangeExpression) + + +__all__ = ('MIN_VALUES', 'MAX_VALUES', 'DEFAULT_VALUES', 'BaseField', 'WeekField', + 'DayOfMonthField', 'DayOfWeekField') + + +MIN_VALUES = {'year': 1970, 'month': 1, 'day': 1, 'week': 1, 'day_of_week': 0, 'hour': 0, + 'minute': 0, 'second': 0} +MAX_VALUES = {'year': 9999, 'month': 12, 'day': 31, 'week': 53, 'day_of_week': 6, 'hour': 23, + 'minute': 59, 'second': 59} +DEFAULT_VALUES = {'year': '*', 'month': 1, 'day': 1, 'week': '*', 'day_of_week': '*', 'hour': 0, + 'minute': 0, 'second': 0} +SEPARATOR = re.compile(' *, *') + + +class BaseField(object): + REAL = True + COMPILERS = [AllExpression, RangeExpression] + + def __init__(self, name, exprs, is_default=False): + self.name = name + self.is_default = is_default + self.compile_expressions(exprs) + + def get_min(self, dateval): + return MIN_VALUES[self.name] + + def get_max(self, dateval): + return MAX_VALUES[self.name] + + def get_value(self, dateval): + return getattr(dateval, self.name) + + def get_next_value(self, dateval): + smallest = None + for expr in self.expressions: + value = expr.get_next_value(dateval, self) + if smallest is None or (value is not None and value < smallest): + smallest = value + + return smallest + + def compile_expressions(self, exprs): + self.expressions = [] + + # Split a comma-separated expression list, if any + for expr in SEPARATOR.split(str(exprs).strip()): + self.compile_expression(expr) + + def compile_expression(self, expr): + for compiler in self.COMPILERS: + match = compiler.value_re.match(expr) + if match: + compiled_expr = compiler(**match.groupdict()) + + try: + compiled_expr.validate_range(self.name) + except ValueError as e: + exc = ValueError('Error validating expression {!r}: {}'.format(expr, e)) + six.raise_from(exc, None) + + self.expressions.append(compiled_expr) + return + + raise ValueError('Unrecognized expression "%s" for field "%s"' % (expr, self.name)) + + def __eq__(self, other): + return isinstance(self, self.__class__) and self.expressions == other.expressions + + def __str__(self): + expr_strings = (str(e) for e in self.expressions) + return ','.join(expr_strings) + + def __repr__(self): + return "%s('%s', '%s')" % (self.__class__.__name__, self.name, self) + + +class WeekField(BaseField): + REAL = False + + def get_value(self, dateval): + return dateval.isocalendar()[1] + + +class DayOfMonthField(BaseField): + COMPILERS = BaseField.COMPILERS + [WeekdayPositionExpression, LastDayOfMonthExpression] + + def get_max(self, dateval): + return monthrange(dateval.year, dateval.month)[1] + + +class DayOfWeekField(BaseField): + REAL = False + COMPILERS = BaseField.COMPILERS + [WeekdayRangeExpression] + + def get_value(self, dateval): + return dateval.weekday() + + +class MonthField(BaseField): + COMPILERS = BaseField.COMPILERS + [MonthRangeExpression] diff --git a/lib/python3.11/site-packages/apscheduler/triggers/date.py b/lib/python3.11/site-packages/apscheduler/triggers/date.py new file mode 100644 index 0000000..0768100 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/triggers/date.py @@ -0,0 +1,51 @@ +from datetime import datetime + +from tzlocal import get_localzone + +from apscheduler.triggers.base import BaseTrigger +from apscheduler.util import convert_to_datetime, datetime_repr, astimezone + + +class DateTrigger(BaseTrigger): + """ + Triggers once on the given datetime. If ``run_date`` is left empty, current time is used. + + :param datetime|str run_date: the date/time to run the job at + :param datetime.tzinfo|str timezone: time zone for ``run_date`` if it doesn't have one already + """ + + __slots__ = 'run_date' + + def __init__(self, run_date=None, timezone=None): + timezone = astimezone(timezone) or get_localzone() + if run_date is not None: + self.run_date = convert_to_datetime(run_date, timezone, 'run_date') + else: + self.run_date = datetime.now(timezone) + + def get_next_fire_time(self, previous_fire_time, now): + return self.run_date if previous_fire_time is None else None + + def __getstate__(self): + return { + 'version': 1, + 'run_date': self.run_date + } + + def __setstate__(self, state): + # This is for compatibility with APScheduler 3.0.x + if isinstance(state, tuple): + state = state[1] + + if state.get('version', 1) > 1: + raise ValueError( + 'Got serialized data for version %s of %s, but only version 1 can be handled' % + (state['version'], self.__class__.__name__)) + + self.run_date = state['run_date'] + + def __str__(self): + return 'date[%s]' % datetime_repr(self.run_date) + + def __repr__(self): + return "<%s (run_date='%s')>" % (self.__class__.__name__, datetime_repr(self.run_date)) diff --git a/lib/python3.11/site-packages/apscheduler/triggers/interval.py b/lib/python3.11/site-packages/apscheduler/triggers/interval.py new file mode 100644 index 0000000..b0e2dbd --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/triggers/interval.py @@ -0,0 +1,108 @@ +from datetime import timedelta, datetime +from math import ceil + +from tzlocal import get_localzone + +from apscheduler.triggers.base import BaseTrigger +from apscheduler.util import ( + convert_to_datetime, normalize, timedelta_seconds, datetime_repr, + astimezone) + + +class IntervalTrigger(BaseTrigger): + """ + Triggers on specified intervals, starting on ``start_date`` if specified, ``datetime.now()`` + + interval otherwise. + + :param int weeks: number of weeks to wait + :param int days: number of days to wait + :param int hours: number of hours to wait + :param int minutes: number of minutes to wait + :param int seconds: number of seconds to wait + :param datetime|str start_date: starting point for the interval calculation + :param datetime|str end_date: latest possible date/time to trigger on + :param datetime.tzinfo|str timezone: time zone to use for the date/time calculations + :param int|None jitter: delay the job execution by ``jitter`` seconds at most + """ + + __slots__ = 'timezone', 'start_date', 'end_date', 'interval', 'interval_length', 'jitter' + + def __init__(self, weeks=0, days=0, hours=0, minutes=0, seconds=0, start_date=None, + end_date=None, timezone=None, jitter=None): + self.interval = timedelta(weeks=weeks, days=days, hours=hours, minutes=minutes, + seconds=seconds) + self.interval_length = timedelta_seconds(self.interval) + if self.interval_length == 0: + self.interval = timedelta(seconds=1) + self.interval_length = 1 + + if timezone: + self.timezone = astimezone(timezone) + elif isinstance(start_date, datetime) and start_date.tzinfo: + self.timezone = start_date.tzinfo + elif isinstance(end_date, datetime) and end_date.tzinfo: + self.timezone = end_date.tzinfo + else: + self.timezone = get_localzone() + + start_date = start_date or (datetime.now(self.timezone) + self.interval) + self.start_date = convert_to_datetime(start_date, self.timezone, 'start_date') + self.end_date = convert_to_datetime(end_date, self.timezone, 'end_date') + + self.jitter = jitter + + def get_next_fire_time(self, previous_fire_time, now): + if previous_fire_time: + next_fire_time = previous_fire_time + self.interval + elif self.start_date > now: + next_fire_time = self.start_date + else: + timediff_seconds = timedelta_seconds(now - self.start_date) + next_interval_num = int(ceil(timediff_seconds / self.interval_length)) + next_fire_time = self.start_date + self.interval * next_interval_num + + if self.jitter is not None: + next_fire_time = self._apply_jitter(next_fire_time, self.jitter, now) + + if not self.end_date or next_fire_time <= self.end_date: + return normalize(next_fire_time) + + def __getstate__(self): + return { + 'version': 2, + 'timezone': self.timezone, + 'start_date': self.start_date, + 'end_date': self.end_date, + 'interval': self.interval, + 'jitter': self.jitter, + } + + def __setstate__(self, state): + # This is for compatibility with APScheduler 3.0.x + if isinstance(state, tuple): + state = state[1] + + if state.get('version', 1) > 2: + raise ValueError( + 'Got serialized data for version %s of %s, but only versions up to 2 can be ' + 'handled' % (state['version'], self.__class__.__name__)) + + self.timezone = state['timezone'] + self.start_date = state['start_date'] + self.end_date = state['end_date'] + self.interval = state['interval'] + self.interval_length = timedelta_seconds(self.interval) + self.jitter = state.get('jitter') + + def __str__(self): + return 'interval[%s]' % str(self.interval) + + def __repr__(self): + options = ['interval=%r' % self.interval, 'start_date=%r' % datetime_repr(self.start_date)] + if self.end_date: + options.append("end_date=%r" % datetime_repr(self.end_date)) + if self.jitter: + options.append('jitter=%s' % self.jitter) + + return "<%s (%s, timezone='%s')>" % ( + self.__class__.__name__, ', '.join(options), self.timezone) diff --git a/lib/python3.11/site-packages/apscheduler/util.py b/lib/python3.11/site-packages/apscheduler/util.py new file mode 100644 index 0000000..64b27d7 --- /dev/null +++ b/lib/python3.11/site-packages/apscheduler/util.py @@ -0,0 +1,430 @@ +"""This module contains several handy functions primarily meant for internal use.""" + +from __future__ import division + +from asyncio import iscoroutinefunction +from datetime import date, datetime, time, timedelta, tzinfo +from calendar import timegm +from functools import partial +from inspect import isclass, ismethod +import re +import sys + +from pytz import timezone, utc, FixedOffset +import six + +try: + from inspect import signature +except ImportError: # pragma: nocover + from funcsigs import signature + +try: + from threading import TIMEOUT_MAX +except ImportError: + TIMEOUT_MAX = 4294967 # Maximum value accepted by Event.wait() on Windows + +__all__ = ('asint', 'asbool', 'astimezone', 'convert_to_datetime', 'datetime_to_utc_timestamp', + 'utc_timestamp_to_datetime', 'timedelta_seconds', 'datetime_ceil', 'get_callable_name', + 'obj_to_ref', 'ref_to_obj', 'maybe_ref', 'repr_escape', 'check_callable_args', + 'normalize', 'localize', 'TIMEOUT_MAX') + + +class _Undefined(object): + def __nonzero__(self): + return False + + def __bool__(self): + return False + + def __repr__(self): + return '' + + +undefined = _Undefined() #: a unique object that only signifies that no value is defined + + +def asint(text): + """ + Safely converts a string to an integer, returning ``None`` if the string is ``None``. + + :type text: str + :rtype: int + + """ + if text is not None: + return int(text) + + +def asbool(obj): + """ + Interprets an object as a boolean value. + + :rtype: bool + + """ + if isinstance(obj, str): + obj = obj.strip().lower() + if obj in ('true', 'yes', 'on', 'y', 't', '1'): + return True + if obj in ('false', 'no', 'off', 'n', 'f', '0'): + return False + raise ValueError('Unable to interpret value "%s" as boolean' % obj) + return bool(obj) + + +def astimezone(obj): + """ + Interprets an object as a timezone. + + :rtype: tzinfo + + """ + if isinstance(obj, six.string_types): + return timezone(obj) + if isinstance(obj, tzinfo): + if obj.tzname(None) == 'local': + raise ValueError( + 'Unable to determine the name of the local timezone -- you must explicitly ' + 'specify the name of the local timezone. Please refrain from using timezones like ' + 'EST to prevent problems with daylight saving time. Instead, use a locale based ' + 'timezone name (such as Europe/Helsinki).') + return obj + if obj is not None: + raise TypeError('Expected tzinfo, got %s instead' % obj.__class__.__name__) + + +_DATE_REGEX = re.compile( + r'(?P\d{4})-(?P\d{1,2})-(?P\d{1,2})' + r'(?:[ T](?P\d{1,2}):(?P\d{1,2}):(?P\d{1,2})' + r'(?:\.(?P\d{1,6}))?' + r'(?PZ|[+-]\d\d:\d\d)?)?$') + + +def convert_to_datetime(input, tz, arg_name): + """ + Converts the given object to a timezone aware datetime object. + + If a timezone aware datetime object is passed, it is returned unmodified. + If a native datetime object is passed, it is given the specified timezone. + If the input is a string, it is parsed as a datetime with the given timezone. + + Date strings are accepted in three different forms: date only (Y-m-d), date with time + (Y-m-d H:M:S) or with date+time with microseconds (Y-m-d H:M:S.micro). Additionally you can + override the time zone by giving a specific offset in the format specified by ISO 8601: + Z (UTC), +HH:MM or -HH:MM. + + :param str|datetime input: the datetime or string to convert to a timezone aware datetime + :param datetime.tzinfo tz: timezone to interpret ``input`` in + :param str arg_name: the name of the argument (used in an error message) + :rtype: datetime + + """ + if input is None: + return + elif isinstance(input, datetime): + datetime_ = input + elif isinstance(input, date): + datetime_ = datetime.combine(input, time()) + elif isinstance(input, six.string_types): + m = _DATE_REGEX.match(input) + if not m: + raise ValueError('Invalid date string') + + values = m.groupdict() + tzname = values.pop('timezone') + if tzname == 'Z': + tz = utc + elif tzname: + hours, minutes = (int(x) for x in tzname[1:].split(':')) + sign = 1 if tzname[0] == '+' else -1 + tz = FixedOffset(sign * (hours * 60 + minutes)) + + values = {k: int(v or 0) for k, v in values.items()} + datetime_ = datetime(**values) + else: + raise TypeError('Unsupported type for %s: %s' % (arg_name, input.__class__.__name__)) + + if datetime_.tzinfo is not None: + return datetime_ + if tz is None: + raise ValueError( + 'The "tz" argument must be specified if %s has no timezone information' % arg_name) + if isinstance(tz, six.string_types): + tz = timezone(tz) + + return localize(datetime_, tz) + + +def datetime_to_utc_timestamp(timeval): + """ + Converts a datetime instance to a timestamp. + + :type timeval: datetime + :rtype: float + + """ + if timeval is not None: + return timegm(timeval.utctimetuple()) + timeval.microsecond / 1000000 + + +def utc_timestamp_to_datetime(timestamp): + """ + Converts the given timestamp to a datetime instance. + + :type timestamp: float + :rtype: datetime + + """ + if timestamp is not None: + return datetime.fromtimestamp(timestamp, utc) + + +def timedelta_seconds(delta): + """ + Converts the given timedelta to seconds. + + :type delta: timedelta + :rtype: float + + """ + return delta.days * 24 * 60 * 60 + delta.seconds + \ + delta.microseconds / 1000000.0 + + +def datetime_ceil(dateval): + """ + Rounds the given datetime object upwards. + + :type dateval: datetime + + """ + if dateval.microsecond > 0: + return dateval + timedelta(seconds=1, microseconds=-dateval.microsecond) + return dateval + + +def datetime_repr(dateval): + return dateval.strftime('%Y-%m-%d %H:%M:%S %Z') if dateval else 'None' + + +def get_callable_name(func): + """ + Returns the best available display name for the given function/callable. + + :rtype: str + + """ + # the easy case (on Python 3.3+) + if hasattr(func, '__qualname__'): + return func.__qualname__ + + # class methods, bound and unbound methods + f_self = getattr(func, '__self__', None) or getattr(func, 'im_self', None) + if f_self and hasattr(func, '__name__'): + f_class = f_self if isclass(f_self) else f_self.__class__ + else: + f_class = getattr(func, 'im_class', None) + + if f_class and hasattr(func, '__name__'): + return '%s.%s' % (f_class.__name__, func.__name__) + + # class or class instance + if hasattr(func, '__call__'): + # class + if hasattr(func, '__name__'): + return func.__name__ + + # instance of a class with a __call__ method + return func.__class__.__name__ + + raise TypeError('Unable to determine a name for %r -- maybe it is not a callable?' % func) + + +def obj_to_ref(obj): + """ + Returns the path to the given callable. + + :rtype: str + :raises TypeError: if the given object is not callable + :raises ValueError: if the given object is a :class:`~functools.partial`, lambda or a nested + function + + """ + if isinstance(obj, partial): + raise ValueError('Cannot create a reference to a partial()') + + name = get_callable_name(obj) + if '' in name: + raise ValueError('Cannot create a reference to a lambda') + if '' in name: + raise ValueError('Cannot create a reference to a nested function') + + if ismethod(obj): + if hasattr(obj, 'im_self') and obj.im_self: + # bound method + module = obj.im_self.__module__ + elif hasattr(obj, 'im_class') and obj.im_class: + # unbound method + module = obj.im_class.__module__ + else: + module = obj.__module__ + else: + module = obj.__module__ + return '%s:%s' % (module, name) + + +def ref_to_obj(ref): + """ + Returns the object pointed to by ``ref``. + + :type ref: str + + """ + if not isinstance(ref, six.string_types): + raise TypeError('References must be strings') + if ':' not in ref: + raise ValueError('Invalid reference') + + modulename, rest = ref.split(':', 1) + try: + obj = __import__(modulename, fromlist=[rest]) + except ImportError: + raise LookupError('Error resolving reference %s: could not import module' % ref) + + try: + for name in rest.split('.'): + obj = getattr(obj, name) + return obj + except Exception: + raise LookupError('Error resolving reference %s: error looking up object' % ref) + + +def maybe_ref(ref): + """ + Returns the object that the given reference points to, if it is indeed a reference. + If it is not a reference, the object is returned as-is. + + """ + if not isinstance(ref, str): + return ref + return ref_to_obj(ref) + + +if six.PY2: + def repr_escape(string): + if isinstance(string, six.text_type): + return string.encode('ascii', 'backslashreplace') + return string +else: + def repr_escape(string): + return string + + +def check_callable_args(func, args, kwargs): + """ + Ensures that the given callable can be called with the given arguments. + + :type args: tuple + :type kwargs: dict + + """ + pos_kwargs_conflicts = [] # parameters that have a match in both args and kwargs + positional_only_kwargs = [] # positional-only parameters that have a match in kwargs + unsatisfied_args = [] # parameters in signature that don't have a match in args or kwargs + unsatisfied_kwargs = [] # keyword-only arguments that don't have a match in kwargs + unmatched_args = list(args) # args that didn't match any of the parameters in the signature + # kwargs that didn't match any of the parameters in the signature + unmatched_kwargs = list(kwargs) + # indicates if the signature defines *args and **kwargs respectively + has_varargs = has_var_kwargs = False + + try: + if sys.version_info >= (3, 5): + sig = signature(func, follow_wrapped=False) + else: + sig = signature(func) + except ValueError: + # signature() doesn't work against every kind of callable + return + + for param in six.itervalues(sig.parameters): + if param.kind == param.POSITIONAL_OR_KEYWORD: + if param.name in unmatched_kwargs and unmatched_args: + pos_kwargs_conflicts.append(param.name) + elif unmatched_args: + del unmatched_args[0] + elif param.name in unmatched_kwargs: + unmatched_kwargs.remove(param.name) + elif param.default is param.empty: + unsatisfied_args.append(param.name) + elif param.kind == param.POSITIONAL_ONLY: + if unmatched_args: + del unmatched_args[0] + elif param.name in unmatched_kwargs: + unmatched_kwargs.remove(param.name) + positional_only_kwargs.append(param.name) + elif param.default is param.empty: + unsatisfied_args.append(param.name) + elif param.kind == param.KEYWORD_ONLY: + if param.name in unmatched_kwargs: + unmatched_kwargs.remove(param.name) + elif param.default is param.empty: + unsatisfied_kwargs.append(param.name) + elif param.kind == param.VAR_POSITIONAL: + has_varargs = True + elif param.kind == param.VAR_KEYWORD: + has_var_kwargs = True + + # Make sure there are no conflicts between args and kwargs + if pos_kwargs_conflicts: + raise ValueError('The following arguments are supplied in both args and kwargs: %s' % + ', '.join(pos_kwargs_conflicts)) + + # Check if keyword arguments are being fed to positional-only parameters + if positional_only_kwargs: + raise ValueError('The following arguments cannot be given as keyword arguments: %s' % + ', '.join(positional_only_kwargs)) + + # Check that the number of positional arguments minus the number of matched kwargs matches the + # argspec + if unsatisfied_args: + raise ValueError('The following arguments have not been supplied: %s' % + ', '.join(unsatisfied_args)) + + # Check that all keyword-only arguments have been supplied + if unsatisfied_kwargs: + raise ValueError( + 'The following keyword-only arguments have not been supplied in kwargs: %s' % + ', '.join(unsatisfied_kwargs)) + + # Check that the callable can accept the given number of positional arguments + if not has_varargs and unmatched_args: + raise ValueError( + 'The list of positional arguments is longer than the target callable can handle ' + '(allowed: %d, given in args: %d)' % (len(args) - len(unmatched_args), len(args))) + + # Check that the callable can accept the given keyword arguments + if not has_var_kwargs and unmatched_kwargs: + raise ValueError( + 'The target callable does not accept the following keyword arguments: %s' % + ', '.join(unmatched_kwargs)) + + +def iscoroutinefunction_partial(f): + while isinstance(f, partial): + f = f.func + + # The asyncio version of iscoroutinefunction includes testing for @coroutine + # decorations vs. the inspect version which does not. + return iscoroutinefunction(f) + + +def normalize(dt): + return datetime.fromtimestamp(dt.timestamp(), dt.tzinfo) + + +def localize(dt, tzinfo): + if hasattr(tzinfo, 'localize'): + return tzinfo.localize(dt) + + return normalize(dt.replace(tzinfo=tzinfo)) diff --git a/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/INSTALLER b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/LICENSE b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/LICENSE new file mode 100644 index 0000000..033c86b --- /dev/null +++ b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/LICENSE @@ -0,0 +1,13 @@ +Copyright 2016-2020 aio-libs collaboration. + +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/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/METADATA b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/METADATA new file mode 100644 index 0000000..e68d234 --- /dev/null +++ b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/METADATA @@ -0,0 +1,133 @@ +Metadata-Version: 2.1 +Name: async-timeout +Version: 4.0.2 +Summary: Timeout context manager for asyncio programs +Home-page: https://github.com/aio-libs/async-timeout +Author: Andrew Svetlov +Author-email: andrew.svetlov@gmail.com +License: Apache 2 +Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby +Project-URL: CI: GitHub Actions, https://github.com/aio-libs/async-timeout/actions +Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/async-timeout +Project-URL: GitHub: issues, https://github.com/aio-libs/async-timeout/issues +Project-URL: GitHub: repo, https://github.com/aio-libs/async-timeout +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Topic :: Software Development :: Libraries +Classifier: Framework :: AsyncIO +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +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: >=3.6 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: typing-extensions (>=3.6.5) ; python_version < "3.8" + +async-timeout +============= +.. image:: https://travis-ci.com/aio-libs/async-timeout.svg?branch=master + :target: https://travis-ci.com/aio-libs/async-timeout +.. image:: https://codecov.io/gh/aio-libs/async-timeout/branch/master/graph/badge.svg + :target: https://codecov.io/gh/aio-libs/async-timeout +.. image:: https://img.shields.io/pypi/v/async-timeout.svg + :target: https://pypi.python.org/pypi/async-timeout +.. image:: https://badges.gitter.im/Join%20Chat.svg + :target: https://gitter.im/aio-libs/Lobby + :alt: Chat on Gitter + +asyncio-compatible timeout context manager. + + +Usage example +------------- + + +The context manager is useful in cases when you want to apply timeout +logic around block of code or in cases when ``asyncio.wait_for()`` is +not suitable. Also it's much faster than ``asyncio.wait_for()`` +because ``timeout`` doesn't create a new task. + +The ``timeout(delay, *, loop=None)`` call returns a context manager +that cancels a block on *timeout* expiring:: + + async with timeout(1.5): + await inner() + +1. If ``inner()`` is executed faster than in ``1.5`` seconds nothing + happens. +2. Otherwise ``inner()`` is cancelled internally by sending + ``asyncio.CancelledError`` into but ``asyncio.TimeoutError`` is + raised outside of context manager scope. + +*timeout* parameter could be ``None`` for skipping timeout functionality. + + +Alternatively, ``timeout_at(when)`` can be used for scheduling +at the absolute time:: + + loop = asyncio.get_event_loop() + now = loop.time() + + async with timeout_at(now + 1.5): + await inner() + + +Please note: it is not POSIX time but a time with +undefined starting base, e.g. the time of the system power on. + + +Context manager has ``.expired`` property for check if timeout happens +exactly in context manager:: + + async with timeout(1.5) as cm: + await inner() + print(cm.expired) + +The property is ``True`` if ``inner()`` execution is cancelled by +timeout context manager. + +If ``inner()`` call explicitly raises ``TimeoutError`` ``cm.expired`` +is ``False``. + +The scheduled deadline time is available as ``.deadline`` property:: + + async with timeout(1.5) as cm: + cm.deadline + +Not finished yet timeout can be rescheduled by ``shift_by()`` +or ``shift_to()`` methods:: + + async with timeout(1.5) as cm: + cm.shift(1) # add another second on waiting + cm.update(loop.time() + 5) # reschedule to now+5 seconds + +Rescheduling is forbidden if the timeout is expired or after exit from ``async with`` +code block. + + +Installation +------------ + +:: + + $ pip install async-timeout + +The library is Python 3 only! + + + +Authors and License +------------------- + +The module is written by Andrew Svetlov. + +It's *Apache 2* licensed and freely available. + + diff --git a/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/RECORD b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/RECORD new file mode 100644 index 0000000..b73fa9e --- /dev/null +++ b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/RECORD @@ -0,0 +1,11 @@ +async_timeout-4.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +async_timeout-4.0.2.dist-info/LICENSE,sha256=4Y17uPUT4sRrtYXJS1hb0wcg3TzLId2weG9y0WZY-Sw,568 +async_timeout-4.0.2.dist-info/METADATA,sha256=2pfMxxBst5vQ7SfMy5TDaDU0cRgCSQa7wcD5eI-Ew-8,4193 +async_timeout-4.0.2.dist-info/RECORD,, +async_timeout-4.0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +async_timeout-4.0.2.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +async_timeout-4.0.2.dist-info/top_level.txt,sha256=9oM4e7Twq8iD_7_Q3Mz0E6GPIB6vJvRFo-UBwUQtBDU,14 +async_timeout-4.0.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +async_timeout/__init__.py,sha256=N-JUI_VExhHnO0emkF_-h08dl4HBgOje16N4Ci-W-go,7487 +async_timeout/__pycache__/__init__.cpython-311.pyc,, +async_timeout/py.typed,sha256=tyozzRT1fziXETDxokmuyt6jhOmtjUbnVNJdZcG7ik0,12 diff --git a/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/REQUESTED b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/WHEEL b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/WHEEL new file mode 100644 index 0000000..5bad85f --- /dev/null +++ b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/top_level.txt b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/top_level.txt new file mode 100644 index 0000000..ad29955 --- /dev/null +++ b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +async_timeout diff --git a/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/zip-safe b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/python3.11/site-packages/async_timeout-4.0.2.dist-info/zip-safe @@ -0,0 +1 @@ + diff --git a/lib/python3.11/site-packages/async_timeout/__init__.py b/lib/python3.11/site-packages/async_timeout/__init__.py new file mode 100644 index 0000000..179d1b0 --- /dev/null +++ b/lib/python3.11/site-packages/async_timeout/__init__.py @@ -0,0 +1,247 @@ +import asyncio +import enum +import sys +import warnings +from types import TracebackType +from typing import Any, Optional, Type + + +if sys.version_info >= (3, 8): + from typing import final +else: + from typing_extensions import final + + +__version__ = "4.0.2" + + +__all__ = ("timeout", "timeout_at", "Timeout") + + +def timeout(delay: Optional[float]) -> "Timeout": + """timeout context manager. + + Useful in cases when you want to apply timeout logic around block + of code or in cases when asyncio.wait_for is not suitable. For example: + + >>> async with timeout(0.001): + ... async with aiohttp.get('https://github.com') as r: + ... await r.text() + + + delay - value in seconds or None to disable timeout logic + """ + loop = _get_running_loop() + if delay is not None: + deadline = loop.time() + delay # type: Optional[float] + else: + deadline = None + return Timeout(deadline, loop) + + +def timeout_at(deadline: Optional[float]) -> "Timeout": + """Schedule the timeout at absolute time. + + deadline argument points on the time in the same clock system + as loop.time(). + + Please note: it is not POSIX time but a time with + undefined starting base, e.g. the time of the system power on. + + >>> async with timeout_at(loop.time() + 10): + ... async with aiohttp.get('https://github.com') as r: + ... await r.text() + + + """ + loop = _get_running_loop() + return Timeout(deadline, loop) + + +class _State(enum.Enum): + INIT = "INIT" + ENTER = "ENTER" + TIMEOUT = "TIMEOUT" + EXIT = "EXIT" + + +@final +class Timeout: + # Internal class, please don't instantiate it directly + # Use timeout() and timeout_at() public factories instead. + # + # Implementation note: `async with timeout()` is preferred + # over `with timeout()`. + # While technically the Timeout class implementation + # doesn't need to be async at all, + # the `async with` statement explicitly points that + # the context manager should be used from async function context. + # + # This design allows to avoid many silly misusages. + # + # TimeoutError is raised immadiatelly when scheduled + # if the deadline is passed. + # The purpose is to time out as sson as possible + # without waiting for the next await expression. + + __slots__ = ("_deadline", "_loop", "_state", "_timeout_handler") + + def __init__( + self, deadline: Optional[float], loop: asyncio.AbstractEventLoop + ) -> None: + self._loop = loop + self._state = _State.INIT + + self._timeout_handler = None # type: Optional[asyncio.Handle] + if deadline is None: + self._deadline = None # type: Optional[float] + else: + self.update(deadline) + + def __enter__(self) -> "Timeout": + warnings.warn( + "with timeout() is deprecated, use async with timeout() instead", + DeprecationWarning, + stacklevel=2, + ) + self._do_enter() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> Optional[bool]: + self._do_exit(exc_type) + return None + + async def __aenter__(self) -> "Timeout": + self._do_enter() + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> Optional[bool]: + self._do_exit(exc_type) + return None + + @property + def expired(self) -> bool: + """Is timeout expired during execution?""" + return self._state == _State.TIMEOUT + + @property + def deadline(self) -> Optional[float]: + return self._deadline + + def reject(self) -> None: + """Reject scheduled timeout if any.""" + # cancel is maybe better name but + # task.cancel() raises CancelledError in asyncio world. + if self._state not in (_State.INIT, _State.ENTER): + raise RuntimeError(f"invalid state {self._state.value}") + self._reject() + + def _reject(self) -> None: + if self._timeout_handler is not None: + self._timeout_handler.cancel() + self._timeout_handler = None + + def shift(self, delay: float) -> None: + """Advance timeout on delay seconds. + + The delay can be negative. + + Raise RuntimeError if shift is called when deadline is not scheduled + """ + deadline = self._deadline + if deadline is None: + raise RuntimeError("cannot shift timeout if deadline is not scheduled") + self.update(deadline + delay) + + def update(self, deadline: float) -> None: + """Set deadline to absolute value. + + deadline argument points on the time in the same clock system + as loop.time(). + + If new deadline is in the past the timeout is raised immediatelly. + + Please note: it is not POSIX time but a time with + undefined starting base, e.g. the time of the system power on. + """ + if self._state == _State.EXIT: + raise RuntimeError("cannot reschedule after exit from context manager") + if self._state == _State.TIMEOUT: + raise RuntimeError("cannot reschedule expired timeout") + if self._timeout_handler is not None: + self._timeout_handler.cancel() + self._deadline = deadline + if self._state != _State.INIT: + self._reschedule() + + def _reschedule(self) -> None: + assert self._state == _State.ENTER + deadline = self._deadline + if deadline is None: + return + + now = self._loop.time() + if self._timeout_handler is not None: + self._timeout_handler.cancel() + + task = _current_task(self._loop) + if deadline <= now: + self._timeout_handler = self._loop.call_soon(self._on_timeout, task) + else: + self._timeout_handler = self._loop.call_at(deadline, self._on_timeout, task) + + def _do_enter(self) -> None: + if self._state != _State.INIT: + raise RuntimeError(f"invalid state {self._state.value}") + self._state = _State.ENTER + self._reschedule() + + def _do_exit(self, exc_type: Optional[Type[BaseException]]) -> None: + if exc_type is asyncio.CancelledError and self._state == _State.TIMEOUT: + self._timeout_handler = None + raise asyncio.TimeoutError + # timeout has not expired + self._state = _State.EXIT + self._reject() + return None + + def _on_timeout(self, task: "asyncio.Task[None]") -> None: + task.cancel() + self._state = _State.TIMEOUT + # drop the reference early + self._timeout_handler = None + + +if sys.version_info >= (3, 7): + + def _current_task(loop: asyncio.AbstractEventLoop) -> "Optional[asyncio.Task[Any]]": + return asyncio.current_task(loop=loop) + +else: + + def _current_task(loop: asyncio.AbstractEventLoop) -> "Optional[asyncio.Task[Any]]": + return asyncio.Task.current_task(loop=loop) + + +if sys.version_info >= (3, 7): + + def _get_running_loop() -> asyncio.AbstractEventLoop: + return asyncio.get_running_loop() + +else: + + def _get_running_loop() -> asyncio.AbstractEventLoop: + loop = asyncio.get_event_loop() + if not loop.is_running(): + raise RuntimeError("no running event loop") + return loop diff --git a/lib/python3.11/site-packages/async_timeout/py.typed b/lib/python3.11/site-packages/async_timeout/py.typed new file mode 100644 index 0000000..3b94f91 --- /dev/null +++ b/lib/python3.11/site-packages/async_timeout/py.typed @@ -0,0 +1 @@ +Placeholder diff --git a/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/INSTALLER b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/METADATA b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/METADATA new file mode 100644 index 0000000..f1d7204 --- /dev/null +++ b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/METADATA @@ -0,0 +1,116 @@ +Metadata-Version: 2.1 +Name: beautifulsoup4 +Version: 4.12.2 +Summary: Screen-scraping library +Project-URL: Download, https://www.crummy.com/software/BeautifulSoup/bs4/download/ +Project-URL: Homepage, https://www.crummy.com/software/BeautifulSoup/bs4/ +Author-email: Leonard Richardson +License-Expression: MIT +License-File: AUTHORS +License-File: LICENSE +Keywords: HTML,XML,parse,soup +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 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Topic :: Text Processing :: Markup :: SGML +Classifier: Topic :: Text Processing :: Markup :: XML +Requires-Python: >=3.6.0 +Requires-Dist: soupsieve>1.2 +Provides-Extra: html5lib +Requires-Dist: html5lib; extra == 'html5lib' +Provides-Extra: lxml +Requires-Dist: lxml; extra == 'lxml' +Description-Content-Type: text/markdown + +Beautiful Soup is a library that makes it easy to scrape information +from web pages. It sits atop an HTML or XML parser, providing Pythonic +idioms for iterating, searching, and modifying the parse tree. + +# Quick start + +``` +>>> from bs4 import BeautifulSoup +>>> soup = BeautifulSoup("

    SomebadHTML") +>>> print(soup.prettify()) + + +

    + Some + + bad + + HTML + + +

    + + +>>> soup.find(text="bad") +'bad' +>>> soup.i +HTML +# +>>> soup = BeautifulSoup("SomebadXML", "xml") +# +>>> print(soup.prettify()) + + + Some + + bad + + XML + + +``` + +To go beyond the basics, [comprehensive documentation is available](https://www.crummy.com/software/BeautifulSoup/bs4/doc/). + +# Links + +* [Homepage](https://www.crummy.com/software/BeautifulSoup/bs4/) +* [Documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) +* [Discussion group](https://groups.google.com/group/beautifulsoup/) +* [Development](https://code.launchpad.net/beautifulsoup/) +* [Bug tracker](https://bugs.launchpad.net/beautifulsoup/) +* [Complete changelog](https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/CHANGELOG) + +# Note on Python 2 sunsetting + +Beautiful Soup's support for Python 2 was discontinued on December 31, +2020: one year after the sunset date for Python 2 itself. From this +point onward, new Beautiful Soup development will exclusively target +Python 3. The final release of Beautiful Soup 4 to support Python 2 +was 4.9.3. + +# Supporting the project + +If you use Beautiful Soup as part of your professional work, please consider a +[Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme). +This will support many of the free software projects your organization +depends on, not just Beautiful Soup. + +If you use Beautiful Soup for personal projects, the best way to say +thank you is to read +[Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I +wrote about what Beautiful Soup has taught me about software +development. + +# Building the documentation + +The bs4/doc/ directory contains full documentation in Sphinx +format. Run `make html` in that directory to create HTML +documentation. + +# Running the unit tests + +Beautiful Soup supports unit test discovery using Pytest: + +``` +$ pytest +``` + diff --git a/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/RECORD b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/RECORD new file mode 100644 index 0000000..1067781 --- /dev/null +++ b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/RECORD @@ -0,0 +1,72 @@ +beautifulsoup4-4.12.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +beautifulsoup4-4.12.2.dist-info/METADATA,sha256=M6TF9wpbgywQQvtehBohLTEr2f8e7cw909PZ3Xsk3N4,3556 +beautifulsoup4-4.12.2.dist-info/RECORD,, +beautifulsoup4-4.12.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +beautifulsoup4-4.12.2.dist-info/WHEEL,sha256=Fd6mP6ydyRguakwUJ05oBE7fh2IPxgtDN9IwHJ9OqJQ,87 +beautifulsoup4-4.12.2.dist-info/licenses/AUTHORS,sha256=uSIdbrBb1sobdXl7VrlUvuvim2dN9kF3MH4Edn0WKGE,2176 +beautifulsoup4-4.12.2.dist-info/licenses/LICENSE,sha256=VbTY1LHlvIbRDvrJG3TIe8t3UmsPW57a-LnNKtxzl7I,1441 +bs4/__init__.py,sha256=4QO9qbbubMeEQw46YDLWEYS1yAebwKYR5l_Se9E_Gxo,33822 +bs4/__pycache__/__init__.cpython-311.pyc,, +bs4/__pycache__/css.cpython-311.pyc,, +bs4/__pycache__/dammit.cpython-311.pyc,, +bs4/__pycache__/diagnose.cpython-311.pyc,, +bs4/__pycache__/element.cpython-311.pyc,, +bs4/__pycache__/formatter.cpython-311.pyc,, +bs4/builder/__init__.py,sha256=KGBl_FgX1KV1wBIshW4EXlWjP3KLcRiF2opZ-zVcyAc,24393 +bs4/builder/__pycache__/__init__.cpython-311.pyc,, +bs4/builder/__pycache__/_html5lib.cpython-311.pyc,, +bs4/builder/__pycache__/_htmlparser.cpython-311.pyc,, +bs4/builder/__pycache__/_lxml.cpython-311.pyc,, +bs4/builder/_html5lib.py,sha256=LnhimXrUdKujKoHHbmzwNk8OBb11YfTRFXUwhZjwqow,19078 +bs4/builder/_htmlparser.py,sha256=2j4Kj0dFi86vD-OblQRaFFCsRXuWb1VdBGJVPxKKEUc,14919 +bs4/builder/_lxml.py,sha256=ik6BFGnxAzV2-21S_Wc-7ZeA174muSA_ZhmpnAe3g0E,14904 +bs4/css.py,sha256=gqGaHRrKeCRF3gDqxzeU0uclOCeSsTpuW9gUaSnJeWc,10077 +bs4/dammit.py,sha256=G0cQfsEqfwJ-FIQMkXgCJwSHMn7t9vPepCrud6fZEKk,41158 +bs4/diagnose.py,sha256=uAwdDugL_67tB-BIwDIFLFbiuzGxP2wQzJJ4_bGYUrA,7195 +bs4/element.py,sha256=R-HP8gtZPFJ71Rl4ieIBct1I9VTErTAD9FW64Jtg6Sc,92716 +bs4/formatter.py,sha256=fE8Xf9SrHvTZcv_zDpgtOGWk3OIWENPoeKcwhuMJnDs,7184 +bs4/tests/__init__.py,sha256=usdUEP_PwnDfhCdx9rQw9HLWRyc4k9goB6ErZT9aAc0,48391 +bs4/tests/__pycache__/__init__.cpython-311.pyc,, +bs4/tests/__pycache__/test_builder.cpython-311.pyc,, +bs4/tests/__pycache__/test_builder_registry.cpython-311.pyc,, +bs4/tests/__pycache__/test_css.cpython-311.pyc,, +bs4/tests/__pycache__/test_dammit.cpython-311.pyc,, +bs4/tests/__pycache__/test_docs.cpython-311.pyc,, +bs4/tests/__pycache__/test_element.cpython-311.pyc,, +bs4/tests/__pycache__/test_formatter.cpython-311.pyc,, +bs4/tests/__pycache__/test_fuzz.cpython-311.pyc,, +bs4/tests/__pycache__/test_html5lib.cpython-311.pyc,, +bs4/tests/__pycache__/test_htmlparser.cpython-311.pyc,, +bs4/tests/__pycache__/test_lxml.cpython-311.pyc,, +bs4/tests/__pycache__/test_navigablestring.cpython-311.pyc,, +bs4/tests/__pycache__/test_pageelement.cpython-311.pyc,, +bs4/tests/__pycache__/test_soup.cpython-311.pyc,, +bs4/tests/__pycache__/test_tag.cpython-311.pyc,, +bs4/tests/__pycache__/test_tree.cpython-311.pyc,, +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase,sha256=Uv_dx4a43TSfoNkjU-jHW2nSXkqHFg4XdAw7SWVObUk,23 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase,sha256=OEyVA0Ej4FxswOElrUNt0In4s4YhrmtaxE_NHGZvGtg,30 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase,sha256=3d8z65o4p7Rur-RmCHoOjzqaYQ8EAtjmiBYTHNyAdl4,19469 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase,sha256=2bq3S8KxZgk8EajLReHD8m4_0Lj_nrkyJAxB_z_U0D0,5 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase,sha256=MZDu31LPLfgu6jP9IZkrlwNes3f_sL8WFP5BChkUKdY,35 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase,sha256=w58r-s6besG5JwPXpnz37W2YTj9-_qxFbk6hiEnKeIQ,51495 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase,sha256=q8rkdMECEXKcqVhOf5zWHkSBTQeOPt0JiLg2TZiPCuk,10380 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase,sha256=QfzoOxKwNuqG-4xIrea6MOQLXhfAAOQJ0r9u-J6kSNs,19 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase,sha256=EItOpSdeD4ewK-qgJ9vtxennwn_huguzXgctrUT7fqE,3546 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase,sha256=a2aJTG4FceGSJXsjtxoS8S4jk_8rZsS3aznLkeO2_dY,124 +bs4/tests/fuzz/crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase,sha256=jRFRtCKlP3-3EDLc_iVRTcE6JNymv0rYcVM6qRaPrxI,2607 +bs4/tests/test_builder.py,sha256=nc2JE5EMrEf-p24qhf2R8qAV5PpFiOuNpYCmtmCjlTI,1115 +bs4/tests/test_builder_registry.py,sha256=7WLj2prjSHGphebnrjQuI6JYr03Uy_c9_CkaFSQ9HRo,5114 +bs4/tests/test_css.py,sha256=jCcgIWem3lyPa5AjhAk9S6fWI07hk1rg0v8coD7bEtI,17279 +bs4/tests/test_dammit.py,sha256=MbSmRN6VEP0Rm56-w6Ja0TW8eC-8ZxOJ-wXWVf_hRi8,15451 +bs4/tests/test_docs.py,sha256=xoAxnUfoQ7aRqGImwW_9BJDU8WNMZHIuvWqVepvWXt8,1127 +bs4/tests/test_element.py,sha256=92oRSRoGk8gIXAbAGHErKzocx2MK32TqcQdUJ-dGQMo,2377 +bs4/tests/test_formatter.py,sha256=eTzj91Lmhv90z-WiHjK3sBJZm0hRk0crFY1TZaXstCY,4148 +bs4/tests/test_fuzz.py,sha256=wXfic-J9-sv4C3upnTeZju_PIa9NxktOD_zw3Ek0u9w,3637 +bs4/tests/test_html5lib.py,sha256=2-ipm-_MaPt37WTxEd5DodUTNhS4EbLFKPRaO6XSCW4,8322 +bs4/tests/test_htmlparser.py,sha256=wnngcIlzjEwH21JFfu_mgt6JdpLt0ncJfLcGT7HeGw0,6256 +bs4/tests/test_lxml.py,sha256=nQCmLt7bWk0id7xMumZw--PzEe1xF9PTQn3lvHyNC6I,7635 +bs4/tests/test_navigablestring.py,sha256=RGSgziNf7cZnYdEPsoqL1B2I68TUJp1JmEQVxbh_ryA,5081 +bs4/tests/test_pageelement.py,sha256=VdGjUxx3RhjqmNsJ92ao6VZC_YD7T8mdLkDZjosOYeE,14274 +bs4/tests/test_soup.py,sha256=JmnAPLE1_GXm0wmwEUN7icdvBz9HDch-qoU2mT_TDrs,19877 +bs4/tests/test_tag.py,sha256=f19uie7QehvgvhIqNWfjDRR4TKa-ftm_RRoo6LXZyqk,9016 +bs4/tests/test_tree.py,sha256=n9nTQOzJb3-ZnZ6AkmMdZQ5TYcTUPnqHoVgal0mYXfg,48129 diff --git a/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/REQUESTED b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/WHEEL b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/WHEEL new file mode 100644 index 0000000..9d72767 --- /dev/null +++ b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.13.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/AUTHORS b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/AUTHORS new file mode 100644 index 0000000..1f14fe0 --- /dev/null +++ b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/AUTHORS @@ -0,0 +1,49 @@ +Behold, mortal, the origins of Beautiful Soup... +================================================ + +Leonard Richardson is the primary maintainer. + +Aaron DeVore and Isaac Muse have made significant contributions to the +code base. + +Mark Pilgrim provided the encoding detection code that forms the base +of UnicodeDammit. + +Thomas Kluyver and Ezio Melotti finished the work of getting Beautiful +Soup 4 working under Python 3. + +Simon Willison wrote soupselect, which was used to make Beautiful Soup +support CSS selectors. Isaac Muse wrote SoupSieve, which made it +possible to _remove_ the CSS selector code from Beautiful Soup. + +Sam Ruby helped with a lot of edge cases. + +Jonathan Ellis was awarded the prestigious Beau Potage D'Or for his +work in solving the nestable tags conundrum. + +An incomplete list of people have contributed patches to Beautiful +Soup: + + Istvan Albert, Andrew Lin, Anthony Baxter, Oliver Beattie, Andrew +Boyko, Tony Chang, Francisco Canas, "Delong", Zephyr Fang, Fuzzy, +Roman Gaufman, Yoni Gilad, Richie Hindle, Toshihiro Kamiya, Peteris +Krumins, Kent Johnson, Marek Kapolka, Andreas Kostyrka, Roel Kramer, +Ben Last, Robert Leftwich, Stefaan Lippens, "liquider", Staffan +Malmgren, Ksenia Marasanova, JP Moins, Adam Monsen, John Nagle, "Jon", +Ed Oskiewicz, Martijn Peters, Greg Phillips, Giles Radford, Stefano +Revera, Arthur Rudolph, Marko Samastur, James Salter, Jouni Seppänen, +Alexander Schmolck, Tim Shirley, Geoffrey Sneddon, Ville Skyttä, +"Vikas", Jens Svalgaard, Andy Theyers, Eric Weiser, Glyn Webster, John +Wiseman, Paul Wright, Danny Yoo + +An incomplete list of people who made suggestions or found bugs or +found ways to break Beautiful Soup: + + Hanno Böck, Matteo Bertini, Chris Curvey, Simon Cusack, Bruce Eckel, + Matt Ernst, Michael Foord, Tom Harris, Bill de hOra, Donald Howes, + Matt Patterson, Scott Roberts, Steve Strassmann, Mike Williams, + warchild at redho dot com, Sami Kuisma, Carlos Rocha, Bob Hutchison, + Joren Mc, Michal Migurski, John Kleven, Tim Heaney, Tripp Lilley, Ed + Summers, Dennis Sutch, Chris Smith, Aaron Swartz, Stuart + Turner, Greg Edwards, Kevin J Kalupson, Nikos Kouremenos, Artur de + Sousa Rocha, Yichun Wei, Per Vognsen diff --git a/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/LICENSE b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/LICENSE new file mode 100644 index 0000000..08e3a9c --- /dev/null +++ b/lib/python3.11/site-packages/beautifulsoup4-4.12.2.dist-info/licenses/LICENSE @@ -0,0 +1,31 @@ +Beautiful Soup is made available under the MIT license: + + Copyright (c) Leonard Richardson + + 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. + +Beautiful Soup incorporates code from the html5lib library, which is +also made available under the MIT license. Copyright (c) James Graham +and other contributors + +Beautiful Soup has an optional dependency on the soupsieve library, +which is also made available under the MIT license. Copyright (c) +Isaac Muse diff --git a/lib/python3.11/site-packages/brotli.py b/lib/python3.11/site-packages/brotli.py new file mode 100644 index 0000000..d66966b --- /dev/null +++ b/lib/python3.11/site-packages/brotli.py @@ -0,0 +1,56 @@ +# Copyright 2016 The Brotli Authors. All rights reserved. +# +# Distributed under MIT license. +# See file LICENSE for detail or copy at https://opensource.org/licenses/MIT + +"""Functions to compress and decompress data using the Brotli library.""" + +import _brotli + + +# The library version. +__version__ = _brotli.__version__ + +# The compression mode. +MODE_GENERIC = _brotli.MODE_GENERIC +MODE_TEXT = _brotli.MODE_TEXT +MODE_FONT = _brotli.MODE_FONT + +# The Compressor object. +Compressor = _brotli.Compressor + +# The Decompressor object. +Decompressor = _brotli.Decompressor + +# Compress a byte string. +def compress(string, mode=MODE_GENERIC, quality=11, lgwin=22, lgblock=0): + """Compress a byte string. + + Args: + string (bytes): The input data. + mode (int, optional): The compression mode can be MODE_GENERIC (default), + MODE_TEXT (for UTF-8 format text input) or MODE_FONT (for WOFF 2.0). + quality (int, optional): Controls the compression-speed vs compression- + density tradeoff. The higher the quality, the slower the compression. + Range is 0 to 11. Defaults to 11. + lgwin (int, optional): Base 2 logarithm of the sliding window size. Range + is 10 to 24. Defaults to 22. + lgblock (int, optional): Base 2 logarithm of the maximum input block size. + Range is 16 to 24. If set to 0, the value will be set based on the + quality. Defaults to 0. + + Returns: + The compressed byte string. + + Raises: + brotli.error: If arguments are invalid, or compressor fails. + """ + compressor = Compressor(mode=mode, quality=quality, lgwin=lgwin, + lgblock=lgblock) + return compressor.process(string) + compressor.finish() + +# Decompress a compressed byte string. +decompress = _brotli.decompress + +# Raised if compression or decompression fails. +error = _brotli.error diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/PKG-INFO b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/PKG-INFO new file mode 100644 index 0000000..ad7cdfa --- /dev/null +++ b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/PKG-INFO @@ -0,0 +1,21 @@ +Metadata-Version: 2.1 +Name: bs4 +Version: 0.0.1 +Summary: Screen-scraping library +Home-page: https://pypi.python.org/pypi/beautifulsoup4 +Download-URL: http://www.crummy.com/software/BeautifulSoup/bs4/download/ +Author: Leonard Richardson +Author-email: leonardr@segfault.org +License: MIT +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Topic :: Text Processing :: Markup :: XML +Classifier: Topic :: Text Processing :: Markup :: SGML +Classifier: Topic :: Software Development :: Libraries :: Python Modules + +Use `beautifulsoup4 `_ instead. diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/SOURCES.txt b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/SOURCES.txt new file mode 100644 index 0000000..b46d1c5 --- /dev/null +++ b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/SOURCES.txt @@ -0,0 +1,7 @@ +setup.cfg +setup.py +bs4.egg-info/PKG-INFO +bs4.egg-info/SOURCES.txt +bs4.egg-info/dependency_links.txt +bs4.egg-info/requires.txt +bs4.egg-info/top_level.txt \ No newline at end of file diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/dependency_links.txt b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/installed-files.txt b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/installed-files.txt new file mode 100644 index 0000000..62cfadb --- /dev/null +++ b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/installed-files.txt @@ -0,0 +1,5 @@ +PKG-INFO +SOURCES.txt +dependency_links.txt +requires.txt +top_level.txt diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/requires.txt b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/requires.txt new file mode 100644 index 0000000..c1f5f71 --- /dev/null +++ b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/requires.txt @@ -0,0 +1 @@ +beautifulsoup4 diff --git a/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/top_level.txt b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/top_level.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/python3.11/site-packages/bs4-0.0.1-py3.11.egg-info/top_level.txt @@ -0,0 +1 @@ + diff --git a/lib/python3.11/site-packages/bs4/__init__.py b/lib/python3.11/site-packages/bs4/__init__.py new file mode 100644 index 0000000..3d2ab09 --- /dev/null +++ b/lib/python3.11/site-packages/bs4/__init__.py @@ -0,0 +1,840 @@ +"""Beautiful Soup Elixir and Tonic - "The Screen-Scraper's Friend". + +http://www.crummy.com/software/BeautifulSoup/ + +Beautiful Soup uses a pluggable XML or HTML parser to parse a +(possibly invalid) document into a tree representation. Beautiful Soup +provides methods and Pythonic idioms that make it easy to navigate, +search, and modify the parse tree. + +Beautiful Soup works with Python 3.6 and up. It works better if lxml +and/or html5lib is installed. + +For more than you ever wanted to know about Beautiful Soup, see the +documentation: http://www.crummy.com/software/BeautifulSoup/bs4/doc/ +""" + +__author__ = "Leonard Richardson (leonardr@segfault.org)" +__version__ = "4.12.2" +__copyright__ = "Copyright (c) 2004-2023 Leonard Richardson" +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +__all__ = ['BeautifulSoup'] + +from collections import Counter +import os +import re +import sys +import traceback +import warnings + +# The very first thing we do is give a useful error if someone is +# running this code under Python 2. +if sys.version_info.major < 3: + raise ImportError('You are trying to use a Python 3-specific version of Beautiful Soup under Python 2. This will not work. The final version of Beautiful Soup to support Python 2 was 4.9.3.') + +from .builder import ( + builder_registry, + ParserRejectedMarkup, + XMLParsedAsHTMLWarning, + HTMLParserTreeBuilder +) +from .dammit import UnicodeDammit +from .element import ( + CData, + Comment, + CSS, + DEFAULT_OUTPUT_ENCODING, + Declaration, + Doctype, + NavigableString, + PageElement, + ProcessingInstruction, + PYTHON_SPECIFIC_ENCODINGS, + ResultSet, + Script, + Stylesheet, + SoupStrainer, + Tag, + TemplateString, + ) + +# Define some custom warnings. +class GuessedAtParserWarning(UserWarning): + """The warning issued when BeautifulSoup has to guess what parser to + use -- probably because no parser was specified in the constructor. + """ + +class MarkupResemblesLocatorWarning(UserWarning): + """The warning issued when BeautifulSoup is given 'markup' that + actually looks like a resource locator -- a URL or a path to a file + on disk. + """ + + +class BeautifulSoup(Tag): + """A data structure representing a parsed HTML or XML document. + + Most of the methods you'll call on a BeautifulSoup object are inherited from + PageElement or Tag. + + Internally, this class defines the basic interface called by the + tree builders when converting an HTML/XML document into a data + structure. The interface abstracts away the differences between + parsers. To write a new tree builder, you'll need to understand + these methods as a whole. + + These methods will be called by the BeautifulSoup constructor: + * reset() + * feed(markup) + + The tree builder may call these methods from its feed() implementation: + * handle_starttag(name, attrs) # See note about return value + * handle_endtag(name) + * handle_data(data) # Appends to the current data node + * endData(containerClass) # Ends the current data node + + No matter how complicated the underlying parser is, you should be + able to build a tree using 'start tag' events, 'end tag' events, + 'data' events, and "done with data" events. + + If you encounter an empty-element tag (aka a self-closing tag, + like HTML's
    tag), call handle_starttag and then + handle_endtag. + """ + + # Since BeautifulSoup subclasses Tag, it's possible to treat it as + # a Tag with a .name. This name makes it clear the BeautifulSoup + # object isn't a real markup tag. + ROOT_TAG_NAME = '[document]' + + # If the end-user gives no indication which tree builder they + # want, look for one with these features. + DEFAULT_BUILDER_FEATURES = ['html', 'fast'] + + # A string containing all ASCII whitespace characters, used in + # endData() to detect data chunks that seem 'empty'. + ASCII_SPACES = '\x20\x0a\x09\x0c\x0d' + + NO_PARSER_SPECIFIED_WARNING = "No parser was explicitly specified, so I'm using the best available %(markup_type)s parser for this system (\"%(parser)s\"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.\n\nThe code that caused this warning is on line %(line_number)s of the file %(filename)s. To get rid of this warning, pass the additional argument 'features=\"%(parser)s\"' to the BeautifulSoup constructor.\n" + + def __init__(self, markup="", features=None, builder=None, + parse_only=None, from_encoding=None, exclude_encodings=None, + element_classes=None, **kwargs): + """Constructor. + + :param markup: A string or a file-like object representing + markup to be parsed. + + :param features: Desirable features of the parser to be + used. This may be the name of a specific parser ("lxml", + "lxml-xml", "html.parser", or "html5lib") or it may be the + type of markup to be used ("html", "html5", "xml"). It's + recommended that you name a specific parser, so that + Beautiful Soup gives you the same results across platforms + and virtual environments. + + :param builder: A TreeBuilder subclass to instantiate (or + instance to use) instead of looking one up based on + `features`. You only need to use this if you've implemented a + custom TreeBuilder. + + :param parse_only: A SoupStrainer. Only parts of the document + matching the SoupStrainer will be considered. This is useful + when parsing part of a document that would otherwise be too + large to fit into memory. + + :param from_encoding: A string indicating the encoding of the + document to be parsed. Pass this in if Beautiful Soup is + guessing wrongly about the document's encoding. + + :param exclude_encodings: A list of strings indicating + encodings known to be wrong. Pass this in if you don't know + the document's encoding but you know Beautiful Soup's guess is + wrong. + + :param element_classes: A dictionary mapping BeautifulSoup + classes like Tag and NavigableString, to other classes you'd + like to be instantiated instead as the parse tree is + built. This is useful for subclassing Tag or NavigableString + to modify default behavior. + + :param kwargs: For backwards compatibility purposes, the + constructor accepts certain keyword arguments used in + Beautiful Soup 3. None of these arguments do anything in + Beautiful Soup 4; they will result in a warning and then be + ignored. + + Apart from this, any keyword arguments passed into the + BeautifulSoup constructor are propagated to the TreeBuilder + constructor. This makes it possible to configure a + TreeBuilder by passing in arguments, not just by saying which + one to use. + """ + if 'convertEntities' in kwargs: + del kwargs['convertEntities'] + warnings.warn( + "BS4 does not respect the convertEntities argument to the " + "BeautifulSoup constructor. Entities are always converted " + "to Unicode characters.") + + if 'markupMassage' in kwargs: + del kwargs['markupMassage'] + warnings.warn( + "BS4 does not respect the markupMassage argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for any necessary markup massage.") + + if 'smartQuotesTo' in kwargs: + del kwargs['smartQuotesTo'] + warnings.warn( + "BS4 does not respect the smartQuotesTo argument to the " + "BeautifulSoup constructor. Smart quotes are always converted " + "to Unicode characters.") + + if 'selfClosingTags' in kwargs: + del kwargs['selfClosingTags'] + warnings.warn( + "BS4 does not respect the selfClosingTags argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for understanding self-closing tags.") + + if 'isHTML' in kwargs: + del kwargs['isHTML'] + warnings.warn( + "BS4 does not respect the isHTML argument to the " + "BeautifulSoup constructor. Suggest you use " + "features='lxml' for HTML and features='lxml-xml' for " + "XML.") + + def deprecated_argument(old_name, new_name): + if old_name in kwargs: + warnings.warn( + 'The "%s" argument to the BeautifulSoup constructor ' + 'has been renamed to "%s."' % (old_name, new_name), + DeprecationWarning, stacklevel=3 + ) + return kwargs.pop(old_name) + return None + + parse_only = parse_only or deprecated_argument( + "parseOnlyThese", "parse_only") + + from_encoding = from_encoding or deprecated_argument( + "fromEncoding", "from_encoding") + + if from_encoding and isinstance(markup, str): + warnings.warn("You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.") + from_encoding = None + + self.element_classes = element_classes or dict() + + # We need this information to track whether or not the builder + # was specified well enough that we can omit the 'you need to + # specify a parser' warning. + original_builder = builder + original_features = features + + if isinstance(builder, type): + # A builder class was passed in; it needs to be instantiated. + builder_class = builder + builder = None + elif builder is None: + if isinstance(features, str): + features = [features] + if features is None or len(features) == 0: + features = self.DEFAULT_BUILDER_FEATURES + builder_class = builder_registry.lookup(*features) + if builder_class is None: + raise FeatureNotFound( + "Couldn't find a tree builder with the features you " + "requested: %s. Do you need to install a parser library?" + % ",".join(features)) + + # At this point either we have a TreeBuilder instance in + # builder, or we have a builder_class that we can instantiate + # with the remaining **kwargs. + if builder is None: + builder = builder_class(**kwargs) + if not original_builder and not ( + original_features == builder.NAME or + original_features in builder.ALTERNATE_NAMES + ) and markup: + # The user did not tell us which TreeBuilder to use, + # and we had to guess. Issue a warning. + if builder.is_xml: + markup_type = "XML" + else: + markup_type = "HTML" + + # This code adapted from warnings.py so that we get the same line + # of code as our warnings.warn() call gets, even if the answer is wrong + # (as it may be in a multithreading situation). + caller = None + try: + caller = sys._getframe(1) + except ValueError: + pass + if caller: + globals = caller.f_globals + line_number = caller.f_lineno + else: + globals = sys.__dict__ + line_number= 1 + filename = globals.get('__file__') + if filename: + fnl = filename.lower() + if fnl.endswith((".pyc", ".pyo")): + filename = filename[:-1] + if filename: + # If there is no filename at all, the user is most likely in a REPL, + # and the warning is not necessary. + values = dict( + filename=filename, + line_number=line_number, + parser=builder.NAME, + markup_type=markup_type + ) + warnings.warn( + self.NO_PARSER_SPECIFIED_WARNING % values, + GuessedAtParserWarning, stacklevel=2 + ) + else: + if kwargs: + warnings.warn("Keyword arguments to the BeautifulSoup constructor will be ignored. These would normally be passed into the TreeBuilder constructor, but a TreeBuilder instance was passed in as `builder`.") + + self.builder = builder + self.is_xml = builder.is_xml + self.known_xml = self.is_xml + self._namespaces = dict() + self.parse_only = parse_only + + if hasattr(markup, 'read'): # It's a file-type object. + markup = markup.read() + elif len(markup) <= 256 and ( + (isinstance(markup, bytes) and not b'<' in markup) + or (isinstance(markup, str) and not '<' in markup) + ): + # Issue warnings for a couple beginner problems + # involving passing non-markup to Beautiful Soup. + # Beautiful Soup will still parse the input as markup, + # since that is sometimes the intended behavior. + if not self._markup_is_url(markup): + self._markup_resembles_filename(markup) + + rejections = [] + success = False + for (self.markup, self.original_encoding, self.declared_html_encoding, + self.contains_replacement_characters) in ( + self.builder.prepare_markup( + markup, from_encoding, exclude_encodings=exclude_encodings)): + self.reset() + self.builder.initialize_soup(self) + try: + self._feed() + success = True + break + except ParserRejectedMarkup as e: + rejections.append(e) + pass + + if not success: + other_exceptions = [str(e) for e in rejections] + raise ParserRejectedMarkup( + "The markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.\n\nOriginal exception(s) from parser:\n " + "\n ".join(other_exceptions) + ) + + # Clear out the markup and remove the builder's circular + # reference to this object. + self.markup = None + self.builder.soup = None + + def _clone(self): + """Create a new BeautifulSoup object with the same TreeBuilder, + but not associated with any markup. + + This is the first step of the deepcopy process. + """ + clone = type(self)("", None, self.builder) + + # Keep track of the encoding of the original document, + # since we won't be parsing it again. + clone.original_encoding = self.original_encoding + return clone + + def __getstate__(self): + # Frequently a tree builder can't be pickled. + d = dict(self.__dict__) + if 'builder' in d and d['builder'] is not None and not self.builder.picklable: + d['builder'] = type(self.builder) + # Store the contents as a Unicode string. + d['contents'] = [] + d['markup'] = self.decode() + + # If _most_recent_element is present, it's a Tag object left + # over from initial parse. It might not be picklable and we + # don't need it. + if '_most_recent_element' in d: + del d['_most_recent_element'] + return d + + def __setstate__(self, state): + # If necessary, restore the TreeBuilder by looking it up. + self.__dict__ = state + if isinstance(self.builder, type): + self.builder = self.builder() + elif not self.builder: + # We don't know which builder was used to build this + # parse tree, so use a default we know is always available. + self.builder = HTMLParserTreeBuilder() + self.builder.soup = self + self.reset() + self._feed() + return state + + + @classmethod + def _decode_markup(cls, markup): + """Ensure `markup` is bytes so it's safe to send into warnings.warn. + + TODO: warnings.warn had this problem back in 2010 but it might not + anymore. + """ + if isinstance(markup, bytes): + decoded = markup.decode('utf-8', 'replace') + else: + decoded = markup + return decoded + + @classmethod + def _markup_is_url(cls, markup): + """Error-handling method to raise a warning if incoming markup looks + like a URL. + + :param markup: A string. + :return: Whether or not the markup resembles a URL + closely enough to justify a warning. + """ + if isinstance(markup, bytes): + space = b' ' + cant_start_with = (b"http:", b"https:") + elif isinstance(markup, str): + space = ' ' + cant_start_with = ("http:", "https:") + else: + return False + + if any(markup.startswith(prefix) for prefix in cant_start_with): + if not space in markup: + warnings.warn( + 'The input looks more like a URL than markup. You may want to use' + ' an HTTP client like requests to get the document behind' + ' the URL, and feed that document to Beautiful Soup.', + MarkupResemblesLocatorWarning, + stacklevel=3 + ) + return True + return False + + @classmethod + def _markup_resembles_filename(cls, markup): + """Error-handling method to raise a warning if incoming markup + resembles a filename. + + :param markup: A bytestring or string. + :return: Whether or not the markup resembles a filename + closely enough to justify a warning. + """ + path_characters = '/\\' + extensions = ['.html', '.htm', '.xml', '.xhtml', '.txt'] + if isinstance(markup, bytes): + path_characters = path_characters.encode("utf8") + extensions = [x.encode('utf8') for x in extensions] + filelike = False + if any(x in markup for x in path_characters): + filelike = True + else: + lower = markup.lower() + if any(lower.endswith(ext) for ext in extensions): + filelike = True + if filelike: + warnings.warn( + 'The input looks more like a filename than markup. You may' + ' want to open this file and pass the filehandle into' + ' Beautiful Soup.', + MarkupResemblesLocatorWarning, stacklevel=3 + ) + return True + return False + + def _feed(self): + """Internal method that parses previously set markup, creating a large + number of Tag and NavigableString objects. + """ + # Convert the document to Unicode. + self.builder.reset() + + self.builder.feed(self.markup) + # Close out any unfinished strings and close all the open tags. + self.endData() + while self.currentTag.name != self.ROOT_TAG_NAME: + self.popTag() + + def reset(self): + """Reset this object to a state as though it had never parsed any + markup. + """ + Tag.__init__(self, self, self.builder, self.ROOT_TAG_NAME) + self.hidden = 1 + self.builder.reset() + self.current_data = [] + self.currentTag = None + self.tagStack = [] + self.open_tag_counter = Counter() + self.preserve_whitespace_tag_stack = [] + self.string_container_stack = [] + self._most_recent_element = None + self.pushTag(self) + + def new_tag(self, name, namespace=None, nsprefix=None, attrs={}, + sourceline=None, sourcepos=None, **kwattrs): + """Create a new Tag associated with this BeautifulSoup object. + + :param name: The name of the new Tag. + :param namespace: The URI of the new Tag's XML namespace, if any. + :param prefix: The prefix for the new Tag's XML namespace, if any. + :param attrs: A dictionary of this Tag's attribute values; can + be used instead of `kwattrs` for attributes like 'class' + that are reserved words in Python. + :param sourceline: The line number where this tag was + (purportedly) found in its source document. + :param sourcepos: The character position within `sourceline` where this + tag was (purportedly) found. + :param kwattrs: Keyword arguments for the new Tag's attribute values. + + """ + kwattrs.update(attrs) + return self.element_classes.get(Tag, Tag)( + None, self.builder, name, namespace, nsprefix, kwattrs, + sourceline=sourceline, sourcepos=sourcepos + ) + + def string_container(self, base_class=None): + container = base_class or NavigableString + + # There may be a general override of NavigableString. + container = self.element_classes.get( + container, container + ) + + # On top of that, we may be inside a tag that needs a special + # container class. + if self.string_container_stack and container is NavigableString: + container = self.builder.string_containers.get( + self.string_container_stack[-1].name, container + ) + return container + + def new_string(self, s, subclass=None): + """Create a new NavigableString associated with this BeautifulSoup + object. + """ + container = self.string_container(subclass) + return container(s) + + def insert_before(self, *args): + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError("BeautifulSoup objects don't support insert_before().") + + def insert_after(self, *args): + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError("BeautifulSoup objects don't support insert_after().") + + def popTag(self): + """Internal method called by _popToTag when a tag is closed.""" + tag = self.tagStack.pop() + if tag.name in self.open_tag_counter: + self.open_tag_counter[tag.name] -= 1 + if self.preserve_whitespace_tag_stack and tag == self.preserve_whitespace_tag_stack[-1]: + self.preserve_whitespace_tag_stack.pop() + if self.string_container_stack and tag == self.string_container_stack[-1]: + self.string_container_stack.pop() + #print("Pop", tag.name) + if self.tagStack: + self.currentTag = self.tagStack[-1] + return self.currentTag + + def pushTag(self, tag): + """Internal method called by handle_starttag when a tag is opened.""" + #print("Push", tag.name) + if self.currentTag is not None: + self.currentTag.contents.append(tag) + self.tagStack.append(tag) + self.currentTag = self.tagStack[-1] + if tag.name != self.ROOT_TAG_NAME: + self.open_tag_counter[tag.name] += 1 + if tag.name in self.builder.preserve_whitespace_tags: + self.preserve_whitespace_tag_stack.append(tag) + if tag.name in self.builder.string_containers: + self.string_container_stack.append(tag) + + def endData(self, containerClass=None): + """Method called by the TreeBuilder when the end of a data segment + occurs. + """ + if self.current_data: + current_data = ''.join(self.current_data) + # If whitespace is not preserved, and this string contains + # nothing but ASCII spaces, replace it with a single space + # or newline. + if not self.preserve_whitespace_tag_stack: + strippable = True + for i in current_data: + if i not in self.ASCII_SPACES: + strippable = False + break + if strippable: + if '\n' in current_data: + current_data = '\n' + else: + current_data = ' ' + + # Reset the data collector. + self.current_data = [] + + # Should we add this string to the tree at all? + if self.parse_only and len(self.tagStack) <= 1 and \ + (not self.parse_only.text or \ + not self.parse_only.search(current_data)): + return + + containerClass = self.string_container(containerClass) + o = containerClass(current_data) + self.object_was_parsed(o) + + def object_was_parsed(self, o, parent=None, most_recent_element=None): + """Method called by the TreeBuilder to integrate an object into the parse tree.""" + if parent is None: + parent = self.currentTag + if most_recent_element is not None: + previous_element = most_recent_element + else: + previous_element = self._most_recent_element + + next_element = previous_sibling = next_sibling = None + if isinstance(o, Tag): + next_element = o.next_element + next_sibling = o.next_sibling + previous_sibling = o.previous_sibling + if previous_element is None: + previous_element = o.previous_element + + fix = parent.next_element is not None + + o.setup(parent, previous_element, next_element, previous_sibling, next_sibling) + + self._most_recent_element = o + parent.contents.append(o) + + # Check if we are inserting into an already parsed node. + if fix: + self._linkage_fixer(parent) + + def _linkage_fixer(self, el): + """Make sure linkage of this fragment is sound.""" + + first = el.contents[0] + child = el.contents[-1] + descendant = child + + if child is first and el.parent is not None: + # Parent should be linked to first child + el.next_element = child + # We are no longer linked to whatever this element is + prev_el = child.previous_element + if prev_el is not None and prev_el is not el: + prev_el.next_element = None + # First child should be linked to the parent, and no previous siblings. + child.previous_element = el + child.previous_sibling = None + + # We have no sibling as we've been appended as the last. + child.next_sibling = None + + # This index is a tag, dig deeper for a "last descendant" + if isinstance(child, Tag) and child.contents: + descendant = child._last_descendant(False) + + # As the final step, link last descendant. It should be linked + # to the parent's next sibling (if found), else walk up the chain + # and find a parent with a sibling. It should have no next sibling. + descendant.next_element = None + descendant.next_sibling = None + target = el + while True: + if target is None: + break + elif target.next_sibling is not None: + descendant.next_element = target.next_sibling + target.next_sibling.previous_element = child + break + target = target.parent + + def _popToTag(self, name, nsprefix=None, inclusivePop=True): + """Pops the tag stack up to and including the most recent + instance of the given tag. + + If there are no open tags with the given name, nothing will be + popped. + + :param name: Pop up to the most recent tag with this name. + :param nsprefix: The namespace prefix that goes with `name`. + :param inclusivePop: It this is false, pops the tag stack up + to but *not* including the most recent instqance of the + given tag. + + """ + #print("Popping to %s" % name) + if name == self.ROOT_TAG_NAME: + # The BeautifulSoup object itself can never be popped. + return + + most_recently_popped = None + + stack_size = len(self.tagStack) + for i in range(stack_size - 1, 0, -1): + if not self.open_tag_counter.get(name): + break + t = self.tagStack[i] + if (name == t.name and nsprefix == t.prefix): + if inclusivePop: + most_recently_popped = self.popTag() + break + most_recently_popped = self.popTag() + + return most_recently_popped + + def handle_starttag(self, name, namespace, nsprefix, attrs, sourceline=None, + sourcepos=None, namespaces=None): + """Called by the tree builder when a new tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + :param attrs: A dictionary of attribute values. + :param sourceline: The line number where this tag was found in its + source document. + :param sourcepos: The character position within `sourceline` where this + tag was found. + :param namespaces: A dictionary of all namespace prefix mappings + currently in scope in the document. + + If this method returns None, the tag was rejected by an active + SoupStrainer. You should proceed as if the tag had not occurred + in the document. For instance, if this was a self-closing tag, + don't call handle_endtag. + """ + # print("Start tag %s: %s" % (name, attrs)) + self.endData() + + if (self.parse_only and len(self.tagStack) <= 1 + and (self.parse_only.text + or not self.parse_only.search_tag(name, attrs))): + return None + + tag = self.element_classes.get(Tag, Tag)( + self, self.builder, name, namespace, nsprefix, attrs, + self.currentTag, self._most_recent_element, + sourceline=sourceline, sourcepos=sourcepos, + namespaces=namespaces + ) + if tag is None: + return tag + if self._most_recent_element is not None: + self._most_recent_element.next_element = tag + self._most_recent_element = tag + self.pushTag(tag) + return tag + + def handle_endtag(self, name, nsprefix=None): + """Called by the tree builder when an ending tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + """ + #print("End tag: " + name) + self.endData() + self._popToTag(name, nsprefix) + + def handle_data(self, data): + """Called by the tree builder when a chunk of textual data is encountered.""" + self.current_data.append(data) + + def decode(self, pretty_print=False, + eventual_encoding=DEFAULT_OUTPUT_ENCODING, + formatter="minimal", iterator=None): + """Returns a string or Unicode representation of the parse tree + as an HTML or XML document. + + :param pretty_print: If this is True, indentation will be used to + make the document more readable. + :param eventual_encoding: The encoding of the final document. + If this is None, the document will be a Unicode string. + """ + if self.is_xml: + # Print the XML declaration + encoding_part = '' + if eventual_encoding in PYTHON_SPECIFIC_ENCODINGS: + # This is a special Python encoding; it can't actually + # go into an XML document because it means nothing + # outside of Python. + eventual_encoding = None + if eventual_encoding != None: + encoding_part = ' encoding="%s"' % eventual_encoding + prefix = '\n' % encoding_part + else: + prefix = '' + if not pretty_print: + indent_level = None + else: + indent_level = 0 + return prefix + super(BeautifulSoup, self).decode( + indent_level, eventual_encoding, formatter, iterator) + +# Aliases to make it easier to get started quickly, e.g. 'from bs4 import _soup' +_s = BeautifulSoup +_soup = BeautifulSoup + +class BeautifulStoneSoup(BeautifulSoup): + """Deprecated interface to an XML parser.""" + + def __init__(self, *args, **kwargs): + kwargs['features'] = 'xml' + warnings.warn( + 'The BeautifulStoneSoup class is deprecated. Instead of using ' + 'it, pass features="xml" into the BeautifulSoup constructor.', + DeprecationWarning, stacklevel=2 + ) + super(BeautifulStoneSoup, self).__init__(*args, **kwargs) + + +class StopParsing(Exception): + """Exception raised by a TreeBuilder if it's unable to continue parsing.""" + pass + +class FeatureNotFound(ValueError): + """Exception raised by the BeautifulSoup constructor if no parser with the + requested features is found. + """ + pass + + +#If this file is run as a script, act as an HTML pretty-printer. +if __name__ == '__main__': + import sys + soup = BeautifulSoup(sys.stdin) + print((soup.prettify())) diff --git a/lib/python3.11/site-packages/bs4/builder/__init__.py b/lib/python3.11/site-packages/bs4/builder/__init__.py new file mode 100644 index 0000000..2e39745 --- /dev/null +++ b/lib/python3.11/site-packages/bs4/builder/__init__.py @@ -0,0 +1,631 @@ +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +from collections import defaultdict +import itertools +import re +import warnings +import sys +from bs4.element import ( + CharsetMetaAttributeValue, + ContentMetaAttributeValue, + RubyParenthesisString, + RubyTextString, + Stylesheet, + Script, + TemplateString, + nonwhitespace_re +) + +__all__ = [ + 'HTMLTreeBuilder', + 'SAXTreeBuilder', + 'TreeBuilder', + 'TreeBuilderRegistry', + ] + +# Some useful features for a TreeBuilder to have. +FAST = 'fast' +PERMISSIVE = 'permissive' +STRICT = 'strict' +XML = 'xml' +HTML = 'html' +HTML_5 = 'html5' + +class XMLParsedAsHTMLWarning(UserWarning): + """The warning issued when an HTML parser is used to parse + XML that is not XHTML. + """ + MESSAGE = """It looks like you're parsing an XML document using an HTML parser. If this really is an HTML document (maybe it's XHTML?), you can ignore or filter this warning. If it's XML, you should know that using an XML parser will be more reliable. To parse this document as XML, make sure you have the lxml package installed, and pass the keyword argument `features="xml"` into the BeautifulSoup constructor.""" + + +class TreeBuilderRegistry(object): + """A way of looking up TreeBuilder subclasses by their name or by desired + features. + """ + + def __init__(self): + self.builders_for_feature = defaultdict(list) + self.builders = [] + + def register(self, treebuilder_class): + """Register a treebuilder based on its advertised features. + + :param treebuilder_class: A subclass of Treebuilder. its .features + attribute should list its features. + """ + for feature in treebuilder_class.features: + self.builders_for_feature[feature].insert(0, treebuilder_class) + self.builders.insert(0, treebuilder_class) + + def lookup(self, *features): + """Look up a TreeBuilder subclass with the desired features. + + :param features: A list of features to look for. If none are + provided, the most recently registered TreeBuilder subclass + will be used. + :return: A TreeBuilder subclass, or None if there's no + registered subclass with all the requested features. + """ + if len(self.builders) == 0: + # There are no builders at all. + return None + + if len(features) == 0: + # They didn't ask for any features. Give them the most + # recently registered builder. + return self.builders[0] + + # Go down the list of features in order, and eliminate any builders + # that don't match every feature. + features = list(features) + features.reverse() + candidates = None + candidate_set = None + while len(features) > 0: + feature = features.pop() + we_have_the_feature = self.builders_for_feature.get(feature, []) + if len(we_have_the_feature) > 0: + if candidates is None: + candidates = we_have_the_feature + candidate_set = set(candidates) + else: + # Eliminate any candidates that don't have this feature. + candidate_set = candidate_set.intersection( + set(we_have_the_feature)) + + # The only valid candidates are the ones in candidate_set. + # Go through the original list of candidates and pick the first one + # that's in candidate_set. + if candidate_set is None: + return None + for candidate in candidates: + if candidate in candidate_set: + return candidate + return None + +# The BeautifulSoup class will take feature lists from developers and use them +# to look up builders in this registry. +builder_registry = TreeBuilderRegistry() + +class TreeBuilder(object): + """Turn a textual document into a Beautiful Soup object tree.""" + + NAME = "[Unknown tree builder]" + ALTERNATE_NAMES = [] + features = [] + + is_xml = False + picklable = False + empty_element_tags = None # A tag will be considered an empty-element + # tag when and only when it has no contents. + + # A value for these tag/attribute combinations is a space- or + # comma-separated list of CDATA, rather than a single CDATA. + DEFAULT_CDATA_LIST_ATTRIBUTES = defaultdict(list) + + # Whitespace should be preserved inside these tags. + DEFAULT_PRESERVE_WHITESPACE_TAGS = set() + + # The textual contents of tags with these names should be + # instantiated with some class other than NavigableString. + DEFAULT_STRING_CONTAINERS = {} + + USE_DEFAULT = object() + + # Most parsers don't keep track of line numbers. + TRACKS_LINE_NUMBERS = False + + def __init__(self, multi_valued_attributes=USE_DEFAULT, + preserve_whitespace_tags=USE_DEFAULT, + store_line_numbers=USE_DEFAULT, + string_containers=USE_DEFAULT, + ): + """Constructor. + + :param multi_valued_attributes: If this is set to None, the + TreeBuilder will not turn any values for attributes like + 'class' into lists. Setting this to a dictionary will + customize this behavior; look at DEFAULT_CDATA_LIST_ATTRIBUTES + for an example. + + Internally, these are called "CDATA list attributes", but that + probably doesn't make sense to an end-user, so the argument name + is `multi_valued_attributes`. + + :param preserve_whitespace_tags: A list of tags to treat + the way
     tags are treated in HTML. Tags in this list
    +         are immune from pretty-printing; their contents will always be
    +         output as-is.
    +
    +        :param string_containers: A dictionary mapping tag names to
    +        the classes that should be instantiated to contain the textual
    +        contents of those tags. The default is to use NavigableString
    +        for every tag, no matter what the name. You can override the
    +        default by changing DEFAULT_STRING_CONTAINERS.
    +
    +        :param store_line_numbers: If the parser keeps track of the
    +         line numbers and positions of the original markup, that
    +         information will, by default, be stored in each corresponding
    +         `Tag` object. You can turn this off by passing
    +         store_line_numbers=False. If the parser you're using doesn't 
    +         keep track of this information, then setting store_line_numbers=True
    +         will do nothing.
    +        """
    +        self.soup = None
    +        if multi_valued_attributes is self.USE_DEFAULT:
    +            multi_valued_attributes = self.DEFAULT_CDATA_LIST_ATTRIBUTES
    +        self.cdata_list_attributes = multi_valued_attributes
    +        if preserve_whitespace_tags is self.USE_DEFAULT:
    +            preserve_whitespace_tags = self.DEFAULT_PRESERVE_WHITESPACE_TAGS
    +        self.preserve_whitespace_tags = preserve_whitespace_tags
    +        if store_line_numbers == self.USE_DEFAULT:
    +            store_line_numbers = self.TRACKS_LINE_NUMBERS
    +        self.store_line_numbers = store_line_numbers 
    +        if string_containers == self.USE_DEFAULT:
    +            string_containers = self.DEFAULT_STRING_CONTAINERS
    +        self.string_containers = string_containers
    +        
    +    def initialize_soup(self, soup):
    +        """The BeautifulSoup object has been initialized and is now
    +        being associated with the TreeBuilder.
    +
    +        :param soup: A BeautifulSoup object.
    +        """
    +        self.soup = soup
    +        
    +    def reset(self):
    +        """Do any work necessary to reset the underlying parser
    +        for a new document.
    +
    +        By default, this does nothing.
    +        """
    +        pass
    +
    +    def can_be_empty_element(self, tag_name):
    +        """Might a tag with this name be an empty-element tag?
    +
    +        The final markup may or may not actually present this tag as
    +        self-closing.
    +
    +        For instance: an HTMLBuilder does not consider a 

    tag to be + an empty-element tag (it's not in + HTMLBuilder.empty_element_tags). This means an empty

    tag + will be presented as "

    ", not "

    " or "

    ". + + The default implementation has no opinion about which tags are + empty-element tags, so a tag will be presented as an + empty-element tag if and only if it has no children. + "" will become "", and "bar" will + be left alone. + + :param tag_name: The name of a markup tag. + """ + if self.empty_element_tags is None: + return True + return tag_name in self.empty_element_tags + + def feed(self, markup): + """Run some incoming markup through some parsing process, + populating the `BeautifulSoup` object in self.soup. + + This method is not implemented in TreeBuilder; it must be + implemented in subclasses. + + :return: None. + """ + raise NotImplementedError() + + def prepare_markup(self, markup, user_specified_encoding=None, + document_declared_encoding=None, exclude_encodings=None): + """Run any preliminary steps necessary to make incoming markup + acceptable to the parser. + + :param markup: Some markup -- probably a bytestring. + :param user_specified_encoding: The user asked to try this encoding. + :param document_declared_encoding: The markup itself claims to be + in this encoding. NOTE: This argument is not used by the + calling code and can probably be removed. + :param exclude_encodings: The user asked _not_ to try any of + these encodings. + + :yield: A series of 4-tuples: + (markup, encoding, declared encoding, + has undergone character replacement) + + Each 4-tuple represents a strategy for converting the + document to Unicode and parsing it. Each strategy will be tried + in turn. + + By default, the only strategy is to parse the markup + as-is. See `LXMLTreeBuilderForXML` and + `HTMLParserTreeBuilder` for implementations that take into + account the quirks of particular parsers. + """ + yield markup, None, None, False + + def test_fragment_to_document(self, fragment): + """Wrap an HTML fragment to make it look like a document. + + Different parsers do this differently. For instance, lxml + introduces an empty tag, and html5lib + doesn't. Abstracting this away lets us write simple tests + which run HTML fragments through the parser and compare the + results against other HTML fragments. + + This method should not be used outside of tests. + + :param fragment: A string -- fragment of HTML. + :return: A string -- a full HTML document. + """ + return fragment + + def set_up_substitutions(self, tag): + """Set up any substitutions that will need to be performed on + a `Tag` when it's output as a string. + + By default, this does nothing. See `HTMLTreeBuilder` for a + case where this is used. + + :param tag: A `Tag` + :return: Whether or not a substitution was performed. + """ + return False + + def _replace_cdata_list_attribute_values(self, tag_name, attrs): + """When an attribute value is associated with a tag that can + have multiple values for that attribute, convert the string + value to a list of strings. + + Basically, replaces class="foo bar" with class=["foo", "bar"] + + NOTE: This method modifies its input in place. + + :param tag_name: The name of a tag. + :param attrs: A dictionary containing the tag's attributes. + Any appropriate attribute values will be modified in place. + """ + if not attrs: + return attrs + if self.cdata_list_attributes: + universal = self.cdata_list_attributes.get('*', []) + tag_specific = self.cdata_list_attributes.get( + tag_name.lower(), None) + for attr in list(attrs.keys()): + if attr in universal or (tag_specific and attr in tag_specific): + # We have a "class"-type attribute whose string + # value is a whitespace-separated list of + # values. Split it into a list. + value = attrs[attr] + if isinstance(value, str): + values = nonwhitespace_re.findall(value) + else: + # html5lib sometimes calls setAttributes twice + # for the same tag when rearranging the parse + # tree. On the second call the attribute value + # here is already a list. If this happens, + # leave the value alone rather than trying to + # split it again. + values = value + attrs[attr] = values + return attrs + +class SAXTreeBuilder(TreeBuilder): + """A Beautiful Soup treebuilder that listens for SAX events. + + This is not currently used for anything, but it demonstrates + how a simple TreeBuilder would work. + """ + + def feed(self, markup): + raise NotImplementedError() + + def close(self): + pass + + def startElement(self, name, attrs): + attrs = dict((key[1], value) for key, value in list(attrs.items())) + #print("Start %s, %r" % (name, attrs)) + self.soup.handle_starttag(name, attrs) + + def endElement(self, name): + #print("End %s" % name) + self.soup.handle_endtag(name) + + def startElementNS(self, nsTuple, nodeName, attrs): + # Throw away (ns, nodeName) for now. + self.startElement(nodeName, attrs) + + def endElementNS(self, nsTuple, nodeName): + # Throw away (ns, nodeName) for now. + self.endElement(nodeName) + #handler.endElementNS((ns, node.nodeName), node.nodeName) + + def startPrefixMapping(self, prefix, nodeValue): + # Ignore the prefix for now. + pass + + def endPrefixMapping(self, prefix): + # Ignore the prefix for now. + # handler.endPrefixMapping(prefix) + pass + + def characters(self, content): + self.soup.handle_data(content) + + def startDocument(self): + pass + + def endDocument(self): + pass + + +class HTMLTreeBuilder(TreeBuilder): + """This TreeBuilder knows facts about HTML. + + Such as which tags are empty-element tags. + """ + + empty_element_tags = set([ + # These are from HTML5. + 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr', + + # These are from earlier versions of HTML and are removed in HTML5. + 'basefont', 'bgsound', 'command', 'frame', 'image', 'isindex', 'nextid', 'spacer' + ]) + + # The HTML standard defines these as block-level elements. Beautiful + # Soup does not treat these elements differently from other elements, + # but it may do so eventually, and this information is available if + # you need to use it. + block_elements = set(["address", "article", "aside", "blockquote", "canvas", "dd", "div", "dl", "dt", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hr", "li", "main", "nav", "noscript", "ol", "output", "p", "pre", "section", "table", "tfoot", "ul", "video"]) + + # These HTML tags need special treatment so they can be + # represented by a string class other than NavigableString. + # + # For some of these tags, it's because the HTML standard defines + # an unusual content model for them. I made this list by going + # through the HTML spec + # (https://html.spec.whatwg.org/#metadata-content) and looking for + # "metadata content" elements that can contain strings. + # + # The Ruby tags ( and ) are here despite being normal + # "phrasing content" tags, because the content they contain is + # qualitatively different from other text in the document, and it + # can be useful to be able to distinguish it. + # + # TODO: Arguably

     and
    +            # 
    +
    This numeric entity is missing the final semicolon:
    + +
    a
    +
    This document contains (do you see it?)
    +
    This document ends with That attribute value was bogus
    +The doctype is invalid because it contains extra whitespace +
    That boolean attribute had no value
    +
    Here's a nonexistent entity: &#foo; (do you see it?)
    +
    This document ends before the entity finishes: > +

    Paragraphs shouldn't contain block display elements, but this one does:

    you see?

    +Multiple values for the same attribute. +
    Here's a table
    +
    +
    This tag contains nothing but whitespace:
    +

    This p tag is cut off by

    the end of the blockquote tag
    +
    Here's a nested table:
    foo
    This table contains bare markup
    + +
    This document contains a surprise doctype
    + +
    Tag name contains Unicode characters
    + + +""" + + +class SoupTest(object): + + @property + def default_builder(self): + return default_builder + + def soup(self, markup, **kwargs): + """Build a Beautiful Soup object from markup.""" + builder = kwargs.pop('builder', self.default_builder) + return BeautifulSoup(markup, builder=builder, **kwargs) + + def document_for(self, markup, **kwargs): + """Turn an HTML fragment into a document. + + The details depend on the builder. + """ + return self.default_builder(**kwargs).test_fragment_to_document(markup) + + def assert_soup(self, to_parse, compare_parsed_to=None): + """Parse some markup using Beautiful Soup and verify that + the output markup is as expected. + """ + builder = self.default_builder + obj = BeautifulSoup(to_parse, builder=builder) + if compare_parsed_to is None: + compare_parsed_to = to_parse + + # Verify that the documents come out the same. + assert obj.decode() == self.document_for(compare_parsed_to) + + # Also run some checks on the BeautifulSoup object itself: + + # Verify that every tag that was opened was eventually closed. + + # There are no tags in the open tag counter. + assert all(v==0 for v in list(obj.open_tag_counter.values())) + + # The only tag in the tag stack is the one for the root + # document. + assert [obj.ROOT_TAG_NAME] == [x.name for x in obj.tagStack] + + assertSoupEquals = assert_soup + + def assertConnectedness(self, element): + """Ensure that next_element and previous_element are properly + set for all descendants of the given element. + """ + earlier = None + for e in element.descendants: + if earlier: + assert e == earlier.next_element + assert earlier == e.previous_element + earlier = e + + def linkage_validator(self, el, _recursive_call=False): + """Ensure proper linkage throughout the document.""" + descendant = None + # Document element should have no previous element or previous sibling. + # It also shouldn't have a next sibling. + if el.parent is None: + assert el.previous_element is None,\ + "Bad previous_element\nNODE: {}\nPREV: {}\nEXPECTED: {}".format( + el, el.previous_element, None + ) + assert el.previous_sibling is None,\ + "Bad previous_sibling\nNODE: {}\nPREV: {}\nEXPECTED: {}".format( + el, el.previous_sibling, None + ) + assert el.next_sibling is None,\ + "Bad next_sibling\nNODE: {}\nNEXT: {}\nEXPECTED: {}".format( + el, el.next_sibling, None + ) + + idx = 0 + child = None + last_child = None + last_idx = len(el.contents) - 1 + for child in el.contents: + descendant = None + + # Parent should link next element to their first child + # That child should have no previous sibling + if idx == 0: + if el.parent is not None: + assert el.next_element is child,\ + "Bad next_element\nNODE: {}\nNEXT: {}\nEXPECTED: {}".format( + el, el.next_element, child + ) + assert child.previous_element is el,\ + "Bad previous_element\nNODE: {}\nPREV: {}\nEXPECTED: {}".format( + child, child.previous_element, el + ) + assert child.previous_sibling is None,\ + "Bad previous_sibling\nNODE: {}\nPREV {}\nEXPECTED: {}".format( + child, child.previous_sibling, None + ) + + # If not the first child, previous index should link as sibling to this index + # Previous element should match the last index or the last bubbled up descendant + else: + assert child.previous_sibling is el.contents[idx - 1],\ + "Bad previous_sibling\nNODE: {}\nPREV {}\nEXPECTED {}".format( + child, child.previous_sibling, el.contents[idx - 1] + ) + assert el.contents[idx - 1].next_sibling is child,\ + "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + el.contents[idx - 1], el.contents[idx - 1].next_sibling, child + ) + + if last_child is not None: + assert child.previous_element is last_child,\ + "Bad previous_element\nNODE: {}\nPREV {}\nEXPECTED {}\nCONTENTS {}".format( + child, child.previous_element, last_child, child.parent.contents + ) + assert last_child.next_element is child,\ + "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + last_child, last_child.next_element, child + ) + + if isinstance(child, Tag) and child.contents: + descendant = self.linkage_validator(child, True) + # A bubbled up descendant should have no next siblings + assert descendant.next_sibling is None,\ + "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + descendant, descendant.next_sibling, None + ) + + # Mark last child as either the bubbled up descendant or the current child + if descendant is not None: + last_child = descendant + else: + last_child = child + + # If last child, there are non next siblings + if idx == last_idx: + assert child.next_sibling is None,\ + "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + child, child.next_sibling, None + ) + idx += 1 + + child = descendant if descendant is not None else child + if child is None: + child = el + + if not _recursive_call and child is not None: + target = el + while True: + if target is None: + assert child.next_element is None, \ + "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + child, child.next_element, None + ) + break + elif target.next_sibling is not None: + assert child.next_element is target.next_sibling, \ + "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + child, child.next_element, target.next_sibling + ) + break + target = target.parent + + # We are done, so nothing to return + return None + else: + # Return the child to the recursive caller + return child + + def assert_selects(self, tags, should_match): + """Make sure that the given tags have the correct text. + + This is used in tests that define a bunch of tags, each + containing a single string, and then select certain strings by + some mechanism. + """ + assert [tag.string for tag in tags] == should_match + + def assert_selects_ids(self, tags, should_match): + """Make sure that the given tags have the correct IDs. + + This is used in tests that define a bunch of tags, each + containing a single string, and then select certain strings by + some mechanism. + """ + assert [tag['id'] for tag in tags] == should_match + + +class TreeBuilderSmokeTest(object): + # Tests that are common to HTML and XML tree builders. + + @pytest.mark.parametrize( + "multi_valued_attributes", + [None, {}, dict(b=['class']), {'*': ['notclass']}] + ) + def test_attribute_not_multi_valued(self, multi_valued_attributes): + markup = '' + soup = self.soup(markup, multi_valued_attributes=multi_valued_attributes) + assert soup.a['class'] == 'a b c' + + @pytest.mark.parametrize( + "multi_valued_attributes", [dict(a=['class']), {'*': ['class']}] + ) + def test_attribute_multi_valued(self, multi_valued_attributes): + markup = '' + soup = self.soup( + markup, multi_valued_attributes=multi_valued_attributes + ) + assert soup.a['class'] == ['a', 'b', 'c'] + + def test_invalid_doctype(self): + markup = 'content' + markup = '' + soup = self.soup(markup) + +class HTMLTreeBuilderSmokeTest(TreeBuilderSmokeTest): + + """A basic test of a treebuilder's competence. + + Any HTML treebuilder, present or future, should be able to pass + these tests. With invalid markup, there's room for interpretation, + and different parsers can handle it differently. But with the + markup in these tests, there's not much room for interpretation. + """ + + def test_empty_element_tags(self): + """Verify that all HTML4 and HTML5 empty element (aka void element) tags + are handled correctly. + """ + for name in [ + 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr', + 'spacer', 'frame' + ]: + soup = self.soup("") + new_tag = soup.new_tag(name) + assert new_tag.is_empty_element == True + + def test_special_string_containers(self): + soup = self.soup( + "" + ) + assert isinstance(soup.style.string, Stylesheet) + assert isinstance(soup.script.string, Script) + + soup = self.soup( + "" + ) + assert isinstance(soup.style.string, Stylesheet) + # The contents of the style tag resemble an HTML comment, but + # it's not treated as a comment. + assert soup.style.string == "" + assert isinstance(soup.style.string, Stylesheet) + + def test_pickle_and_unpickle_identity(self): + # Pickling a tree, then unpickling it, yields a tree identical + # to the original. + tree = self.soup("foo") + dumped = pickle.dumps(tree, 2) + loaded = pickle.loads(dumped) + assert loaded.__class__ == BeautifulSoup + assert loaded.decode() == tree.decode() + + def assertDoctypeHandled(self, doctype_fragment): + """Assert that a given doctype string is handled correctly.""" + doctype_str, soup = self._document_with_doctype(doctype_fragment) + + # Make sure a Doctype object was created. + doctype = soup.contents[0] + assert doctype.__class__ == Doctype + assert doctype == doctype_fragment + assert soup.encode("utf8")[:len(doctype_str)] == doctype_str + + # Make sure that the doctype was correctly associated with the + # parse tree and that the rest of the document parsed. + assert soup.p.contents[0] == 'foo' + + def _document_with_doctype(self, doctype_fragment, doctype_string="DOCTYPE"): + """Generate and parse a document with the given doctype.""" + doctype = '' % (doctype_string, doctype_fragment) + markup = doctype + '\n

    foo

    ' + soup = self.soup(markup) + return doctype.encode("utf8"), soup + + def test_normal_doctypes(self): + """Make sure normal, everyday HTML doctypes are handled correctly.""" + self.assertDoctypeHandled("html") + self.assertDoctypeHandled( + 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"') + + def test_empty_doctype(self): + soup = self.soup("") + doctype = soup.contents[0] + assert "" == doctype.strip() + + def test_mixed_case_doctype(self): + # A lowercase or mixed-case doctype becomes a Doctype. + for doctype_fragment in ("doctype", "DocType"): + doctype_str, soup = self._document_with_doctype( + "html", doctype_fragment + ) + + # Make sure a Doctype object was created and that the DOCTYPE + # is uppercase. + doctype = soup.contents[0] + assert doctype.__class__ == Doctype + assert doctype == "html" + assert soup.encode("utf8")[:len(doctype_str)] == b"" + + # Make sure that the doctype was correctly associated with the + # parse tree and that the rest of the document parsed. + assert soup.p.contents[0] == 'foo' + + def test_public_doctype_with_url(self): + doctype = 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' + self.assertDoctypeHandled(doctype) + + def test_system_doctype(self): + self.assertDoctypeHandled('foo SYSTEM "http://www.example.com/"') + + def test_namespaced_system_doctype(self): + # We can handle a namespaced doctype with a system ID. + self.assertDoctypeHandled('xsl:stylesheet SYSTEM "htmlent.dtd"') + + def test_namespaced_public_doctype(self): + # Test a namespaced doctype with a public id. + self.assertDoctypeHandled('xsl:stylesheet PUBLIC "htmlent.dtd"') + + def test_real_xhtml_document(self): + """A real XHTML document should come out more or less the same as it went in.""" + markup = b""" + + +Hello. +Goodbye. +""" + with warnings.catch_warnings(record=True) as w: + soup = self.soup(markup) + assert soup.encode("utf-8").replace(b"\n", b"") == markup.replace(b"\n", b"") + + # No warning was issued about parsing an XML document as HTML, + # because XHTML is both. + assert w == [] + + + def test_namespaced_html(self): + # When a namespaced XML document is parsed as HTML it should + # be treated as HTML with weird tag names. + markup = b"""content""" + with warnings.catch_warnings(record=True) as w: + soup = self.soup(markup) + + assert 2 == len(soup.find_all("ns1:foo")) + + # n.b. no "you're parsing XML as HTML" warning was given + # because there was no XML declaration. + assert [] == w + + def test_detect_xml_parsed_as_html(self): + # A warning is issued when parsing an XML document as HTML, + # but basic stuff should still work. + markup = b"""string""" + with warnings.catch_warnings(record=True) as w: + soup = self.soup(markup) + assert soup.tag.string == 'string' + [warning] = w + assert isinstance(warning.message, XMLParsedAsHTMLWarning) + assert str(warning.message) == XMLParsedAsHTMLWarning.MESSAGE + + # NOTE: the warning is not issued if the document appears to + # be XHTML (tested with test_real_xhtml_document in the + # superclass) or if there is no XML declaration (tested with + # test_namespaced_html in the superclass). + + def test_processing_instruction(self): + # We test both Unicode and bytestring to verify that + # process_markup correctly sets processing_instruction_class + # even when the markup is already Unicode and there is no + # need to process anything. + markup = """""" + soup = self.soup(markup) + assert markup == soup.decode() + + markup = b"""""" + soup = self.soup(markup) + assert markup == soup.encode("utf8") + + def test_deepcopy(self): + """Make sure you can copy the tree builder. + + This is important because the builder is part of a + BeautifulSoup object, and we want to be able to copy that. + """ + copy.deepcopy(self.default_builder) + + def test_p_tag_is_never_empty_element(self): + """A

    tag is never designated as an empty-element tag. + + Even if the markup shows it as an empty-element tag, it + shouldn't be presented that way. + """ + soup = self.soup("

    ") + assert not soup.p.is_empty_element + assert str(soup.p) == "

    " + + def test_unclosed_tags_get_closed(self): + """A tag that's not closed by the end of the document should be closed. + + This applies to all tags except empty-element tags. + """ + self.assert_soup("

    ", "

    ") + self.assert_soup("", "") + + self.assert_soup("
    ", "
    ") + + def test_br_is_always_empty_element_tag(self): + """A
    tag is designated as an empty-element tag. + + Some parsers treat

    as one
    tag, some parsers as + two tags, but it should always be an empty-element tag. + """ + soup = self.soup("

    ") + assert soup.br.is_empty_element + assert str(soup.br) == "
    " + + def test_nested_formatting_elements(self): + self.assert_soup("") + + def test_double_head(self): + html = ''' + + +Ordinary HEAD element test + + + +Hello, world! + + +''' + soup = self.soup(html) + assert "text/javascript" == soup.find('script')['type'] + + def test_comment(self): + # Comments are represented as Comment objects. + markup = "

    foobaz

    " + self.assert_soup(markup) + + soup = self.soup(markup) + comment = soup.find(string="foobar") + assert comment.__class__ == Comment + + # The comment is properly integrated into the tree. + foo = soup.find(string="foo") + assert comment == foo.next_element + baz = soup.find(string="baz") + assert comment == baz.previous_element + + def test_preserved_whitespace_in_pre_and_textarea(self): + """Whitespace must be preserved in
     and \n"
    +        self.assert_soup(pre_markup)
    +        self.assert_soup(textarea_markup)
    +
    +        soup = self.soup(pre_markup)
    +        assert soup.pre.prettify() == pre_markup
    +
    +        soup = self.soup(textarea_markup)
    +        assert soup.textarea.prettify() == textarea_markup
    +
    +        soup = self.soup("")
    +        assert soup.textarea.prettify() == "\n"
    +
    +    def test_nested_inline_elements(self):
    +        """Inline elements can be nested indefinitely."""
    +        b_tag = "Inside a B tag"
    +        self.assert_soup(b_tag)
    +
    +        nested_b_tag = "

    A nested tag

    " + self.assert_soup(nested_b_tag) + + double_nested_b_tag = "

    A doubly nested tag

    " + self.assert_soup(nested_b_tag) + + def test_nested_block_level_elements(self): + """Block elements can be nested.""" + soup = self.soup('

    Foo

    ') + blockquote = soup.blockquote + assert blockquote.p.b.string == 'Foo' + assert blockquote.b.string == 'Foo' + + def test_correctly_nested_tables(self): + """One table can go inside another one.""" + markup = ('' + '' + "') + + self.assert_soup( + markup, + '
    Here's another table:" + '' + '' + '
    foo
    Here\'s another table:' + '
    foo
    ' + '
    ') + + self.assert_soup( + "" + "" + "
    Foo
    Bar
    Baz
    ") + + def test_multivalued_attribute_with_whitespace(self): + # Whitespace separating the values of a multi-valued attribute + # should be ignored. + + markup = '
    ' + soup = self.soup(markup) + assert ['foo', 'bar'] == soup.div['class'] + + # If you search by the literal name of the class it's like the whitespace + # wasn't there. + assert soup.div == soup.find('div', class_="foo bar") + + def test_deeply_nested_multivalued_attribute(self): + # html5lib can set the attributes of the same tag many times + # as it rearranges the tree. This has caused problems with + # multivalued attributes. + markup = '
    ' + soup = self.soup(markup) + assert ["css"] == soup.div.div['class'] + + def test_multivalued_attribute_on_html(self): + # html5lib uses a different API to set the attributes ot the + # tag. This has caused problems with multivalued + # attributes. + markup = '' + soup = self.soup(markup) + assert ["a", "b"] == soup.html['class'] + + def test_angle_brackets_in_attribute_values_are_escaped(self): + self.assert_soup('', '') + + def test_strings_resembling_character_entity_references(self): + # "&T" and "&p" look like incomplete character entities, but they are + # not. + self.assert_soup( + "

    • AT&T is in the s&p 500

    ", + "

    \u2022 AT&T is in the s&p 500

    " + ) + + def test_apos_entity(self): + self.assert_soup( + "

    Bob's Bar

    ", + "

    Bob's Bar

    ", + ) + + def test_entities_in_foreign_document_encoding(self): + # “ and ” are invalid numeric entities referencing + # Windows-1252 characters. - references a character common + # to Windows-1252 and Unicode, and ☃ references a + # character only found in Unicode. + # + # All of these entities should be converted to Unicode + # characters. + markup = "

    “Hello” -☃

    " + soup = self.soup(markup) + assert "“Hello†-☃" == soup.p.string + + def test_entities_in_attributes_converted_to_unicode(self): + expect = '

    ' + self.assert_soup('

    ', expect) + self.assert_soup('

    ', expect) + self.assert_soup('

    ', expect) + self.assert_soup('

    ', expect) + + def test_entities_in_text_converted_to_unicode(self): + expect = '

    pi\N{LATIN SMALL LETTER N WITH TILDE}ata

    ' + self.assert_soup("

    piñata

    ", expect) + self.assert_soup("

    piñata

    ", expect) + self.assert_soup("

    piñata

    ", expect) + self.assert_soup("

    piñata

    ", expect) + + def test_quot_entity_converted_to_quotation_mark(self): + self.assert_soup("

    I said "good day!"

    ", + '

    I said "good day!"

    ') + + def test_out_of_range_entity(self): + expect = "\N{REPLACEMENT CHARACTER}" + self.assert_soup("�", expect) + self.assert_soup("�", expect) + self.assert_soup("�", expect) + + def test_multipart_strings(self): + "Mostly to prevent a recurrence of a bug in the html5lib treebuilder." + soup = self.soup("

    \nfoo

    ") + assert "p" == soup.h2.string.next_element.name + assert "p" == soup.p.name + self.assertConnectedness(soup) + + def test_empty_element_tags(self): + """Verify consistent handling of empty-element tags, + no matter how they come in through the markup. + """ + self.assert_soup('


    ', "


    ") + self.assert_soup('


    ', "


    ") + + def test_head_tag_between_head_and_body(self): + "Prevent recurrence of a bug in the html5lib treebuilder." + content = """ + + foo + +""" + soup = self.soup(content) + assert soup.html.body is not None + self.assertConnectedness(soup) + + def test_multiple_copies_of_a_tag(self): + "Prevent recurrence of a bug in the html5lib treebuilder." + content = """ + + + + + +""" + soup = self.soup(content) + self.assertConnectedness(soup.article) + + def test_basic_namespaces(self): + """Parsers don't need to *understand* namespaces, but at the + very least they should not choke on namespaces or lose + data.""" + + markup = b'4' + soup = self.soup(markup) + assert markup == soup.encode() + html = soup.html + assert 'http://www.w3.org/1999/xhtml' == soup.html['xmlns'] + assert 'http://www.w3.org/1998/Math/MathML' == soup.html['xmlns:mathml'] + assert 'http://www.w3.org/2000/svg' == soup.html['xmlns:svg'] + + def test_multivalued_attribute_value_becomes_list(self): + markup = b'' + soup = self.soup(markup) + assert ['foo', 'bar'] == soup.a['class'] + + # + # Generally speaking, tests below this point are more tests of + # Beautiful Soup than tests of the tree builders. But parsers are + # weird, so we run these tests separately for every tree builder + # to detect any differences between them. + # + + def test_can_parse_unicode_document(self): + # A seemingly innocuous document... but it's in Unicode! And + # it contains characters that can't be represented in the + # encoding found in the declaration! The horror! + markup = 'Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!' + soup = self.soup(markup) + assert 'Sacr\xe9 bleu!' == soup.body.string + + def test_soupstrainer(self): + """Parsers should be able to work with SoupStrainers.""" + strainer = SoupStrainer("b") + soup = self.soup("A bold statement", + parse_only=strainer) + assert soup.decode() == "bold" + + def test_single_quote_attribute_values_become_double_quotes(self): + self.assert_soup("", + '') + + def test_attribute_values_with_nested_quotes_are_left_alone(self): + text = """a""" + self.assert_soup(text) + + def test_attribute_values_with_double_nested_quotes_get_quoted(self): + text = """a""" + soup = self.soup(text) + soup.foo['attr'] = 'Brawls happen at "Bob\'s Bar"' + self.assert_soup( + soup.foo.decode(), + """a""") + + def test_ampersand_in_attribute_value_gets_escaped(self): + self.assert_soup('', + '') + + self.assert_soup( + 'foo', + 'foo') + + def test_escaped_ampersand_in_attribute_value_is_left_alone(self): + self.assert_soup('') + + def test_entities_in_strings_converted_during_parsing(self): + # Both XML and HTML entities are converted to Unicode characters + # during parsing. + text = "

    <<sacré bleu!>>

    " + expected = "

    <<sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!>>

    " + self.assert_soup(text, expected) + + def test_smart_quotes_converted_on_the_way_in(self): + # Microsoft smart quotes are converted to Unicode characters during + # parsing. + quote = b"

    \x91Foo\x92

    " + soup = self.soup(quote) + assert soup.p.string == "\N{LEFT SINGLE QUOTATION MARK}Foo\N{RIGHT SINGLE QUOTATION MARK}" + + def test_non_breaking_spaces_converted_on_the_way_in(self): + soup = self.soup("  ") + assert soup.a.string == "\N{NO-BREAK SPACE}" * 2 + + def test_entities_converted_on_the_way_out(self): + text = "

    <<sacré bleu!>>

    " + expected = "

    <<sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!>>

    ".encode("utf-8") + soup = self.soup(text) + assert soup.p.encode("utf-8") == expected + + def test_real_iso_8859_document(self): + # Smoke test of interrelated functionality, using an + # easy-to-understand document. + + # Here it is in Unicode. Note that it claims to be in ISO-8859-1. + unicode_html = '

    Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!

    ' + + # That's because we're going to encode it into ISO-8859-1, + # and use that to test. + iso_latin_html = unicode_html.encode("iso-8859-1") + + # Parse the ISO-8859-1 HTML. + soup = self.soup(iso_latin_html) + + # Encode it to UTF-8. + result = soup.encode("utf-8") + + # What do we expect the result to look like? Well, it would + # look like unicode_html, except that the META tag would say + # UTF-8 instead of ISO-8859-1. + expected = unicode_html.replace("ISO-8859-1", "utf-8") + + # And, of course, it would be in UTF-8, not Unicode. + expected = expected.encode("utf-8") + + # Ta-da! + assert result == expected + + def test_real_shift_jis_document(self): + # Smoke test to make sure the parser can handle a document in + # Shift-JIS encoding, without choking. + shift_jis_html = ( + b'
    '
    +            b'\x82\xb1\x82\xea\x82\xcdShift-JIS\x82\xc5\x83R\x81[\x83f'
    +            b'\x83B\x83\x93\x83O\x82\xb3\x82\xea\x82\xbd\x93\xfa\x96{\x8c'
    +            b'\xea\x82\xcc\x83t\x83@\x83C\x83\x8b\x82\xc5\x82\xb7\x81B'
    +            b'
    ') + unicode_html = shift_jis_html.decode("shift-jis") + soup = self.soup(unicode_html) + + # Make sure the parse tree is correctly encoded to various + # encodings. + assert soup.encode("utf-8") == unicode_html.encode("utf-8") + assert soup.encode("euc_jp") == unicode_html.encode("euc_jp") + + def test_real_hebrew_document(self): + # A real-world test to make sure we can convert ISO-8859-9 (a + # Hebrew encoding) to UTF-8. + hebrew_document = b'Hebrew (ISO 8859-8) in Visual Directionality

    Hebrew (ISO 8859-8) in Visual Directionality

    \xed\xe5\xec\xf9' + soup = self.soup( + hebrew_document, from_encoding="iso8859-8") + # Some tree builders call it iso8859-8, others call it iso-8859-9. + # That's not a difference we really care about. + assert soup.original_encoding in ('iso8859-8', 'iso-8859-8') + assert soup.encode('utf-8') == ( + hebrew_document.decode("iso8859-8").encode("utf-8") + ) + + def test_meta_tag_reflects_current_encoding(self): + # Here's the tag saying that a document is + # encoded in Shift-JIS. + meta_tag = ('') + + # Here's a document incorporating that meta tag. + shift_jis_html = ( + '\n%s\n' + '' + 'Shift-JIS markup goes here.') % meta_tag + soup = self.soup(shift_jis_html) + + # Parse the document, and the charset is seemingly unaffected. + parsed_meta = soup.find('meta', {'http-equiv': 'Content-type'}) + content = parsed_meta['content'] + assert 'text/html; charset=x-sjis' == content + + # But that value is actually a ContentMetaAttributeValue object. + assert isinstance(content, ContentMetaAttributeValue) + + # And it will take on a value that reflects its current + # encoding. + assert 'text/html; charset=utf8' == content.encode("utf8") + + # For the rest of the story, see TestSubstitutions in + # test_tree.py. + + def test_html5_style_meta_tag_reflects_current_encoding(self): + # Here's the tag saying that a document is + # encoded in Shift-JIS. + meta_tag = ('') + + # Here's a document incorporating that meta tag. + shift_jis_html = ( + '\n%s\n' + '' + 'Shift-JIS markup goes here.') % meta_tag + soup = self.soup(shift_jis_html) + + # Parse the document, and the charset is seemingly unaffected. + parsed_meta = soup.find('meta', id="encoding") + charset = parsed_meta['charset'] + assert 'x-sjis' == charset + + # But that value is actually a CharsetMetaAttributeValue object. + assert isinstance(charset, CharsetMetaAttributeValue) + + # And it will take on a value that reflects its current + # encoding. + assert 'utf8' == charset.encode("utf8") + + def test_python_specific_encodings_not_used_in_charset(self): + # You can encode an HTML document using a Python-specific + # encoding, but that encoding won't be mentioned _inside_ the + # resulting document. Instead, the document will appear to + # have no encoding. + for markup in [ + b'' + b'' + ]: + soup = self.soup(markup) + for encoding in PYTHON_SPECIFIC_ENCODINGS: + if encoding in ( + 'idna', 'mbcs', 'oem', 'undefined', + 'string_escape', 'string-escape' + ): + # For one reason or another, these will raise an + # exception if we actually try to use them, so don't + # bother. + continue + encoded = soup.encode(encoding) + assert b'meta charset=""' in encoded + assert encoding.encode("ascii") not in encoded + + def test_tag_with_no_attributes_can_have_attributes_added(self): + data = self.soup("text") + data.a['foo'] = 'bar' + assert 'text' == data.a.decode() + + def test_closing_tag_with_no_opening_tag(self): + # Without BeautifulSoup.open_tag_counter, the tag will + # cause _popToTag to be called over and over again as we look + # for a tag that wasn't there. The result is that 'text2' + # will show up outside the body of the document. + soup = self.soup("

    text1

    text2
    ") + assert "

    text1

    text2
    " == soup.body.decode() + + def test_worst_case(self): + """Test the worst case (currently) for linking issues.""" + + soup = self.soup(BAD_DOCUMENT) + self.linkage_validator(soup) + + +class XMLTreeBuilderSmokeTest(TreeBuilderSmokeTest): + + def test_pickle_and_unpickle_identity(self): + # Pickling a tree, then unpickling it, yields a tree identical + # to the original. + tree = self.soup("foo") + dumped = pickle.dumps(tree, 2) + loaded = pickle.loads(dumped) + assert loaded.__class__ == BeautifulSoup + assert loaded.decode() == tree.decode() + + def test_docstring_generated(self): + soup = self.soup("") + assert soup.encode() == b'\n' + + def test_xml_declaration(self): + markup = b"""\n""" + soup = self.soup(markup) + assert markup == soup.encode("utf8") + + def test_python_specific_encodings_not_used_in_xml_declaration(self): + # You can encode an XML document using a Python-specific + # encoding, but that encoding won't be mentioned _inside_ the + # resulting document. + markup = b"""\n""" + soup = self.soup(markup) + for encoding in PYTHON_SPECIFIC_ENCODINGS: + if encoding in ( + 'idna', 'mbcs', 'oem', 'undefined', + 'string_escape', 'string-escape' + ): + # For one reason or another, these will raise an + # exception if we actually try to use them, so don't + # bother. + continue + encoded = soup.encode(encoding) + assert b'' in encoded + assert encoding.encode("ascii") not in encoded + + def test_processing_instruction(self): + markup = b"""\n""" + soup = self.soup(markup) + assert markup == soup.encode("utf8") + + def test_real_xhtml_document(self): + """A real XHTML document should come out *exactly* the same as it went in.""" + markup = b""" + + +Hello. +Goodbye. +""" + soup = self.soup(markup) + assert soup.encode("utf-8") == markup + + def test_nested_namespaces(self): + doc = b""" + + + + + +""" + soup = self.soup(doc) + assert doc == soup.encode() + + def test_formatter_processes_script_tag_for_xml_documents(self): + doc = """ + +""" + soup = BeautifulSoup(doc, "lxml-xml") + # lxml would have stripped this while parsing, but we can add + # it later. + soup.script.string = 'console.log("< < hey > > ");' + encoded = soup.encode() + assert b"< < hey > >" in encoded + + def test_can_parse_unicode_document(self): + markup = 'Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!' + soup = self.soup(markup) + assert 'Sacr\xe9 bleu!' == soup.root.string + + def test_can_parse_unicode_document_begining_with_bom(self): + markup = '\N{BYTE ORDER MARK}Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!' + soup = self.soup(markup) + assert 'Sacr\xe9 bleu!' == soup.root.string + + def test_popping_namespaced_tag(self): + markup = 'b2012-07-02T20:33:42Zcd' + soup = self.soup(markup) + assert str(soup.rss) == markup + + def test_docstring_includes_correct_encoding(self): + soup = self.soup("") + assert soup.encode("latin1") == b'\n' + + def test_large_xml_document(self): + """A large XML document should come out the same as it went in.""" + markup = (b'\n' + + b'0' * (2**12) + + b'') + soup = self.soup(markup) + assert soup.encode("utf-8") == markup + + def test_tags_are_empty_element_if_and_only_if_they_are_empty(self): + self.assert_soup("

    ", "

    ") + self.assert_soup("

    foo

    ") + + def test_namespaces_are_preserved(self): + markup = 'This tag is in the a namespaceThis tag is in the b namespace' + soup = self.soup(markup) + root = soup.root + assert "http://example.com/" == root['xmlns:a'] + assert "http://example.net/" == root['xmlns:b'] + + def test_closing_namespaced_tag(self): + markup = '

    20010504

    ' + soup = self.soup(markup) + assert str(soup.p) == markup + + def test_namespaced_attributes(self): + markup = '' + soup = self.soup(markup) + assert str(soup.foo) == markup + + def test_namespaced_attributes_xml_namespace(self): + markup = 'bar' + soup = self.soup(markup) + assert str(soup.foo) == markup + + def test_find_by_prefixed_name(self): + doc = """ +foo + bar + baz + +""" + soup = self.soup(doc) + + # There are three tags. + assert 3 == len(soup.find_all('tag')) + + # But two of them are ns1:tag and one of them is ns2:tag. + assert 2 == len(soup.find_all('ns1:tag')) + assert 1 == len(soup.find_all('ns2:tag')) + + assert 1, len(soup.find_all('ns2:tag', key='value')) + assert 3, len(soup.find_all(['ns1:tag', 'ns2:tag'])) + + def test_copy_tag_preserves_namespace(self): + xml = """ +""" + + soup = self.soup(xml) + tag = soup.document + duplicate = copy.copy(tag) + + # The two tags have the same namespace prefix. + assert tag.prefix == duplicate.prefix + + def test_worst_case(self): + """Test the worst case (currently) for linking issues.""" + + soup = self.soup(BAD_DOCUMENT) + self.linkage_validator(soup) + + +class HTML5TreeBuilderSmokeTest(HTMLTreeBuilderSmokeTest): + """Smoke test for a tree builder that supports HTML5.""" + + def test_real_xhtml_document(self): + # Since XHTML is not HTML5, HTML5 parsers are not tested to handle + # XHTML documents in any particular way. + pass + + def test_html_tags_have_namespace(self): + markup = "" + soup = self.soup(markup) + assert "http://www.w3.org/1999/xhtml" == soup.a.namespace + + def test_svg_tags_have_namespace(self): + markup = '' + soup = self.soup(markup) + namespace = "http://www.w3.org/2000/svg" + assert namespace == soup.svg.namespace + assert namespace == soup.circle.namespace + + + def test_mathml_tags_have_namespace(self): + markup = '5' + soup = self.soup(markup) + namespace = 'http://www.w3.org/1998/Math/MathML' + assert namespace == soup.math.namespace + assert namespace == soup.msqrt.namespace + + def test_xml_declaration_becomes_comment(self): + markup = '' + soup = self.soup(markup) + assert isinstance(soup.contents[0], Comment) + assert soup.contents[0] == '?xml version="1.0" encoding="utf-8"?' + assert "html" == soup.contents[0].next_element.name diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase b/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase new file mode 100644 index 0000000..b34be8b --- /dev/null +++ b/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase @@ -0,0 +1 @@ +ÿ

    \ No newline at end of file diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase b/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase new file mode 100644 index 0000000000000000000000000000000000000000..0fe66dd23fe94a8e451dfb1a84da38ed0984c1f9 GIT binary patch literal 19469 zcmeHP%}&BV5UwW1c<}1c&|0d-m{hN9YYZMVF=z-E6E3Azz?Aa07`*ugp1gb37w}np z1J6Ey_J;^Y+hVrDb~+?vcLObSXLo15`M%w!71Cc4g4b8Y>@_=7*S$g~EsGkt2Bn={ zt2=1kXi~B5P|KmamD`Rb<;p=_zIm%4C&qy-Vu088oOsuGz>Kq!-D0_0%~Ls_F?gfesF!B~xlP=*UCbCH?n*-O%0 z!Q*F>?46hl=N3}p9^s$pfQ;#K?C}VRg&?#Cu4Gl`M+NhN`Lsc{A^94o$;0t3y>S870B{5&zz9DFt<}-BMx(8V;~9 zu^`3{e->4K<9oQkG(Mym>pheEPdQ^GK5fr%nc+{ydd)pa{!emW8I*DurdQ@~y8Kk4 zgV7-WU60=nl>ER&`8c&A8JzU^4}@gt+g^h^gT@rwKLtV<2l@NX63OYId;^?(0~P60 z?9W6QN1A0E6WR+_CBVe3&|S@XJ2R{CP{xr=dJz@rVH;L3n4Q9zrUy|Y_Y}rG!O4js mqyYzMPzM!p)C@wIG(#Cwq{BE*384&|DuI`yvfSgo2>k@d3|T1v literal 0 HcmV?d00001 diff --git a/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase b/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase new file mode 100644 index 0000000..367106c --- /dev/null +++ b/lib/python3.11/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase @@ -0,0 +1,2 @@ + +' + "clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896", + + # b'ñ' + "clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224", + + #
    , some ^@ characters, some tags. + "clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744", + + # Nested table + "crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08" + ] + ) + def test_html5lib_parse_errors(self, filename): + markup = self.__markup(filename) + print(BeautifulSoup(markup, 'html5lib').encode()) + + def __markup(self, filename): + if not filename.endswith(self.TESTCASE_SUFFIX): + filename += self.TESTCASE_SUFFIX + this_dir = os.path.split(__file__)[0] + path = os.path.join(this_dir, 'fuzz', filename) + return open(path, 'rb').read() diff --git a/lib/python3.11/site-packages/bs4/tests/test_html5lib.py b/lib/python3.11/site-packages/bs4/tests/test_html5lib.py new file mode 100644 index 0000000..4197720 --- /dev/null +++ b/lib/python3.11/site-packages/bs4/tests/test_html5lib.py @@ -0,0 +1,224 @@ +"""Tests to ensure that the html5lib tree builder generates good trees.""" + +import pytest +import warnings + +from bs4 import BeautifulSoup +from bs4.element import SoupStrainer +from . import ( + HTML5LIB_PRESENT, + HTML5TreeBuilderSmokeTest, + SoupTest, +) + +@pytest.mark.skipif( + not HTML5LIB_PRESENT, + reason="html5lib seems not to be present, not testing its tree builder." +) +class TestHTML5LibBuilder(SoupTest, HTML5TreeBuilderSmokeTest): + """See ``HTML5TreeBuilderSmokeTest``.""" + + @property + def default_builder(self): + from bs4.builder import HTML5TreeBuilder + return HTML5TreeBuilder + + def test_soupstrainer(self): + # The html5lib tree builder does not support SoupStrainers. + strainer = SoupStrainer("b") + markup = "

    A bold statement.

    " + with warnings.catch_warnings(record=True) as w: + soup = BeautifulSoup(markup, "html5lib", parse_only=strainer) + assert soup.decode() == self.document_for(markup) + + [warning] = w + assert warning.filename == __file__ + assert "the html5lib tree builder doesn't support parse_only" in str(warning.message) + + def test_correctly_nested_tables(self): + """html5lib inserts tags where other parsers don't.""" + markup = ('
    ' + '' + "') + + self.assert_soup( + markup, + '
    Here's another table:" + '' + '' + '
    foo
    Here\'s another table:' + '
    foo
    ' + '
    ') + + self.assert_soup( + "" + "" + "
    Foo
    Bar
    Baz
    ") + + def test_xml_declaration_followed_by_doctype(self): + markup = ''' + + + + + +

    foo

    + +''' + soup = self.soup(markup) + # Verify that we can reach the

    tag; this means the tree is connected. + assert b"

    foo

    " == soup.p.encode() + + def test_reparented_markup(self): + markup = '

    foo

    \n

    bar

    ' + soup = self.soup(markup) + assert "

    foo

    \n

    bar

    " == soup.body.decode() + assert 2 == len(soup.find_all('p')) + + + def test_reparented_markup_ends_with_whitespace(self): + markup = '

    foo

    \n

    bar

    \n' + soup = self.soup(markup) + assert "

    foo

    \n

    bar

    \n" == soup.body.decode() + assert 2 == len(soup.find_all('p')) + + def test_reparented_markup_containing_identical_whitespace_nodes(self): + """Verify that we keep the two whitespace nodes in this + document distinct when reparenting the adjacent tags. + """ + markup = '
    ' + soup = self.soup(markup) + space1, space2 = soup.find_all(string=' ') + tbody1, tbody2 = soup.find_all('tbody') + assert space1.next_element is tbody1 + assert tbody2.next_element is space2 + + def test_reparented_markup_containing_children(self): + markup = '' + soup = self.soup(markup) + noscript = soup.noscript + assert "target" == noscript.next_element + target = soup.find(string='target') + + # The 'aftermath' string was duplicated; we want the second one. + final_aftermath = soup.find_all(string='aftermath')[-1] + + # The

BI8#d0wZbERM& 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%0A5zL1(_pYM< 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≶K22J;8Q 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