From 67f2621a69766982ec131e199831d32134e98636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E5=8F=B8git?= <240241002@qq.com> Date: Wed, 14 Jan 2026 17:00:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(payment):=20=E9=9B=86=E6=88=90=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E6=94=AF=E4=BB=98=E4=B8=8E=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在应用中注册支付蓝图(payment_bp)以支持支付接口 - 配置支付宝相关秘钥、回调地址及环境选项 - 新增订单模型(Order),支持订单数据存储与管理 - 管理后台接口添加订单列表查询功能,支持超级管理员访问 - 购买页面与表单修改,支持不同套餐的购买提交 - 支付成功页面提示,显示订单编号及积分到账信息 - 移除买积分按钮禁用逻辑,开放购买功能 --- __pycache__/app.cpython-312.pyc | Bin 1830 -> 2170 bytes __pycache__/config.cpython-312.pyc | Bin 1710 -> 4121 bytes __pycache__/extensions.cpython-312.pyc | Bin 667 -> 665 bytes __pycache__/models.cpython-312.pyc | Bin 7618 -> 9067 bytes app.py | 2 + blueprints/__pycache__/admin.cpython-312.pyc | Bin 11175 -> 12422 bytes blueprints/__pycache__/api.cpython-312.pyc | Bin 21220 -> 21218 bytes blueprints/__pycache__/auth.cpython-312.pyc | Bin 11924 -> 11922 bytes .../__pycache__/payment.cpython-312.pyc | Bin 0 -> 5070 bytes blueprints/admin.py | 23 +- blueprints/payment.py | 111 + config.py | 12 + logs/system.log | 2 + middlewares/__pycache__/auth.cpython-312.pyc | Bin 2780 -> 2778 bytes models.py | 16 + requirements.txt | Bin 2188 -> 2226 bytes .../alipay_service.cpython-312.pyc | Bin 0 -> 2773 bytes services/__pycache__/logger.cpython-312.pyc | Bin 3986 -> 3984 bytes .../__pycache__/sms_service.cpython-312.pyc | Bin 6011 -> 6009 bytes services/alipay_service.py | 42 + sync_db.py | 15 + templates/buy.html | 68 +- .../site-packages/Cryptodome/Cipher/AES.py | 235 ++ .../site-packages/Cryptodome/Cipher/AES.pyi | 156 + .../site-packages/Cryptodome/Cipher/ARC2.py | 175 + .../site-packages/Cryptodome/Cipher/ARC2.pyi | 35 + .../site-packages/Cryptodome/Cipher/ARC4.py | 136 + .../site-packages/Cryptodome/Cipher/ARC4.pyi | 16 + .../Cryptodome/Cipher/Blowfish.py | 159 + .../Cryptodome/Cipher/Blowfish.pyi | 35 + .../site-packages/Cryptodome/Cipher/CAST.py | 159 + .../site-packages/Cryptodome/Cipher/CAST.pyi | 35 + .../Cryptodome/Cipher/ChaCha20.py | 291 ++ .../Cryptodome/Cipher/ChaCha20.pyi | 25 + .../Cryptodome/Cipher/ChaCha20_Poly1305.py | 334 ++ .../Cryptodome/Cipher/ChaCha20_Poly1305.pyi | 28 + .../site-packages/Cryptodome/Cipher/DES.py | 158 + .../site-packages/Cryptodome/Cipher/DES.pyi | 35 + .../site-packages/Cryptodome/Cipher/DES3.py | 187 + .../site-packages/Cryptodome/Cipher/DES3.pyi | 37 + .../Cryptodome/Cipher/PKCS1_OAEP.py | 231 ++ .../Cryptodome/Cipher/PKCS1_OAEP.pyi | 35 + .../Cryptodome/Cipher/PKCS1_v1_5.py | 189 + .../Cryptodome/Cipher/PKCS1_v1_5.pyi | 20 + .../Cryptodome/Cipher/Salsa20.py | 167 + .../Cryptodome/Cipher/Salsa20.pyi | 26 + .../site-packages/Cryptodome/Cipher/_ARC4.pyd | Bin 0 -> 10752 bytes .../Cryptodome/Cipher/_EKSBlowfish.py | 131 + .../Cryptodome/Cipher/_EKSBlowfish.pyi | 15 + .../Cryptodome/Cipher/_Salsa20.pyd | Bin 0 -> 13824 bytes .../Cryptodome/Cipher/__init__.py | 91 + .../Cipher/__init__.pyi} | 0 .../Cipher/__pycache__/AES.cpython-312.pyc | Bin 0 -> 8232 bytes .../Cipher/__pycache__/ARC2.cpython-312.pyc | Bin 0 -> 6610 bytes .../Cipher/__pycache__/ARC4.cpython-312.pyc | Bin 0 -> 4845 bytes .../__pycache__/Blowfish.cpython-312.pyc | Bin 0 -> 5623 bytes .../Cipher/__pycache__/CAST.cpython-312.pyc | Bin 0 -> 5738 bytes .../__pycache__/ChaCha20.cpython-312.pyc | Bin 0 -> 10075 bytes .../ChaCha20_Poly1305.cpython-312.pyc | Bin 0 -> 13406 bytes .../Cipher/__pycache__/DES.cpython-312.pyc | Bin 0 -> 5612 bytes .../Cipher/__pycache__/DES3.cpython-312.pyc | Bin 0 -> 6973 bytes .../__pycache__/PKCS1_OAEP.cpython-312.pyc | Bin 0 -> 8939 bytes .../__pycache__/PKCS1_v1_5.cpython-312.pyc | Bin 0 -> 7040 bytes .../__pycache__/Salsa20.cpython-312.pyc | Bin 0 -> 5960 bytes .../__pycache__/_EKSBlowfish.cpython-312.pyc | Bin 0 -> 4369 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2798 bytes .../__pycache__/_mode_cbc.cpython-312.pyc | Bin 0 -> 9614 bytes .../__pycache__/_mode_ccm.cpython-312.pyc | Bin 0 -> 25892 bytes .../__pycache__/_mode_cfb.cpython-312.pyc | Bin 0 -> 9983 bytes .../__pycache__/_mode_ctr.cpython-312.pyc | Bin 0 -> 14276 bytes .../__pycache__/_mode_eax.cpython-312.pyc | Bin 0 -> 15070 bytes .../__pycache__/_mode_ecb.cpython-312.pyc | Bin 0 -> 7412 bytes .../__pycache__/_mode_gcm.cpython-312.pyc | Bin 0 -> 22965 bytes .../__pycache__/_mode_kw.cpython-312.pyc | Bin 0 -> 6565 bytes .../__pycache__/_mode_kwp.cpython-312.pyc | Bin 0 -> 5252 bytes .../__pycache__/_mode_ocb.cpython-312.pyc | Bin 0 -> 19822 bytes .../__pycache__/_mode_ofb.cpython-312.pyc | Bin 0 -> 9422 bytes .../__pycache__/_mode_openpgp.cpython-312.pyc | Bin 0 -> 6117 bytes .../__pycache__/_mode_siv.cpython-312.pyc | Bin 0 -> 14485 bytes .../_pkcs1_oaep_decode.cpython-312.pyc | Bin 0 -> 2067 bytes .../Cryptodome/Cipher/_chacha20.pyd | Bin 0 -> 13312 bytes .../Cryptodome/Cipher/_mode_cbc.py | 293 ++ .../Cryptodome/Cipher/_mode_cbc.pyi | 25 + .../Cryptodome/Cipher/_mode_ccm.py | 671 ++++ .../Cryptodome/Cipher/_mode_ccm.pyi | 52 + .../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_kw.py | 158 + .../Cryptodome/Cipher/_mode_kwp.py | 135 + .../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.pyd | Bin 0 -> 13312 bytes .../Cryptodome/Cipher/_pkcs1_oaep_decode.py | 41 + .../Cryptodome/Cipher/_raw_aes.pyd | Bin 0 -> 35328 bytes .../Cryptodome/Cipher/_raw_aesni.pyd | Bin 0 -> 15360 bytes .../Cryptodome/Cipher/_raw_arc2.pyd | Bin 0 -> 14848 bytes .../Cryptodome/Cipher/_raw_blowfish.pyd | Bin 0 -> 19456 bytes .../Cryptodome/Cipher/_raw_cast.pyd | Bin 0 -> 24064 bytes .../Cryptodome/Cipher/_raw_cbc.pyd | Bin 0 -> 11776 bytes .../Cryptodome/Cipher/_raw_cfb.pyd | Bin 0 -> 12288 bytes .../Cryptodome/Cipher/_raw_ctr.pyd | Bin 0 -> 14848 bytes .../Cryptodome/Cipher/_raw_des.pyd | Bin 0 -> 52736 bytes .../Cryptodome/Cipher/_raw_des3.pyd | Bin 0 -> 52736 bytes .../Cryptodome/Cipher/_raw_ecb.pyd | Bin 0 -> 10240 bytes .../Cryptodome/Cipher/_raw_eksblowfish.pyd | Bin 0 -> 20480 bytes .../Cryptodome/Cipher/_raw_ocb.pyd | Bin 0 -> 17920 bytes .../Cryptodome/Cipher/_raw_ofb.pyd | Bin 0 -> 11776 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 + .../Lib/site-packages/Cryptodome/Hash/CMAC.py | 306 ++ .../site-packages/Cryptodome/Hash/CMAC.pyi | 30 + .../Lib/site-packages/Cryptodome/Hash/HMAC.py | 238 ++ .../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 | 222 ++ .../Cryptodome/Hash/KangarooTwelve.pyi | 16 + venv/Lib/site-packages/Cryptodome/Hash/MD2.py | 166 + .../Lib/site-packages/Cryptodome/Hash/MD2.pyi | 19 + venv/Lib/site-packages/Cryptodome/Hash/MD4.py | 185 + .../Lib/site-packages/Cryptodome/Hash/MD4.pyi | 19 + venv/Lib/site-packages/Cryptodome/Hash/MD5.py | 184 + .../Lib/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 + venv/Lib/site-packages/Cryptodome/Hash/SHA.py | 24 + .../Lib/site-packages/Cryptodome/Hash/SHA.pyi | 4 + .../Lib/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 | 145 + .../Cryptodome/Hash/SHAKE128.pyi | 14 + .../site-packages/Cryptodome/Hash/SHAKE256.py | 146 + .../Cryptodome/Hash/SHAKE256.pyi | 14 + .../Cryptodome/Hash/TupleHash128.py | 136 + .../Cryptodome/Hash/TupleHash128.pyi | 22 + .../Cryptodome/Hash/TupleHash256.py | 70 + .../Cryptodome/Hash/TupleHash256.pyi | 5 + .../Cryptodome/Hash/TurboSHAKE128.py | 112 + .../Cryptodome/Hash/TurboSHAKE128.pyi | 17 + .../Cryptodome/Hash/TurboSHAKE256.py | 22 + .../Cryptodome/Hash/TurboSHAKE256.pyi | 12 + .../Cryptodome/Hash/_BLAKE2b.pyd | Bin 0 -> 14336 bytes .../Cryptodome/Hash/_BLAKE2s.pyd | Bin 0 -> 13824 bytes .../site-packages/Cryptodome/Hash/_MD2.pyd | Bin 0 -> 14336 bytes .../site-packages/Cryptodome/Hash/_MD4.pyd | Bin 0 -> 13824 bytes .../site-packages/Cryptodome/Hash/_MD5.pyd | Bin 0 -> 15360 bytes .../Cryptodome/Hash/_RIPEMD160.pyd | Bin 0 -> 13824 bytes .../site-packages/Cryptodome/Hash/_SHA1.pyd | Bin 0 -> 17920 bytes .../site-packages/Cryptodome/Hash/_SHA224.pyd | Bin 0 -> 21504 bytes .../site-packages/Cryptodome/Hash/_SHA256.pyd | Bin 0 -> 21504 bytes .../site-packages/Cryptodome/Hash/_SHA384.pyd | Bin 0 -> 26112 bytes .../site-packages/Cryptodome/Hash/_SHA512.pyd | Bin 0 -> 26112 bytes .../site-packages/Cryptodome/Hash/__init__.py | 69 + .../Cryptodome/Hash/__init__.pyi | 57 + .../Hash/__pycache__/BLAKE2b.cpython-312.pyc | Bin 0 -> 9225 bytes .../Hash/__pycache__/BLAKE2s.cpython-312.pyc | Bin 0 -> 9231 bytes .../Hash/__pycache__/CMAC.cpython-312.pyc | Bin 0 -> 11599 bytes .../Hash/__pycache__/HMAC.cpython-312.pyc | Bin 0 -> 8189 bytes .../Hash/__pycache__/KMAC128.cpython-312.pyc | Bin 0 -> 6373 bytes .../Hash/__pycache__/KMAC256.cpython-312.pyc | Bin 0 -> 1904 bytes .../KangarooTwelve.cpython-312.pyc | Bin 0 -> 6909 bytes .../Hash/__pycache__/MD2.cpython-312.pyc | Bin 0 -> 5622 bytes .../Hash/__pycache__/MD4.cpython-312.pyc | Bin 0 -> 6115 bytes .../Hash/__pycache__/MD5.cpython-312.pyc | Bin 0 -> 6817 bytes .../Hash/__pycache__/Poly1305.cpython-312.pyc | Bin 0 -> 8728 bytes .../Hash/__pycache__/RIPEMD.cpython-312.pyc | Bin 0 -> 323 bytes .../__pycache__/RIPEMD160.cpython-312.pyc | Bin 0 -> 5863 bytes .../Hash/__pycache__/SHA.cpython-312.pyc | Bin 0 -> 268 bytes .../Hash/__pycache__/SHA1.cpython-312.pyc | Bin 0 -> 6888 bytes .../Hash/__pycache__/SHA224.cpython-312.pyc | Bin 0 -> 7124 bytes .../Hash/__pycache__/SHA256.cpython-312.pyc | Bin 0 -> 7120 bytes .../Hash/__pycache__/SHA384.cpython-312.pyc | Bin 0 -> 7120 bytes .../Hash/__pycache__/SHA3_224.cpython-312.pyc | Bin 0 -> 6344 bytes .../Hash/__pycache__/SHA3_256.cpython-312.pyc | Bin 0 -> 6344 bytes .../Hash/__pycache__/SHA3_384.cpython-312.pyc | Bin 0 -> 6542 bytes .../Hash/__pycache__/SHA3_512.cpython-312.pyc | Bin 0 -> 6346 bytes .../Hash/__pycache__/SHA512.cpython-312.pyc | Bin 0 -> 7914 bytes .../Hash/__pycache__/SHAKE128.cpython-312.pyc | Bin 0 -> 4762 bytes .../Hash/__pycache__/SHAKE256.cpython-312.pyc | Bin 0 -> 4762 bytes .../__pycache__/TupleHash128.cpython-312.pyc | Bin 0 -> 4431 bytes .../__pycache__/TupleHash256.cpython-312.pyc | Bin 0 -> 1537 bytes .../__pycache__/TurboSHAKE128.cpython-312.pyc | Bin 0 -> 4915 bytes .../__pycache__/TurboSHAKE256.cpython-312.pyc | Bin 0 -> 1069 bytes .../Hash/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2271 bytes .../__pycache__/cSHAKE128.cpython-312.pyc | Bin 0 -> 6062 bytes .../__pycache__/cSHAKE256.cpython-312.pyc | Bin 0 -> 994 bytes .../Hash/__pycache__/keccak.cpython-312.pyc | Bin 0 -> 7031 bytes .../Cryptodome/Hash/_ghash_clmul.pyd | Bin 0 -> 12800 bytes .../Cryptodome/Hash/_ghash_portable.pyd | Bin 0 -> 12288 bytes .../site-packages/Cryptodome/Hash/_keccak.pyd | Bin 0 -> 15360 bytes .../Cryptodome/Hash/_poly1305.pyd | Bin 0 -> 13824 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 + venv/Lib/site-packages/Cryptodome/IO/PEM.py | 191 + venv/Lib/site-packages/Cryptodome/IO/PEM.pyi | 10 + venv/Lib/site-packages/Cryptodome/IO/PKCS8.py | 226 ++ .../Lib/site-packages/Cryptodome/IO/PKCS8.pyi | 17 + venv/Lib/site-packages/Cryptodome/IO/_PBES.py | 546 +++ .../Lib/site-packages/Cryptodome/IO/_PBES.pyi | 26 + .../site-packages/Cryptodome/IO/__init__.py | 31 + .../IO/__pycache__/PEM.cpython-312.pyc | Bin 0 -> 7048 bytes .../IO/__pycache__/PKCS8.cpython-312.pyc | Bin 0 -> 5574 bytes .../IO/__pycache__/_PBES.cpython-312.pyc | Bin 0 -> 16759 bytes .../IO/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 191 bytes .../site-packages/Cryptodome/Math/Numbers.py | 47 + .../site-packages/Cryptodome/Math/Numbers.pyi | 2 + .../Cryptodome/Math/Primality.py | 369 ++ .../Cryptodome/Math/Primality.pyi | 18 + .../Cryptodome/Math/_IntegerBase.py | 412 +++ .../Cryptodome/Math/_IntegerBase.pyi | 67 + .../Cryptodome/Math/_IntegerCustom.py | 162 + .../Cryptodome/Math/_IntegerCustom.pyi | 8 + .../Cryptodome/Math/_IntegerGMP.py | 799 ++++ .../Cryptodome/Math/_IntegerGMP.pyi | 3 + .../Cryptodome/Math/_IntegerNative.py | 382 ++ .../Cryptodome/Math/_IntegerNative.pyi | 3 + .../site-packages/Cryptodome/Math/__init__.py | 0 .../Math/__pycache__/Numbers.cpython-312.pyc | Bin 0 -> 784 bytes .../__pycache__/Primality.cpython-312.pyc | Bin 0 -> 10645 bytes .../__pycache__/_IntegerBase.cpython-312.pyc | Bin 0 -> 15448 bytes .../_IntegerCustom.cpython-312.pyc | Bin 0 -> 4401 bytes .../__pycache__/_IntegerGMP.cpython-312.pyc | Bin 0 -> 33680 bytes .../_IntegerNative.cpython-312.pyc | Bin 0 -> 16257 bytes .../Math/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 155 bytes .../site-packages/Cryptodome/Math/_modexp.pyd | Bin 0 -> 30720 bytes .../site-packages/Cryptodome/Protocol/DH.py | 192 + .../site-packages/Cryptodome/Protocol/DH.pyi | 19 + .../site-packages/Cryptodome/Protocol/HPKE.py | 483 +++ .../site-packages/Cryptodome/Protocol/KDF.py | 647 ++++ .../site-packages/Cryptodome/Protocol/KDF.pyi | 44 + .../Cryptodome/Protocol/SecretSharing.py | 297 ++ .../Cryptodome/Protocol/SecretSharing.pyi | 22 + .../Cryptodome/Protocol/__init__.py | 31 + .../Cryptodome/Protocol/__init__.pyi | 1 + .../Protocol/__pycache__/DH.cpython-312.pyc | Bin 0 -> 6372 bytes .../Protocol/__pycache__/HPKE.cpython-312.pyc | Bin 0 -> 18385 bytes .../Protocol/__pycache__/KDF.cpython-312.pyc | Bin 0 -> 27120 bytes .../__pycache__/SecretSharing.cpython-312.pyc | Bin 0 -> 9226 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 206 bytes .../Cryptodome/Protocol/_scrypt.pyd | Bin 0 -> 12288 bytes .../site-packages/Cryptodome/PublicKey/DSA.py | 682 ++++ .../Cryptodome/PublicKey/DSA.pyi | 31 + .../site-packages/Cryptodome/PublicKey/ECC.py | 1342 +++++++ .../Cryptodome/PublicKey/ECC.pyi | 80 + .../Cryptodome/PublicKey/ElGamal.py | 286 ++ .../Cryptodome/PublicKey/ElGamal.pyi | 18 + .../site-packages/Cryptodome/PublicKey/RSA.py | 871 +++++ .../Cryptodome/PublicKey/RSA.pyi | 78 + .../Cryptodome/PublicKey/__init__.py | 94 + .../Cryptodome/PublicKey/__init__.pyi | 0 .../PublicKey/__pycache__/DSA.cpython-312.pyc | Bin 0 -> 26603 bytes .../PublicKey/__pycache__/ECC.cpython-312.pyc | Bin 0 -> 52425 bytes .../__pycache__/ElGamal.cpython-312.pyc | Bin 0 -> 10818 bytes .../PublicKey/__pycache__/RSA.cpython-312.pyc | Bin 0 -> 33294 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2696 bytes .../__pycache__/_curve.cpython-312.pyc | Bin 0 -> 904 bytes .../__pycache__/_edwards.cpython-312.pyc | Bin 0 -> 5105 bytes .../__pycache__/_montgomery.cpython-312.pyc | Bin 0 -> 5542 bytes .../__pycache__/_nist_ecc.cpython-312.pyc | Bin 0 -> 9544 bytes .../__pycache__/_openssh.cpython-312.pyc | Bin 0 -> 4928 bytes .../__pycache__/_point.cpython-312.pyc | Bin 0 -> 23215 bytes .../Cryptodome/PublicKey/_curve.py | 37 + .../Cryptodome/PublicKey/_curve25519.pyd | Bin 0 -> 19456 bytes .../Cryptodome/PublicKey/_curve448.pyd | Bin 0 -> 58880 bytes .../Cryptodome/PublicKey/_ec_ws.pyd | Bin 0 -> 755200 bytes .../Cryptodome/PublicKey/_ed25519.pyd | Bin 0 -> 23552 bytes .../Cryptodome/PublicKey/_ed448.pyd | Bin 0 -> 74752 bytes .../Cryptodome/PublicKey/_edwards.py | 116 + .../Cryptodome/PublicKey/_montgomery.py | 152 + .../Cryptodome/PublicKey/_nist_ecc.py | 246 ++ .../Cryptodome/PublicKey/_openssh.py | 135 + .../Cryptodome/PublicKey/_openssh.pyi | 7 + .../Cryptodome/PublicKey/_point.py | 493 +++ .../Cryptodome/PublicKey/_point.pyi | 49 + .../Cryptodome/Random/__init__.py | 57 + .../Cryptodome/Random/__init__.pyi | 19 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1346 bytes .../Random/__pycache__/random.cpython-312.pyc | Bin 0 -> 4976 bytes .../site-packages/Cryptodome/Random/random.py | 138 + .../Cryptodome/Random/random.pyi | 22 + .../Cryptodome/SelfTest/Cipher/__init__.py | 64 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3276 bytes .../Cipher/__pycache__/common.cpython-312.pyc | Bin 0 -> 21957 bytes .../__pycache__/test_AES.cpython-312.pyc | Bin 0 -> 53050 bytes .../__pycache__/test_ARC2.cpython-312.pyc | Bin 0 -> 6303 bytes .../__pycache__/test_ARC4.cpython-312.pyc | Bin 0 -> 26118 bytes .../__pycache__/test_Blowfish.cpython-312.pyc | Bin 0 -> 6287 bytes .../__pycache__/test_CAST.cpython-312.pyc | Bin 0 -> 3694 bytes .../__pycache__/test_CBC.cpython-312.pyc | Bin 0 -> 29074 bytes .../__pycache__/test_CCM.cpython-312.pyc | Bin 0 -> 51691 bytes .../__pycache__/test_CFB.cpython-312.pyc | Bin 0 -> 18344 bytes .../__pycache__/test_CTR.cpython-312.pyc | Bin 0 -> 29536 bytes .../__pycache__/test_ChaCha20.cpython-312.pyc | Bin 0 -> 23924 bytes .../test_ChaCha20_Poly1305.cpython-312.pyc | Bin 0 -> 40628 bytes .../__pycache__/test_DES.cpython-312.pyc | Bin 0 -> 16441 bytes .../__pycache__/test_DES3.cpython-312.pyc | Bin 0 -> 7303 bytes .../__pycache__/test_EAX.cpython-312.pyc | Bin 0 -> 43752 bytes .../__pycache__/test_GCM.cpython-312.pyc | Bin 0 -> 49003 bytes .../__pycache__/test_KW.cpython-312.pyc | Bin 0 -> 8921 bytes .../__pycache__/test_OCB.cpython-312.pyc | Bin 0 -> 43173 bytes .../__pycache__/test_OFB.cpython-312.pyc | Bin 0 -> 10823 bytes .../__pycache__/test_OpenPGP.cpython-312.pyc | Bin 0 -> 10048 bytes .../__pycache__/test_SIV.cpython-312.pyc | Bin 0 -> 32164 bytes .../__pycache__/test_Salsa20.cpython-312.pyc | Bin 0 -> 20922 bytes .../__pycache__/test_pkcs1_15.cpython-312.pyc | Bin 0 -> 14801 bytes .../test_pkcs1_oaep.cpython-312.pyc | Bin 0 -> 26306 bytes .../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 | 970 +++++ .../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_KW.py | 175 + .../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 | 62 + .../Hash/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3337 bytes .../Hash/__pycache__/common.cpython-312.pyc | Bin 0 -> 14541 bytes .../__pycache__/test_BLAKE2.cpython-312.pyc | Bin 0 -> 23013 bytes .../__pycache__/test_CMAC.cpython-312.pyc | Bin 0 -> 13640 bytes .../__pycache__/test_HMAC.cpython-312.pyc | Bin 0 -> 18569 bytes .../__pycache__/test_KMAC.cpython-312.pyc | Bin 0 -> 14310 bytes .../test_KangarooTwelve.cpython-312.pyc | Bin 0 -> 18645 bytes .../Hash/__pycache__/test_MD2.cpython-312.pyc | Bin 0 -> 1484 bytes .../Hash/__pycache__/test_MD4.cpython-312.pyc | Bin 0 -> 1513 bytes .../Hash/__pycache__/test_MD5.cpython-312.pyc | Bin 0 -> 2991 bytes .../__pycache__/test_Poly1305.cpython-312.pyc | Bin 0 -> 21385 bytes .../test_RIPEMD160.cpython-312.pyc | Bin 0 -> 1752 bytes .../__pycache__/test_SHA1.cpython-312.pyc | Bin 0 -> 2707 bytes .../__pycache__/test_SHA224.cpython-312.pyc | Bin 0 -> 1574 bytes .../__pycache__/test_SHA256.cpython-312.pyc | Bin 0 -> 2900 bytes .../__pycache__/test_SHA384.cpython-312.pyc | Bin 0 -> 1712 bytes .../__pycache__/test_SHA3_224.cpython-312.pyc | Bin 0 -> 3079 bytes .../__pycache__/test_SHA3_256.cpython-312.pyc | Bin 0 -> 3079 bytes .../__pycache__/test_SHA3_384.cpython-312.pyc | Bin 0 -> 3079 bytes .../__pycache__/test_SHA3_512.cpython-312.pyc | Bin 0 -> 3080 bytes .../__pycache__/test_SHA512.cpython-312.pyc | Bin 0 -> 4810 bytes .../__pycache__/test_SHAKE.cpython-312.pyc | Bin 0 -> 7168 bytes .../test_TupleHash.cpython-312.pyc | Bin 0 -> 12198 bytes .../test_TurboSHAKE.cpython-312.pyc | Bin 0 -> 24763 bytes .../__pycache__/test_cSHAKE.cpython-312.pyc | Bin 0 -> 10238 bytes .../__pycache__/test_keccak.cpython-312.pyc | Bin 0 -> 11282 bytes .../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 | 367 ++ .../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 | 151 + .../SelfTest/Hash/test_TupleHash.py | 302 ++ .../SelfTest/Hash/test_TurboSHAKE.py | 468 +++ .../Cryptodome/SelfTest/Hash/test_cSHAKE.py | 178 + .../Cryptodome/SelfTest/Hash/test_keccak.py | 250 ++ .../Cryptodome/SelfTest/IO/__init__.py | 47 + .../IO/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 928 bytes .../IO/__pycache__/test_PBES.cpython-312.pyc | Bin 0 -> 5116 bytes .../IO/__pycache__/test_PKCS8.cpython-312.pyc | Bin 0 -> 17995 bytes .../Cryptodome/SelfTest/IO/test_PBES.py | 118 + .../Cryptodome/SelfTest/IO/test_PKCS8.py | 459 +++ .../Cryptodome/SelfTest/Math/__init__.py | 51 + .../Math/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1155 bytes .../__pycache__/test_Numbers.cpython-312.pyc | Bin 0 -> 54328 bytes .../test_Primality.cpython-312.pyc | Bin 0 -> 5141 bytes .../__pycache__/test_modexp.cpython-312.pyc | Bin 0 -> 9096 bytes .../__pycache__/test_modmult.cpython-312.pyc | Bin 0 -> 4374 bytes .../Cryptodome/SelfTest/Math/test_Numbers.py | 838 +++++ .../SelfTest/Math/test_Primality.py | 118 + .../Cryptodome/SelfTest/Math/test_modexp.py | 201 + .../Cryptodome/SelfTest/Math/test_modmult.py | 120 + .../Cryptodome/SelfTest/Protocol/__init__.py | 45 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1334 bytes .../__pycache__/test_HPKE.cpython-312.pyc | Bin 0 -> 23712 bytes .../__pycache__/test_KDF.cpython-312.pyc | Bin 0 -> 39175 bytes .../test_SecretSharing.cpython-312.pyc | Bin 0 -> 11578 bytes .../__pycache__/test_ecdh.cpython-312.pyc | Bin 0 -> 38945 bytes .../__pycache__/test_rfc1751.cpython-312.pyc | Bin 0 -> 2147 bytes .../Cryptodome/SelfTest/Protocol/test_HPKE.py | 491 +++ .../Cryptodome/SelfTest/Protocol/test_KDF.py | 809 ++++ .../SelfTest/Protocol/test_SecretSharing.py | 290 ++ .../Cryptodome/SelfTest/Protocol/test_ecdh.py | 770 ++++ .../SelfTest/Protocol/test_rfc1751.py | 62 + .../Cryptodome/SelfTest/PublicKey/__init__.py | 63 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2098 bytes .../__pycache__/test_DSA.cpython-312.pyc | Bin 0 -> 15059 bytes .../test_ECC_Curve25519.cpython-312.pyc | Bin 0 -> 15075 bytes .../test_ECC_Curve448.cpython-312.pyc | Bin 0 -> 14892 bytes .../test_ECC_Ed25519.cpython-312.pyc | Bin 0 -> 20059 bytes .../test_ECC_Ed448.cpython-312.pyc | Bin 0 -> 20689 bytes .../__pycache__/test_ECC_NIST.cpython-312.pyc | Bin 0 -> 74863 bytes .../__pycache__/test_ElGamal.cpython-312.pyc | Bin 0 -> 11061 bytes .../__pycache__/test_RSA.cpython-312.pyc | Bin 0 -> 19242 bytes .../test_import_Curve25519.cpython-312.pyc | Bin 0 -> 18698 bytes .../test_import_Curve448.cpython-312.pyc | Bin 0 -> 18506 bytes .../test_import_DSA.cpython-312.pyc | Bin 0 -> 33863 bytes .../test_import_ECC.cpython-312.pyc | Bin 0 -> 119379 bytes .../test_import_RSA.cpython-312.pyc | Bin 0 -> 41809 bytes .../Cryptodome/SelfTest/PublicKey/test_DSA.py | 247 ++ .../SelfTest/PublicKey/test_ECC_Curve25519.py | 283 ++ .../SelfTest/PublicKey/test_ECC_Curve448.py | 246 ++ .../SelfTest/PublicKey/test_ECC_Ed25519.py | 341 ++ .../SelfTest/PublicKey/test_ECC_Ed448.py | 336 ++ .../SelfTest/PublicKey/test_ECC_NIST.py | 1440 ++++++++ .../SelfTest/PublicKey/test_ElGamal.py | 217 ++ .../Cryptodome/SelfTest/PublicKey/test_RSA.py | 324 ++ .../PublicKey/test_import_Curve25519.py | 385 ++ .../PublicKey/test_import_Curve448.py | 351 ++ .../SelfTest/PublicKey/test_import_DSA.py | 554 +++ .../SelfTest/PublicKey/test_import_ECC.py | 2782 ++++++++++++++ .../SelfTest/PublicKey/test_import_RSA.py | 636 ++++ .../Cryptodome/SelfTest/Random/__init__.py | 39 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 881 bytes .../__pycache__/test_random.cpython-312.pyc | Bin 0 -> 8417 bytes .../Cryptodome/SelfTest/Random/test_random.py | 167 + .../Cryptodome/SelfTest/Signature/__init__.py | 41 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1117 bytes .../__pycache__/test_dss.cpython-312.pyc | Bin 0 -> 61025 bytes .../__pycache__/test_eddsa.cpython-312.pyc | Bin 0 -> 24512 bytes .../__pycache__/test_pkcs1_15.cpython-312.pyc | Bin 0 -> 18100 bytes .../__pycache__/test_pss.cpython-312.pyc | Bin 0 -> 21880 bytes .../Cryptodome/SelfTest/Signature/test_dss.py | 1369 +++++++ .../SelfTest/Signature/test_eddsa.py | 604 +++ .../SelfTest/Signature/test_pkcs1_15.py | 348 ++ .../Cryptodome/SelfTest/Signature/test_pss.py | 377 ++ .../Cryptodome/SelfTest/Util/__init__.py | 46 + .../Util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1419 bytes .../__pycache__/test_Counter.cpython-312.pyc | Bin 0 -> 2820 bytes .../__pycache__/test_Padding.cpython-312.pyc | Bin 0 -> 9298 bytes .../__pycache__/test_asn1.cpython-312.pyc | Bin 0 -> 46087 bytes .../__pycache__/test_number.cpython-312.pyc | Bin 0 -> 12136 bytes .../__pycache__/test_rfc1751.cpython-312.pyc | Bin 0 -> 2064 bytes .../__pycache__/test_strxor.cpython-312.pyc | Bin 0 -> 12169 bytes .../Cryptodome/SelfTest/Util/test_Counter.py | 67 + .../Cryptodome/SelfTest/Util/test_Padding.py | 153 + .../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 | 102 + .../Cryptodome/SelfTest/__main__.py | 43 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3058 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 804 bytes .../__pycache__/loader.cpython-312.pyc | Bin 0 -> 8593 bytes .../__pycache__/st_common.cpython-312.pyc | Bin 0 -> 1582 bytes .../Cryptodome/SelfTest/loader.py | 250 ++ .../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 + .../Signature/__pycache__/DSS.cpython-312.pyc | Bin 0 -> 16716 bytes .../__pycache__/PKCS1_PSS.cpython-312.pyc | Bin 0 -> 1065 bytes .../__pycache__/PKCS1_v1_5.cpython-312.pyc | Bin 0 -> 982 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 355 bytes .../__pycache__/eddsa.cpython-312.pyc | Bin 0 -> 14119 bytes .../__pycache__/pkcs1_15.cpython-312.pyc | Bin 0 -> 7385 bytes .../Signature/__pycache__/pss.cpython-312.pyc | Bin 0 -> 14338 bytes .../Cryptodome/Signature/eddsa.py | 343 ++ .../Cryptodome/Signature/eddsa.pyi | 21 + .../Cryptodome/Signature/pkcs1_15.py | 223 ++ .../Cryptodome/Signature/pkcs1_15.pyi | 17 + .../site-packages/Cryptodome/Signature/pss.py | 387 ++ .../Cryptodome/Signature/pss.pyi | 30 + .../site-packages/Cryptodome/Util/Counter.py | 79 + .../site-packages/Cryptodome/Util/Counter.pyi | 5 + .../site-packages/Cryptodome/Util/Padding.py | 119 + .../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 + .../Util/__pycache__/Counter.cpython-312.pyc | Bin 0 -> 2211 bytes .../Util/__pycache__/Padding.cpython-312.pyc | Bin 0 -> 3207 bytes .../Util/__pycache__/RFC1751.cpython-312.pyc | Bin 0 -> 16792 bytes .../Util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1134 bytes .../__pycache__/_cpu_features.cpython-312.pyc | Bin 0 -> 823 bytes .../__pycache__/_file_system.cpython-312.pyc | Bin 0 -> 1220 bytes .../Util/__pycache__/_raw_api.cpython-312.pyc | Bin 0 -> 12915 bytes .../Util/__pycache__/asn1.cpython-312.pyc | Bin 0 -> 40608 bytes .../Util/__pycache__/number.cpython-312.pyc | Bin 0 -> 65662 bytes .../__pycache__/py3compat.cpython-312.pyc | Bin 0 -> 7007 bytes .../Util/__pycache__/strxor.cpython-312.pyc | Bin 0 -> 4213 bytes .../Cryptodome/Util/_cpu_features.py | 46 + .../Cryptodome/Util/_cpu_features.pyi | 2 + .../Cryptodome/Util/_cpuid_c.pyd | Bin 0 -> 10240 bytes .../Cryptodome/Util/_file_system.py | 54 + .../Cryptodome/Util/_file_system.pyi | 4 + .../site-packages/Cryptodome/Util/_raw_api.py | 325 ++ .../Cryptodome/Util/_raw_api.pyi | 27 + .../site-packages/Cryptodome/Util/_strxor.pyd | Bin 0 -> 10240 bytes .../Lib/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 | 185 + .../Cryptodome/Util/py3compat.pyi | 33 + .../site-packages/Cryptodome/Util/strxor.py | 146 + .../site-packages/Cryptodome/Util/strxor.pyi | 6 + venv/Lib/site-packages/Cryptodome/__init__.py | 6 + .../Lib/site-packages/Cryptodome/__init__.pyi | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 426 bytes venv/Lib/site-packages/Cryptodome/py.typed | 0 venv/Lib/site-packages/OpenSSL/SSL.py | 3239 +++++++++++++++++ venv/Lib/site-packages/OpenSSL/__init__.py | 31 + .../OpenSSL/__pycache__/SSL.cpython-312.pyc | Bin 0 -> 137299 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 568 bytes .../OpenSSL/__pycache__/_util.cpython-312.pyc | Bin 0 -> 4939 bytes .../__pycache__/crypto.cpython-312.pyc | Bin 0 -> 104845 bytes .../OpenSSL/__pycache__/debug.cpython-312.pyc | Bin 0 -> 1685 bytes .../OpenSSL/__pycache__/rand.cpython-312.pyc | Bin 0 -> 1807 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 669 bytes venv/Lib/site-packages/OpenSSL/_util.py | 129 + venv/Lib/site-packages/OpenSSL/crypto.py | 2450 +++++++++++++ venv/Lib/site-packages/OpenSSL/debug.py | 40 + venv/Lib/site-packages/OpenSSL/py.typed | 0 venv/Lib/site-packages/OpenSSL/rand.py | 50 + venv/Lib/site-packages/OpenSSL/version.py | 28 + venv/Lib/site-packages/PIL/AvifImagePlugin.py | 293 -- venv/Lib/site-packages/PIL/BdfFontFile.py | 21 +- venv/Lib/site-packages/PIL/BlpImagePlugin.py | 162 +- venv/Lib/site-packages/PIL/BmpImagePlugin.py | 70 +- .../site-packages/PIL/BufrStubImagePlugin.py | 8 +- venv/Lib/site-packages/PIL/ContainerIO.py | 72 +- venv/Lib/site-packages/PIL/CurImagePlugin.py | 6 +- venv/Lib/site-packages/PIL/DcxImagePlugin.py | 4 - venv/Lib/site-packages/PIL/DdsImagePlugin.py | 130 +- venv/Lib/site-packages/PIL/EpsImagePlugin.py | 133 +- venv/Lib/site-packages/PIL/ExifTags.py | 125 +- venv/Lib/site-packages/PIL/FitsImagePlugin.py | 6 +- venv/Lib/site-packages/PIL/FliImagePlugin.py | 30 +- venv/Lib/site-packages/PIL/FpxImagePlugin.py | 24 +- venv/Lib/site-packages/PIL/FtexImagePlugin.py | 10 +- venv/Lib/site-packages/PIL/GbrImagePlugin.py | 12 +- venv/Lib/site-packages/PIL/GdImageFile.py | 10 +- venv/Lib/site-packages/PIL/GifImagePlugin.py | 178 +- .../Lib/site-packages/PIL/GimpGradientFile.py | 8 +- venv/Lib/site-packages/PIL/GimpPaletteFile.py | 41 +- .../site-packages/PIL/GribStubImagePlugin.py | 8 +- .../site-packages/PIL/Hdf5StubImagePlugin.py | 8 +- venv/Lib/site-packages/PIL/IcnsImagePlugin.py | 103 +- venv/Lib/site-packages/PIL/IcoImagePlugin.py | 170 +- venv/Lib/site-packages/PIL/ImImagePlugin.py | 42 +- venv/Lib/site-packages/PIL/Image.py | 967 +++-- venv/Lib/site-packages/PIL/ImageCms.py | 89 +- venv/Lib/site-packages/PIL/ImageDraw.py | 602 +-- venv/Lib/site-packages/PIL/ImageDraw2.py | 99 +- venv/Lib/site-packages/PIL/ImageEnhance.py | 16 +- venv/Lib/site-packages/PIL/ImageFile.py | 288 +- venv/Lib/site-packages/PIL/ImageFilter.py | 17 +- venv/Lib/site-packages/PIL/ImageFont.py | 184 +- venv/Lib/site-packages/PIL/ImageGrab.py | 100 +- venv/Lib/site-packages/PIL/ImageMath.py | 77 +- venv/Lib/site-packages/PIL/ImageMode.py | 7 + venv/Lib/site-packages/PIL/ImageMorph.py | 132 +- venv/Lib/site-packages/PIL/ImageOps.py | 54 +- venv/Lib/site-packages/PIL/ImagePalette.py | 15 +- venv/Lib/site-packages/PIL/ImageQt.py | 68 +- venv/Lib/site-packages/PIL/ImageSequence.py | 8 +- venv/Lib/site-packages/PIL/ImageShow.py | 15 +- venv/Lib/site-packages/PIL/ImageStat.py | 13 +- venv/Lib/site-packages/PIL/ImageText.py | 320 -- venv/Lib/site-packages/PIL/ImageTk.py | 122 +- venv/Lib/site-packages/PIL/ImageTransform.py | 11 +- venv/Lib/site-packages/PIL/ImageWin.py | 63 +- venv/Lib/site-packages/PIL/ImtImagePlugin.py | 6 +- venv/Lib/site-packages/PIL/IptcImagePlugin.py | 140 +- .../site-packages/PIL/Jpeg2KImagePlugin.py | 86 +- venv/Lib/site-packages/PIL/JpegImagePlugin.py | 158 +- venv/Lib/site-packages/PIL/JpegPresets.py | 2 +- .../site-packages/PIL/McIdasImagePlugin.py | 12 +- venv/Lib/site-packages/PIL/MicImagePlugin.py | 14 +- venv/Lib/site-packages/PIL/MpegImagePlugin.py | 8 +- venv/Lib/site-packages/PIL/MpoImagePlugin.py | 46 +- venv/Lib/site-packages/PIL/MspImagePlugin.py | 14 +- venv/Lib/site-packages/PIL/PSDraw.py | 14 +- venv/Lib/site-packages/PIL/PaletteFile.py | 2 +- venv/Lib/site-packages/PIL/PalmImagePlugin.py | 36 +- venv/Lib/site-packages/PIL/PcdImagePlugin.py | 20 +- venv/Lib/site-packages/PIL/PcfFontFile.py | 6 +- venv/Lib/site-packages/PIL/PcxImagePlugin.py | 19 +- venv/Lib/site-packages/PIL/PdfImagePlugin.py | 71 +- venv/Lib/site-packages/PIL/PdfParser.py | 326 +- .../Lib/site-packages/PIL/PixarImagePlugin.py | 4 +- venv/Lib/site-packages/PIL/PngImagePlugin.py | 309 +- venv/Lib/site-packages/PIL/PpmImagePlugin.py | 22 +- venv/Lib/site-packages/PIL/PsdImagePlugin.py | 70 +- venv/Lib/site-packages/PIL/PyAccess.py | 381 ++ venv/Lib/site-packages/PIL/QoiImagePlugin.py | 130 +- venv/Lib/site-packages/PIL/SgiImagePlugin.py | 47 +- .../site-packages/PIL/SpiderImagePlugin.py | 33 +- venv/Lib/site-packages/PIL/SunImagePlugin.py | 8 +- venv/Lib/site-packages/PIL/TarIO.py | 14 +- venv/Lib/site-packages/PIL/TgaImagePlugin.py | 14 +- venv/Lib/site-packages/PIL/TiffImagePlugin.py | 738 ++-- venv/Lib/site-packages/PIL/TiffTags.py | 33 +- venv/Lib/site-packages/PIL/WalImageFile.py | 14 +- venv/Lib/site-packages/PIL/WebPImagePlugin.py | 144 +- venv/Lib/site-packages/PIL/WmfImagePlugin.py | 41 +- .../site-packages/PIL/XVThumbImagePlugin.py | 10 +- venv/Lib/site-packages/PIL/XbmImagePlugin.py | 6 +- venv/Lib/site-packages/PIL/XpmImagePlugin.py | 82 +- venv/Lib/site-packages/PIL/__init__.py | 1 - .../AvifImagePlugin.cpython-312.pyc | Bin 11545 -> 0 bytes .../__pycache__/BdfFontFile.cpython-312.pyc | Bin 4181 -> 4322 bytes .../BlpImagePlugin.cpython-312.pyc | Bin 24099 -> 23795 bytes .../BmpImagePlugin.cpython-312.pyc | Bin 18111 -> 16739 bytes .../BufrStubImagePlugin.cpython-312.pyc | Bin 2672 -> 2648 bytes .../__pycache__/ContainerIO.cpython-312.pyc | Bin 6978 -> 4248 bytes .../CurImagePlugin.cpython-312.pyc | Bin 2312 -> 2251 bytes .../DcxImagePlugin.cpython-312.pyc | Bin 2897 -> 2662 bytes .../DdsImagePlugin.cpython-312.pyc | Bin 24251 -> 22605 bytes .../EpsImagePlugin.cpython-312.pyc | Bin 16003 -> 16581 bytes .../PIL/__pycache__/ExifTags.cpython-312.pyc | Bin 11519 -> 11503 bytes .../FitsImagePlugin.cpython-312.pyc | Bin 5999 -> 5895 bytes .../FliImagePlugin.cpython-312.pyc | Bin 7137 -> 6516 bytes .../PIL/__pycache__/FontFile.cpython-312.pyc | Bin 4477 -> 4475 bytes .../FpxImagePlugin.cpython-312.pyc | Bin 7772 -> 7267 bytes .../FtexImagePlugin.cpython-312.pyc | Bin 5314 -> 5155 bytes .../GbrImagePlugin.cpython-312.pyc | Bin 3734 -> 3611 bytes .../__pycache__/GdImageFile.cpython-312.pyc | Bin 3379 -> 3336 bytes .../GifImagePlugin.cpython-312.pyc | Bin 45590 -> 42298 bytes .../GimpGradientFile.cpython-312.pyc | Bin 5500 -> 5424 bytes .../GimpPaletteFile.cpython-312.pyc | Bin 2708 -> 2069 bytes .../GribStubImagePlugin.cpython-312.pyc | Bin 2760 -> 2646 bytes .../Hdf5StubImagePlugin.cpython-312.pyc | Bin 2678 -> 2621 bytes .../IcnsImagePlugin.cpython-312.pyc | Bin 16846 -> 16699 bytes .../IcoImagePlugin.cpython-312.pyc | Bin 15304 -> 14101 bytes .../__pycache__/ImImagePlugin.cpython-312.pyc | Bin 13104 -> 12372 bytes .../PIL/__pycache__/Image.cpython-312.pyc | Bin 175795 -> 169407 bytes .../__pycache__/ImageChops.cpython-312.pyc | Bin 11198 -> 11196 bytes .../PIL/__pycache__/ImageCms.cpython-312.pyc | Bin 42578 -> 44117 bytes .../__pycache__/ImageColor.cpython-312.pyc | Bin 12447 -> 12445 bytes .../PIL/__pycache__/ImageDraw.cpython-312.pyc | Bin 38597 -> 42917 bytes .../__pycache__/ImageDraw2.cpython-312.pyc | Bin 9755 -> 8602 bytes .../__pycache__/ImageEnhance.cpython-312.pyc | Bin 5360 -> 4995 bytes .../PIL/__pycache__/ImageFile.cpython-312.pyc | Bin 36057 -> 29872 bytes .../__pycache__/ImageFilter.cpython-312.pyc | Bin 23129 -> 23138 bytes .../PIL/__pycache__/ImageFont.cpython-312.pyc | Bin 68094 -> 66181 bytes .../PIL/__pycache__/ImageGrab.cpython-312.pyc | Bin 8039 -> 6975 bytes .../PIL/__pycache__/ImageMath.cpython-312.pyc | Bin 14417 -> 16088 bytes .../PIL/__pycache__/ImageMode.cpython-312.pyc | Bin 2542 -> 2770 bytes .../__pycache__/ImageMorph.cpython-312.pyc | Bin 13011 -> 11404 bytes .../PIL/__pycache__/ImageOps.cpython-312.pyc | Bin 30354 -> 29382 bytes .../__pycache__/ImagePalette.cpython-312.pyc | Bin 12242 -> 12088 bytes .../PIL/__pycache__/ImagePath.cpython-312.pyc | Bin 308 -> 306 bytes .../PIL/__pycache__/ImageQt.cpython-312.pyc | Bin 7985 -> 7356 bytes .../__pycache__/ImageSequence.cpython-312.pyc | Bin 3375 -> 3321 bytes .../PIL/__pycache__/ImageShow.cpython-312.pyc | Bin 13836 -> 13639 bytes .../PIL/__pycache__/ImageStat.cpython-312.pyc | Bin 7525 -> 7340 bytes .../PIL/__pycache__/ImageText.cpython-312.pyc | Bin 12619 -> 0 bytes .../PIL/__pycache__/ImageTk.cpython-312.pyc | Bin 9336 -> 10480 bytes .../ImageTransform.cpython-312.pyc | Bin 5341 -> 5279 bytes .../PIL/__pycache__/ImageWin.cpython-312.pyc | Bin 11821 -> 11184 bytes .../ImtImagePlugin.cpython-312.pyc | Bin 2507 -> 2463 bytes .../IptcImagePlugin.cpython-312.pyc | Bin 8198 -> 8288 bytes .../Jpeg2KImagePlugin.cpython-312.pyc | Bin 18319 -> 16591 bytes .../JpegImagePlugin.cpython-312.pyc | Bin 33698 -> 31569 bytes .../__pycache__/JpegPresets.cpython-312.pyc | Bin 8087 -> 8128 bytes .../McIdasImagePlugin.cpython-312.pyc | Bin 2185 -> 2134 bytes .../MicImagePlugin.cpython-312.pyc | Bin 3670 -> 3726 bytes .../MpegImagePlugin.cpython-312.pyc | Bin 3587 -> 3639 bytes .../MpoImagePlugin.cpython-312.pyc | Bin 8833 -> 7641 bytes .../MspImagePlugin.cpython-312.pyc | Bin 5955 -> 5758 bytes .../PIL/__pycache__/PSDraw.cpython-312.pyc | Bin 7904 -> 8040 bytes .../__pycache__/PaletteFile.cpython-312.pyc | Bin 1890 -> 1864 bytes .../PalmImagePlugin.cpython-312.pyc | Bin 9125 -> 9570 bytes .../PcdImagePlugin.cpython-312.pyc | Bin 2431 -> 1989 bytes .../__pycache__/PcfFontFile.cpython-312.pyc | Bin 9971 -> 9907 bytes .../PcxImagePlugin.cpython-312.pyc | Bin 7367 -> 7285 bytes .../PdfImagePlugin.cpython-312.pyc | Bin 9704 -> 9269 bytes .../PIL/__pycache__/PdfParser.cpython-312.pyc | Bin 52816 -> 50191 bytes .../PixarImagePlugin.cpython-312.pyc | Bin 1925 -> 1870 bytes .../PngImagePlugin.cpython-312.pyc | Bin 63071 -> 58989 bytes .../PpmImagePlugin.cpython-312.pyc | Bin 14155 -> 13953 bytes .../PsdImagePlugin.cpython-312.pyc | Bin 11050 -> 10293 bytes .../PIL/__pycache__/PyAccess.cpython-312.pyc | Bin 0 -> 17387 bytes .../QoiImagePlugin.cpython-312.pyc | Bin 11323 -> 6103 bytes .../SgiImagePlugin.cpython-312.pyc | Bin 7988 -> 8211 bytes .../SpiderImagePlugin.cpython-312.pyc | Bin 12501 -> 12129 bytes .../SunImagePlugin.cpython-312.pyc | Bin 3379 -> 3273 bytes .../PIL/__pycache__/TarIO.cpython-312.pyc | Bin 2001 -> 2382 bytes .../TgaImagePlugin.cpython-312.pyc | Bin 8055 -> 7949 bytes .../TiffImagePlugin.cpython-312.pyc | Bin 101717 -> 93546 bytes .../PIL/__pycache__/TiffTags.cpython-312.pyc | Bin 18873 -> 18082 bytes .../__pycache__/WalImageFile.cpython-312.pyc | Bin 4141 -> 3871 bytes .../WebPImagePlugin.cpython-312.pyc | Bin 12936 -> 14526 bytes .../WmfImagePlugin.cpython-312.pyc | Bin 6426 -> 6072 bytes .../XVThumbImagePlugin.cpython-312.pyc | Bin 2621 -> 2523 bytes .../XbmImagePlugin.cpython-312.pyc | Bin 4068 -> 3953 bytes .../XpmImagePlugin.cpython-312.pyc | Bin 6118 -> 4156 bytes .../PIL/__pycache__/__init__.cpython-312.pyc | Bin 2004 -> 1985 bytes .../PIL/__pycache__/__main__.cpython-312.pyc | Bin 352 -> 350 bytes .../PIL/__pycache__/_binary.cpython-312.pyc | Bin 3395 -> 3393 bytes .../__pycache__/_deprecate.cpython-312.pyc | Bin 2535 -> 2484 bytes .../_tkinter_finder.cpython-312.pyc | Bin 719 -> 723 bytes .../PIL/__pycache__/_typing.cpython-312.pyc | Bin 1583 -> 1688 bytes .../PIL/__pycache__/_util.cpython-312.pyc | Bin 1539 -> 1811 bytes .../PIL/__pycache__/_version.cpython-312.pyc | Bin 224 -> 222 bytes .../PIL/__pycache__/features.cpython-312.pyc | Bin 13473 -> 13232 bytes .../PIL/__pycache__/report.cpython-312.pyc | Bin 286 -> 284 bytes .../PIL/_avif.cp312-win_amd64.pyd | Bin 7834112 -> 0 bytes venv/Lib/site-packages/PIL/_avif.pyi | 3 - venv/Lib/site-packages/PIL/_deprecate.py | 11 +- .../PIL/_imaging.cp312-win_amd64.pyd | Bin 2588160 -> 2343424 bytes venv/Lib/site-packages/PIL/_imaging.pyi | 1 - .../PIL/_imagingcms.cp312-win_amd64.pyd | Bin 269824 -> 262656 bytes venv/Lib/site-packages/PIL/_imagingcms.pyi | 12 +- .../PIL/_imagingft.cp312-win_amd64.pyd | Bin 2170368 -> 1819648 bytes venv/Lib/site-packages/PIL/_imagingft.pyi | 59 +- .../PIL/_imagingmath.cp312-win_amd64.pyd | Bin 25088 -> 24064 bytes .../PIL/_imagingmorph.cp312-win_amd64.pyd | Bin 13824 -> 13824 bytes .../PIL/_imagingtk.cp312-win_amd64.pyd | Bin 14848 -> 14848 bytes venv/Lib/site-packages/PIL/_imagingtk.pyi | 3 - venv/Lib/site-packages/PIL/_tkinter_finder.py | 3 +- venv/Lib/site-packages/PIL/_typing.py | 42 +- venv/Lib/site-packages/PIL/_util.py | 12 +- venv/Lib/site-packages/PIL/_version.py | 2 +- .../PIL/_webp.cp312-win_amd64.pyd | Bin 410112 -> 412160 bytes venv/Lib/site-packages/PIL/features.py | 21 +- .../Tea/__pycache__/__init__.cpython-312.pyc | Bin 171 -> 169 bytes .../Tea/__pycache__/core.cpython-312.pyc | Bin 19031 -> 19029 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 1583 -> 1581 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 3445 -> 3443 bytes .../Tea/__pycache__/model.cpython-312.pyc | Bin 3008 -> 3006 bytes .../Tea/__pycache__/request.cpython-312.pyc | Bin 1330 -> 1328 bytes .../Tea/__pycache__/response.cpython-312.pyc | Bin 414 -> 412 bytes .../Tea/__pycache__/stream.cpython-312.pyc | Bin 2229 -> 2227 bytes .../__pycache__/six.cpython-312.pyc | Bin 41372 -> 41370 bytes .../typing_extensions.cpython-312.pyc | Bin 163717 -> 163715 bytes .../aiofiles-24.1.0.dist-info/RECORD | 1 + .../aiofiles-24.1.0.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 487 -> 485 bytes .../aiofiles/__pycache__/base.cpython-312.pyc | Bin 4010 -> 4008 bytes .../aiofiles/__pycache__/os.cpython-312.pyc | Bin 1805 -> 1803 bytes .../__pycache__/ospath.cpython-312.pyc | Bin 1667 -> 1665 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 8349 -> 8347 bytes .../__pycache__/temptypes.cpython-312.pyc | Bin 3713 -> 3711 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4473 -> 4471 bytes .../__pycache__/binary.cpython-312.pyc | Bin 2855 -> 2853 bytes .../__pycache__/text.cpython-312.pyc | Bin 1501 -> 1499 bytes .../__pycache__/utils.cpython-312.pyc | Bin 3890 -> 3888 bytes .../aiohappyeyeballs-2.6.1.dist-info/RECORD | 1 + .../REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 474 -> 472 bytes .../__pycache__/_staggered.cpython-312.pyc | Bin 7976 -> 7974 bytes .../__pycache__/impl.cpython-312.pyc | Bin 10087 -> 10085 bytes .../__pycache__/types.cpython-312.pyc | Bin 570 -> 568 bytes .../__pycache__/utils.cpython-312.pyc | Bin 3682 -> 3680 bytes .../aiohttp-3.13.3.dist-info/RECORD | 1 + .../aiohttp-3.13.3.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 5285 -> 5283 bytes .../_cookie_helpers.cpython-312.pyc | Bin 10874 -> 10872 bytes .../aiohttp/__pycache__/abc.cpython-312.pyc | Bin 12449 -> 12447 bytes .../__pycache__/base_protocol.cpython-312.pyc | Bin 4492 -> 4490 bytes .../__pycache__/client.cpython-312.pyc | Bin 56359 -> 56357 bytes .../client_exceptions.cpython-312.pyc | Bin 17945 -> 17943 bytes ...ent_middleware_digest_auth.cpython-312.pyc | Bin 16441 -> 16439 bytes .../client_middlewares.cpython-312.pyc | Bin 2245 -> 2243 bytes .../__pycache__/client_proto.cpython-312.pyc | Bin 13350 -> 13348 bytes .../__pycache__/client_reqrep.cpython-312.pyc | Bin 64525 -> 64523 bytes .../__pycache__/client_ws.cpython-312.pyc | Bin 22477 -> 22475 bytes .../compression_utils.cpython-312.pyc | Bin 17714 -> 17712 bytes .../__pycache__/connector.cpython-312.pyc | Bin 77307 -> 77305 bytes .../__pycache__/cookiejar.cpython-312.pyc | Bin 21430 -> 21428 bytes .../__pycache__/formdata.cpython-312.pyc | Bin 7587 -> 7585 bytes .../aiohttp/__pycache__/hdrs.cpython-312.pyc | Bin 8451 -> 8449 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 43174 -> 43172 bytes .../aiohttp/__pycache__/http.cpython-312.pyc | Bin 1652 -> 1650 bytes .../http_exceptions.cpython-312.pyc | Bin 6330 -> 6328 bytes .../__pycache__/http_parser.cpython-312.pyc | Bin 37210 -> 37208 bytes .../http_websocket.cpython-312.pyc | Bin 940 -> 938 bytes .../__pycache__/http_writer.cpython-312.pyc | Bin 14502 -> 14500 bytes .../aiohttp/__pycache__/log.cpython-312.pyc | Bin 689 -> 687 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 53232 -> 53230 bytes .../__pycache__/payload.cpython-312.pyc | Bin 48809 -> 48807 bytes .../payload_streamer.cpython-312.pyc | Bin 4377 -> 4375 bytes .../__pycache__/pytest_plugin.cpython-312.pyc | Bin 18463 -> 18461 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 10899 -> 10897 bytes .../__pycache__/streams.cpython-312.pyc | Bin 31914 -> 31912 bytes .../__pycache__/tcp_helpers.cpython-312.pyc | Bin 1748 -> 1746 bytes .../__pycache__/test_utils.cpython-312.pyc | Bin 34793 -> 34791 bytes .../__pycache__/tracing.cpython-312.pyc | Bin 21868 -> 21866 bytes .../__pycache__/typedefs.cpython-312.pyc | Bin 2241 -> 2239 bytes .../aiohttp/__pycache__/web.cpython-312.pyc | Bin 16147 -> 16145 bytes .../__pycache__/web_app.cpython-312.pyc | Bin 27242 -> 27240 bytes .../web_exceptions.cpython-312.pyc | Bin 14973 -> 14971 bytes .../web_fileresponse.cpython-312.pyc | Bin 17173 -> 17171 bytes .../__pycache__/web_log.cpython-312.pyc | Bin 10645 -> 10643 bytes .../web_middlewares.cpython-312.pyc | Bin 5597 -> 5595 bytes .../__pycache__/web_protocol.cpython-312.pyc | Bin 31222 -> 31220 bytes .../__pycache__/web_request.cpython-312.pyc | Bin 38696 -> 38694 bytes .../__pycache__/web_response.cpython-312.pyc | Bin 39119 -> 39117 bytes .../__pycache__/web_routedef.cpython-312.pyc | Bin 11868 -> 11866 bytes .../__pycache__/web_runner.cpython-312.pyc | Bin 19008 -> 19006 bytes .../__pycache__/web_server.cpython-312.pyc | Bin 4876 -> 4874 bytes .../web_urldispatcher.cpython-312.pyc | Bin 68866 -> 68864 bytes .../__pycache__/web_ws.cpython-312.pyc | Bin 31546 -> 31544 bytes .../__pycache__/worker.cpython-312.pyc | Bin 12037 -> 12035 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 212 -> 210 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 5959 -> 5957 bytes .../__pycache__/models.cpython-312.pyc | Bin 3422 -> 3420 bytes .../__pycache__/reader.cpython-312.pyc | Bin 708 -> 706 bytes .../__pycache__/reader_c.cpython-312.pyc | Bin 17583 -> 17581 bytes .../__pycache__/reader_py.cpython-312.pyc | Bin 17584 -> 17582 bytes .../__pycache__/writer.cpython-312.pyc | Bin 10341 -> 10339 bytes .../aiosignal-1.4.0.dist-info/RECORD | 1 + .../aiosignal-1.4.0.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 2654 -> 2652 bytes .../RECORD | 1 + .../REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 192 -> 190 bytes .../__pycache__/client.cpython-312.pyc | Bin 13007 -> 13005 bytes .../__pycache__/credentials.cpython-312.pyc | Bin 29157 -> 29155 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 601 -> 599 bytes .../__pycache__/models.cpython-312.pyc | Bin 14247 -> 14245 bytes .../__pycache__/providers.cpython-312.pyc | Bin 41828 -> 41826 bytes .../http/__pycache__/__init__.cpython-312.pyc | Bin 250 -> 248 bytes .../http/__pycache__/_options.cpython-312.pyc | Bin 675 -> 673 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1074 -> 1072 bytes .../__pycache__/cli_profile.cpython-312.pyc | Bin 29594 -> 29592 bytes .../__pycache__/cloud_sso.cpython-312.pyc | Bin 9294 -> 9292 bytes .../__pycache__/default.cpython-312.pyc | Bin 5548 -> 5546 bytes .../__pycache__/ecs_ram_role.cpython-312.pyc | Bin 15798 -> 15796 bytes .../provider/__pycache__/env.cpython-312.pyc | Bin 1995 -> 1993 bytes .../__pycache__/oauth.cpython-312.pyc | Bin 15375 -> 15373 bytes .../provider/__pycache__/oidc.cpython-312.pyc | Bin 11953 -> 11951 bytes .../__pycache__/profile.cpython-312.pyc | Bin 8315 -> 8313 bytes .../__pycache__/ram_role_arn.cpython-312.pyc | Bin 12714 -> 12712 bytes .../__pycache__/refreshable.cpython-312.pyc | Bin 19553 -> 19551 bytes .../__pycache__/rsa_key_pair.cpython-312.pyc | Bin 10437 -> 10435 bytes .../__pycache__/static_ak.cpython-312.pyc | Bin 2123 -> 2121 bytes .../__pycache__/static_sts.cpython-312.pyc | Bin 2461 -> 2459 bytes .../provider/__pycache__/uri.cpython-312.pyc | Bin 8580 -> 8578 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 172 -> 170 bytes .../__pycache__/auth_constant.cpython-312.pyc | Bin 1298 -> 1296 bytes .../__pycache__/auth_util.cpython-312.pyc | Bin 4135 -> 4133 bytes .../parameter_helper.cpython-312.pyc | Bin 3423 -> 3421 bytes .../RECORD | 1 + .../REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 318 -> 316 bytes .../__pycache__/models.cpython-312.pyc | Bin 2102 -> 2100 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 197 -> 195 bytes .../__pycache__/client.cpython-312.pyc | Bin 118755 -> 118753 bytes .../__pycache__/models.cpython-312.pyc | Bin 161565 -> 161563 bytes .../RECORD | 1 + .../REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 194 -> 192 bytes .../__pycache__/client.cpython-312.pyc | Bin 1229 -> 1227 bytes .../RECORD | 1 + .../REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 192 -> 190 bytes .../__pycache__/client.cpython-312.pyc | Bin 2211 -> 2209 bytes .../__pycache__/models.cpython-312.pyc | Bin 16590 -> 16588 bytes .../RECORD | 1 + .../REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 193 -> 191 bytes .../__pycache__/client.cpython-312.pyc | Bin 18974 -> 18972 bytes .../__pycache__/sm3.cpython-312.pyc | Bin 7637 -> 7635 bytes .../alibabacloud_tea-0.4.3.dist-info/RECORD | 1 + .../REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 192 -> 190 bytes .../__pycache__/client.cpython-312.pyc | Bin 122298 -> 122296 bytes .../__pycache__/sm3.cpython-312.pyc | Bin 7636 -> 7634 bytes .../__pycache__/utils.cpython-312.pyc | Bin 27393 -> 27391 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 488 -> 486 bytes .../_alibaba_cloud.cpython-312.pyc | Bin 1459 -> 1457 bytes .../__pycache__/_client.cpython-312.pyc | Bin 1407 -> 1405 bytes .../__pycache__/_server.cpython-312.pyc | Bin 1338 -> 1336 bytes .../__pycache__/_throttling.cpython-312.pyc | Bin 1419 -> 1417 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 446 -> 444 bytes .../__pycache__/_sseresponse.cpython-312.pyc | Bin 2517 -> 2515 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 474 -> 472 bytes .../__pycache__/_config.cpython-312.pyc | Bin 10875 -> 10873 bytes .../_global_parameters.cpython-312.pyc | Bin 1816 -> 1814 bytes .../_open_api_request.cpython-312.pyc | Bin 2936 -> 2934 bytes .../__pycache__/_params.cpython-312.pyc | Bin 4313 -> 4311 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 190 -> 188 bytes .../__pycache__/client.cpython-312.pyc | Bin 19343 -> 19341 bytes .../__pycache__/models.cpython-312.pyc | Bin 8153 -> 8151 bytes venv/Lib/site-packages/alipay/__init__.py | 890 +++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 35113 bytes .../alipay/__pycache__/compat.cpython-312.pyc | Bin 0 -> 361 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 1394 bytes .../__pycache__/loggers.cpython-312.pyc | Bin 0 -> 723 bytes .../alipay/__pycache__/utils.cpython-312.pyc | Bin 0 -> 534 bytes venv/Lib/site-packages/alipay/compat.py | 9 + venv/Lib/site-packages/alipay/exceptions.py | 25 + venv/Lib/site-packages/alipay/loggers.py | 26 + venv/Lib/site-packages/alipay/utils.py | 9 + .../apscheduler-3.11.2.dist-info/RECORD | 1 + .../apscheduler-3.11.2.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 1118 -> 1116 bytes .../__pycache__/events.cpython-312.pyc | Bin 4280 -> 4278 bytes .../__pycache__/job.cpython-312.pyc | Bin 13085 -> 13083 bytes .../__pycache__/util.cpython-312.pyc | Bin 17465 -> 17463 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 163 -> 161 bytes .../__pycache__/asyncio.cpython-312.pyc | Bin 3157 -> 3155 bytes .../__pycache__/base.cpython-312.pyc | Bin 9271 -> 9269 bytes .../__pycache__/debug.cpython-312.pyc | Bin 1287 -> 1285 bytes .../__pycache__/gevent.cpython-312.pyc | Bin 1702 -> 1700 bytes .../__pycache__/pool.cpython-312.pyc | Bin 4912 -> 4910 bytes .../__pycache__/tornado.cpython-312.pyc | Bin 2884 -> 2882 bytes .../__pycache__/twisted.cpython-312.pyc | Bin 1725 -> 1723 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 163 -> 161 bytes .../__pycache__/base.cpython-312.pyc | Bin 6786 -> 6784 bytes .../__pycache__/etcd.cpython-312.pyc | Bin 9022 -> 9020 bytes .../__pycache__/memory.cpython-312.pyc | Bin 5369 -> 5367 bytes .../__pycache__/mongodb.cpython-312.pyc | Bin 8266 -> 8264 bytes .../__pycache__/redis.cpython-312.pyc | Bin 9560 -> 9558 bytes .../__pycache__/rethinkdb.cpython-312.pyc | Bin 11221 -> 11219 bytes .../__pycache__/sqlalchemy.cpython-312.pyc | Bin 11592 -> 11590 bytes .../__pycache__/zookeeper.cpython-312.pyc | Bin 10142 -> 10140 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1024 -> 1022 bytes .../__pycache__/asyncio.cpython-312.pyc | Bin 4079 -> 4077 bytes .../__pycache__/background.cpython-312.pyc | Bin 2530 -> 2528 bytes .../__pycache__/base.cpython-312.pyc | Bin 54293 -> 54291 bytes .../__pycache__/blocking.cpython-312.pyc | Bin 2086 -> 2084 bytes .../__pycache__/gevent.cpython-312.pyc | Bin 1996 -> 1994 bytes .../schedulers/__pycache__/qt.cpython-312.pyc | Bin 2498 -> 2496 bytes .../__pycache__/tornado.cpython-312.pyc | Bin 3972 -> 3970 bytes .../__pycache__/twisted.cpython-312.pyc | Bin 3763 -> 3761 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 162 -> 160 bytes .../triggers/__pycache__/base.cpython-312.pyc | Bin 1890 -> 1888 bytes .../calendarinterval.cpython-312.pyc | Bin 9350 -> 9348 bytes .../__pycache__/combining.cpython-312.pyc | Bin 6282 -> 6280 bytes .../triggers/__pycache__/date.cpython-312.pyc | Bin 2764 -> 2762 bytes .../__pycache__/interval.cpython-312.pyc | Bin 6254 -> 6252 bytes .../cron/__pycache__/__init__.cpython-312.pyc | Bin 11915 -> 11913 bytes .../__pycache__/expressions.cpython-312.pyc | Bin 15262 -> 15260 bytes .../cron/__pycache__/fields.cpython-312.pyc | Bin 6171 -> 6169 bytes .../attr/__pycache__/__init__.cpython-312.pyc | Bin 2583 -> 2581 bytes .../attr/__pycache__/_cmp.cpython-312.pyc | Bin 5047 -> 5045 bytes .../attr/__pycache__/_compat.cpython-312.pyc | Bin 3604 -> 3602 bytes .../attr/__pycache__/_config.cpython-312.pyc | Bin 1079 -> 1077 bytes .../attr/__pycache__/_funcs.cpython-312.pyc | Bin 14001 -> 13999 bytes .../attr/__pycache__/_make.cpython-312.pyc | Bin 107121 -> 107119 bytes .../__pycache__/_next_gen.cpython-312.pyc | Bin 26337 -> 26335 bytes .../__pycache__/_version_info.cpython-312.pyc | Bin 3388 -> 3386 bytes .../__pycache__/converters.cpython-312.pyc | Bin 4597 -> 4595 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 3550 -> 3548 bytes .../attr/__pycache__/filters.cpython-312.pyc | Bin 2964 -> 2962 bytes .../attr/__pycache__/setters.cpython-312.pyc | Bin 1884 -> 1882 bytes .../__pycache__/validators.cpython-312.pyc | Bin 27495 -> 27493 bytes .../attrs-25.4.0.dist-info/RECORD | 1 + .../attrs-25.4.0.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 1180 -> 1178 bytes .../__pycache__/converters.cpython-312.pyc | Bin 188 -> 186 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 188 -> 186 bytes .../attrs/__pycache__/filters.cpython-312.pyc | Bin 182 -> 180 bytes .../attrs/__pycache__/setters.cpython-312.pyc | Bin 182 -> 180 bytes .../__pycache__/validators.cpython-312.pyc | Bin 188 -> 186 bytes .../blinker-1.9.0.dist-info/RECORD | 1 + .../blinker-1.9.0.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 461 -> 459 bytes .../__pycache__/_utilities.cpython-312.pyc | Bin 2688 -> 2686 bytes .../blinker/__pycache__/base.cpython-312.pyc | Bin 21965 -> 21963 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3446 -> 3444 bytes .../boto3/__pycache__/compat.cpython-312.pyc | Bin 2974 -> 2972 bytes .../boto3/__pycache__/crt.cpython-312.pyc | Bin 7217 -> 7215 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 5069 -> 5067 bytes .../boto3/__pycache__/session.cpython-312.pyc | Bin 21445 -> 21443 bytes .../boto3/__pycache__/utils.cpython-312.pyc | Bin 3432 -> 3430 bytes .../docs/__pycache__/__init__.cpython-312.pyc | Bin 1795 -> 1793 bytes .../docs/__pycache__/action.cpython-312.pyc | Bin 7817 -> 7815 bytes .../docs/__pycache__/attr.cpython-312.pyc | Bin 2476 -> 2474 bytes .../docs/__pycache__/base.cpython-312.pyc | Bin 2974 -> 2972 bytes .../docs/__pycache__/client.cpython-312.pyc | Bin 1173 -> 1171 bytes .../__pycache__/collection.cpython-312.pyc | Bin 10690 -> 10688 bytes .../__pycache__/docstring.cpython-312.pyc | Bin 3921 -> 3919 bytes .../docs/__pycache__/method.cpython-312.pyc | Bin 2238 -> 2236 bytes .../docs/__pycache__/resource.cpython-312.pyc | Bin 18506 -> 18504 bytes .../docs/__pycache__/service.cpython-312.pyc | Bin 10408 -> 10406 bytes .../__pycache__/subresource.cpython-312.pyc | Bin 6516 -> 6514 bytes .../docs/__pycache__/utils.cpython-312.pyc | Bin 6427 -> 6425 bytes .../docs/__pycache__/waiter.cpython-312.pyc | Bin 5348 -> 5346 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 156 -> 154 bytes .../__pycache__/conditions.cpython-312.pyc | Bin 17836 -> 17834 bytes .../__pycache__/table.cpython-312.pyc | Bin 7601 -> 7599 bytes .../__pycache__/transform.cpython-312.pyc | Bin 12784 -> 12782 bytes .../__pycache__/types.cpython-312.pyc | Bin 14239 -> 14237 bytes .../ec2/__pycache__/__init__.cpython-312.pyc | Bin 151 -> 149 bytes .../__pycache__/createtags.cpython-312.pyc | Bin 1261 -> 1259 bytes .../__pycache__/deletetags.cpython-312.pyc | Bin 979 -> 977 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 157 -> 155 bytes .../__pycache__/action.cpython-312.pyc | Bin 9849 -> 9847 bytes .../__pycache__/base.cpython-312.pyc | Bin 4882 -> 4880 bytes .../__pycache__/collection.cpython-312.pyc | Bin 19766 -> 19764 bytes .../__pycache__/factory.cpython-312.pyc | Bin 19705 -> 19703 bytes .../__pycache__/model.cpython-312.pyc | Bin 22611 -> 22609 bytes .../__pycache__/params.cpython-312.pyc | Bin 5076 -> 5074 bytes .../__pycache__/response.cpython-312.pyc | Bin 9826 -> 9824 bytes .../s3/__pycache__/__init__.cpython-312.pyc | Bin 150 -> 148 bytes .../s3/__pycache__/constants.cpython-312.pyc | Bin 276 -> 274 bytes .../s3/__pycache__/inject.cpython-312.pyc | Bin 31668 -> 31666 bytes .../s3/__pycache__/transfer.cpython-312.pyc | Bin 18742 -> 18740 bytes .../botocore-1.42.25.dist-info/RECORD | 1 + .../botocore-1.42.25.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 7904 -> 7902 bytes .../botocore/__pycache__/args.cpython-312.pyc | Bin 29378 -> 29376 bytes .../botocore/__pycache__/auth.cpython-312.pyc | Bin 48830 -> 48828 bytes .../__pycache__/awsrequest.cpython-312.pyc | Bin 25108 -> 25106 bytes .../__pycache__/client.cpython-312.pyc | Bin 49232 -> 49230 bytes .../__pycache__/compat.cpython-312.pyc | Bin 10820 -> 10818 bytes .../__pycache__/compress.cpython-312.pyc | Bin 5033 -> 5031 bytes .../__pycache__/config.cpython-312.pyc | Bin 18224 -> 18222 bytes .../__pycache__/configloader.cpython-312.pyc | Bin 10289 -> 10287 bytes .../configprovider.cpython-312.pyc | Bin 41249 -> 41247 bytes .../__pycache__/context.cpython-312.pyc | Bin 4570 -> 4568 bytes .../__pycache__/credentials.cpython-312.pyc | Bin 105428 -> 105426 bytes .../__pycache__/discovery.cpython-312.pyc | Bin 14017 -> 14015 bytes .../__pycache__/endpoint.cpython-312.pyc | Bin 15354 -> 15352 bytes .../endpoint_provider.cpython-312.pyc | Bin 29140 -> 29138 bytes .../__pycache__/errorfactory.cpython-312.pyc | Bin 4308 -> 4306 bytes .../__pycache__/eventstream.cpython-312.pyc | Bin 27441 -> 27439 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 33939 -> 33937 bytes .../__pycache__/handlers.cpython-312.pyc | Bin 61654 -> 61652 bytes .../__pycache__/history.cpython-312.pyc | Bin 2262 -> 2260 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 23444 -> 23442 bytes .../__pycache__/httpchecksum.cpython-312.pyc | Bin 22684 -> 22682 bytes .../__pycache__/httpsession.cpython-312.pyc | Bin 20145 -> 20143 bytes .../__pycache__/loaders.cpython-312.pyc | Bin 20854 -> 20852 bytes .../__pycache__/model.cpython-312.pyc | Bin 43057 -> 43055 bytes .../__pycache__/monitoring.cpython-312.pyc | Bin 24873 -> 24871 bytes .../__pycache__/paginate.cpython-312.pyc | Bin 27448 -> 27446 bytes .../__pycache__/parsers.cpython-312.pyc | Bin 61476 -> 61474 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 3088 -> 3086 bytes .../__pycache__/regions.cpython-312.pyc | Bin 31588 -> 31586 bytes .../__pycache__/response.cpython-312.pyc | Bin 8274 -> 8272 bytes .../__pycache__/retryhandler.cpython-312.pyc | Bin 14590 -> 14588 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 52966 -> 52964 bytes .../__pycache__/session.cpython-312.pyc | Bin 54905 -> 54903 bytes .../__pycache__/signers.cpython-312.pyc | Bin 32055 -> 32053 bytes .../botocore/__pycache__/stub.cpython-312.pyc | Bin 16569 -> 16567 bytes .../__pycache__/tokens.cpython-312.pyc | Bin 13839 -> 13837 bytes .../__pycache__/translate.cpython-312.pyc | Bin 2045 -> 2043 bytes .../__pycache__/useragent.cpython-312.pyc | Bin 26693 -> 26691 bytes .../__pycache__/utils.cpython-312.pyc | Bin 147266 -> 147264 bytes .../__pycache__/validate.cpython-312.pyc | Bin 16292 -> 16290 bytes .../__pycache__/waiter.cpython-312.pyc | Bin 14940 -> 14938 bytes .../crt/__pycache__/__init__.cpython-312.pyc | Bin 248 -> 246 bytes .../crt/__pycache__/auth.cpython-312.pyc | Bin 21215 -> 21213 bytes .../docs/__pycache__/__init__.cpython-312.pyc | Bin 1752 -> 1750 bytes .../docs/__pycache__/client.cpython-312.pyc | Bin 23035 -> 23033 bytes .../__pycache__/docstring.cpython-312.pyc | Bin 4643 -> 4641 bytes .../docs/__pycache__/example.cpython-312.pyc | Bin 10699 -> 10697 bytes .../docs/__pycache__/method.cpython-312.pyc | Bin 12060 -> 12058 bytes .../__pycache__/paginator.cpython-312.pyc | Bin 8208 -> 8206 bytes .../docs/__pycache__/params.cpython-312.pyc | Bin 13718 -> 13716 bytes .../docs/__pycache__/service.cpython-312.pyc | Bin 6636 -> 6634 bytes .../docs/__pycache__/shape.cpython-312.pyc | Bin 4805 -> 4803 bytes .../__pycache__/sharedexample.cpython-312.pyc | Bin 11992 -> 11990 bytes .../__pycache__/translator.cpython-312.pyc | Bin 2773 -> 2771 bytes .../docs/__pycache__/utils.cpython-312.pyc | Bin 8283 -> 8281 bytes .../docs/__pycache__/waiter.cpython-312.pyc | Bin 7113 -> 7111 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 190 -> 188 bytes .../docstringparser.cpython-312.pyc | Bin 17228 -> 17226 bytes .../bcdoc/__pycache__/restdoc.cpython-312.pyc | Bin 13909 -> 13907 bytes .../bcdoc/__pycache__/style.cpython-312.pyc | Bin 23009 -> 23007 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 289 -> 287 bytes .../__pycache__/adaptive.cpython-312.pyc | Bin 5989 -> 5987 bytes .../retries/__pycache__/base.cpython-312.pyc | Bin 1416 -> 1414 bytes .../__pycache__/bucket.cpython-312.pyc | Bin 5186 -> 5184 bytes .../retries/__pycache__/quota.cpython-312.pyc | Bin 2298 -> 2296 bytes .../__pycache__/special.cpython-312.pyc | Bin 2395 -> 2393 bytes .../__pycache__/standard.cpython-312.pyc | Bin 21394 -> 21392 bytes .../__pycache__/throttling.cpython-312.pyc | Bin 2581 -> 2579 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 159 -> 157 bytes .../vendored/__pycache__/six.cpython-312.pyc | Bin 41245 -> 41243 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 347 -> 345 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 4704 -> 4702 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 268 -> 266 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 420 -> 418 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7722 -> 7720 bytes .../certifi-2026.1.4.dist-info/RECORD | 1 + .../certifi-2026.1.4.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 276 -> 274 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 591 -> 589 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 2023 -> 2021 bytes .../site-packages/cffi-2.0.0.dist-info/RECORD | 1 + .../cffi-2.0.0.dist-info/REQUESTED | 0 .../cffi/__pycache__/__init__.cpython-312.pyc | Bin 514 -> 512 bytes .../_imp_emulation.cpython-312.pyc | Bin 3844 -> 3842 bytes .../_shimmed_dist_utils.cpython-312.pyc | Bin 2050 -> 2048 bytes .../cffi/__pycache__/api.cpython-312.pyc | Bin 50273 -> 50271 bytes .../backend_ctypes.cpython-312.pyc | Bin 63516 -> 63514 bytes .../__pycache__/cffi_opcode.cpython-312.pyc | Bin 6745 -> 6743 bytes .../__pycache__/commontypes.cpython-312.pyc | Bin 3044 -> 3042 bytes .../cffi/__pycache__/cparser.cpython-312.pyc | Bin 46804 -> 46802 bytes .../cffi/__pycache__/error.cpython-312.pyc | Bin 1856 -> 1854 bytes .../__pycache__/ffiplatform.cpython-312.pyc | Bin 5793 -> 5791 bytes .../cffi/__pycache__/lock.cpython-312.pyc | Bin 486 -> 484 bytes .../cffi/__pycache__/model.cpython-312.pyc | Bin 30121 -> 30119 bytes .../__pycache__/pkgconfig.cpython-312.pyc | Bin 6333 -> 6331 bytes .../__pycache__/recompiler.cpython-312.pyc | Bin 81036 -> 81034 bytes .../setuptools_ext.cpython-312.pyc | Bin 11222 -> 11220 bytes .../__pycache__/vengine_cpy.cpython-312.pyc | Bin 50894 -> 50892 bytes .../__pycache__/vengine_gen.cpython-312.pyc | Bin 34130 -> 34128 bytes .../cffi/__pycache__/verifier.cpython-312.pyc | Bin 16185 -> 16183 bytes .../charset_normalizer-3.4.4.dist-info/RECORD | 3 +- .../REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 1742 -> 1740 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 317 -> 315 bytes .../__pycache__/api.cpython-312.pyc | Bin 18153 -> 18151 bytes .../__pycache__/cd.cpython-312.pyc | Bin 13258 -> 13256 bytes .../__pycache__/constant.cpython-312.pyc | Bin 40772 -> 40770 bytes .../__pycache__/legacy.cpython-312.pyc | Bin 2972 -> 2970 bytes .../__pycache__/md.cpython-312.pyc | Bin 24309 -> 24307 bytes .../__pycache__/models.cpython-312.pyc | Bin 17089 -> 17087 bytes .../__pycache__/utils.cpython-312.pyc | Bin 13718 -> 13716 bytes .../__pycache__/version.cpython-312.pyc | Bin 344 -> 342 bytes .../cli/__pycache__/__init__.cpython-312.pyc | Bin 305 -> 303 bytes .../cli/__pycache__/__main__.cpython-312.pyc | Bin 14366 -> 14364 bytes .../click-8.3.1.dist-info/RECORD | 1 + .../click-8.3.1.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 4033 -> 4031 bytes .../click/__pycache__/_compat.cpython-312.pyc | Bin 24155 -> 24153 bytes .../__pycache__/_termui_impl.cpython-312.pyc | Bin 31577 -> 31575 bytes .../__pycache__/_textwrap.cpython-312.pyc | Bin 2386 -> 2384 bytes .../click/__pycache__/_utils.cpython-312.pyc | Bin 1161 -> 1159 bytes .../__pycache__/_winconsole.cpython-312.pyc | Bin 11731 -> 11729 bytes .../click/__pycache__/core.cpython-312.pyc | Bin 134627 -> 134625 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 22098 -> 22096 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 14737 -> 14735 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 13633 -> 13631 bytes .../click/__pycache__/globals.cpython-312.pyc | Bin 2926 -> 2924 bytes .../click/__pycache__/parser.cpython-312.pyc | Bin 20403 -> 20401 bytes .../shell_completion.cpython-312.pyc | Bin 23298 -> 23296 bytes .../click/__pycache__/termui.cpython-312.pyc | Bin 34612 -> 34610 bytes .../click/__pycache__/testing.cpython-312.pyc | Bin 27370 -> 27368 bytes .../click/__pycache__/types.cpython-312.pyc | Bin 49999 -> 49997 bytes .../click/__pycache__/utils.cpython-312.pyc | Bin 24840 -> 24838 bytes .../colorama-0.4.6.dist-info/RECORD | 1 + .../colorama-0.4.6.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 450 -> 448 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 3908 -> 3906 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 16379 -> 16377 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 3508 -> 3506 bytes .../__pycache__/win32.cpython-312.pyc | Bin 8084 -> 8082 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 9046 -> 9044 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 156 -> 154 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 5425 -> 5423 bytes .../ansitowin32_test.cpython-312.pyc | Bin 18061 -> 18059 bytes .../initialise_test.cpython-312.pyc | Bin 11706 -> 11704 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 4862 -> 4860 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 2446 -> 2444 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 6570 -> 6568 bytes .../cryptography-44.0.3.dist-info/WHEEL | 4 - .../INSTALLER | 0 .../METADATA | 65 +- .../RECORD | 150 +- .../cryptography-46.0.3.dist-info/WHEEL | 4 + .../licenses/LICENSE | 0 .../licenses/LICENSE.APACHE | 0 .../licenses/LICENSE.BSD | 0 .../site-packages/cryptography/__about__.py | 4 +- .../site-packages/cryptography/__init__.py | 13 - .../__pycache__/__about__.cpython-312.pyc | Bin 426 -> 424 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 839 -> 334 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2350 -> 2348 bytes .../__pycache__/fernet.cpython-312.pyc | Bin 11058 -> 11098 bytes .../__pycache__/utils.cpython-312.pyc | Bin 6256 -> 6524 bytes venv/Lib/site-packages/cryptography/fernet.py | 3 +- .../__pycache__/__init__.cpython-312.pyc | Bin 217 -> 215 bytes .../hazmat/__pycache__/_oid.cpython-312.pyc | Bin 18532 -> 21005 bytes .../site-packages/cryptography/hazmat/_oid.py | 45 +- .../cryptography/hazmat/asn1/__init__.py | 10 + .../asn1/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 294 bytes .../asn1/__pycache__/asn1.cpython-312.pyc | Bin 0 -> 3589 bytes .../cryptography/hazmat/asn1/asn1.py | 116 + .../__pycache__/__init__.cpython-312.pyc | Bin 467 -> 465 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 333 -> 331 bytes .../__pycache__/backend.cpython-312.pyc | Bin 12852 -> 13473 bytes .../hazmat/backends/openssl/backend.py | 38 +- .../__pycache__/__init__.cpython-312.pyc | Bin 170 -> 168 bytes .../cryptography/hazmat/bindings/_rust.pyd | Bin 8315904 -> 9245696 bytes .../hazmat/bindings/_rust/__init__.pyi | 19 +- .../bindings/_rust/declarative_asn1.pyi | 32 + .../hazmat/bindings/_rust/ocsp.pyi | 4 +- .../bindings/_rust/openssl/__init__.pyi | 3 + .../hazmat/bindings/_rust/openssl/aead.pyi | 94 +- .../hazmat/bindings/_rust/openssl/ciphers.pyi | 4 +- .../hazmat/bindings/_rust/openssl/ed25519.pyi | 3 +- .../hazmat/bindings/_rust/openssl/ed448.pyi | 3 +- .../hazmat/bindings/_rust/openssl/hashes.pyi | 11 +- .../hazmat/bindings/_rust/openssl/hmac.pyi | 5 +- .../hazmat/bindings/_rust/openssl/kdf.pyi | 33 +- .../hazmat/bindings/_rust/openssl/keys.pyi | 5 +- .../bindings/_rust/openssl/poly1305.pyi | 10 +- .../hazmat/bindings/_rust/openssl/x25519.pyi | 3 +- .../hazmat/bindings/_rust/openssl/x448.pyi | 3 +- .../hazmat/bindings/_rust/pkcs12.pyi | 12 +- .../hazmat/bindings/_rust/pkcs7.pyi | 13 +- .../hazmat/bindings/_rust/test_support.pyi | 3 +- .../hazmat/bindings/_rust/x509.pyi | 93 +- .../__pycache__/__init__.cpython-312.pyc | Bin 178 -> 176 bytes .../__pycache__/_conditional.cpython-312.pyc | Bin 5148 -> 5752 bytes .../__pycache__/binding.cpython-312.pyc | Bin 4969 -> 5577 bytes .../hazmat/bindings/openssl/_conditional.py | 26 +- .../hazmat/bindings/openssl/binding.py | 20 +- .../__pycache__/__init__.cpython-312.pyc | Bin 221 -> 219 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 229 -> 227 bytes .../__pycache__/algorithms.cpython-312.pyc | Bin 4597 -> 4759 bytes .../hazmat/decrepit/ciphers/algorithms.py | 5 + .../__pycache__/__init__.cpython-312.pyc | Bin 172 -> 170 bytes .../__pycache__/_asymmetric.cpython-312.pyc | Bin 778 -> 776 bytes .../_cipheralgorithm.cpython-312.pyc | Bin 2412 -> 2456 bytes .../_serialization.cpython-312.pyc | Bin 7004 -> 7000 bytes .../__pycache__/cmac.cpython-312.pyc | Bin 400 -> 398 bytes .../__pycache__/constant_time.cpython-312.pyc | Bin 638 -> 636 bytes .../__pycache__/hashes.cpython-312.pyc | Bin 8117 -> 8240 bytes .../__pycache__/hmac.cpython-312.pyc | Bin 559 -> 557 bytes .../__pycache__/keywrap.cpython-312.pyc | Bin 7436 -> 7434 bytes .../__pycache__/padding.cpython-312.pyc | Bin 7530 -> 3221 bytes .../__pycache__/poly1305.cpython-312.pyc | Bin 412 -> 410 bytes .../hazmat/primitives/_cipheralgorithm.py | 6 +- .../hazmat/primitives/_serialization.py | 3 +- .../__pycache__/__init__.cpython-312.pyc | Bin 183 -> 181 bytes .../asymmetric/__pycache__/dh.cpython-312.pyc | Bin 5664 -> 6043 bytes .../__pycache__/dsa.cpython-312.pyc | Bin 6458 -> 6889 bytes .../asymmetric/__pycache__/ec.cpython-312.pyc | Bin 15826 -> 17797 bytes .../__pycache__/ed25519.cpython-312.pyc | Bin 5143 -> 5577 bytes .../__pycache__/ed448.cpython-312.pyc | Bin 5190 -> 5620 bytes .../__pycache__/padding.cpython-312.pyc | Bin 4824 -> 4791 bytes .../__pycache__/rsa.cpython-312.pyc | Bin 9619 -> 10406 bytes .../__pycache__/types.cpython-312.pyc | Bin 3132 -> 3130 bytes .../__pycache__/utils.cpython-312.pyc | Bin 1297 -> 1295 bytes .../__pycache__/x25519.cpython-312.pyc | Bin 4942 -> 5374 bytes .../__pycache__/x448.cpython-312.pyc | Bin 4987 -> 5415 bytes .../hazmat/primitives/asymmetric/dh.py | 12 + .../hazmat/primitives/asymmetric/dsa.py | 19 +- .../hazmat/primitives/asymmetric/ec.py | 50 +- .../hazmat/primitives/asymmetric/ed25519.py | 19 +- .../hazmat/primitives/asymmetric/ed448.py | 19 +- .../hazmat/primitives/asymmetric/padding.py | 2 - .../hazmat/primitives/asymmetric/rsa.py | 22 + .../hazmat/primitives/asymmetric/x25519.py | 15 +- .../hazmat/primitives/asymmetric/x448.py | 15 +- .../__pycache__/__init__.cpython-312.pyc | Bin 611 -> 609 bytes .../ciphers/__pycache__/aead.cpython-312.pyc | Bin 801 -> 799 bytes .../__pycache__/algorithms.cpython-312.pyc | Bin 5999 -> 4875 bytes .../ciphers/__pycache__/base.cpython-312.pyc | Bin 7008 -> 7056 bytes .../ciphers/__pycache__/modes.cpython-312.pyc | Bin 11763 -> 11768 bytes .../hazmat/primitives/ciphers/algorithms.py | 59 +- .../hazmat/primitives/ciphers/base.py | 9 +- .../hazmat/primitives/ciphers/modes.py | 36 +- .../cryptography/hazmat/primitives/hashes.py | 6 +- .../kdf/__pycache__/__init__.cpython-312.pyc | Bin 1219 -> 1217 bytes .../kdf/__pycache__/argon2.cpython-312.pyc | Bin 553 -> 551 bytes .../kdf/__pycache__/concatkdf.cpython-312.pyc | Bin 5543 -> 5592 bytes .../kdf/__pycache__/hkdf.cpython-312.pyc | Bin 4770 -> 681 bytes .../kdf/__pycache__/kbkdf.cpython-312.pyc | Bin 11194 -> 11271 bytes .../kdf/__pycache__/pbkdf2.cpython-312.pyc | Bin 2689 -> 2696 bytes .../kdf/__pycache__/scrypt.cpython-312.pyc | Bin 639 -> 637 bytes .../kdf/__pycache__/x963kdf.cpython-312.pyc | Bin 3075 -> 3082 bytes .../hazmat/primitives/kdf/concatkdf.py | 9 +- .../hazmat/primitives/kdf/hkdf.py | 97 +- .../hazmat/primitives/kdf/kbkdf.py | 15 +- .../hazmat/primitives/kdf/pbkdf2.py | 2 +- .../hazmat/primitives/kdf/x963kdf.py | 2 +- .../cryptography/hazmat/primitives/padding.py | 128 +- .../primitives/serialization/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 1311 -> 1349 bytes .../__pycache__/base.cpython-312.pyc | Bin 816 -> 814 bytes .../__pycache__/pkcs12.cpython-312.pyc | Bin 6033 -> 6598 bytes .../__pycache__/pkcs7.cpython-312.pyc | Bin 15881 -> 17247 bytes .../__pycache__/ssh.cpython-312.pyc | Bin 65377 -> 67164 bytes .../hazmat/primitives/serialization/pkcs12.py | 22 +- .../hazmat/primitives/serialization/pkcs7.py | 54 +- .../hazmat/primitives/serialization/ssh.py | 88 +- .../__pycache__/__init__.cpython-312.pyc | Bin 425 -> 423 bytes .../__pycache__/hotp.cpython-312.pyc | Bin 5075 -> 5123 bytes .../__pycache__/totp.cpython-312.pyc | Bin 2432 -> 2482 bytes .../hazmat/primitives/twofactor/hotp.py | 5 +- .../hazmat/primitives/twofactor/totp.py | 3 +- venv/Lib/site-packages/cryptography/utils.py | 18 +- .../cryptography/x509/__init__.py | 3 + .../x509/__pycache__/__init__.cpython-312.pyc | Bin 8281 -> 8412 bytes .../x509/__pycache__/base.cpython-312.pyc | Bin 32832 -> 33482 bytes .../certificate_transparency.cpython-312.pyc | Bin 1380 -> 1378 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 110138 -> 112535 bytes .../__pycache__/general_name.cpython-312.pyc | Bin 13059 -> 13057 bytes .../x509/__pycache__/name.cpython-312.pyc | Bin 22899 -> 23190 bytes .../x509/__pycache__/ocsp.cpython-312.pyc | Bin 13827 -> 14949 bytes .../x509/__pycache__/oid.cpython-312.pyc | Bin 701 -> 731 bytes .../__pycache__/verification.cpython-312.pyc | Bin 821 -> 977 bytes .../site-packages/cryptography/x509/base.py | 45 +- .../cryptography/x509/extensions.py | 149 +- .../site-packages/cryptography/x509/name.py | 47 +- .../site-packages/cryptography/x509/ocsp.py | 85 +- .../site-packages/cryptography/x509/oid.py | 2 + .../cryptography/x509/verification.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 177 -> 175 bytes .../__pycache__/core.cpython-312.pyc | Bin 32287 -> 32285 bytes .../__pycache__/date.cpython-312.pyc | Bin 8654 -> 8652 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 3196 -> 3194 bytes .../__pycache__/event.cpython-312.pyc | Bin 2467 -> 2465 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 4804 -> 4802 bytes .../__pycache__/file.cpython-312.pyc | Bin 3268 -> 3266 bytes .../__pycache__/model.cpython-312.pyc | Bin 3077 -> 3075 bytes .../__pycache__/number.cpython-312.pyc | Bin 1339 -> 1337 bytes .../__pycache__/request.cpython-312.pyc | Bin 1339 -> 1337 bytes .../__pycache__/response.cpython-312.pyc | Bin 742 -> 740 bytes .../__pycache__/runtime.cpython-312.pyc | Bin 8694 -> 8692 bytes .../darabonba/__pycache__/url.cpython-312.pyc | Bin 5304 -> 5302 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 158 -> 156 bytes .../policy/__pycache__/retry.cpython-312.pyc | Bin 14171 -> 14169 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 157 -> 155 bytes .../utils/__pycache__/bytes.cpython-312.pyc | Bin 1980 -> 1978 bytes .../utils/__pycache__/form.cpython-312.pyc | Bin 10749 -> 10747 bytes .../utils/__pycache__/logger.cpython-312.pyc | Bin 2448 -> 2446 bytes .../utils/__pycache__/map.cpython-312.pyc | Bin 1045 -> 1043 bytes .../utils/__pycache__/stream.cpython-312.pyc | Bin 25829 -> 25827 bytes .../__pycache__/validation.cpython-312.pyc | Bin 1221 -> 1219 bytes .../utils/__pycache__/xml.cpython-312.pyc | Bin 5069 -> 5067 bytes .../darabonba_core-1.0.5.dist-info/RECORD | 1 + .../darabonba_core-1.0.5.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 1096 -> 1094 bytes .../__pycache__/_common.cpython-312.pyc | Bin 1893 -> 1891 bytes .../__pycache__/_version.cpython-312.pyc | Bin 272 -> 270 bytes .../__pycache__/easter.cpython-312.pyc | Bin 2816 -> 2814 bytes .../__pycache__/relativedelta.cpython-312.pyc | Bin 28329 -> 28327 bytes .../__pycache__/rrule.cpython-312.pyc | Bin 69189 -> 69187 bytes .../__pycache__/tzwin.cpython-312.pyc | Bin 175 -> 173 bytes .../__pycache__/utils.cpython-312.pyc | Bin 2528 -> 2526 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2622 -> 2620 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 61815 -> 61813 bytes .../__pycache__/isoparser.cpython-312.pyc | Bin 15548 -> 15546 bytes .../tz/__pycache__/__init__.cpython-312.pyc | Bin 675 -> 673 bytes .../tz/__pycache__/_common.cpython-312.pyc | Bin 14128 -> 14126 bytes .../tz/__pycache__/_factories.cpython-312.pyc | Bin 4561 -> 4559 bytes .../tz/__pycache__/tz.cpython-312.pyc | Bin 65975 -> 65973 bytes .../tz/__pycache__/win.cpython-312.pyc | Bin 17231 -> 17229 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 7398 -> 7396 bytes .../__pycache__/rebuild.cpython-312.pyc | Bin 3924 -> 3922 bytes .../flask-3.1.2.dist-info/RECORD | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 2493 -> 2491 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 201 -> 199 bytes .../flask/__pycache__/app.cpython-312.pyc | Bin 62448 -> 62446 bytes .../__pycache__/blueprints.cpython-312.pyc | Bin 4960 -> 4958 bytes .../flask/__pycache__/cli.cpython-312.pyc | Bin 43504 -> 43502 bytes .../flask/__pycache__/config.cpython-312.pyc | Bin 16212 -> 16210 bytes .../flask/__pycache__/ctx.cpython-312.pyc | Bin 19798 -> 19796 bytes .../__pycache__/debughelpers.cpython-312.pyc | Bin 9110 -> 9108 bytes .../flask/__pycache__/globals.cpython-312.pyc | Bin 1825 -> 1823 bytes .../flask/__pycache__/helpers.cpython-312.pyc | Bin 25526 -> 25524 bytes .../flask/__pycache__/logging.cpython-312.pyc | Bin 3227 -> 3225 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 17142 -> 17140 bytes .../flask/__pycache__/signals.cpython-312.pyc | Bin 1182 -> 1180 bytes .../__pycache__/templating.cpython-312.pyc | Bin 9891 -> 9889 bytes .../flask/__pycache__/testing.cpython-312.pyc | Bin 13572 -> 13570 bytes .../flask/__pycache__/typing.cpython-312.pyc | Bin 4090 -> 4088 bytes .../flask/__pycache__/views.cpython-312.pyc | Bin 6981 -> 6979 bytes .../__pycache__/wrappers.cpython-312.pyc | Bin 10013 -> 10011 bytes .../json/__pycache__/__init__.cpython-312.pyc | Bin 6653 -> 6651 bytes .../json/__pycache__/provider.cpython-312.pyc | Bin 9220 -> 9218 bytes .../json/__pycache__/tag.cpython-312.pyc | Bin 13915 -> 13913 bytes .../sansio/__pycache__/app.cpython-312.pyc | Bin 33672 -> 33670 bytes .../__pycache__/blueprints.cpython-312.pyc | Bin 31173 -> 31171 bytes .../__pycache__/scaffold.cpython-312.pyc | Bin 30186 -> 30184 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 595 -> 593 bytes .../__pycache__/client.cpython-312.pyc | Bin 2858 -> 2856 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1009 -> 1007 bytes .../__pycache__/cli.cpython-312.pyc | Bin 987 -> 985 bytes .../__pycache__/extension.cpython-312.pyc | Bin 39916 -> 39914 bytes .../__pycache__/model.cpython-312.pyc | Bin 13341 -> 13339 bytes .../__pycache__/pagination.cpython-312.pyc | Bin 14243 -> 14241 bytes .../__pycache__/query.cpython-312.pyc | Bin 4478 -> 4476 bytes .../record_queries.cpython-312.pyc | Bin 4807 -> 4805 bytes .../__pycache__/session.cpython-312.pyc | Bin 4511 -> 4509 bytes .../__pycache__/table.cpython-312.pyc | Bin 1802 -> 1800 bytes .../track_modifications.cpython-312.pyc | Bin 3584 -> 3582 bytes .../frozenlist-1.8.0.dist-info/RECORD | 1 + .../frozenlist-1.8.0.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 4029 -> 4027 bytes .../greenlet-3.3.0.dist-info/RECORD | 1 + .../greenlet-3.3.0.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 1036 -> 1034 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 159 -> 157 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 9212 -> 9210 bytes ...fail_clearing_run_switches.cpython-312.pyc | Bin 2044 -> 2042 bytes .../fail_cpp_exception.cpython-312.pyc | Bin 1579 -> 1577 bytes ...nitialstub_already_started.cpython-312.pyc | Bin 3447 -> 3445 bytes .../fail_slp_switch.cpython-312.pyc | Bin 1272 -> 1270 bytes ...ail_switch_three_greenlets.cpython-312.pyc | Bin 1688 -> 1686 bytes ...il_switch_three_greenlets2.cpython-312.pyc | Bin 2542 -> 2540 bytes .../fail_switch_two_greenlets.cpython-312.pyc | Bin 1659 -> 1657 bytes .../__pycache__/leakcheck.cpython-312.pyc | Bin 11666 -> 11664 bytes .../test_contextvars.cpython-312.pyc | Bin 15443 -> 15441 bytes .../__pycache__/test_cpp.cpython-312.pyc | Bin 4073 -> 4071 bytes .../test_extension_interface.cpython-312.pyc | Bin 7431 -> 7429 bytes .../tests/__pycache__/test_gc.cpython-312.pyc | Bin 4882 -> 4880 bytes .../test_generator.cpython-312.pyc | Bin 3047 -> 3045 bytes .../test_generator_nested.cpython-312.pyc | Bin 7785 -> 7783 bytes .../__pycache__/test_greenlet.cpython-312.pyc | Bin 76290 -> 76288 bytes .../test_greenlet_trash.cpython-312.pyc | Bin 6744 -> 6742 bytes .../__pycache__/test_leaks.cpython-312.pyc | Bin 19938 -> 19936 bytes .../test_stack_saved.cpython-312.pyc | Bin 1311 -> 1309 bytes .../__pycache__/test_throw.cpython-312.pyc | Bin 7347 -> 7345 bytes .../__pycache__/test_tracing.cpython-312.pyc | Bin 13843 -> 13841 bytes .../__pycache__/test_version.cpython-312.pyc | Bin 2530 -> 2528 bytes .../__pycache__/test_weakref.cpython-312.pyc | Bin 2696 -> 2694 bytes .../site-packages/idna-3.11.dist-info/RECORD | 1 + .../idna-3.11.dist-info/REQUESTED | 0 .../idna/__pycache__/__init__.cpython-312.pyc | Bin 844 -> 842 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 4944 -> 4942 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 848 -> 846 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16156 -> 16154 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 100873 -> 100871 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2596 -> 2594 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 175 -> 173 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 161803 -> 161801 bytes .../itsdangerous-2.2.0.dist-info/RECORD | 1 + .../itsdangerous-2.2.0.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 1592 -> 1590 bytes .../__pycache__/_json.cpython-312.pyc | Bin 1146 -> 1144 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2646 -> 2644 bytes .../__pycache__/exc.cpython-312.pyc | Bin 3906 -> 3904 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 15387 -> 15385 bytes .../__pycache__/signer.cpython-312.pyc | Bin 11252 -> 11250 bytes .../__pycache__/timed.cpython-312.pyc | Bin 8700 -> 8698 bytes .../__pycache__/url_safe.cpython-312.pyc | Bin 3496 -> 3494 bytes .../jinja2-3.1.6.dist-info/RECORD | 1 + .../jinja2-3.1.6.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 1617 -> 1615 bytes .../__pycache__/_identifier.cpython-312.pyc | Bin 2098 -> 2096 bytes .../__pycache__/async_utils.cpython-312.pyc | Bin 4938 -> 4936 bytes .../__pycache__/bccache.cpython-312.pyc | Bin 19309 -> 19307 bytes .../__pycache__/compiler.cpython-312.pyc | Bin 104024 -> 104022 bytes .../__pycache__/constants.cpython-312.pyc | Bin 1520 -> 1518 bytes .../jinja2/__pycache__/debug.cpython-312.pyc | Bin 6545 -> 6543 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 1570 -> 1568 bytes .../__pycache__/environment.cpython-312.pyc | Bin 76646 -> 76644 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7684 -> 7682 bytes .../jinja2/__pycache__/ext.cpython-312.pyc | Bin 41877 -> 41875 bytes .../__pycache__/filters.cpython-312.pyc | Bin 72294 -> 72292 bytes .../__pycache__/idtracking.cpython-312.pyc | Bin 19159 -> 19157 bytes .../jinja2/__pycache__/lexer.cpython-312.pyc | Bin 32040 -> 32038 bytes .../__pycache__/loaders.cpython-312.pyc | Bin 32319 -> 32317 bytes .../jinja2/__pycache__/meta.cpython-312.pyc | Bin 5454 -> 5452 bytes .../__pycache__/nativetypes.cpython-312.pyc | Bin 6975 -> 6973 bytes .../jinja2/__pycache__/nodes.cpython-312.pyc | Bin 58237 -> 58235 bytes .../__pycache__/optimizer.cpython-312.pyc | Bin 2653 -> 2651 bytes .../jinja2/__pycache__/parser.cpython-312.pyc | Bin 61167 -> 61165 bytes .../__pycache__/runtime.cpython-312.pyc | Bin 48855 -> 48853 bytes .../__pycache__/sandbox.cpython-312.pyc | Bin 18071 -> 18069 bytes .../jinja2/__pycache__/tests.cpython-312.pyc | Bin 9014 -> 9012 bytes .../jinja2/__pycache__/utils.cpython-312.pyc | Bin 34827 -> 34825 bytes .../__pycache__/visitor.cpython-312.pyc | Bin 5329 -> 5327 bytes .../jmespath-1.0.1.dist-info/RECORD | 3 +- .../jmespath-1.0.1.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 778 -> 776 bytes .../jmespath/__pycache__/ast.cpython-312.pyc | Bin 3348 -> 3346 bytes .../__pycache__/compat.cpython-312.pyc | Bin 843 -> 841 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 6227 -> 6225 bytes .../__pycache__/functions.cpython-312.pyc | Bin 15105 -> 15103 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 9638 -> 9636 bytes .../__pycache__/parser.cpython-312.pyc | Bin 25986 -> 25984 bytes .../__pycache__/visitor.cpython-312.pyc | Bin 14533 -> 14531 bytes .../markupsafe-3.0.3.dist-info/RECORD | 1 + .../markupsafe-3.0.3.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 20927 -> 20925 bytes .../__pycache__/_native.cpython-312.pyc | Bin 579 -> 577 bytes .../multidict-6.7.0.dist-info/RECORD | 1 + .../multidict-6.7.0.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 1361 -> 1359 bytes .../__pycache__/_abc.cpython-312.pyc | Bin 5507 -> 5505 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 623 -> 621 bytes .../__pycache__/_multidict_py.cpython-312.pyc | Bin 65474 -> 65472 bytes .../INSTALLER | 0 .../LICENSE | 650 +--- .../METADATA | 82 +- .../pillow-10.4.0.dist-info/RECORD | 214 ++ .../pillow-10.4.0.dist-info/REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 0 .../zip-safe | 0 .../pillow-12.1.0.dist-info/RECORD | 219 -- .../site-packages/pip-24.0.dist-info/RECORD | 6 +- .../pip/__pycache__/__init__.cpython-312.pyc | Bin 654 -> 652 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 810 -> 808 bytes .../__pip-runner__.cpython-312.pyc | Bin 2173 -> 2171 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 756 -> 754 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 14263 -> 14261 bytes .../__pycache__/cache.cpython-312.pyc | Bin 12634 -> 12632 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 17635 -> 17633 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 33253 -> 33251 bytes .../__pycache__/main.cpython-312.pyc | Bin 639 -> 637 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 4940 -> 4938 bytes .../self_outdated_check.cpython-312.pyc | Bin 10521 -> 10519 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 13618 -> 13616 bytes .../cli/__pycache__/__init__.cpython-312.pyc | Bin 247 -> 245 bytes .../autocompletion.cpython-312.pyc | Bin 8434 -> 8432 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 10424 -> 10422 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 30343 -> 30341 bytes .../command_context.cpython-312.pyc | Bin 1750 -> 1748 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 2267 -> 2265 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 4874 -> 4872 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 14991 -> 14989 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 2589 -> 2587 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 18821 -> 18819 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 7809 -> 7807 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 344 -> 342 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3971 -> 3969 bytes .../__pycache__/cache.cpython-312.pyc | Bin 9680 -> 9678 bytes .../__pycache__/check.cpython-312.pyc | Bin 2059 -> 2057 bytes .../__pycache__/completion.cpython-312.pyc | Bin 5161 -> 5159 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 13181 -> 13179 bytes .../__pycache__/debug.cpython-312.pyc | Bin 10130 -> 10128 bytes .../__pycache__/download.cpython-312.pyc | Bin 7558 -> 7556 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 4325 -> 4323 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 2952 -> 2950 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 1642 -> 1640 bytes .../__pycache__/index.cpython-312.pyc | Bin 6689 -> 6687 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 3944 -> 3942 bytes .../__pycache__/install.cpython-312.pyc | Bin 28882 -> 28880 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 15369 -> 15367 bytes .../__pycache__/search.cpython-312.pyc | Bin 7590 -> 7588 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 9697 -> 9695 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 4695 -> 4693 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 8925 -> 8923 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 910 -> 908 bytes .../__pycache__/base.cpython-312.pyc | Bin 2831 -> 2829 bytes .../__pycache__/installed.cpython-312.pyc | Bin 1669 -> 1667 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 8457 -> 8455 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 2217 -> 2215 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 201 -> 199 bytes .../__pycache__/collector.cpython-312.pyc | Bin 21855 -> 21853 bytes .../package_finder.cpython-312.pyc | Bin 40704 -> 40702 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 12573 -> 12571 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 16745 -> 16743 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 6825 -> 6823 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 7980 -> 7978 bytes .../__pycache__/base.cpython-312.pyc | Bin 3750 -> 3748 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5851 -> 5849 bytes .../__pycache__/_json.cpython-312.pyc | Bin 2844 -> 2842 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 35681 -> 35679 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 15759 -> 15757 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 327 -> 325 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 3302 -> 3300 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 13394 -> 13392 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 11149 -> 11147 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 235 -> 233 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 1874 -> 1872 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 11168 -> 11166 bytes .../format_control.cpython-312.pyc | Bin 4196 -> 4194 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 1663 -> 1661 bytes .../installation_report.cpython-312.pyc | Bin 2241 -> 2239 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 25971 -> 25969 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 1138 -> 1136 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 5057 -> 5055 bytes .../selection_prefs.cpython-312.pyc | Bin 1820 -> 1818 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 4923 -> 4921 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 5749 -> 5747 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 223 -> 221 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 21965 -> 21963 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 6487 -> 6485 bytes .../__pycache__/download.cpython-312.pyc | Bin 8522 -> 8520 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 11632 -> 11630 bytes .../__pycache__/session.cpython-312.pyc | Bin 18743 -> 18741 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 2222 -> 2220 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 2918 -> 2916 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 166 -> 164 bytes .../__pycache__/check.cpython-312.pyc | Bin 7548 -> 7546 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 10086 -> 10084 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 25716 -> 25714 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 172 -> 170 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 7792 -> 7790 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 1849 -> 1847 bytes .../metadata_editable.cpython-312.pyc | Bin 1883 -> 1881 bytes .../metadata_legacy.cpython-312.pyc | Bin 3034 -> 3032 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 1653 -> 1651 bytes .../wheel_editable.cpython-312.pyc | Bin 1994 -> 1992 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 3898 -> 3896 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 235 -> 233 bytes .../editable_legacy.cpython-312.pyc | Bin 1786 -> 1784 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 33828 -> 33826 bytes .../req/__pycache__/__init__.cpython-312.pyc | Bin 3712 -> 3710 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 21551 -> 21549 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 21430 -> 21428 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 38383 -> 38381 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 7187 -> 7185 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 32946 -> 32944 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 166 -> 164 bytes .../__pycache__/base.cpython-312.pyc | Bin 1154 -> 1152 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 173 -> 171 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 22408 -> 22406 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 177 -> 175 bytes .../__pycache__/base.cpython-312.pyc | Bin 8306 -> 8304 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 30367 -> 30365 bytes .../__pycache__/factory.cpython-312.pyc | Bin 32083 -> 32081 bytes .../found_candidates.cpython-312.pyc | Bin 6177 -> 6175 bytes .../__pycache__/provider.cpython-312.pyc | Bin 10347 -> 10345 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 4904 -> 4902 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 11398 -> 11396 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 12320 -> 12318 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 161 -> 159 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 4502 -> 4500 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 1832 -> 1830 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 2376 -> 2374 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 2179 -> 2177 bytes .../compatibility_tags.cpython-312.pyc | Bin 5527 -> 5525 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 650 -> 648 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 4152 -> 4150 bytes .../direct_url_helpers.cpython-312.pyc | Bin 3529 -> 3527 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 3192 -> 3190 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2124 -> 2122 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 3959 -> 3957 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 7424 -> 7422 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 1130 -> 1128 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 2308 -> 2306 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 7520 -> 7518 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 13523 -> 13521 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 34087 -> 34085 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 2678 -> 2676 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 2549 -> 2547 bytes .../setuptools_build.cpython-312.pyc | Bin 4516 -> 4514 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 8684 -> 8682 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 12028 -> 12026 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 11074 -> 11072 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 2371 -> 2369 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 4446 -> 4444 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 5892 -> 5890 bytes .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 500 -> 498 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 4992 -> 4990 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 18961 -> 18959 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 7581 -> 7579 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 12453 -> 12451 bytes .../versioncontrol.cpython-312.pyc | Bin 28979 -> 28977 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4662 -> 4660 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 41239 -> 41237 bytes .../typing_extensions.cpython-312.pyc | Bin 122019 -> 122017 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 872 -> 870 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 2616 -> 2614 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 6434 -> 6432 bytes .../__pycache__/cache.cpython-312.pyc | Bin 3779 -> 3777 bytes .../__pycache__/controller.cpython-312.pyc | Bin 16137 -> 16135 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 4317 -> 4315 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 6664 -> 6662 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 6375 -> 6373 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 1644 -> 1642 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 405 -> 403 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 7680 -> 7678 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 2708 -> 2706 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 288 -> 286 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 615 -> 613 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 2819 -> 2817 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4538 -> 4536 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 27169 -> 27167 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 1357 -> 1355 bytes .../chardistribution.cpython-312.pyc | Bin 9608 -> 9606 bytes .../charsetgroupprober.cpython-312.pyc | Bin 4092 -> 4090 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 4988 -> 4986 bytes .../codingstatemachine.cpython-312.pyc | Bin 3848 -> 3846 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 759 -> 757 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 1366 -> 1364 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 2966 -> 2964 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 4536 -> 4534 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 15280 -> 15278 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 4353 -> 4351 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 12052 -> 12050 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 1360 -> 1358 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 27174 -> 27172 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 1360 -> 1358 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 19096 -> 19094 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 1373 -> 1371 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 5792 -> 5790 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 22125 -> 22123 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 82973 -> 82971 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 1364 -> 1362 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 39519 -> 39517 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 83092 -> 83090 bytes .../langgreekmodel.cpython-312.pyc | Bin 76958 -> 76956 bytes .../langhebrewmodel.cpython-312.pyc | Bin 77469 -> 77467 bytes .../langhungarianmodel.cpython-312.pyc | Bin 83046 -> 83044 bytes .../langrussianmodel.cpython-312.pyc | Bin 105221 -> 105219 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 77647 -> 77645 bytes .../langturkishmodel.cpython-312.pyc | Bin 77486 -> 77484 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 6972 -> 6970 bytes .../macromanprober.cpython-312.pyc | Bin 7152 -> 7150 bytes .../mbcharsetprober.cpython-312.pyc | Bin 3873 -> 3871 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 1558 -> 1556 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 38615 -> 38613 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 602 -> 600 bytes .../sbcharsetprober.cpython-312.pyc | Bin 6357 -> 6355 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 2327 -> 2325 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 4465 -> 4463 bytes .../universaldetector.cpython-312.pyc | Bin 12239 -> 12237 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 9949 -> 9947 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 3145 -> 3143 bytes .../__pycache__/version.cpython-312.pyc | Bin 458 -> 456 bytes .../cli/__pycache__/__init__.cpython-312.pyc | Bin 165 -> 163 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 3982 -> 3980 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 170 -> 168 bytes .../__pycache__/languages.cpython-312.pyc | Bin 9725 -> 9723 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 462 -> 460 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 3920 -> 3918 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 16391 -> 16389 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 3520 -> 3518 bytes .../__pycache__/win32.cpython-312.pyc | Bin 8096 -> 8094 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 9058 -> 9056 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 168 -> 166 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 5437 -> 5435 bytes .../ansitowin32_test.cpython-312.pyc | Bin 18073 -> 18071 bytes .../initialise_test.cpython-312.pyc | Bin 11718 -> 11716 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 4874 -> 4872 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 2458 -> 2456 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 6582 -> 6580 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1239 -> 1237 bytes .../__pycache__/compat.cpython-312.pyc | Bin 45575 -> 45573 bytes .../__pycache__/database.cpython-312.pyc | Bin 65997 -> 65995 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 24336 -> 24334 bytes .../__pycache__/locators.cpython-312.pyc | Bin 60128 -> 60126 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 15095 -> 15093 bytes .../__pycache__/markers.cpython-312.pyc | Bin 7652 -> 7650 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 41769 -> 41767 bytes .../__pycache__/resources.cpython-312.pyc | Bin 17295 -> 17293 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 19550 -> 19548 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 88226 -> 88224 bytes .../__pycache__/version.cpython-312.pyc | Bin 30336 -> 30334 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 51831 -> 51829 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 930 -> 928 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 262 -> 260 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 53724 -> 53722 bytes .../idna/__pycache__/__init__.cpython-312.pyc | Bin 851 -> 849 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 4603 -> 4601 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 857 -> 855 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16252 -> 16250 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 38352 -> 38350 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2608 -> 2606 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 186 -> 184 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 158840 -> 158838 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1801 -> 1799 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 1995 -> 1993 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 8638 -> 8636 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 43546 -> 43544 bytes .../__pycache__/__about__.cpython-312.pyc | Bin 600 -> 598 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 436 -> 434 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 12046 -> 12044 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 6880 -> 6878 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 3211 -> 3209 bytes .../__pycache__/markers.cpython-312.pyc | Bin 14028 -> 14026 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 6916 -> 6914 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 31217 -> 31215 bytes .../__pycache__/tags.cpython-312.pyc | Bin 18926 -> 18924 bytes .../__pycache__/utils.cpython-312.pyc | Bin 5838 -> 5836 bytes .../__pycache__/version.cpython-312.pyc | Bin 19909 -> 19907 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 146444 -> 146442 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 17999 -> 17997 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 1916 -> 1914 bytes .../__pycache__/android.cpython-312.pyc | Bin 9414 -> 9412 bytes .../__pycache__/api.cpython-312.pyc | Bin 9642 -> 9640 bytes .../__pycache__/macos.cpython-312.pyc | Bin 5607 -> 5605 bytes .../__pycache__/unix.cpython-312.pyc | Bin 12411 -> 12409 bytes .../__pycache__/version.cpython-312.pyc | Bin 281 -> 279 bytes .../__pycache__/windows.cpython-312.pyc | Bin 12969 -> 12967 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3459 -> 3457 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 705 -> 703 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 26576 -> 26574 bytes .../__pycache__/console.cpython-312.pyc | Bin 2597 -> 2595 bytes .../__pycache__/filter.cpython-312.pyc | Bin 3203 -> 3201 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 4540 -> 4538 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 38300 -> 38298 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 1539 -> 1537 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 3367 -> 3365 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 4052 -> 4050 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 4727 -> 4725 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 11017 -> 11015 bytes .../__pycache__/style.cpython-312.pyc | Bin 6645 -> 6643 bytes .../__pycache__/token.cpython-312.pyc | Bin 8113 -> 8111 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 32959 -> 32957 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 13952 -> 13950 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 37907 -> 37905 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 6897 -> 6895 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 4186 -> 4184 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 4165 -> 4163 bytes .../__pycache__/groff.cpython-312.pyc | Bin 7235 -> 7233 bytes .../__pycache__/html.cpython-312.pyc | Bin 40543 -> 40541 bytes .../__pycache__/img.cpython-312.pyc | Bin 27014 -> 27012 bytes .../__pycache__/irc.cpython-312.pyc | Bin 6036 -> 6034 bytes .../__pycache__/latex.cpython-312.pyc | Bin 19925 -> 19923 bytes .../__pycache__/other.cpython-312.pyc | Bin 6855 -> 6853 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 2901 -> 2899 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 6097 -> 6095 bytes .../__pycache__/svg.cpython-312.pyc | Bin 9037 -> 9035 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 5800 -> 5798 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 15128 -> 15126 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 14623 -> 14621 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 64375 -> 64373 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 42610 -> 42608 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4419 -> 4417 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 7882 -> 7880 bytes .../__pycache__/actions.cpython-312.pyc | Bin 8366 -> 8364 bytes .../__pycache__/common.cpython-312.pyc | Bin 13385 -> 13383 bytes .../__pycache__/core.cpython-312.pyc | Bin 267679 -> 267677 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 12965 -> 12963 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 48472 -> 48470 bytes .../__pycache__/results.cpython-312.pyc | Bin 34081 -> 34079 bytes .../__pycache__/testing.cpython-312.pyc | Bin 17159 -> 17157 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 13155 -> 13153 bytes .../__pycache__/util.cpython-312.pyc | Bin 14875 -> 14873 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 26784 -> 26782 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 584 -> 582 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 345 -> 343 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 14696 -> 14694 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1051 -> 1049 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 14368 -> 14366 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5424 -> 5422 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 555 -> 553 bytes .../_internal_utils.cpython-312.pyc | Bin 1995 -> 1993 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 21251 -> 21249 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7175 -> 7173 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13894 -> 13892 bytes .../__pycache__/certs.cpython-312.pyc | Bin 893 -> 891 bytes .../__pycache__/compat.cpython-312.pyc | Bin 1478 -> 1476 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25217 -> 25215 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7018 -> 7016 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 4283 -> 4281 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1023 -> 1021 bytes .../__pycache__/models.cpython-312.pyc | Bin 35419 -> 35417 bytes .../__pycache__/packages.cpython-312.pyc | Bin 743 -> 741 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27728 -> 27726 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 5930 -> 5928 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5588 -> 5586 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36240 -> 36238 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 605 -> 603 bytes .../__pycache__/providers.cpython-312.pyc | Bin 6822 -> 6820 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 2625 -> 2623 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 25868 -> 25866 bytes .../__pycache__/structs.cpython-312.pyc | Bin 10477 -> 10475 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 171 -> 169 bytes .../collections_abc.cpython-312.pyc | Bin 391 -> 389 bytes .../rich/__pycache__/__init__.cpython-312.pyc | Bin 6986 -> 6984 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 10275 -> 10273 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 7792 -> 7790 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 205947 -> 205945 bytes .../_emoji_replace.cpython-312.pyc | Bin 1700 -> 1698 bytes .../_export_format.cpython-312.pyc | Bin 2292 -> 2290 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 508 -> 506 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 826 -> 824 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 12048 -> 12046 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 4118 -> 4116 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 1856 -> 1854 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 3591 -> 3589 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 5131 -> 5129 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 697 -> 695 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 6550 -> 6548 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 13150 -> 13148 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 936 -> 934 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 836 -> 834 bytes .../_win32_console.cpython-312.pyc | Bin 28947 -> 28945 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 2461 -> 2459 bytes .../_windows_renderer.cpython-312.pyc | Bin 3544 -> 3542 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 2331 -> 2329 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 1579 -> 1577 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 12293 -> 12291 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 9077 -> 9075 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 4243 -> 4241 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 11829 -> 11827 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 5589 -> 5587 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 26541 -> 26539 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 1672 -> 1670 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 8558 -> 8556 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 113764 -> 113762 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 2229 -> 2227 bytes .../__pycache__/containers.cpython-312.pyc | Bin 9197 -> 9195 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 10900 -> 10898 bytes .../default_styles.cpython-312.pyc | Bin 10344 -> 10342 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 1458 -> 1456 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 4180 -> 4178 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 1816 -> 1814 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 3548 -> 3546 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 3053 -> 3051 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 9869 -> 9867 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 6006 -> 6004 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 5180 -> 5178 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 20191 -> 20189 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 19114 -> 19112 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 4865 -> 4863 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 13525 -> 13523 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 9269 -> 9267 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 6347 -> 6345 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 7105 -> 7103 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 1791 -> 1789 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 5285 -> 5283 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 12068 -> 12066 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 40027 -> 40025 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 75049 -> 75047 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 10360 -> 10358 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 14752 -> 14750 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 1763 -> 1761 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 538 -> 536 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 6597 -> 6595 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 6539 -> 6537 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 3801 -> 3799 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 2455 -> 2453 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 28132 -> 28130 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 6035 -> 6033 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 6039 -> 6037 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 33485 -> 33483 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 2110 -> 2108 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 39583 -> 39581 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 43555 -> 43553 bytes .../terminal_theme.cpython-312.pyc | Bin 3319 -> 3317 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 58934 -> 58932 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 6311 -> 6309 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 285 -> 283 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 31519 -> 31517 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 11410 -> 11408 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 27057 -> 27055 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 4777 -> 4775 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 2286 -> 2284 bytes .../__pycache__/after.cpython-312.pyc | Bin 1595 -> 1593 bytes .../__pycache__/before.cpython-312.pyc | Bin 1435 -> 1433 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 2273 -> 2271 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 1383 -> 1381 bytes .../__pycache__/retry.cpython-312.pyc | Bin 14252 -> 14250 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 5539 -> 5537 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 2557 -> 2555 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 12384 -> 12382 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 355 -> 353 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 26898 -> 26896 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 3879 -> 3877 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 337 -> 335 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 589 -> 587 bytes .../__pycache__/_api.cpython-312.pyc | Bin 15768 -> 15766 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 16633 -> 16631 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 2186 -> 2184 bytes .../_ssl_constants.cpython-312.pyc | Bin 1070 -> 1068 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 15477 -> 15475 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3376 -> 3374 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 15902 -> 15900 bytes .../__pycache__/_version.cpython-312.pyc | Bin 189 -> 187 bytes .../__pycache__/connection.cpython-312.pyc | Bin 20378 -> 20376 bytes .../connectionpool.cpython-312.pyc | Bin 36250 -> 36248 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 13464 -> 13462 bytes .../__pycache__/fields.cpython-312.pyc | Bin 10384 -> 10382 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 3989 -> 3987 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 20273 -> 20271 bytes .../__pycache__/request.cpython-312.pyc | Bin 7265 -> 7263 bytes .../__pycache__/response.cpython-312.pyc | Bin 33939 -> 33937 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 169 -> 167 bytes .../_appengine_environ.cpython-312.pyc | Bin 1819 -> 1817 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 11535 -> 11533 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 5690 -> 5688 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 24421 -> 24419 bytes .../securetransport.cpython-312.pyc | Bin 35527 -> 35525 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 7482 -> 7480 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 186 -> 184 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 17398 -> 17396 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 14772 -> 14770 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 170 -> 168 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 41290 -> 41288 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 180 -> 178 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 1796 -> 1794 bytes .../weakref_finalize.cpython-312.pyc | Bin 7302 -> 7300 bytes .../util/__pycache__/__init__.cpython-312.pyc | Bin 1117 -> 1115 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4727 -> 4725 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1523 -> 1521 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 1323 -> 1321 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 4154 -> 4152 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 2960 -> 2958 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 21668 -> 21666 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 15074 -> 15072 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5042 -> 5040 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 10743 -> 10741 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11110 -> 11108 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 15766 -> 15764 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 4374 -> 4372 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 11972 -> 11970 bytes .../__pycache__/labels.cpython-312.pyc | Bin 7103 -> 7101 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 2670 -> 2668 bytes .../__pycache__/tests.cpython-312.pyc | Bin 9222 -> 9220 bytes .../x_user_defined.cpython-312.pyc | Bin 3266 -> 3264 bytes .../propcache-0.4.1.dist-info/RECORD | 1 + .../propcache-0.4.1.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 1249 -> 1247 bytes .../__pycache__/_helpers.cpython-312.pyc | Bin 992 -> 990 bytes .../__pycache__/_helpers_py.cpython-312.pyc | Bin 3170 -> 3168 bytes .../propcache/__pycache__/api.cpython-312.pyc | Bin 310 -> 308 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4356 -> 4354 bytes .../__pycache__/_ipaddress.cpython-312.pyc | Bin 2594 -> 2592 bytes .../__pycache__/_json.cpython-312.pyc | Bin 7443 -> 7441 bytes .../__pycache__/_range.cpython-312.pyc | Bin 21014 -> 21012 bytes .../__pycache__/errorcodes.cpython-312.pyc | Bin 14538 -> 14536 bytes .../__pycache__/errors.cpython-312.pyc | Bin 502 -> 500 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 7428 -> 7426 bytes .../__pycache__/extras.cpython-312.pyc | Bin 60512 -> 60510 bytes .../psycopg2/__pycache__/pool.cpython-312.pyc | Bin 7798 -> 7796 bytes .../psycopg2/__pycache__/sql.cpython-312.pyc | Bin 18902 -> 18900 bytes .../psycopg2/__pycache__/tz.cpython-312.pyc | Bin 6164 -> 6162 bytes .../pycparser-2.23.dist-info/RECORD | 1 + .../pycparser-2.23.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 3010 -> 3008 bytes .../__pycache__/_ast_gen.cpython-312.pyc | Bin 12495 -> 12493 bytes .../__pycache__/_build_tables.cpython-312.pyc | Bin 753 -> 751 bytes .../ast_transforms.cpython-312.pyc | Bin 5530 -> 5528 bytes .../__pycache__/c_ast.cpython-312.pyc | Bin 50222 -> 50220 bytes .../__pycache__/c_generator.cpython-312.pyc | Bin 30069 -> 30067 bytes .../__pycache__/c_lexer.cpython-312.pyc | Bin 18245 -> 18243 bytes .../__pycache__/c_parser.cpython-312.pyc | Bin 88373 -> 88371 bytes .../__pycache__/lextab.cpython-312.pyc | Bin 6944 -> 6942 bytes .../__pycache__/plyparser.cpython-312.pyc | Bin 6028 -> 6026 bytes .../__pycache__/yacctab.cpython-312.pyc | Bin 192156 -> 192154 bytes .../ply/__pycache__/__init__.cpython-312.pyc | Bin 218 -> 216 bytes .../ply/__pycache__/cpp.cpython-312.pyc | Bin 32296 -> 32294 bytes .../ply/__pycache__/ctokens.cpython-312.pyc | Bin 2430 -> 2428 bytes .../ply/__pycache__/lex.cpython-312.pyc | Bin 41585 -> 41583 bytes .../ply/__pycache__/yacc.cpython-312.pyc | Bin 101110 -> 101108 bytes .../ply/__pycache__/ygen.cpython-312.pyc | Bin 2973 -> 2971 bytes .../AUTHORS.rst | 51 + .../pycryptodomex-3.23.0.dist-info/INSTALLER | 1 + .../LICENSE.rst | 61 + .../pycryptodomex-3.23.0.dist-info/METADATA | 86 + .../pycryptodomex-3.23.0.dist-info/RECORD | 559 +++ .../pycryptodomex-3.23.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../pyopenssl-25.3.0.dist-info/INSTALLER | 1 + .../pyopenssl-25.3.0.dist-info/METADATA | 525 +++ .../pyopenssl-25.3.0.dist-info/RECORD | 21 + .../pyopenssl-25.3.0.dist-info/WHEEL | 5 + .../licenses/LICENSE | 202 + .../pyopenssl-25.3.0.dist-info/top_level.txt | 1 + .../INSTALLER | 1 + .../METADATA | 29 + .../python_alipay_sdk-3.4.0.dist-info/RECORD | 17 + .../REQUESTED | 0 .../python_alipay_sdk-3.4.0.dist-info/WHEEL | 5 + .../licenses/LICENSE.txt | 26 + .../top_level.txt | 1 + .../RECORD | 1 + .../REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 1975 -> 1973 bytes .../__pycache__/background.cpython-312.pyc | Bin 9569 -> 9567 bytes .../redis/__pycache__/backoff.cpython-312.pyc | Bin 9834 -> 9832 bytes .../redis/__pycache__/cache.cpython-312.pyc | Bin 17737 -> 17735 bytes .../redis/__pycache__/client.cpython-312.pyc | Bin 73312 -> 73310 bytes .../redis/__pycache__/cluster.cpython-312.pyc | Bin 137098 -> 137096 bytes .../__pycache__/connection.cpython-312.pyc | Bin 124699 -> 124697 bytes .../redis/__pycache__/crc.cpython-312.pyc | Bin 950 -> 948 bytes .../__pycache__/credentials.cpython-312.pyc | Bin 3657 -> 3655 bytes .../data_structure.cpython-312.pyc | Bin 4761 -> 4759 bytes .../redis/__pycache__/event.cpython-312.pyc | Bin 25476 -> 25474 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 10132 -> 10130 bytes .../redis/__pycache__/lock.cpython-312.pyc | Bin 14461 -> 14459 bytes .../maint_notifications.cpython-312.pyc | Bin 33291 -> 33289 bytes .../redis/__pycache__/ocsp.cpython-312.pyc | Bin 15032 -> 15030 bytes .../redis/__pycache__/retry.cpython-312.pyc | Bin 5554 -> 5552 bytes .../__pycache__/sentinel.cpython-312.pyc | Bin 18751 -> 18749 bytes .../redis/__pycache__/typing.cpython-312.pyc | Bin 2050 -> 2048 bytes .../redis/__pycache__/utils.cpython-312.pyc | Bin 17010 -> 17008 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 734 -> 732 bytes .../_parsers/__pycache__/base.cpython-312.pyc | Bin 19467 -> 19465 bytes .../__pycache__/commands.cpython-312.pyc | Bin 22461 -> 22459 bytes .../__pycache__/encoders.cpython-312.pyc | Bin 2257 -> 2255 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 40668 -> 40666 bytes .../__pycache__/hiredis.cpython-312.pyc | Bin 12646 -> 12644 bytes .../__pycache__/resp2.cpython-312.pyc | Bin 5010 -> 5008 bytes .../__pycache__/resp3.cpython-312.pyc | Bin 9223 -> 9221 bytes .../__pycache__/socket.cpython-312.pyc | Bin 7151 -> 7149 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1338 -> 1336 bytes .../__pycache__/client.cpython-312.pyc | Bin 75737 -> 75735 bytes .../__pycache__/cluster.cpython-312.pyc | Bin 111450 -> 111448 bytes .../__pycache__/connection.cpython-312.pyc | Bin 67953 -> 67951 bytes .../asyncio/__pycache__/lock.cpython-312.pyc | Bin 15296 -> 15294 bytes .../asyncio/__pycache__/retry.cpython-312.pyc | Bin 3046 -> 3044 bytes .../__pycache__/sentinel.cpython-312.pyc | Bin 18933 -> 18931 bytes .../asyncio/__pycache__/utils.cpython-312.pyc | Bin 1534 -> 1532 bytes .../http/__pycache__/__init__.cpython-312.pyc | Bin 160 -> 158 bytes .../__pycache__/http_client.cpython-312.pyc | Bin 9626 -> 9624 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 163 -> 161 bytes .../__pycache__/client.cpython-312.pyc | Bin 27301 -> 27299 bytes .../command_executor.cpython-312.pyc | Bin 18712 -> 18710 bytes .../__pycache__/config.cpython-312.pyc | Bin 10012 -> 10010 bytes .../__pycache__/database.cpython-312.pyc | Bin 3376 -> 3374 bytes .../multidb/__pycache__/event.cpython-312.pyc | Bin 5137 -> 5135 bytes .../__pycache__/failover.cpython-312.pyc | Bin 6277 -> 6275 bytes .../failure_detector.cpython-312.pyc | Bin 2626 -> 2624 bytes .../__pycache__/healthcheck.cpython-312.pyc | Bin 13469 -> 13467 bytes .../auth/__pycache__/__init__.cpython-312.pyc | Bin 152 -> 150 bytes .../auth/__pycache__/err.cpython-312.pyc | Bin 1688 -> 1686 bytes .../auth/__pycache__/idp.cpython-312.pyc | Bin 1286 -> 1284 bytes .../auth/__pycache__/token.cpython-312.pyc | Bin 7479 -> 7477 bytes .../__pycache__/token_manager.cpython-312.pyc | Bin 18005 -> 18003 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 639 -> 637 bytes .../__pycache__/cluster.cpython-312.pyc | Bin 35473 -> 35471 bytes .../commands/__pycache__/core.cpython-312.pyc | Bin 284970 -> 284968 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 5199 -> 5197 bytes .../__pycache__/policies.cpython-312.pyc | Bin 12669 -> 12667 bytes .../__pycache__/redismodules.cpython-312.pyc | Bin 3745 -> 3743 bytes .../__pycache__/sentinel.cpython-312.pyc | Bin 7063 -> 7061 bytes .../bf/__pycache__/__init__.cpython-312.pyc | Bin 9382 -> 9380 bytes .../bf/__pycache__/commands.cpython-312.pyc | Bin 26486 -> 26484 bytes .../bf/__pycache__/info.cpython-312.pyc | Bin 5565 -> 5563 bytes .../json/__pycache__/__init__.cpython-312.pyc | Bin 6915 -> 6913 bytes .../json/__pycache__/_util.cpython-312.pyc | Bin 353 -> 351 bytes .../json/__pycache__/commands.cpython-312.pyc | Bin 19928 -> 19926 bytes .../json/__pycache__/decoders.cpython-312.pyc | Bin 2413 -> 2411 bytes .../json/__pycache__/path.cpython-312.pyc | Bin 958 -> 956 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 7245 -> 7243 bytes .../search/__pycache__/_util.cpython-312.pyc | Bin 499 -> 497 bytes .../__pycache__/aggregation.cpython-312.pyc | Bin 16315 -> 16313 bytes .../__pycache__/commands.cpython-312.pyc | Bin 48670 -> 48668 bytes .../__pycache__/dialect.cpython-312.pyc | Bin 192 -> 190 bytes .../__pycache__/document.cpython-312.pyc | Bin 1106 -> 1104 bytes .../search/__pycache__/field.cpython-312.pyc | Bin 8809 -> 8807 bytes .../__pycache__/hybrid_query.cpython-312.pyc | Bin 18341 -> 18339 bytes .../__pycache__/hybrid_result.cpython-312.pyc | Bin 1553 -> 1551 bytes .../index_definition.cpython-312.pyc | Bin 4256 -> 4254 bytes .../profile_information.cpython-312.pyc | Bin 857 -> 855 bytes .../search/__pycache__/query.cpython-312.pyc | Bin 16505 -> 16503 bytes .../__pycache__/querystring.cpython-312.pyc | Bin 14054 -> 14052 bytes .../__pycache__/reducers.cpython-312.pyc | Bin 7647 -> 7645 bytes .../search/__pycache__/result.cpython-312.pyc | Bin 2884 -> 2882 bytes .../__pycache__/suggestion.cpython-312.pyc | Bin 2825 -> 2823 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4679 -> 4677 bytes .../__pycache__/commands.cpython-312.pyc | Bin 49777 -> 49775 bytes .../__pycache__/info.cpython-312.pyc | Bin 4129 -> 4127 bytes .../__pycache__/utils.cpython-312.pyc | Bin 2617 -> 2615 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2224 -> 2222 bytes .../__pycache__/commands.cpython-312.pyc | Bin 15888 -> 15886 bytes .../__pycache__/utils.cpython-312.pyc | Bin 4764 -> 4762 bytes .../http/__pycache__/__init__.cpython-312.pyc | Bin 152 -> 150 bytes .../__pycache__/http_client.cpython-312.pyc | Bin 17277 -> 17275 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 155 -> 153 bytes .../__pycache__/circuit.cpython-312.pyc | Bin 7225 -> 7223 bytes .../__pycache__/client.cpython-312.pyc | Bin 25000 -> 24998 bytes .../command_executor.cpython-312.pyc | Bin 18447 -> 18445 bytes .../__pycache__/config.cpython-312.pyc | Bin 9965 -> 9963 bytes .../__pycache__/database.cpython-312.pyc | Bin 6265 -> 6263 bytes .../multidb/__pycache__/event.cpython-312.pyc | Bin 5219 -> 5217 bytes .../__pycache__/exception.cpython-312.pyc | Bin 1218 -> 1216 bytes .../__pycache__/failover.cpython-312.pyc | Bin 6129 -> 6127 bytes .../failure_detector.cpython-312.pyc | Bin 6006 -> 6004 bytes .../__pycache__/healthcheck.cpython-312.pyc | Bin 12561 -> 12559 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 5379 -> 5377 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 543 -> 541 bytes .../_internal_utils.cpython-312.pyc | Bin 1983 -> 1981 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 27770 -> 27768 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7163 -> 7161 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13882 -> 13880 bytes .../__pycache__/certs.cpython-312.pyc | Bin 625 -> 623 bytes .../__pycache__/compat.cpython-312.pyc | Bin 2339 -> 2337 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25235 -> 25233 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7544 -> 7542 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 4286 -> 4284 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1011 -> 1009 bytes .../__pycache__/models.cpython-312.pyc | Bin 35460 -> 35458 bytes .../__pycache__/packages.cpython-312.pyc | Bin 1098 -> 1096 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27849 -> 27847 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 5990 -> 5988 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5576 -> 5574 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36137 -> 36135 bytes venv/Lib/site-packages/rust/Cargo.toml | 35 - .../rust/cryptography-cffi/Cargo.toml | 17 - .../rust/cryptography-keepalive/Cargo.toml | 10 - .../rust/cryptography-key-parsing/Cargo.toml | 17 - .../rust/cryptography-openssl/Cargo.toml | 17 - .../cryptography-x509-verification/Cargo.toml | 16 - .../rust/cryptography-x509/Cargo.toml | 11 - .../s3transfer-0.16.0.dist-info/RECORD | 1 + .../s3transfer-0.16.0.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 34559 -> 34557 bytes .../__pycache__/bandwidth.cpython-312.pyc | Bin 18499 -> 18497 bytes .../__pycache__/compat.cpython-312.pyc | Bin 2622 -> 2620 bytes .../__pycache__/constants.cpython-312.pyc | Bin 673 -> 671 bytes .../__pycache__/copies.cpython-312.pyc | Bin 12458 -> 12456 bytes .../__pycache__/crt.cpython-312.pyc | Bin 46537 -> 46535 bytes .../__pycache__/delete.cpython-312.pyc | Bin 2614 -> 2612 bytes .../__pycache__/download.cpython-312.pyc | Bin 31888 -> 31886 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 1882 -> 1880 bytes .../__pycache__/futures.cpython-312.pyc | Bin 29046 -> 29044 bytes .../__pycache__/manager.cpython-312.pyc | Bin 27771 -> 27769 bytes .../__pycache__/processpool.cpython-312.pyc | Bin 41748 -> 41746 bytes .../__pycache__/subscribers.cpython-312.pyc | Bin 3788 -> 3786 bytes .../__pycache__/tasks.cpython-312.pyc | Bin 14014 -> 14012 bytes .../__pycache__/upload.cpython-312.pyc | Bin 32212 -> 32210 bytes .../__pycache__/utils.cpython-312.pyc | Bin 37213 -> 37211 bytes .../site-packages/six-1.17.0.dist-info/RECORD | 1 + .../six-1.17.0.dist-info/REQUESTED | 0 .../sqlalchemy-2.0.45.dist-info/RECORD | 1 + .../sqlalchemy-2.0.45.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 9388 -> 9386 bytes .../__pycache__/events.cpython-312.pyc | Bin 525 -> 523 bytes .../__pycache__/exc.cpython-312.pyc | Bin 31196 -> 31194 bytes .../__pycache__/inspection.cpython-312.pyc | Bin 6628 -> 6626 bytes .../__pycache__/log.cpython-312.pyc | Bin 11586 -> 11584 bytes .../__pycache__/schema.cpython-312.pyc | Bin 2340 -> 2338 bytes .../__pycache__/types.cpython-312.pyc | Bin 2250 -> 2248 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 564 -> 562 bytes .../__pycache__/aioodbc.cpython-312.pyc | Bin 7811 -> 7809 bytes .../__pycache__/asyncio.cpython-312.pyc | Bin 21627 -> 21625 bytes .../__pycache__/pyodbc.cpython-312.pyc | Bin 9596 -> 9594 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 164 -> 162 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1880 -> 1878 bytes .../__pycache__/_typing.cpython-312.pyc | Bin 1054 -> 1052 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1632 -> 1630 bytes .../mssql/__pycache__/aioodbc.cpython-312.pyc | Bin 2373 -> 2371 bytes .../mssql/__pycache__/base.cpython-312.pyc | Bin 153364 -> 153362 bytes .../information_schema.cpython-312.pyc | Bin 8908 -> 8906 bytes .../mssql/__pycache__/json.cpython-312.pyc | Bin 5189 -> 5187 bytes .../__pycache__/provision.cpython-312.pyc | Bin 7578 -> 7576 bytes .../mssql/__pycache__/pymssql.cpython-312.pyc | Bin 5921 -> 5919 bytes .../mssql/__pycache__/pyodbc.cpython-312.pyc | Bin 30585 -> 30583 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1961 -> 1959 bytes .../__pycache__/aiomysql.cpython-312.pyc | Bin 11714 -> 11712 bytes .../mysql/__pycache__/asyncmy.cpython-312.pyc | Bin 11191 -> 11189 bytes .../mysql/__pycache__/base.cpython-312.pyc | Bin 154540 -> 154538 bytes .../mysql/__pycache__/cymysql.cpython-312.pyc | Bin 4068 -> 4066 bytes .../mysql/__pycache__/dml.cpython-312.pyc | Bin 8319 -> 8317 bytes .../__pycache__/enumerated.cpython-312.pyc | Bin 11497 -> 11495 bytes .../__pycache__/expression.cpython-312.pyc | Bin 5195 -> 5193 bytes .../mysql/__pycache__/json.cpython-312.pyc | Bin 3909 -> 3907 bytes .../mysql/__pycache__/mariadb.cpython-312.pyc | Bin 2675 -> 2673 bytes .../mariadbconnector.cpython-312.pyc | Bin 13755 -> 13753 bytes .../mysqlconnector.cpython-312.pyc | Bin 14173 -> 14171 bytes .../mysql/__pycache__/mysqldb.cpython-312.pyc | Bin 12346 -> 12344 bytes .../__pycache__/provision.cpython-312.pyc | Bin 6373 -> 6371 bytes .../mysql/__pycache__/pymysql.cpython-312.pyc | Bin 6185 -> 6183 bytes .../mysql/__pycache__/pyodbc.cpython-312.pyc | Bin 6071 -> 6069 bytes .../__pycache__/reflection.cpython-312.pyc | Bin 25868 -> 25866 bytes .../reserved_words.cpython-312.pyc | Bin 4361 -> 4359 bytes .../mysql/__pycache__/types.cpython-312.pyc | Bin 33030 -> 33028 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1633 -> 1631 bytes .../oracle/__pycache__/base.cpython-312.pyc | Bin 153921 -> 153919 bytes .../__pycache__/cx_oracle.cpython-312.pyc | Bin 60975 -> 60973 bytes .../__pycache__/dictionary.cpython-312.pyc | Bin 24568 -> 24566 bytes .../__pycache__/oracledb.cpython-312.pyc | Bin 41048 -> 41046 bytes .../__pycache__/provision.cpython-312.pyc | Bin 13262 -> 13260 bytes .../oracle/__pycache__/types.cpython-312.pyc | Bin 13182 -> 13180 bytes .../oracle/__pycache__/vector.cpython-312.pyc | Bin 12199 -> 12197 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3402 -> 3400 bytes .../_psycopg_common.cpython-312.pyc | Bin 7894 -> 7892 bytes .../__pycache__/array.cpython-312.pyc | Bin 19522 -> 19520 bytes .../__pycache__/asyncpg.cpython-312.pyc | Bin 58796 -> 58794 bytes .../__pycache__/base.cpython-312.pyc | Bin 216148 -> 216146 bytes .../__pycache__/dml.cpython-312.pyc | Bin 12556 -> 12554 bytes .../__pycache__/ext.cpython-312.pyc | Bin 20589 -> 20587 bytes .../__pycache__/hstore.cpython-312.pyc | Bin 15338 -> 15336 bytes .../__pycache__/json.cpython-312.pyc | Bin 16603 -> 16601 bytes .../__pycache__/named_types.cpython-312.pyc | Bin 23039 -> 23037 bytes .../__pycache__/operators.cpython-312.pyc | Bin 2125 -> 2123 bytes .../__pycache__/pg8000.cpython-312.pyc | Bin 30487 -> 30485 bytes .../__pycache__/pg_catalog.cpython-312.pyc | Bin 11838 -> 11836 bytes .../__pycache__/provision.cpython-312.pyc | Bin 7748 -> 7746 bytes .../__pycache__/psycopg.cpython-312.pyc | Bin 40759 -> 40757 bytes .../__pycache__/psycopg2.cpython-312.pyc | Bin 35956 -> 35954 bytes .../__pycache__/psycopg2cffi.cpython-312.pyc | Bin 2132 -> 2130 bytes .../__pycache__/ranges.cpython-312.pyc | Bin 34736 -> 34734 bytes .../__pycache__/types.cpython-312.pyc | Bin 11483 -> 11481 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1028 -> 1026 bytes .../__pycache__/aiosqlite.cpython-312.pyc | Bin 20186 -> 20184 bytes .../sqlite/__pycache__/base.cpython-312.pyc | Bin 109102 -> 109100 bytes .../sqlite/__pycache__/dml.cpython-312.pyc | Bin 10011 -> 10009 bytes .../sqlite/__pycache__/json.cpython-312.pyc | Bin 3740 -> 3738 bytes .../__pycache__/provision.cpython-312.pyc | Bin 8720 -> 8718 bytes .../__pycache__/pysqlcipher.cpython-312.pyc | Bin 6187 -> 6185 bytes .../__pycache__/pysqlite.cpython-312.pyc | Bin 31192 -> 31190 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2243 -> 2241 bytes .../_py_processors.cpython-312.pyc | Bin 4466 -> 4464 bytes .../__pycache__/_py_row.cpython-312.pyc | Bin 5735 -> 5733 bytes .../__pycache__/_py_util.cpython-312.pyc | Bin 2174 -> 2172 bytes .../engine/__pycache__/base.cpython-312.pyc | Bin 130303 -> 130301 bytes .../characteristics.cpython-312.pyc | Bin 6812 -> 6810 bytes .../engine/__pycache__/create.cpython-312.pyc | Bin 34969 -> 34967 bytes .../engine/__pycache__/cursor.cpython-312.pyc | Bin 82990 -> 82988 bytes .../__pycache__/default.cpython-312.pyc | Bin 89129 -> 89127 bytes .../engine/__pycache__/events.cpython-312.pyc | Bin 39895 -> 39893 bytes .../__pycache__/interfaces.cpython-312.pyc | Bin 102530 -> 102528 bytes .../engine/__pycache__/mock.cpython-312.pyc | Bin 5649 -> 5647 bytes .../__pycache__/processors.cpython-312.pyc | Bin 1257 -> 1255 bytes .../__pycache__/reflection.cpython-312.pyc | Bin 80772 -> 80770 bytes .../engine/__pycache__/result.cpython-312.pyc | Bin 91416 -> 91414 bytes .../engine/__pycache__/row.cpython-312.pyc | Bin 17386 -> 17384 bytes .../__pycache__/strategies.cpython-312.pyc | Bin 521 -> 519 bytes .../engine/__pycache__/url.cpython-312.pyc | Bin 34378 -> 34376 bytes .../engine/__pycache__/util.cpython-312.pyc | Bin 6611 -> 6609 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 852 -> 850 bytes .../event/__pycache__/api.cpython-312.pyc | Bin 9044 -> 9042 bytes .../event/__pycache__/attr.cpython-312.pyc | Bin 31069 -> 31067 bytes .../event/__pycache__/base.cpython-312.pyc | Bin 19965 -> 19963 bytes .../event/__pycache__/legacy.cpython-312.pyc | Bin 9665 -> 9663 bytes .../__pycache__/registry.cpython-312.pyc | Bin 12585 -> 12583 bytes .../ext/__pycache__/__init__.cpython-312.pyc | Bin 319 -> 317 bytes .../associationproxy.cpython-312.pyc | Bin 87294 -> 87292 bytes .../ext/__pycache__/automap.cpython-312.pyc | Bin 57375 -> 57373 bytes .../ext/__pycache__/baked.cpython-312.pyc | Bin 23367 -> 23365 bytes .../ext/__pycache__/compiler.cpython-312.pyc | Bin 21217 -> 21215 bytes .../horizontal_shard.cpython-312.pyc | Bin 17634 -> 17632 bytes .../ext/__pycache__/hybrid.cpython-312.pyc | Bin 59956 -> 59954 bytes .../ext/__pycache__/indexable.cpython-312.pyc | Bin 13049 -> 13047 bytes .../instrumentation.cpython-312.pyc | Bin 19854 -> 19852 bytes .../ext/__pycache__/mutable.cpython-312.pyc | Bin 45842 -> 45840 bytes .../__pycache__/orderinglist.cpython-312.pyc | Bin 18063 -> 18061 bytes .../__pycache__/serializer.cpython-312.pyc | Bin 8014 -> 8012 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 942 -> 940 bytes .../asyncio/__pycache__/base.cpython-312.pyc | Bin 11320 -> 11318 bytes .../__pycache__/engine.cpython-312.pyc | Bin 57526 -> 57524 bytes .../asyncio/__pycache__/exc.cpython-312.pyc | Bin 1002 -> 1000 bytes .../__pycache__/result.cpython-312.pyc | Bin 37641 -> 37639 bytes .../__pycache__/scoping.cpython-312.pyc | Bin 56462 -> 56460 bytes .../__pycache__/session.cpython-312.pyc | Bin 71572 -> 71570 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1978 -> 1976 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 21246 -> 21244 bytes .../mypy/__pycache__/__init__.cpython-312.pyc | Bin 161 -> 159 bytes .../mypy/__pycache__/apply.cpython-312.pyc | Bin 10508 -> 10506 bytes .../__pycache__/decl_class.cpython-312.pyc | Bin 15812 -> 15810 bytes .../mypy/__pycache__/infer.cpython-312.pyc | Bin 15601 -> 15599 bytes .../mypy/__pycache__/names.cpython-312.pyc | Bin 11014 -> 11012 bytes .../mypy/__pycache__/plugin.cpython-312.pyc | Bin 12485 -> 12483 bytes .../ext/mypy/__pycache__/util.cpython-312.pyc | Bin 13971 -> 13969 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 429 -> 427 bytes .../future/__pycache__/engine.cpython-312.pyc | Bin 362 -> 360 bytes .../orm/__pycache__/__init__.cpython-312.pyc | Bin 6353 -> 6351 bytes .../_orm_constructors.cpython-312.pyc | Bin 106998 -> 106996 bytes .../orm/__pycache__/_typing.cpython-312.pyc | Bin 6769 -> 6767 bytes .../__pycache__/attributes.cpython-312.pyc | Bin 100566 -> 100564 bytes .../orm/__pycache__/base.cpython-312.pyc | Bin 30303 -> 30301 bytes .../bulk_persistence.cpython-312.pyc | Bin 64683 -> 64681 bytes .../__pycache__/clsregistry.cpython-312.pyc | Bin 23734 -> 23732 bytes .../__pycache__/collections.cpython-312.pyc | Bin 61910 -> 61908 bytes .../orm/__pycache__/context.cpython-312.pyc | Bin 103194 -> 103192 bytes .../orm/__pycache__/decl_api.cpython-312.pyc | Bin 69671 -> 69669 bytes .../orm/__pycache__/decl_base.cpython-312.pyc | Bin 68954 -> 68952 bytes .../__pycache__/dependency.cpython-312.pyc | Bin 43306 -> 43304 bytes .../descriptor_props.cpython-312.pyc | Bin 49604 -> 49602 bytes .../orm/__pycache__/dynamic.cpython-312.pyc | Bin 12906 -> 12904 bytes .../orm/__pycache__/evaluator.cpython-312.pyc | Bin 16726 -> 16724 bytes .../orm/__pycache__/events.cpython-312.pyc | Bin 136484 -> 136482 bytes .../orm/__pycache__/exc.cpython-312.pyc | Bin 10184 -> 10182 bytes .../orm/__pycache__/identity.cpython-312.pyc | Bin 12592 -> 12590 bytes .../instrumentation.cpython-312.pyc | Bin 31184 -> 31182 bytes .../__pycache__/interfaces.cpython-312.pyc | Bin 54560 -> 54558 bytes .../orm/__pycache__/loading.cpython-312.pyc | Bin 47088 -> 47086 bytes .../mapped_collection.cpython-312.pyc | Bin 21851 -> 21849 bytes .../orm/__pycache__/mapper.cpython-312.pyc | Bin 169031 -> 169029 bytes .../__pycache__/path_registry.cpython-312.pyc | Bin 31455 -> 31453 bytes .../__pycache__/persistence.cpython-312.pyc | Bin 48447 -> 48445 bytes .../__pycache__/properties.cpython-312.pyc | Bin 34617 -> 34615 bytes .../orm/__pycache__/query.cpython-312.pyc | Bin 128786 -> 128784 bytes .../__pycache__/relationships.cpython-312.pyc | Bin 130364 -> 130362 bytes .../orm/__pycache__/scoping.cpython-312.pyc | Bin 83074 -> 83072 bytes .../orm/__pycache__/session.cpython-312.pyc | Bin 202932 -> 202930 bytes .../orm/__pycache__/state.cpython-312.pyc | Bin 45846 -> 45844 bytes .../__pycache__/state_changes.cpython-312.pyc | Bin 6987 -> 6985 bytes .../__pycache__/strategies.cpython-312.pyc | Bin 105087 -> 105085 bytes .../strategy_options.cpython-312.pyc | Bin 87511 -> 87509 bytes .../orm/__pycache__/sync.cpython-312.pyc | Bin 6574 -> 6572 bytes .../__pycache__/unitofwork.cpython-312.pyc | Bin 34063 -> 34061 bytes .../orm/__pycache__/util.cpython-312.pyc | Bin 84950 -> 84948 bytes .../orm/__pycache__/writeonly.cpython-312.pyc | Bin 28773 -> 28771 bytes .../pool/__pycache__/__init__.cpython-312.pyc | Bin 1480 -> 1478 bytes .../pool/__pycache__/base.cpython-312.pyc | Bin 56385 -> 56383 bytes .../pool/__pycache__/events.cpython-312.pyc | Bin 14293 -> 14291 bytes .../pool/__pycache__/impl.cpython-312.pyc | Bin 26284 -> 26282 bytes .../sql/__pycache__/__init__.cpython-312.pyc | Bin 4653 -> 4651 bytes .../_dml_constructors.cpython-312.pyc | Bin 3961 -> 3959 bytes .../_elements_constructors.cpython-312.pyc | Bin 65981 -> 65979 bytes .../__pycache__/_orm_types.cpython-312.pyc | Bin 593 -> 591 bytes .../sql/__pycache__/_py_util.cpython-312.pyc | Bin 2932 -> 2930 bytes .../_selectable_constructors.cpython-312.pyc | Bin 25116 -> 25114 bytes .../sql/__pycache__/_typing.cpython-312.pyc | Bin 15127 -> 15125 bytes .../__pycache__/annotation.cpython-312.pyc | Bin 21359 -> 21357 bytes .../sql/__pycache__/base.cpython-312.pyc | Bin 100107 -> 100105 bytes .../sql/__pycache__/cache_key.cpython-312.pyc | Bin 35562 -> 35560 bytes .../sql/__pycache__/coercions.cpython-312.pyc | Bin 49045 -> 49043 bytes .../sql/__pycache__/compiler.cpython-312.pyc | Bin 280030 -> 280028 bytes .../sql/__pycache__/crud.cpython-312.pyc | Bin 48044 -> 48042 bytes .../sql/__pycache__/ddl.cpython-312.pyc | Bin 58652 -> 58650 bytes .../default_comparator.cpython-312.pyc | Bin 19446 -> 19444 bytes .../sql/__pycache__/dml.cpython-312.pyc | Bin 74248 -> 74246 bytes .../sql/__pycache__/elements.cpython-312.pyc | Bin 214144 -> 214142 bytes .../sql/__pycache__/events.cpython-312.pyc | Bin 19188 -> 19186 bytes .../__pycache__/expression.cpython-312.pyc | Bin 5113 -> 5111 bytes .../sql/__pycache__/functions.cpython-312.pyc | Bin 78638 -> 78636 bytes .../sql/__pycache__/lambdas.cpython-312.pyc | Bin 54751 -> 54749 bytes .../sql/__pycache__/naming.cpython-312.pyc | Bin 8437 -> 8435 bytes .../sql/__pycache__/operators.cpython-312.pyc | Bin 89836 -> 89834 bytes .../sql/__pycache__/roles.cpython-312.pyc | Bin 12212 -> 12210 bytes .../sql/__pycache__/schema.cpython-312.pyc | Bin 245999 -> 245997 bytes .../__pycache__/selectable.cpython-312.pyc | Bin 264484 -> 264482 bytes .../sql/__pycache__/sqltypes.cpython-312.pyc | Bin 155238 -> 155236 bytes .../__pycache__/traversals.cpython-312.pyc | Bin 42383 -> 42381 bytes .../sql/__pycache__/type_api.cpython-312.pyc | Bin 87785 -> 87783 bytes .../sql/__pycache__/util.cpython-312.pyc | Bin 54403 -> 54401 bytes .../sql/__pycache__/visitors.cpython-312.pyc | Bin 36030 -> 36028 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 3297 -> 3295 bytes .../__pycache__/assertions.cpython-312.pyc | Bin 42126 -> 42124 bytes .../__pycache__/assertsql.cpython-312.pyc | Bin 20266 -> 20264 bytes .../__pycache__/asyncio.cpython-312.pyc | Bin 4117 -> 4115 bytes .../__pycache__/config.cpython-312.pyc | Bin 18147 -> 18145 bytes .../__pycache__/engines.cpython-312.pyc | Bin 21213 -> 21211 bytes .../__pycache__/entities.cpython-312.pyc | Bin 4956 -> 4954 bytes .../__pycache__/exclusions.cpython-312.pyc | Bin 23428 -> 23426 bytes .../__pycache__/pickleable.cpython-312.pyc | Bin 6656 -> 6654 bytes .../__pycache__/profiling.cpython-312.pyc | Bin 13060 -> 13058 bytes .../__pycache__/provision.cpython-312.pyc | Bin 25118 -> 25116 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 92327 -> 92325 bytes .../__pycache__/schema.cpython-312.pyc | Bin 8335 -> 8333 bytes .../testing/__pycache__/util.cpython-312.pyc | Bin 21799 -> 21797 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 1976 -> 1974 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 878 -> 876 bytes .../fixtures/__pycache__/base.cpython-312.pyc | Bin 13515 -> 13513 bytes .../fixtures/__pycache__/mypy.cpython-312.pyc | Bin 13695 -> 13693 bytes .../fixtures/__pycache__/orm.cpython-312.pyc | Bin 11417 -> 11415 bytes .../fixtures/__pycache__/sql.cpython-312.pyc | Bin 21464 -> 21462 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 165 bytes .../__pycache__/bootstrap.cpython-312.pyc | Bin 2118 -> 2116 bytes .../__pycache__/plugin_base.cpython-312.pyc | Bin 29301 -> 29299 bytes .../__pycache__/pytestplugin.cpython-312.pyc | Bin 33655 -> 33653 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 534 -> 532 bytes .../__pycache__/test_cte.cpython-312.pyc | Bin 11049 -> 11047 bytes .../__pycache__/test_ddl.cpython-312.pyc | Bin 18721 -> 18719 bytes .../test_deprecations.cpython-312.pyc | Bin 9005 -> 9003 bytes .../__pycache__/test_dialect.cpython-312.pyc | Bin 36368 -> 36366 bytes .../__pycache__/test_insert.cpython-312.pyc | Bin 25214 -> 25212 bytes .../test_reflection.cpython-312.pyc | Bin 155649 -> 155647 bytes .../__pycache__/test_results.cpython-312.pyc | Bin 25551 -> 25549 bytes .../__pycache__/test_rowcount.cpython-312.pyc | Bin 10318 -> 10316 bytes .../__pycache__/test_select.cpython-312.pyc | Bin 115181 -> 115179 bytes .../__pycache__/test_sequence.cpython-312.pyc | Bin 14968 -> 14966 bytes .../__pycache__/test_types.cpython-312.pyc | Bin 99127 -> 99125 bytes .../test_unicode_ddl.cpython-312.pyc | Bin 7588 -> 7586 bytes .../test_update_delete.cpython-312.pyc | Bin 7367 -> 7365 bytes .../util/__pycache__/__init__.cpython-312.pyc | Bin 5706 -> 5704 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 31752 -> 31750 bytes .../_concurrency_py3k.cpython-312.pyc | Bin 10807 -> 10805 bytes .../util/__pycache__/_has_cy.cpython-312.pyc | Bin 1058 -> 1056 bytes .../_py_collections.cpython-312.pyc | Bin 29172 -> 29170 bytes .../util/__pycache__/compat.cpython-312.pyc | Bin 12923 -> 12921 bytes .../__pycache__/concurrency.cpython-312.pyc | Bin 4062 -> 4060 bytes .../__pycache__/deprecations.cpython-312.pyc | Bin 13628 -> 13626 bytes .../__pycache__/langhelpers.cpython-312.pyc | Bin 86751 -> 86749 bytes .../__pycache__/preloaded.cpython-312.pyc | Bin 5859 -> 5857 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 14591 -> 14589 bytes .../__pycache__/tool_support.cpython-312.pyc | Bin 8693 -> 8691 bytes .../__pycache__/topological.cpython-312.pyc | Bin 3903 -> 3901 bytes .../util/__pycache__/typing.cpython-312.pyc | Bin 26066 -> 26064 bytes .../test/__pycache__/__init__.cpython-312.pyc | Bin 146 -> 144 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 158 -> 156 bytes .../__pycache__/test_client.cpython-312.pyc | Bin 4203 -> 4201 bytes .../unit/__pycache__/__init__.cpython-312.pyc | Bin 151 -> 149 bytes .../__pycache__/test_client.cpython-312.pyc | Bin 862 -> 860 bytes .../typing_extensions-4.15.0.dist-info/RECORD | 1 + .../REQUESTED | 0 .../tzdata-2025.3.dist-info/RECORD | 1 + .../tzdata-2025.3.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 209 -> 207 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 164 -> 162 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 175 -> 173 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 173 -> 171 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 174 -> 172 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 178 -> 176 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 165 -> 163 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 168 -> 166 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 164 -> 162 bytes .../Asia/__pycache__/__init__.cpython-312.pyc | Bin 162 -> 160 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 166 -> 164 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 167 -> 165 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 164 -> 162 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 164 -> 162 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 163 -> 161 bytes .../Etc/__pycache__/__init__.cpython-312.pyc | Bin 161 -> 159 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 164 -> 162 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 164 -> 162 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 164 -> 162 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 165 -> 163 bytes .../US/__pycache__/__init__.cpython-312.pyc | Bin 160 -> 158 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 157 -> 155 bytes .../tzlocal-5.3.1.dist-info/RECORD | 1 + .../tzlocal-5.3.1.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 487 -> 485 bytes .../tzlocal/__pycache__/unix.cpython-312.pyc | Bin 10067 -> 10065 bytes .../tzlocal/__pycache__/utils.cpython-312.pyc | Bin 4338 -> 4336 bytes .../tzlocal/__pycache__/win32.cpython-312.pyc | Bin 4749 -> 4747 bytes .../__pycache__/windows_tz.cpython-312.pyc | Bin 29997 -> 29995 bytes .../urllib3-2.6.3.dist-info/RECORD | 1 + .../urllib3-2.6.3.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 7274 -> 7272 bytes .../_base_connection.cpython-312.pyc | Bin 6812 -> 6810 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 22963 -> 22961 bytes .../_request_methods.cpython-312.pyc | Bin 10566 -> 10564 bytes .../__pycache__/_version.cpython-312.pyc | Bin 757 -> 755 bytes .../__pycache__/connection.cpython-312.pyc | Bin 38884 -> 38882 bytes .../connectionpool.cpython-312.pyc | Bin 39699 -> 39697 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 16575 -> 16573 bytes .../__pycache__/fields.cpython-312.pyc | Bin 11986 -> 11984 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 3453 -> 3451 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 24302 -> 24300 bytes .../__pycache__/response.cpython-312.pyc | Bin 57454 -> 57452 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 157 -> 155 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 28180 -> 28178 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 8135 -> 8133 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 954 -> 952 bytes .../__pycache__/connection.cpython-312.pyc | Bin 10351 -> 10349 bytes .../__pycache__/fetch.cpython-312.pyc | Bin 28602 -> 28600 bytes .../__pycache__/request.cpython-312.pyc | Bin 1385 -> 1383 bytes .../__pycache__/response.cpython-312.pyc | Bin 12179 -> 12177 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1710 -> 1708 bytes .../__pycache__/connection.cpython-312.pyc | Bin 17017 -> 17015 bytes .../http2/__pycache__/probe.cpython-312.pyc | Bin 3661 -> 3659 bytes .../util/__pycache__/__init__.cpython-312.pyc | Bin 970 -> 968 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4660 -> 4658 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1182 -> 1180 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 8306 -> 8304 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 2838 -> 2836 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 20798 -> 20796 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 17284 -> 17282 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5522 -> 5520 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 13289 -> 13287 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11654 -> 11652 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 16191 -> 16189 bytes .../util/__pycache__/util.cpython-312.pyc | Bin 1959 -> 1957 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 3405 -> 3403 bytes .../werkzeug-3.1.5.dist-info/RECORD | 1 + .../werkzeug-3.1.5.dist-info/REQUESTED | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 304 -> 302 bytes .../__pycache__/_internal.cpython-312.pyc | Bin 9717 -> 9715 bytes .../__pycache__/_reloader.cpython-312.pyc | Bin 20888 -> 20886 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 33983 -> 33981 bytes .../__pycache__/formparser.cpython-312.pyc | Bin 16990 -> 16988 bytes .../werkzeug/__pycache__/http.cpython-312.pyc | Bin 50215 -> 50213 bytes .../__pycache__/local.cpython-312.pyc | Bin 28445 -> 28443 bytes .../__pycache__/security.cpython-312.pyc | Bin 8054 -> 8052 bytes .../__pycache__/serving.cpython-312.pyc | Bin 46061 -> 46059 bytes .../werkzeug/__pycache__/test.cpython-312.pyc | Bin 59834 -> 59832 bytes .../__pycache__/testapp.cpython-312.pyc | Bin 8855 -> 8853 bytes .../werkzeug/__pycache__/urls.cpython-312.pyc | Bin 8234 -> 8232 bytes .../__pycache__/user_agent.cpython-312.pyc | Bin 2117 -> 2115 bytes .../__pycache__/utils.cpython-312.pyc | Bin 27694 -> 27692 bytes .../werkzeug/__pycache__/wsgi.cpython-312.pyc | Bin 25180 -> 25178 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 2381 -> 2379 bytes .../__pycache__/accept.cpython-312.pyc | Bin 15908 -> 15906 bytes .../__pycache__/auth.cpython-312.pyc | Bin 14423 -> 14421 bytes .../__pycache__/cache_control.cpython-312.pyc | Bin 12190 -> 12188 bytes .../__pycache__/csp.cpython-312.pyc | Bin 6151 -> 6149 bytes .../__pycache__/etag.cpython-312.pyc | Bin 5366 -> 5364 bytes .../__pycache__/file_storage.cpython-312.pyc | Bin 8788 -> 8786 bytes .../__pycache__/headers.cpython-312.pyc | Bin 30484 -> 30482 bytes .../__pycache__/mixins.cpython-312.pyc | Bin 16364 -> 16362 bytes .../__pycache__/range.cpython-312.pyc | Bin 10019 -> 10017 bytes .../__pycache__/structures.cpython-312.pyc | Bin 59078 -> 59076 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 23570 -> 23568 bytes .../debug/__pycache__/console.cpython-312.pyc | Bin 11601 -> 11599 bytes .../debug/__pycache__/repr.cpython-312.pyc | Bin 13774 -> 13772 bytes .../debug/__pycache__/tbtools.cpython-312.pyc | Bin 17006 -> 17004 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 161 -> 159 bytes .../__pycache__/dispatcher.cpython-312.pyc | Bin 3279 -> 3277 bytes .../__pycache__/http_proxy.cpython-312.pyc | Bin 9371 -> 9369 bytes .../__pycache__/lint.cpython-312.pyc | Bin 17741 -> 17739 bytes .../__pycache__/profiler.cpython-312.pyc | Bin 7165 -> 7163 bytes .../__pycache__/proxy_fix.cpython-312.pyc | Bin 7162 -> 7160 bytes .../__pycache__/shared_data.cpython-312.pyc | Bin 12717 -> 12715 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4634 -> 4632 bytes .../__pycache__/converters.cpython-312.pyc | Bin 10874 -> 10872 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7877 -> 7875 bytes .../routing/__pycache__/map.cpython-312.pyc | Bin 39803 -> 39801 bytes .../__pycache__/matcher.cpython-312.pyc | Bin 8245 -> 8243 bytes .../routing/__pycache__/rules.cpython-312.pyc | Bin 39136 -> 39134 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 157 -> 155 bytes .../sansio/__pycache__/http.cpython-312.pyc | Bin 5608 -> 5606 bytes .../__pycache__/multipart.cpython-312.pyc | Bin 14234 -> 14232 bytes .../__pycache__/request.cpython-312.pyc | Bin 21850 -> 21848 bytes .../__pycache__/response.cpython-312.pyc | Bin 31702 -> 31700 bytes .../sansio/__pycache__/utils.cpython-312.pyc | Bin 6147 -> 6145 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 281 -> 279 bytes .../__pycache__/request.cpython-312.pyc | Bin 26111 -> 26109 bytes .../__pycache__/response.cpython-312.pyc | Bin 34536 -> 34534 bytes .../yarl-1.22.0.dist-info/RECORD | 1 + .../yarl-1.22.0.dist-info/REQUESTED | 0 .../yarl/__pycache__/__init__.cpython-312.pyc | Bin 426 -> 424 bytes .../yarl/__pycache__/_parse.cpython-312.pyc | Bin 6938 -> 6936 bytes .../yarl/__pycache__/_path.cpython-312.pyc | Bin 1380 -> 1378 bytes .../yarl/__pycache__/_query.cpython-312.pyc | Bin 4965 -> 4963 bytes .../yarl/__pycache__/_quoters.cpython-312.pyc | Bin 1961 -> 1959 bytes .../yarl/__pycache__/_quoting.cpython-312.pyc | Bin 720 -> 718 bytes .../__pycache__/_quoting_py.cpython-312.pyc | Bin 8776 -> 8774 bytes .../yarl/__pycache__/_url.cpython-312.pyc | Bin 60760 -> 60758 bytes venv/Scripts/__pycache__/jp.cpython-312.pyc | Bin 3155 -> 3153 bytes venv/Scripts/activate | 4 +- venv/Scripts/activate.bat | 2 +- venv/Scripts/flask.exe | Bin 108379 -> 108377 bytes venv/Scripts/jp.py | 2 +- venv/Scripts/normalizer.exe | Bin 108404 -> 108402 bytes venv/Scripts/pip.exe | Bin 108392 -> 108390 bytes venv/Scripts/pip3.12.exe | Bin 108392 -> 108390 bytes venv/Scripts/pip3.exe | Bin 108392 -> 108390 bytes venv/pyvenv.cfg | 6 +- 2659 files changed, 78944 insertions(+), 6345 deletions(-) create mode 100644 blueprints/__pycache__/payment.cpython-312.pyc create mode 100644 blueprints/payment.py create mode 100644 services/__pycache__/alipay_service.cpython-312.pyc create mode 100644 services/alipay_service.py create mode 100644 sync_db.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/AES.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/AES.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/ARC2.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/ARC2.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/ARC4.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/ARC4.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/Blowfish.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/Blowfish.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/CAST.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/CAST.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/DES.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/DES.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/DES3.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/DES3.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/Salsa20.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/Salsa20.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_ARC4.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_EKSBlowfish.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_Salsa20.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__init__.py rename venv/Lib/site-packages/{pillow-12.1.0.dist-info/REQUESTED => Cryptodome/Cipher/__init__.pyi} (100%) create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/AES.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/ARC2.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/ARC4.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/Blowfish.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/CAST.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/ChaCha20.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/ChaCha20_Poly1305.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/DES.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/DES3.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/PKCS1_OAEP.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/PKCS1_v1_5.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/Salsa20.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_EKSBlowfish.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_cbc.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_ccm.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_cfb.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_ctr.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_eax.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_ecb.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_gcm.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_kw.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_kwp.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_ocb.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_ofb.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_openpgp.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_siv.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_pkcs1_oaep_decode.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_chacha20.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_cbc.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_cbc.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_ccm.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_ccm.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_cfb.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_cfb.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_ctr.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_ctr.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_eax.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_eax.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_ecb.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_ecb.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_gcm.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_gcm.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_kw.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_kwp.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_ocb.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_ocb.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_ofb.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_ofb.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_openpgp.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_siv.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_mode_siv.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_pkcs1_decode.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_pkcs1_oaep_decode.py create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_aes.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_aesni.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_arc2.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_blowfish.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_cast.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_cbc.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_cfb.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_ctr.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_des.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_des3.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_ecb.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_eksblowfish.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_ocb.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Cipher/_raw_ofb.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/BLAKE2b.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/BLAKE2b.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/BLAKE2s.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/BLAKE2s.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/CMAC.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/CMAC.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/HMAC.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/HMAC.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/KMAC128.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/KMAC128.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/KMAC256.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/KMAC256.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/KangarooTwelve.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/KangarooTwelve.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/MD2.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/MD2.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/MD4.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/MD4.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/MD5.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/MD5.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/Poly1305.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/Poly1305.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/RIPEMD.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/RIPEMD.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/RIPEMD160.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/RIPEMD160.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA1.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA1.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA224.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA224.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA256.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA256.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA384.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA384.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA3_224.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA3_224.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA3_256.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA3_256.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA3_384.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA3_384.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA3_512.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA3_512.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA512.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHA512.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHAKE128.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHAKE128.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHAKE256.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/SHAKE256.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/TupleHash128.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/TupleHash128.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/TupleHash256.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/TupleHash256.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE128.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE128.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE256.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE256.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_BLAKE2b.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_BLAKE2s.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_MD2.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_MD4.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_MD5.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_RIPEMD160.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_SHA1.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_SHA224.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_SHA256.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_SHA384.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_SHA512.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__init__.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/BLAKE2b.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/BLAKE2s.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/CMAC.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/HMAC.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/KMAC128.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/KMAC256.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/KangarooTwelve.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/MD2.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/MD4.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/MD5.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/Poly1305.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/RIPEMD.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/RIPEMD160.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA1.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA224.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA256.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA384.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA3_224.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA3_256.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA3_384.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA3_512.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA512.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHAKE128.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHAKE256.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/TupleHash128.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/TupleHash256.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/TurboSHAKE128.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/TurboSHAKE256.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/cSHAKE128.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/cSHAKE256.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/__pycache__/keccak.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_ghash_clmul.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_ghash_portable.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_keccak.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/_poly1305.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/cSHAKE128.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/cSHAKE128.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/cSHAKE256.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/cSHAKE256.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/keccak.py create mode 100644 venv/Lib/site-packages/Cryptodome/Hash/keccak.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/IO/PEM.py create mode 100644 venv/Lib/site-packages/Cryptodome/IO/PEM.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/IO/PKCS8.py create mode 100644 venv/Lib/site-packages/Cryptodome/IO/PKCS8.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/IO/_PBES.py create mode 100644 venv/Lib/site-packages/Cryptodome/IO/_PBES.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/IO/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/IO/__pycache__/PEM.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/IO/__pycache__/PKCS8.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/IO/__pycache__/_PBES.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/IO/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Math/Numbers.py create mode 100644 venv/Lib/site-packages/Cryptodome/Math/Numbers.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Math/Primality.py create mode 100644 venv/Lib/site-packages/Cryptodome/Math/Primality.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Math/_IntegerBase.py create mode 100644 venv/Lib/site-packages/Cryptodome/Math/_IntegerBase.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Math/_IntegerCustom.py create mode 100644 venv/Lib/site-packages/Cryptodome/Math/_IntegerCustom.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Math/_IntegerGMP.py create mode 100644 venv/Lib/site-packages/Cryptodome/Math/_IntegerGMP.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Math/_IntegerNative.py create mode 100644 venv/Lib/site-packages/Cryptodome/Math/_IntegerNative.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Math/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/Math/__pycache__/Numbers.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Math/__pycache__/Primality.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Math/__pycache__/_IntegerBase.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Math/__pycache__/_IntegerCustom.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Math/__pycache__/_IntegerGMP.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Math/__pycache__/_IntegerNative.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Math/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Math/_modexp.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/DH.py create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/DH.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/HPKE.py create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/KDF.py create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/KDF.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/SecretSharing.py create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/SecretSharing.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/__init__.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/DH.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/HPKE.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/KDF.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/SecretSharing.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Protocol/_scrypt.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/DSA.py create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/DSA.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/ECC.py create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/ECC.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/ElGamal.py create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/ElGamal.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/RSA.py create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/RSA.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__init__.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/DSA.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/ECC.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/ElGamal.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/RSA.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_curve.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_edwards.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_montgomery.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_nist_ecc.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_openssh.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_point.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_curve.py create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_curve25519.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_curve448.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_ec_ws.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_ed25519.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_ed448.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_edwards.py create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_montgomery.py create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_nist_ecc.py create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_openssh.py create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_openssh.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_point.py create mode 100644 venv/Lib/site-packages/Cryptodome/PublicKey/_point.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Random/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/Random/__init__.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Random/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Random/__pycache__/random.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Random/random.py create mode 100644 venv/Lib/site-packages/Cryptodome/Random/random.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/common.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_AES.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_ARC2.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_ARC4.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_Blowfish.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_CAST.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_CBC.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_CCM.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_CFB.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_CTR.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_ChaCha20.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_ChaCha20_Poly1305.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_DES.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_DES3.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_EAX.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_GCM.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_KW.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_OCB.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_OFB.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_OpenPGP.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_SIV.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_Salsa20.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_pkcs1_15.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_pkcs1_oaep.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/common.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_AES.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_ARC2.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_ARC4.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_Blowfish.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_CAST.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_CCM.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_CFB.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_CTR.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_ChaCha20_Poly1305.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_DES.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_DES3.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_EAX.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_GCM.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_KW.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_OCB.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_OFB.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_OpenPGP.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_SIV.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_Salsa20.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_15.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/test_pkcs1_oaep.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/common.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_BLAKE2.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_CMAC.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_HMAC.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_KMAC.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_KangarooTwelve.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_MD2.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_MD4.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_MD5.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_Poly1305.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_RIPEMD160.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_SHA1.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_SHA224.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_SHA256.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_SHA384.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_224.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_256.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_384.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_SHA3_512.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_SHA512.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_SHAKE.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_TupleHash.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_TurboSHAKE.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_cSHAKE.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/__pycache__/test_keccak.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/common.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_BLAKE2.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_CMAC.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_HMAC.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_KMAC.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_KangarooTwelve.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_MD2.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_MD4.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_MD5.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_Poly1305.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_RIPEMD160.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_SHA1.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_SHA224.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_SHA256.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_SHA384.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_224.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_256.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_384.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_SHA3_512.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_SHA512.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_SHAKE.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_TupleHash.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_TurboSHAKE.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_cSHAKE.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Hash/test_keccak.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/IO/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/IO/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/IO/__pycache__/test_PBES.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/IO/__pycache__/test_PKCS8.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/IO/test_PBES.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/IO/test_PKCS8.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Math/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Math/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Math/__pycache__/test_Numbers.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Math/__pycache__/test_Primality.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Math/__pycache__/test_modexp.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Math/__pycache__/test_modmult.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Math/test_Numbers.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Math/test_Primality.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Math/test_modexp.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Math/test_modmult.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/__pycache__/test_HPKE.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/__pycache__/test_KDF.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/__pycache__/test_SecretSharing.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/__pycache__/test_ecdh.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/__pycache__/test_rfc1751.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/test_HPKE.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/test_KDF.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/test_SecretSharing.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/test_ecdh.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Protocol/test_rfc1751.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_DSA.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_ECC_Curve25519.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_ECC_Curve448.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_ECC_Ed25519.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_ECC_Ed448.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_ECC_NIST.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_ElGamal.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_RSA.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_import_Curve25519.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_import_Curve448.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_import_DSA.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_import_ECC.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/__pycache__/test_import_RSA.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_DSA.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_Curve25519.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_Curve448.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_Ed25519.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_Ed448.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_ECC_NIST.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_ElGamal.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_RSA.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_import_Curve25519.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_import_Curve448.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_import_DSA.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_import_ECC.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/PublicKey/test_import_RSA.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Random/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Random/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Random/__pycache__/test_random.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Random/test_random.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Signature/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Signature/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Signature/__pycache__/test_dss.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Signature/__pycache__/test_eddsa.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Signature/__pycache__/test_pkcs1_15.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Signature/__pycache__/test_pss.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Signature/test_dss.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Signature/test_eddsa.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Signature/test_pkcs1_15.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Signature/test_pss.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/__pycache__/test_Counter.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/__pycache__/test_Padding.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/__pycache__/test_asn1.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/__pycache__/test_number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/__pycache__/test_rfc1751.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/__pycache__/test_strxor.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/test_Counter.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/test_Padding.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/test_asn1.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/test_number.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/test_rfc1751.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/Util/test_strxor.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/__main__.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/__pycache__/loader.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/__pycache__/st_common.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/loader.py create mode 100644 venv/Lib/site-packages/Cryptodome/SelfTest/st_common.py create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/DSS.py create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/DSS.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/PKCS1_PSS.py create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/PKCS1_PSS.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/PKCS1_v1_5.py create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/PKCS1_v1_5.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/__pycache__/DSS.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/__pycache__/PKCS1_PSS.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/__pycache__/PKCS1_v1_5.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/__pycache__/eddsa.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/__pycache__/pkcs1_15.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/__pycache__/pss.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/eddsa.py create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/eddsa.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/pkcs1_15.py create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/pkcs1_15.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/pss.py create mode 100644 venv/Lib/site-packages/Cryptodome/Signature/pss.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Util/Counter.py create mode 100644 venv/Lib/site-packages/Cryptodome/Util/Counter.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Util/Padding.py create mode 100644 venv/Lib/site-packages/Cryptodome/Util/Padding.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Util/RFC1751.py create mode 100644 venv/Lib/site-packages/Cryptodome/Util/RFC1751.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__pycache__/Counter.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__pycache__/Padding.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__pycache__/RFC1751.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__pycache__/_cpu_features.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__pycache__/_file_system.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__pycache__/_raw_api.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__pycache__/asn1.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__pycache__/number.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__pycache__/py3compat.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Util/__pycache__/strxor.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/Util/_cpu_features.py create mode 100644 venv/Lib/site-packages/Cryptodome/Util/_cpu_features.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Util/_cpuid_c.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Util/_file_system.py create mode 100644 venv/Lib/site-packages/Cryptodome/Util/_file_system.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Util/_raw_api.py create mode 100644 venv/Lib/site-packages/Cryptodome/Util/_raw_api.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Util/_strxor.pyd create mode 100644 venv/Lib/site-packages/Cryptodome/Util/asn1.py create mode 100644 venv/Lib/site-packages/Cryptodome/Util/asn1.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Util/number.py create mode 100644 venv/Lib/site-packages/Cryptodome/Util/number.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Util/py3compat.py create mode 100644 venv/Lib/site-packages/Cryptodome/Util/py3compat.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/Util/strxor.py create mode 100644 venv/Lib/site-packages/Cryptodome/Util/strxor.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/__init__.py create mode 100644 venv/Lib/site-packages/Cryptodome/__init__.pyi create mode 100644 venv/Lib/site-packages/Cryptodome/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/Cryptodome/py.typed create mode 100644 venv/Lib/site-packages/OpenSSL/SSL.py create mode 100644 venv/Lib/site-packages/OpenSSL/__init__.py create mode 100644 venv/Lib/site-packages/OpenSSL/__pycache__/SSL.cpython-312.pyc create mode 100644 venv/Lib/site-packages/OpenSSL/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/OpenSSL/__pycache__/_util.cpython-312.pyc create mode 100644 venv/Lib/site-packages/OpenSSL/__pycache__/crypto.cpython-312.pyc create mode 100644 venv/Lib/site-packages/OpenSSL/__pycache__/debug.cpython-312.pyc create mode 100644 venv/Lib/site-packages/OpenSSL/__pycache__/rand.cpython-312.pyc create mode 100644 venv/Lib/site-packages/OpenSSL/__pycache__/version.cpython-312.pyc create mode 100644 venv/Lib/site-packages/OpenSSL/_util.py create mode 100644 venv/Lib/site-packages/OpenSSL/crypto.py create mode 100644 venv/Lib/site-packages/OpenSSL/debug.py create mode 100644 venv/Lib/site-packages/OpenSSL/py.typed create mode 100644 venv/Lib/site-packages/OpenSSL/rand.py create mode 100644 venv/Lib/site-packages/OpenSSL/version.py delete mode 100644 venv/Lib/site-packages/PIL/AvifImagePlugin.py delete mode 100644 venv/Lib/site-packages/PIL/ImageText.py create mode 100644 venv/Lib/site-packages/PIL/PyAccess.py delete mode 100644 venv/Lib/site-packages/PIL/__pycache__/AvifImagePlugin.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/PIL/__pycache__/ImageText.cpython-312.pyc create mode 100644 venv/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-312.pyc delete mode 100644 venv/Lib/site-packages/PIL/_avif.cp312-win_amd64.pyd delete mode 100644 venv/Lib/site-packages/PIL/_avif.pyi delete mode 100644 venv/Lib/site-packages/PIL/_imagingtk.pyi create mode 100644 venv/Lib/site-packages/aiofiles-24.1.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/aiohappyeyeballs-2.6.1.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/aiohttp-3.13.3.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/aiosignal-1.4.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/alibabacloud_credentials-1.0.4.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/alibabacloud_credentials_api-1.0.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/alibabacloud_endpoint_util-0.0.4.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/alibabacloud_gateway_spi-0.0.3.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/alibabacloud_openapi_util-0.2.2.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/alibabacloud_tea-0.4.3.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/alipay/__init__.py create mode 100644 venv/Lib/site-packages/alipay/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/alipay/__pycache__/compat.cpython-312.pyc create mode 100644 venv/Lib/site-packages/alipay/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/Lib/site-packages/alipay/__pycache__/loggers.cpython-312.pyc create mode 100644 venv/Lib/site-packages/alipay/__pycache__/utils.cpython-312.pyc create mode 100644 venv/Lib/site-packages/alipay/compat.py create mode 100644 venv/Lib/site-packages/alipay/exceptions.py create mode 100644 venv/Lib/site-packages/alipay/loggers.py create mode 100644 venv/Lib/site-packages/alipay/utils.py create mode 100644 venv/Lib/site-packages/apscheduler-3.11.2.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/attrs-25.4.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/blinker-1.9.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/botocore-1.42.25.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/certifi-2026.1.4.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/cffi-2.0.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/charset_normalizer-3.4.4.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/click-8.3.1.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/colorama-0.4.6.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/cryptography-44.0.3.dist-info/WHEEL rename venv/Lib/site-packages/{cryptography-44.0.3.dist-info => cryptography-46.0.3.dist-info}/INSTALLER (100%) rename venv/Lib/site-packages/{cryptography-44.0.3.dist-info => cryptography-46.0.3.dist-info}/METADATA (68%) rename venv/Lib/site-packages/{cryptography-44.0.3.dist-info => cryptography-46.0.3.dist-info}/RECORD (54%) create mode 100644 venv/Lib/site-packages/cryptography-46.0.3.dist-info/WHEEL rename venv/Lib/site-packages/{cryptography-44.0.3.dist-info => cryptography-46.0.3.dist-info}/licenses/LICENSE (100%) rename venv/Lib/site-packages/{cryptography-44.0.3.dist-info => cryptography-46.0.3.dist-info}/licenses/LICENSE.APACHE (100%) rename venv/Lib/site-packages/{cryptography-44.0.3.dist-info => cryptography-46.0.3.dist-info}/licenses/LICENSE.BSD (100%) create mode 100644 venv/Lib/site-packages/cryptography/hazmat/asn1/__init__.py create mode 100644 venv/Lib/site-packages/cryptography/hazmat/asn1/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/Lib/site-packages/cryptography/hazmat/asn1/__pycache__/asn1.cpython-312.pyc create mode 100644 venv/Lib/site-packages/cryptography/hazmat/asn1/asn1.py create mode 100644 venv/Lib/site-packages/cryptography/hazmat/bindings/_rust/declarative_asn1.pyi create mode 100644 venv/Lib/site-packages/darabonba_core-1.0.5.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/frozenlist-1.8.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/greenlet-3.3.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/idna-3.11.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/itsdangerous-2.2.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/jinja2-3.1.6.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/jmespath-1.0.1.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/markupsafe-3.0.3.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/multidict-6.7.0.dist-info/REQUESTED rename venv/Lib/site-packages/{pillow-12.1.0.dist-info => pillow-10.4.0.dist-info}/INSTALLER (100%) rename venv/Lib/site-packages/{pillow-12.1.0.dist-info/licenses => pillow-10.4.0.dist-info}/LICENSE (66%) rename venv/Lib/site-packages/{pillow-12.1.0.dist-info => pillow-10.4.0.dist-info}/METADATA (77%) create mode 100644 venv/Lib/site-packages/pillow-10.4.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pillow-10.4.0.dist-info/REQUESTED rename venv/Lib/site-packages/{pillow-12.1.0.dist-info => pillow-10.4.0.dist-info}/WHEEL (69%) rename venv/Lib/site-packages/{pillow-12.1.0.dist-info => pillow-10.4.0.dist-info}/top_level.txt (100%) rename venv/Lib/site-packages/{pillow-12.1.0.dist-info => pillow-10.4.0.dist-info}/zip-safe (100%) delete mode 100644 venv/Lib/site-packages/pillow-12.1.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/propcache-0.4.1.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/pycparser-2.23.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/pycryptodomex-3.23.0.dist-info/AUTHORS.rst create mode 100644 venv/Lib/site-packages/pycryptodomex-3.23.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pycryptodomex-3.23.0.dist-info/LICENSE.rst create mode 100644 venv/Lib/site-packages/pycryptodomex-3.23.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pycryptodomex-3.23.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pycryptodomex-3.23.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pycryptodomex-3.23.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/pyopenssl-25.3.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/pyopenssl-25.3.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/pyopenssl-25.3.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/pyopenssl-25.3.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/pyopenssl-25.3.0.dist-info/licenses/LICENSE create mode 100644 venv/Lib/site-packages/pyopenssl-25.3.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/python_alipay_sdk-3.4.0.dist-info/INSTALLER create mode 100644 venv/Lib/site-packages/python_alipay_sdk-3.4.0.dist-info/METADATA create mode 100644 venv/Lib/site-packages/python_alipay_sdk-3.4.0.dist-info/RECORD create mode 100644 venv/Lib/site-packages/python_alipay_sdk-3.4.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/python_alipay_sdk-3.4.0.dist-info/WHEEL create mode 100644 venv/Lib/site-packages/python_alipay_sdk-3.4.0.dist-info/licenses/LICENSE.txt create mode 100644 venv/Lib/site-packages/python_alipay_sdk-3.4.0.dist-info/top_level.txt create mode 100644 venv/Lib/site-packages/python_dateutil-2.9.0.post0.dist-info/REQUESTED delete mode 100644 venv/Lib/site-packages/rust/Cargo.toml delete mode 100644 venv/Lib/site-packages/rust/cryptography-cffi/Cargo.toml delete mode 100644 venv/Lib/site-packages/rust/cryptography-keepalive/Cargo.toml delete mode 100644 venv/Lib/site-packages/rust/cryptography-key-parsing/Cargo.toml delete mode 100644 venv/Lib/site-packages/rust/cryptography-openssl/Cargo.toml delete mode 100644 venv/Lib/site-packages/rust/cryptography-x509-verification/Cargo.toml delete mode 100644 venv/Lib/site-packages/rust/cryptography-x509/Cargo.toml create mode 100644 venv/Lib/site-packages/s3transfer-0.16.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/six-1.17.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/sqlalchemy-2.0.45.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/typing_extensions-4.15.0.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/tzdata-2025.3.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/tzlocal-5.3.1.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/urllib3-2.6.3.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/werkzeug-3.1.5.dist-info/REQUESTED create mode 100644 venv/Lib/site-packages/yarl-1.22.0.dist-info/REQUESTED diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc index a0c699c04f7b681eb281402bd4644b18e2251ac3..08608bcfc5d7188863a13683aa5427ece647bb54 100644 GIT binary patch delta 719 zcmZ8eO=uHA7@gVK-EOmHH^1GIrtKENnxv*4q+$)lLwgYfu^@E)scUw%Nj5)Bl0sqy zg^FH0ggNNJvryyBV=scdk0F&$j{cW8^t^DQ+Q;wD?WnJ>?-s1>!!mipr_Lc4Q8Ny+xl!g~@#?xhSmHaH-=C>4#ZQ8SHRT&W^p%f& z=3}qszwoC>K^TjRKpcL$@_6OhdPf*J;GmG|A|PtNSVf))m*o$s)S`|)>cV1@xWd_p z<_h;5vs%DxX+JKkkqOa^hVD9byMlA2S~dOeW9fSzh~wvVreulZ5ehEC_0oUI^rTF& sY}Flm0nbti`}XQJvLnW#`yjCg0((I2iU2CV`8ZS$GUQO4=2@(N0i0Q&r2qf` delta 495 zcmew*u#AuIG%qg~0}w3QkevCIc_N<#Is8%lU|JwbAcdoaAxe;m zAysfSNIeil38f0BaAs>TFcgWV3T0_dzQ`mj&XvNQ!n1~VH8VsFBSR&7CA%iy#5Zvg ze#sCq2+0PdK#D#yZ7yImV`P*BYIm4y&&;bR3saWDyqXchW@ISghKXj$P0nSO7X3><80*V#$0*MBOC;W0V zYA*BZT;R|t;-CDFC4f<2vOjCW6q&PYz>GoP2>@(i~)Tku-=90ur~Fi%Ro~_&{8K z5CL+@FAkgB{FKt1RJ$TAAQu!!#r~5OIHZJbGYH&f;Qq|Uz{vNBMVyiUqtRr44s{lg FP5?9sYS;h( diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc index 8db71630456ef8a5e87787fee5489a1ac6a165f3..281027acce6262d227c6920fffe0c59efbc36f29 100644 GIT binary patch delta 2645 zcmai0$;;%{5&ypNc(9Gf*fCB#_ShaLm|#TQYDul`9JEFbRXH8oQxAB`x;c44 z)f~kZx zz-5fDbEOfWvNNZ=+6Kd+td2-zE~C}qNCxwh+)IYVy9v<Shn z=@=ZBx|kknEzfIkA15L?M#k6jSf{?gJ#-?j?IxS8|Oe+^|^T243MVSiblvn(xvTj*)Y5-nR|Li zbWPZLxVTdwg~vmMJo8<>UJ@{&mZ3OfQYYbHQqKr$E!j-62)yNDqle(Y`Idq-nU?9C zU+jZ&wzAGspd_?HXpHuU;Na5Y!OpjcXkL^B>9skS_)BmL*SQb{M8ANx%zP-$ID4EW zqrLTfcUYubey4B-zxD#h9Q!U(3BaOt=nUyVi=uQzDzS#DvQ$aIr!h_7t;WVK8Lh=>678Lut>a*q z9Z0~nc6m}LmJ^Wc!d8$YZBR?7BB~MU_WRi82XCggt#X9=y_+nSL0~Rj!Z8&TUdZzv zXhuXgb9? zp$4VQtb$b^_H8+~N=;BU&t`-Z?$?#a8)*lC6K{ zVo}8~bC661`-080&IN;F-K%Uyk#xDWcz#G`G!GoTh_IRE%vqiM&CC=}f{W3t%XWf? zM%anLXeB4JXnK@oO|-#aOIMw6rPOm>)M(v`6vJF?O1{~lYLa0V5zXLw>=7rjW#o(x zP}&I>YsnZ$C7fE6B~Y~~&Iep%(jA=CC57%=ebI`sf;U#m0ab^(B4#1jlVsb0>jr`KZbWAhcS?7Lo;l`<2rUXLMx2F2ScQ|RuORjSyBELX z09bVV9cPP#?Ri z+A%dAiFW=;CiG;TIjeJ2s?c&J9Mk9=1}IOSAqs&lf8SK$I@vXB){=m6sSr(HqoUk$ zgTqh10fnuR?W|Tx>jy8~U=1aaUyDJ`AFjWGQ(FxeIN~c1g>%W*!IMm2$_kqx3@5@1 zKPeP;Mq`tY)#6Yu41ql!(7-!2z8?Tx4JhYxll7zkahpD(Hh?TvX@8u09m!9Y6Eoxh zS?<8{PIN#HHLISsf=-n}=eIhY)=3@Hdlt&HsGS;?^k*}(r;v!P!&VaDe5yYb+Gv^d zhj5W$dc~?Puf?dj6LwpqFg#);!J}^@47TR`xluR74yhU3t;T`fMrzl1I&G^9Es+Er zb0n1IL@6@BJ#LOjHIE}x)RDvBOK=Y6sE<}YE|?VrLBY~pILGY5v{i{t<1Catmer+k zP>e$tH*#XD$0Kk^3I|$mxKxUPgetb4RWOML`{4e#a*UKu8q3Vc!Dzf51l81ySxrSE zu_bI{QF2Mok(h$v|0(4E6lr|Vh?=H&IGe%nw1hw(oQLrt1kS-(;S8CdH?zub+A1I4 z`#)~^sfmN(@txHTN$gyi~lkMf#K4L$A_069N)#A&C-oI6S>r1&po=P`I=p_B) tx$kEuuRZ!dtd^5H4b4^kjfp*Z=KA{j&sWd?{r1D_`+s}>YT`GS{t2AIPBH)h delta 199 zcmbQKu#T7SG%qg~0}ymaq-8EwDcWQt^zRHc-r^kxahJ4{?`7GU59 zPhLeh#VRH}KR-PuH6}SfFD)}&ub{Gs1!x$UUAzHG86QyTz;WC)P} delta 34 ocmbQqI-8aIG%qg~0}!mtOkT*%#3k-x6_cKypPrLCS(vE}0FZ$R0ssI2 diff --git a/__pycache__/models.cpython-312.pyc b/__pycache__/models.cpython-312.pyc index 3a9b8a01f9d8408c3f4fa64d2b5dc55b473623bd..7e60e5ae6ed4868cb7690d70a27e8fee4ba89acb 100644 GIT binary patch delta 899 zcmYk4T})D87{||h5K!;{hjRe=(sVi{7bRv3yRZ*LEJw|{!8AO1&VriaUJh-zn!33L za}C|QCeAIfD;z9w+;nN(wQkzvg1Bhj*tFKxh23{vH0xaa_Pqc9^KqVY-VaxPcr~9W zN<~PI=kB90WmwiUkb2p6#{sD#i2;JQEfBmN{UV#>OuW(2RAgn>$XZ(H9p%Eor^TQg z&|tI388-kJFUlGYNg$w~mUcx*Y6wHfV*Ln0sKA)XJrX%}i$I2+unsh)V*rVkSd)&g z%>g`|Ab3T-E+<2qtXr$%)j9H?ik{JJQVC1pj1zrCi?&%i^0O>ef7*e{YtTEo1%1_- z(Uz`G_174o5!YY^t*Du00E6ZYY<*sH+R1QY(gv&2ND_klu@eC^qtsU83pk!7c^yyZ z^*Pz`TjiP4YIB@*7%KAHkQZRAUa}9~zS)2I>RWbW|Mg-;5y5)&9>ibx@Tvqaq$R>p zj4la>*nuvL^Aak`JNUXf}4!QrbOt&sv;_KVk}yzJ*~Kj zD{3%qVGQ9c5MOR)LVRE>jL&8LJd6RkwpVyAaOnAOZt8j IIIed312WS1mH+?% delta 161 zcmaFucF3CVG%qg~0}vFkrDk3hoX97^^nz)l#tSBvN*PVr&34R=OkBb#Rx#=M`RO^S zo7-6#1sOFrcZw}!WQ^aeE%B0xF=eu-v^rZl$cXgGPSPjYK}6`ni$@~(H+k6rJ2y|(ue&&Jc*apE?0a2u;hlVB3nN!mmaNyBF3ncC~_ z!@VXu0Sa2h~re*ov) zaqQj1LX5QE+%xyw^Z3rW_wI`azNYwp$Uo^HIv_xB)?jFo>(7M?~}rLYq>npK`v)WwVlRQ>@;!BpYWBJVPy#AZ;NOsCB__KKE0F6;~+P4 z`8!;G6XXb&-xJYMWI5orRUEZ&%}yIy9a%&a0>{+f4V?Y*8Dh85XifiIer(H@Qs5 zZmMduJZ7IK8=63kh7iIC&3qLN!pkJoB;z{PFdmP88rAwAQZnhsSkW0L?d9(|du^nN z{mR`DUS9pOSZRsbJ$Khf(5M5!(qg+kva$I9j=hrwLlc8^aT^8Tlib?$ob=RazD%bao%_ZWg92Yw4)D; z!lm9=;!uGENAebjTfp^h`00-W92frK6ug0F*u`Lx^p@8&?Gl|lukFkT-&4z7BDq|?I!kKG~6TGDOcf4?La-E>ev&|rc3qYT&S60L#KPo8=J$n z68Dz?rGM4|{Oy(37JmNS58gPjaPic_>6dt8Sw=q#vvd&Qa|qZZbSJ<*9ubvbSo8vX z@QWY7+7F+eSop@YTwl?W71`ig-X%`K4?}E6DkE%%JeoIQidI`LG3&yJ(;1cSftec{ z&mz~_A~;X?Gr9F6ps}G%C01I?K`lIe_UhF0R!|g^r4J(TvU@6Gw8+LO9_>o8@5FDo zQ>=fS!o`nuM&jHZn$5GhM@lyrJa{x|1DFgxB$U4WaSF z2-qH#wMFp|!b1o<*$)%R2;ZCy*x31kk$E^XtQdR`Ddj5(L%g%Ps8^3a`_c3ZHx;$Q zBADF=+u^Gn$x;ek@Z4*0#3Ng(6o@N@s$N}HtQsB>R_h3usIFE6KhP>erWzf zSW3DGguN?eD=XLtGgc0_)^Ql-Zmr`=@c&mGkARV?BO{<{0X!V5*rg-v_iLZLqZgEq zxq1qCRp_QKr{t9pEv+Bb4K0V!EI$n}!h_)YU92avhW#aWg8Z1}<2&FoU}xf?ZDV+u z-1Ov$DjIm<@aJ(dhUe@}&y70{W?R^ix+c=fu^o~9HXdXr+yTF8t58d_L_@$4g#}4= z%$*9YOoBi7k8;{QDSq>HHc{7BatxVHE43na|A(i~LF*iAkUrln<+>#`E)Die_xDQ= z%5KU#+FK|ZX@e>%a%Fn(2u$;{+jJ_qLNRZc&hbJfZ|J5|Hx#3&n>9DIdAFOcaV4Xs z6+>>MaD0@OdhUPkhDRVWdM^TA0H)*NY(X(-4nO1(3JBu}UqE;i0Pcn{c$uV7RcH@x zAuC^MzL_KcU-P*oUf^03<|-Pe>HgmQ5eY8imnQ7^{wEn)? zmTmJ}@B5|vjy&<`$)l4;=fd(#SiW@I=6Aybm-gla-EwZSO~$a&t+6Kt9?6+*#uIn~IOd)h#vxCU}{ui@ssMr7i delta 2190 zcma)7ZD?Cn7{2G`vq{tMHc3B7T9Y+#>(<&?-7Iy&oU6_`N?D;!(yaHki>ApqH<=6u zEo?2FFl={lA2K&5jyl?nVL*nU`>7}ciwNV2%pc3Tf}n!^GZ1{=_a=8)w;vYz+;iXa zemv)S-*Yn)Ul^+R(c^JR@Hg#H6VLnRD}1tUnUC~En50OGHCaC48TK$qmQ<$L)C$GE zX^~)=BGx_;*JSc8^wy==+*V8oFifP&aqHb=*br`{k zKxH@JipmlJJHEC9=ypX-su`7UgqNtyH{r%+01bN?400mnHk=GvTVVs;v@-xx(m!^o zyjGm8m}6ZcQu%8i>c*b|h}wA>uBkp9v*hf!FY_(9-vnS*6R%X&v!2{g)kXFW9$dE_ zK9o+WL@Daz4h&eAkovYAH;^|S5>ju&V3su#<7?Ttnu%pKm212=H&F8jYwN&>5J0vD z;K9P_2PePG&(5q)pSnLgm;c}rXgpHaI{AdKk9d%I|<5)uBB;{jj8}|$M`Jgz~yaK{1EebP^6@r{u zB$c22boKn_#Tmd#0|+z+t`d%h{J2GI?YP2g#k&!Zk}(2>i$!#vcCi#26522J1daot zp8`Ly2Gm)%WfGaBsyjy0sf?P+@P2Wl)w`Mc^(H1ifUp-~UAKqP_BKMlSZi(b(>1Qf z`A?-YiLu0JJd;SLG(M8+Y|F@7A8+dF)W<8AuB>ZnNk&LJ$V1{zsBJQgCFtyKToJQE zr{I;Ophi6&ZG3GC&2kbW>{bj?6u+{@-KeIoVJT&dVYR-PU>bWz7;M2;$aKc diff --git a/blueprints/__pycache__/auth.cpython-312.pyc b/blueprints/__pycache__/auth.cpython-312.pyc index 2a5fea6095a9867aae4ffa903ef65a90de1deba3..321c4d0adfd506dd44429076dfad85492ad081b2 100644 GIT binary patch delta 33 ncmbOdJ1LgyG%qg~0}w?0*~s;mg+nUUDkd>AzHGA~YqKT*s__aP delta 35 pcmbOfJ0+IuG%qg~0}v#IZ{+&R!X=Yp6_cKypPrMtnV+>;69Bbz3SR&K diff --git a/blueprints/__pycache__/payment.cpython-312.pyc b/blueprints/__pycache__/payment.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90581d1a46eda213ae078335a2206666d9ab5b85 GIT binary patch literal 5070 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 literal 0 HcmV?d00001 diff --git a/blueprints/admin.py b/blueprints/admin.py index 0e513a3..7e0cc41 100644 --- a/blueprints/admin.py +++ b/blueprints/admin.py @@ -1,6 +1,6 @@ from flask import Blueprint, request, jsonify from extensions import db -from models import User, Role, Permission, SystemDict, SystemNotification +from models import User, Role, Permission, SystemDict, SystemNotification, Order from middlewares.auth import permission_required admin_bp = Blueprint('admin', __name__, url_prefix='/api/admin') @@ -187,4 +187,23 @@ def delete_notification(): db.session.delete(n) db.session.commit() return jsonify({"message": "通知删除成功"}) - return jsonify({"error": "通知不存在"}), 404 \ No newline at end of file + return jsonify({"error": "通知不存在"}), 404 + +# --- 订单管理 --- +@admin_bp.route('/orders', methods=['GET']) +@permission_required('manage_system') # 仅限超级管理员 +def get_orders(): + orders = Order.query.order_by(Order.created_at.desc()).all() + return jsonify({ + "orders": [{ + "id": o.id, + "out_trade_no": o.out_trade_no, + "user_phone": o.user.phone if o.user else "未知", + "amount": float(o.amount), + "points": o.points, + "status": o.status, + "trade_no": o.trade_no, + "created_at": o.created_at.strftime('%Y-%m-%d %H:%M:%S'), + "paid_at": o.paid_at.strftime('%Y-%m-%d %H:%M:%S') if o.paid_at else None + } for o in orders] + }) \ No newline at end of file diff --git a/blueprints/payment.py b/blueprints/payment.py new file mode 100644 index 0000000..54a14c7 --- /dev/null +++ b/blueprints/payment.py @@ -0,0 +1,111 @@ +from flask import Blueprint, request, redirect, url_for, session, jsonify, render_template +from extensions import db +from models import Order, User +from services.alipay_service import AlipayService +import uuid +from datetime import datetime + +payment_bp = Blueprint('payment', __name__, url_prefix='/payment') + +# 积分价格配置 +POINTS_PACKAGES = { + '50': {'points': 50, 'amount': 5.00}, + '200': {'points': 200, 'amount': 20.00}, + '1000': {'points': 1000, 'amount': 100.00}, + '5000': {'points': 5000, 'amount': 500.00}, +} + +@payment_bp.route('/create', methods=['POST']) +def create_payment(): + if 'user_id' not in session: + return jsonify({'code': 401, 'msg': '请先登录'}), 401 + + package_id = request.form.get('package_id') + if package_id not in POINTS_PACKAGES: + return jsonify({'code': 400, 'msg': '无效的套餐'}), 400 + + package = POINTS_PACKAGES[package_id] + user_id = session['user_id'] + + # 生成唯一订单号 (时间戳 + 随机位) + out_trade_no = datetime.now().strftime('%Y%m%d%H%M%S') + str(uuid.uuid4().hex[:6]) + + # 创建订单记录 + try: + order = Order( + out_trade_no=out_trade_no, + user_id=user_id, + amount=package['amount'], + points=package['points'], + status='PENDING' + ) + db.session.add(order) + db.session.commit() + except Exception as e: + db.session.rollback() + return f"订单创建失败: {str(e)}", 500 + + # 获取支付链接 + try: + alipay_service = AlipayService() + pay_url = alipay_service.create_order_url( + out_trade_no=out_trade_no, + total_amount=package['amount'], + subject=f"购买{package['points']}积分" + ) + return redirect(pay_url) + except Exception as e: + return f"支付链接生成失败: {str(e)}", 500 + +@payment_bp.route('/return') +def payment_return(): + """支付成功后的同步跳转页面""" + data = request.args.to_dict() + signature = data.pop("sign", None) + + if not signature: + return "参数错误", 400 + + alipay_service = AlipayService() + success = alipay_service.verify_notify(data, signature) + + out_trade_no = data.get('out_trade_no') + order = Order.query.filter_by(out_trade_no=out_trade_no).first() + + if success: + # 同步通知仅用于页面展示,实际业务逻辑在异步通知 notify 中处理 + return render_template('buy.html', success=True, order=order) + else: + return "支付验证失败", 400 + +@payment_bp.route('/notify', methods=['POST']) +def payment_notify(): + """支付宝异步通知""" + data = request.form.to_dict() + signature = data.pop("sign", None) + + if not signature: + return "fail" + + alipay_service = AlipayService() + success = alipay_service.verify_notify(data, signature) + + if success and data.get('trade_status') in ['TRADE_SUCCESS', 'TRADE_FINISHED']: + out_trade_no = data.get('out_trade_no') + trade_no = data.get('trade_no') + + order = Order.query.filter_by(out_trade_no=out_trade_no).first() + if order and order.status == 'PENDING': + order.status = 'PAID' + order.trade_no = trade_no + order.paid_at = datetime.utcnow() + + # 给用户加积分 + user = User.query.get(order.user_id) + if user: + user.points += order.points + + db.session.commit() + return "success" + + return "fail" diff --git a/config.py b/config.py index e469929..4215064 100644 --- a/config.py +++ b/config.py @@ -44,6 +44,18 @@ class Config: SMS_TEMPLATE_CODE = "100001" SMS_NEED_PARAM = False # 该模板需要参数,如使用系统赠送模板请改为 False + # 支付宝配置 (待填) + ALIPAY_APP_ID = "2021006126656681" # 支付宝 AppID + ALIPAY_APP_PRIVATE_KEY = """-----BEGIN RSA PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCJSgmesQisfxNdz5dUhdv3Anh6aOGyQ03t69cqnenFumyEiLFk1N9FBDRR6onUsW9ZUGf7+P1sn/TMHdoOQZzZsxYVCCj85820ORP/DHTyP0ONHfBj0GqnKig5o3OGosC9ieJT6QLBzycOmiv/3YcHSJQPQ3zlyUloPScD1UsslgpCFWF3c3UDstzhYy/i1LbNy63w+Hr/xj01f1JCzivJoir9erLpTbbjPcPbQXd9xpycwIyGufXbFh1kOE6q+WOZq6NAXCe0/leUwh+q5v0pTnWnY07iB9nQtL2qvXQIBZWGI6HV4NDnO6rblDf1oOwNWYKcjCtL045xcHfUWKlrAgMBAAECggEAO4qfp3JyJ5WpSYtJv3+aiYNJyxUHpW9pMeGR3MrF41pZzBUYknl8J4uOQWStyE/30c18e5xeFKk+2vOraXltVEFGN3Lli+HgpeQHVxsI8TMc0ewFINT4HG29KlpINUEKxGkzfl7VMkbsUnns0Tg7Yp5IkGIdne7xZkL3U8NCqh/0oHAczMTwV1gqOFetyENNhdqzZJgwjR5c2OIIsNAuq+s0CcIqIw6hSwKzYN3H2i+4UKXmgU9kB2pGIzyxOH41FbEZp/UAcv9m2ikK2oYSXIHozaEsYyUXZbvHn4vmz1+grwnMJy2UQZQUCOLjvkul7tGKcNXTFSCvtgudBMSQ2QKBgQDxKvs97C3CRqgM/GkajI3DVmCY9NZGj5fd75JVg0yIeYQ4tmUmVIepTfq/8YxmgUD284FAFeyfbcFMbZnP4MXQ5Ddun0je70P3snLhfCw52PG1ypxBHl/jzZPdecy5kPKSQIWK9dfaXzwvhRC+YFV2x2V+tcubfeGgZkJ4+79KPQKBgQCRu483SbkjIbKTlJVL1m8a8RtljEg0AxnGIOQQvpkNHWRRHEqE3ozkj3PUHicDh9MumyZSRm9ifSmbD+cYSnjpQYafD9pZQ4lFWE72rCrz2vTTiZKyd/VuuQl2wTcj57ffX7cCaXQ635O1w+tz4VXnZzFnN0Lx3KDQ76bpPEEExwKBgHpRqoyFtc/LtoCfpU9p6p0gum3aALRZMFXIpRfqOG8f8wgwuqzuQsCEZKHmCagT9rdKWkv+0r0qFdiF3nWpM6v3lIXvFC6+fGKth8cGDAhrGG10DjyZA1mvc0fp9wRHmEDFqPYKKyj/FK+ldhCZG7/a8oeJ/XMoLcAFHcHvLd6hAoGAFQnDmhKthHHX6tA3YVRag8Qs1VMUFVYhQWX8JqKtS6RjmAYCh/3szw4ahZO4xBy2kvLY7GW4rLou6HC6RtpxbBMGkS3jsqE6TuV5uMiQBtYkI+mnYNZKeyqBQECSaj+IXtndfJ6mpd0i4Mmg0wDDuv09t43Vvz6/hIokSWVmaX8CgYEApzBH2M3R3j/jz2Hb3cevI+3MaeSIZMCedj2oTI2VB+6cOfuCW+65uuj7VuZkjEWzHMt3jVWPBtjyp002D3unYfIiaFaXUK4hSeoOCVj9ma8xhqR278Llkhxgf6KDx2E43YeTtrg9jStHmuD+Wr4UV96MOuIyaKqOFQHs4P/sQqY= +-----END RSA PRIVATE KEY-----""" # 应用私钥 + ALIPAY_PUBLIC_KEY = """-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx6iXKiRpbs5WLHlb6fdoteef+vs+QxxtmwDL2IJwhEJ+OMrkwlKyd4noYaiGDy2YcyHKahb4bsHRoPLVEqLveuVFksjsiFTH2mUhuwuqDe//XwE4hHsguNL3nY72gZ6qjwbg5mAVrHRcKUi6XSLSP4pWdCzD0leZ4GA9Kw1WstCS4sGBcrzyHPhRvtdVFZR5UjNLVAaN6HIMNhW0TBXz4r1ihXMV4byeN3n0n6e6reBLXr222f7c5almGurq6D9pLqwAmsqWbQWbvitOjZRll+bjpa29JIkNi+jEpPdYpGjU3e0Tl8aWkKjtYXmDyWtdw00RkciHUR4hMuCZW5qIjwIDAQAB +-----END PUBLIC KEY-----""" # 支付宝公钥 + ALIPAY_RETURN_URL = "http://331002.xyz:2010/payment/return" # 支付成功跳转地址 + ALIPAY_NOTIFY_URL = "http://331002.xyz:2010/payment/notify" # 支付异步通知地址 + ALIPAY_DEBUG = False # 是否使用沙箱环境 + # 开发模式配置 DEV_MODE = False # True=开发模式(固定验证码),False=生产模式(真实短信) DEV_SMS_CODE = "888888" # 开发模式下的固定验证码 diff --git a/logs/system.log b/logs/system.log index d62d3d0..d2cb7ed 100644 --- a/logs/system.log +++ b/logs/system.log @@ -128,3 +128,5 @@ [2026-01-13 23:52:22] INFO - 用户生成图片成功 [2026-01-13 23:59:01] INFO - 用户登录尝试 [2026-01-13 23:59:02] INFO - 用户登录成功 +[2026-01-14 16:45:23] INFO - 用户登录尝试 +[2026-01-14 16:45:23] INFO - 用户登录成功 diff --git a/middlewares/__pycache__/auth.cpython-312.pyc b/middlewares/__pycache__/auth.cpython-312.pyc index 60baaeb0da834b0a84070443d24b05dfd9616121..9e517009288c239f7e709e43f4576d4ef9fb2086 100644 GIT binary patch delta 34 ocmca3dP|i1G%qg~0}vdYnYxjC4-9ZVmvz%?i5! diff --git a/models.py b/models.py index 3315eb9..05993fc 100644 --- a/models.py +++ b/models.py @@ -101,3 +101,19 @@ class SystemNotification(db.Model): # 哪些用户已读 read_by_users = db.relationship('User', secondary=notification_reads, backref=db.backref('read_notifications', lazy='dynamic')) + +class Order(db.Model): + """订单模型""" + __tablename__ = 'orders' + + id = db.Column(db.Integer, primary_key=True) + out_trade_no = db.Column(db.String(64), unique=True, nullable=False) # 系统订单号 + user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) + amount = db.Column(db.Numeric(10, 2), nullable=False) # 金额 + points = db.Column(db.Integer, nullable=False) # 购买的积分 + status = db.Column(db.String(20), default='PENDING') # PENDING, PAID, CANCELLED + trade_no = db.Column(db.String(64)) # 支付宝交易号 + created_at = db.Column(db.DateTime, default=datetime.utcnow) + paid_at = db.Column(db.DateTime) + + user = db.relationship('User', backref=db.backref('orders', lazy='dynamic', order_by='Order.created_at.desc()')) diff --git a/requirements.txt b/requirements.txt index c0ada964b02ae3d4d8cb14a55eaedf8356aa59cc..5af9243e613141d8cbdb0197d01ac7c818c37752 100644 GIT binary patch delta 32 ncmeAX+$6Z+0h@3lLk>eGLjgk~LnVVQLoq`NL-yvgZ2K7jn{f$0 delta 12 Tcmdla*dw^%0o!Ia_BD(EANd4i diff --git a/services/__pycache__/alipay_service.cpython-312.pyc b/services/__pycache__/alipay_service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9519a14ebc9a343222d0575b28fba90a05c85ec7 GIT binary patch literal 2773 zcmbtWTTdHD6rS~7Yz%};V}o%nEs$?I%`M3nLz>)s301pd=y1|OVBb(`)J*# zgN%={pwmcTrjWqSS&WrFHb#56Wzz9b8rL3_difZ5rT(Zaiy;;Bkw}l`B4M$8OzeexV(3wwqyP;(|;9ASc_w+-M}3UG4!x{-Y70-Sul8_0(#zyaPj{9SAT zj`e@waDp|b8rW%D4k?B_wjN-(yQ{bT9B%LJ#a$hmv!L7C*Y!?&e6Q8|R8a!|8}!m2bJ(|uMDhoXVIl*TAxa9AN~ zs(-#yY#ZbyJT|BpqE!ZYUBlSydm}N;hOrcqRE)=+MFRKc;)FKkI+#hc;M|dR?oB%P zrkyQGXUiR&a=w{hE|xC1_oUseNq1}7eIV&RFn{o^l>1DA`Q28#P}h*IYf09%r0e!4 z>-Ntd=t$Ld!jg&&3^?l3j>e>;G3{thI-2kF{MeClv?rKL_BBWj6&*-ItbQO9;J|^* zAJ#Z})sci~{;&`%qd_z;*<1`Eh~{Op9u+8v>m_bIM!b8LITPb7^3c(35PEj`;o_Cg zmaaW``qS*<{hN#Tzg|i_%+5Vny#K}1M;~iU-`VzqP;OXI0tjIf5kvvcPSP(B2Ub*B z3I()Uli78t{$&drac{qM{QB|CuEzAPL&;r-G7X+@@K-qF z+(ITaO*j2jZmqPhAZv+Tu7kDyLQ2S)H!3VRGlYaZr4TUNocWw!;><|CisnXvI!evg zviN$Xr2h-i_oz7&V}gA(<+4SvgeZZY;Nsj3xT)go4Rn(R`q^kB}-_2tX@S!zv%d{Af5DQZ=g*9U2k+ zs{9&2>NJiYdRJ8=O547D;fNUGBT}ovhlHW<2VNoQHRuz>F|R*7x-S5Q<$XTp6~f~U zFDx==zA)`MbsS`~6JDjc06C`yBew`25HVbg8Vyoh&&Lp(Rjwfk?k1*zm^}o9GxC8i zlm$`F3Ds)mr4X{~jb=!&(l3jo7#h=|^o?&TR^W@{EY<6dA+%p%ZFPM*&QdE0n4RN*hMA=Fu>ZW?B-`aj@ zOIDv=L1>UVX-QZ!)vl|q*&Vapv&ZHun&xdyhGYvxN93zZ_7ph(Dp@*Czgn^&RP#>+ zNQjD(bGrQP#b*ybT%P3mq$|-t@E~4eK&eMR&u+9 z_)!sK&5rSCScnFRUxx8}Q9fvl$b>9CeYur*2f^G$I)a{|ObV!O$iY*Ho~F>Mg=0@p ztCc0JebrgUHm_}=S+B8%Ob4}+Pt_}(#tsL0<-Bp(TEdEf_c|FSWk!F;bK4t6a>wMO h5F@okA;oWnrYPzOay>y?AET1LnFh+cioobA{{fe~gHr$i literal 0 HcmV?d00001 diff --git a/services/__pycache__/logger.cpython-312.pyc b/services/__pycache__/logger.cpython-312.pyc index 7268fff8728a0c41ac111e24a0ed6e6a6b7ead17..e522000a64bd49c0f1083d2e9a25f3a71ac09777 100644 GIT binary patch delta 34 ocmbOvKS7@RG%qg~0}vdYnYxkt6f1{Rs#Q#4W_;P^`>dNe0jMnsxBvhE delta 36 qcmbOrKS`eZG%qg~0}!15ld_Tf6f2iZid9T{etvpR>gKzwn>hi + {% if success %} +
+
+ +
+
+

支付成功!

+

您的订单 #{{ order.out_trade_no if order else '' }} 已完成,积分已到账。

+
+
+ {% endif %} +
-
+
体验测试
@@ -30,9 +42,12 @@ 快速开启 AI 体验
- +
+ + +
@@ -49,9 +64,12 @@ 满足日常生成需求
- +
+ + +
@@ -67,9 +85,12 @@ 创作自由,无需等待 - +
+ + +
@@ -85,22 +106,12 @@ 至尊权限,顶级服务 - - - - - -
-
-
- -
-
-

官方充值通道接入中

-

Coming Soon · 敬请期待

-
+
+ + +
@@ -118,9 +129,6 @@ {% block scripts %} {% endblock %} \ No newline at end of file diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/AES.py b/venv/Lib/site-packages/Cryptodome/Cipher/AES.py new file mode 100644 index 0000000..42f4bab --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/AES.py @@ -0,0 +1,235 @@ +# -*- 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`) +MODE_KW = 13 #: Key Wrap (:ref:`kw_mode`) +MODE_KWP = 14 #: Key Wrap with Padding (:ref:`kwp_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/venv/Lib/site-packages/Cryptodome/Cipher/AES.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/AES.pyi new file mode 100644 index 0000000..3f07b65 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/AES.pyi @@ -0,0 +1,156 @@ +from typing import Dict, Optional, Tuple, Union, overload +from typing_extensions import Literal + +Buffer=bytes|bytearray|memoryview + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_ccm import CcmMode +from Cryptodome.Cipher._mode_eax import EaxMode +from Cryptodome.Cipher._mode_gcm import GcmMode +from Cryptodome.Cipher._mode_siv import SivMode +from Cryptodome.Cipher._mode_ocb import OcbMode + +MODE_ECB: Literal[1] +MODE_CBC: Literal[2] +MODE_CFB: Literal[3] +MODE_OFB: Literal[5] +MODE_CTR: Literal[6] +MODE_OPENPGP: Literal[7] +MODE_CCM: Literal[8] +MODE_EAX: Literal[9] +MODE_SIV: Literal[10] +MODE_GCM: Literal[11] +MODE_OCB: Literal[12] + +# MODE_ECB +@overload +def new(key: Buffer, + mode: Literal[1], + use_aesni : bool = ...) -> \ + EcbMode: ... + +# MODE_CBC +@overload +def new(key: Buffer, + mode: Literal[2], + iv : Optional[Buffer] = ..., + use_aesni : bool = ...) -> \ + CbcMode: ... + +@overload +def new(key: Buffer, + mode: Literal[2], + IV : Optional[Buffer] = ..., + use_aesni : bool = ...) -> \ + CbcMode: ... + +# MODE_CFB +@overload +def new(key: Buffer, + mode: Literal[3], + iv : Optional[Buffer] = ..., + segment_size : int = ..., + use_aesni : bool = ...) -> \ + CfbMode: ... + +@overload +def new(key: Buffer, + mode: Literal[3], + IV : Optional[Buffer] = ..., + segment_size : int = ..., + use_aesni : bool = ...) -> \ + CfbMode: ... + +# MODE_OFB +@overload +def new(key: Buffer, + mode: Literal[5], + iv : Optional[Buffer] = ..., + use_aesni : bool = ...) -> \ + OfbMode: ... + +@overload +def new(key: Buffer, + mode: Literal[5], + IV : Optional[Buffer] = ..., + use_aesni : bool = ...) -> \ + OfbMode: ... + +# MODE_CTR +@overload +def new(key: Buffer, + mode: Literal[6], + nonce : Optional[Buffer] = ..., + initial_value : Union[int, Buffer] = ..., + counter : Dict = ..., + use_aesni : bool = ...) -> \ + CtrMode: ... + +# MODE_OPENPGP +@overload +def new(key: Buffer, + mode: Literal[7], + iv : Optional[Buffer] = ..., + use_aesni : bool = ...) -> \ + OpenPgpMode: ... + +@overload +def new(key: Buffer, + mode: Literal[7], + IV : Optional[Buffer] = ..., + use_aesni : bool = ...) -> \ + OpenPgpMode: ... + +# MODE_CCM +@overload +def new(key: Buffer, + mode: Literal[8], + nonce : Optional[Buffer] = ..., + mac_len : int = ..., + assoc_len : int = ..., + use_aesni : bool = ...) -> \ + CcmMode: ... + +# MODE_EAX +@overload +def new(key: Buffer, + mode: Literal[9], + nonce : Optional[Buffer] = ..., + mac_len : int = ..., + use_aesni : bool = ...) -> \ + EaxMode: ... + +# MODE_GCM +@overload +def new(key: Buffer, + mode: Literal[10], + nonce : Optional[Buffer] = ..., + use_aesni : bool = ...) -> \ + SivMode: ... + +# MODE_SIV +@overload +def new(key: Buffer, + mode: Literal[11], + nonce : Optional[Buffer] = ..., + mac_len : int = ..., + use_aesni : bool = ...) -> \ + GcmMode: ... + +# MODE_OCB +@overload +def new(key: Buffer, + mode: Literal[12], + nonce : Optional[Buffer] = ..., + mac_len : int = ..., + use_aesni : bool = ...) -> \ + OcbMode: ... + + +block_size: int +key_size: Tuple[int, int, int] diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/ARC2.py b/venv/Lib/site-packages/Cryptodome/Cipher/ARC2.py new file mode 100644 index 0000000..4dc1bb8 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/ARC2.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/ARC2.pyi new file mode 100644 index 0000000..a122a52 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/ARC2.pyi @@ -0,0 +1,35 @@ +from typing import Union, Dict, Iterable, Optional + +Buffer = bytes|bytearray|memoryview + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +ARC2Mode = int + +MODE_ECB: ARC2Mode +MODE_CBC: ARC2Mode +MODE_CFB: ARC2Mode +MODE_OFB: ARC2Mode +MODE_CTR: ARC2Mode +MODE_OPENPGP: ARC2Mode +MODE_EAX: ARC2Mode + +def new(key: Buffer, + mode: ARC2Mode, + iv : Optional[Buffer] = ..., + IV : Optional[Buffer] = ..., + nonce : Optional[Buffer] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, Buffer] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: Iterable[int] diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/ARC4.py b/venv/Lib/site-packages/Cryptodome/Cipher/ARC4.py new file mode 100644 index 0000000..543a323 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/ARC4.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/ARC4.pyi new file mode 100644 index 0000000..b081585 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/ARC4.pyi @@ -0,0 +1,16 @@ +from typing import Any, Union, Iterable + +Buffer = bytes|bytearray|memoryview + +class ARC4Cipher: + block_size: int + key_size: int + + def __init__(self, key: Buffer, *args: Any, **kwargs: Any) -> None: ... + def encrypt(self, plaintext: Buffer) -> bytes: ... + def decrypt(self, ciphertext: Buffer) -> bytes: ... + +def new(key: Buffer, drop : int = ...) -> ARC4Cipher: ... + +block_size: int +key_size: Iterable[int] diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/Blowfish.py b/venv/Lib/site-packages/Cryptodome/Cipher/Blowfish.py new file mode 100644 index 0000000..536cbc8 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/Blowfish.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/Blowfish.pyi new file mode 100644 index 0000000..b8b21c6 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/Blowfish.pyi @@ -0,0 +1,35 @@ +from typing import Union, Dict, Iterable, Optional + +Buffer = bytes|bytearray|memoryview + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +BlowfishMode = int + +MODE_ECB: BlowfishMode +MODE_CBC: BlowfishMode +MODE_CFB: BlowfishMode +MODE_OFB: BlowfishMode +MODE_CTR: BlowfishMode +MODE_OPENPGP: BlowfishMode +MODE_EAX: BlowfishMode + +def new(key: Buffer, + mode: BlowfishMode, + iv : Optional[Buffer] = ..., + IV : Optional[Buffer] = ..., + nonce : Optional[Buffer] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, Buffer] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: Iterable[int] diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/CAST.py b/venv/Lib/site-packages/Cryptodome/Cipher/CAST.py new file mode 100644 index 0000000..84eb88e --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/CAST.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/CAST.pyi new file mode 100644 index 0000000..be01f09 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/CAST.pyi @@ -0,0 +1,35 @@ +from typing import Union, Dict, Iterable, Optional + +Buffer = bytes|bytearray|memoryview + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +CASTMode = int + +MODE_ECB: CASTMode +MODE_CBC: CASTMode +MODE_CFB: CASTMode +MODE_OFB: CASTMode +MODE_CTR: CASTMode +MODE_OPENPGP: CASTMode +MODE_EAX: CASTMode + +def new(key: Buffer, + mode: CASTMode, + iv : Optional[Buffer] = ..., + IV : Optional[Buffer] = ..., + nonce : Optional[Buffer] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, Buffer] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size : Iterable[int] diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20.py b/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20.py new file mode 100644 index 0000000..b2759b9 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20.py @@ -0,0 +1,291 @@ +# =================================================================== +# +# 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. + + If you want to seek to a certain block, + use ``seek(block_number * 64)``. + + Args: + position (integer): + The absolute position within the key stream, in bytes. + """ + + block_number, offset = divmod(position, 64) + block_low = block_number & 0xFFFFFFFF + block_high = block_number >> 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/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20.pyi new file mode 100644 index 0000000..f5001cd --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20.pyi @@ -0,0 +1,25 @@ +from typing import Union, overload, Optional + +Buffer = bytes|bytearray|memoryview + +def _HChaCha20(key: Buffer, nonce: Buffer) -> bytearray: ... + +class ChaCha20Cipher: + block_size: int + nonce: bytes + + def __init__(self, key: Buffer, nonce: Buffer) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + def seek(self, position: int) -> None: ... + +def new(key: Buffer, nonce: Optional[Buffer] = ...) -> ChaCha20Cipher: ... + +block_size: int +key_size: int diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py b/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py new file mode 100644 index 0000000..6a89e2a --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.py @@ -0,0 +1,334 @@ +# =================================================================== +# +# 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) + + 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/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi new file mode 100644 index 0000000..109e805 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/ChaCha20_Poly1305.pyi @@ -0,0 +1,28 @@ +from typing import Union, Tuple, overload, Optional + +Buffer = bytes|bytearray|memoryview + +class ChaCha20Poly1305Cipher: + nonce: bytes + + def __init__(self, key: Buffer, nonce: Buffer) -> None: ... + def update(self, data: Buffer) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + def digest(self) -> bytes: ... + def hexdigest(self) -> str: ... + def verify(self, received_mac_tag: Buffer) -> None: ... + def hexverify(self, received_mac_tag: str) -> None: ... + def encrypt_and_digest(self, plaintext: Buffer) -> Tuple[bytes, bytes]: ... + def decrypt_and_verify(self, ciphertext: Buffer, received_mac_tag: Buffer) -> bytes: ... + +def new(key: Buffer, nonce: Optional[Buffer] = ...) -> ChaCha20Poly1305Cipher: ... + +block_size: int +key_size: int diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/DES.py b/venv/Lib/site-packages/Cryptodome/Cipher/DES.py new file mode 100644 index 0000000..026b491 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/DES.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/DES.pyi new file mode 100644 index 0000000..25a3b23 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/DES.pyi @@ -0,0 +1,35 @@ +from typing import Union, Dict, Iterable, Optional + +Buffer = bytes|bytearray|memoryview + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +DESMode = int + +MODE_ECB: DESMode +MODE_CBC: DESMode +MODE_CFB: DESMode +MODE_OFB: DESMode +MODE_CTR: DESMode +MODE_OPENPGP: DESMode +MODE_EAX: DESMode + +def new(key: Buffer, + mode: DESMode, + iv : Optional[Buffer] = ..., + IV : Optional[Buffer] = ..., + nonce : Optional[Buffer] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, Buffer] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: int diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/DES3.py b/venv/Lib/site-packages/Cryptodome/Cipher/DES3.py new file mode 100644 index 0000000..3b2828e --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/DES3.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/DES3.pyi new file mode 100644 index 0000000..2c150f8 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/DES3.pyi @@ -0,0 +1,37 @@ +from typing import Union, Dict, Tuple, Optional + +Buffer = bytes|bytearray|memoryview + +from Cryptodome.Cipher._mode_ecb import EcbMode +from Cryptodome.Cipher._mode_cbc import CbcMode +from Cryptodome.Cipher._mode_cfb import CfbMode +from Cryptodome.Cipher._mode_ofb import OfbMode +from Cryptodome.Cipher._mode_ctr import CtrMode +from Cryptodome.Cipher._mode_openpgp import OpenPgpMode +from Cryptodome.Cipher._mode_eax import EaxMode + +def adjust_key_parity(key_in: bytes) -> bytes: ... + +DES3Mode = int + +MODE_ECB: DES3Mode +MODE_CBC: DES3Mode +MODE_CFB: DES3Mode +MODE_OFB: DES3Mode +MODE_CTR: DES3Mode +MODE_OPENPGP: DES3Mode +MODE_EAX: DES3Mode + +def new(key: Buffer, + mode: DES3Mode, + iv : Optional[Buffer] = ..., + IV : Optional[Buffer] = ..., + nonce : Optional[Buffer] = ..., + segment_size : int = ..., + mac_len : int = ..., + initial_value : Union[int, Buffer] = ..., + counter : Dict = ...) -> \ + Union[EcbMode, CbcMode, CfbMode, OfbMode, CtrMode, OpenPgpMode]: ... + +block_size: int +key_size: Tuple[int, int] diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py b/venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py new file mode 100644 index 0000000..08f9efe --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py @@ -0,0 +1,231 @@ +# -*- coding: utf-8 -*- +# +# Cipher/PKCS1_OAEP.py : PKCS#1 OAEP +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Cryptodome.Signature.pss import MGF1 +import Cryptodome.Hash.SHA1 + +from Cryptodome.Util.py3compat import _copy_bytes +import Cryptodome.Util.number +from Cryptodome.Util.number import ceil_div, bytes_to_long, long_to_bytes +from Cryptodome.Util.strxor import strxor +from Cryptodome import Random +from ._pkcs1_oaep_decode import oaep_decode + + +class PKCS1OAEP_Cipher: + """Cipher object for PKCS#1 v1.5 OAEP. + Do not create directly: use :func:`new` instead.""" + + def __init__(self, key, hashAlgo, mgfunc, label, randfunc): + """Initialize this PKCS#1 OAEP cipher object. + + :Parameters: + key : an RSA key object + If a private half is given, both encryption and decryption are possible. + If a public half is given, only encryption is possible. + hashAlgo : hash object + The hash function to use. This can be a module under `Cryptodome.Hash` + or an existing hash object created from any of such modules. If not specified, + `Cryptodome.Hash.SHA1` is used. + mgfunc : callable + A mask generation function that accepts two parameters: a string to + use as seed, and the lenth of the mask to generate, in bytes. + If not specified, the standard MGF1 consistent with ``hashAlgo`` is used (a safe choice). + label : bytes/bytearray/memoryview + A label to apply to this particular encryption. If not specified, + an empty string is used. Specifying a label does not improve + security. + randfunc : callable + A function that returns random bytes. + + :attention: Modify the mask generation function only if you know what you are doing. + Sender and receiver must use the same one. + """ + self._key = key + + if hashAlgo: + self._hashObj = hashAlgo + else: + self._hashObj = Cryptodome.Hash.SHA1 + + if mgfunc: + self._mgf = mgfunc + else: + self._mgf = lambda x, y: MGF1(x, y, self._hashObj) + + self._label = _copy_bytes(None, None, label) + self._randfunc = randfunc + + def can_encrypt(self): + """Legacy function to check if you can call :meth:`encrypt`. + + .. deprecated:: 3.0""" + return self._key.can_encrypt() + + def can_decrypt(self): + """Legacy function to check if you can call :meth:`decrypt`. + + .. deprecated:: 3.0""" + return self._key.can_decrypt() + + def encrypt(self, message): + """Encrypt a message with PKCS#1 OAEP. + + :param message: + The message to encrypt, also known as plaintext. It can be of + variable length, but not longer than the RSA modulus (in bytes) + minus 2, minus twice the hash output size. + For instance, if you use RSA 2048 and SHA-256, the longest message + you can encrypt is 190 byte long. + :type message: bytes/bytearray/memoryview + + :returns: The ciphertext, as large as the RSA modulus. + :rtype: bytes + + :raises ValueError: + if the message is too long. + """ + + # See 7.1.1 in RFC3447 + modBits = Cryptodome.Util.number.size(self._key.n) + k = ceil_div(modBits, 8) # Convert from bits to bytes + hLen = self._hashObj.digest_size + mLen = len(message) + + # Step 1b + ps_len = k - mLen - 2 * hLen - 2 + if ps_len < 0: + raise ValueError("Plaintext is too long.") + # Step 2a + lHash = self._hashObj.new(self._label).digest() + # Step 2b + ps = b'\x00' * ps_len + # Step 2c + db = lHash + ps + b'\x01' + _copy_bytes(None, None, message) + # Step 2d + ros = self._randfunc(hLen) + # Step 2e + dbMask = self._mgf(ros, k-hLen-1) + # Step 2f + maskedDB = strxor(db, dbMask) + # Step 2g + seedMask = self._mgf(maskedDB, hLen) + # Step 2h + maskedSeed = strxor(ros, seedMask) + # Step 2i + em = b'\x00' + maskedSeed + maskedDB + # Step 3a (OS2IP) + em_int = bytes_to_long(em) + # Step 3b (RSAEP) + m_int = self._key._encrypt(em_int) + # Step 3c (I2OSP) + c = long_to_bytes(m_int, k) + return c + + def decrypt(self, ciphertext): + """Decrypt a message with PKCS#1 OAEP. + + :param ciphertext: The encrypted message. + :type ciphertext: bytes/bytearray/memoryview + + :returns: The original message (plaintext). + :rtype: bytes + + :raises ValueError: + if the ciphertext has the wrong length, or if decryption + fails the integrity check (in which case, the decryption + key is probably wrong). + :raises TypeError: + if the RSA key has no private half (i.e. you are trying + to decrypt using a public key). + """ + + # See 7.1.2 in RFC3447 + modBits = Cryptodome.Util.number.size(self._key.n) + k = ceil_div(modBits, 8) # Convert from bits to bytes + hLen = self._hashObj.digest_size + + # Step 1b and 1c + if len(ciphertext) != k or k < hLen+2: + raise ValueError("Ciphertext with incorrect length.") + # Step 2a (O2SIP) + ct_int = bytes_to_long(ciphertext) + # Step 2b (RSADP) and step 2c (I2OSP) + em = self._key._decrypt_to_bytes(ct_int) + # Step 3a + lHash = self._hashObj.new(self._label).digest() + # y must be 0, but we MUST NOT check it here in order not to + # allow attacks like Manger's (http://dl.acm.org/citation.cfm?id=704143) + maskedSeed = em[1:hLen+1] + maskedDB = em[hLen+1:] + # Step 3c + seedMask = self._mgf(maskedDB, hLen) + # Step 3d + seed = strxor(maskedSeed, seedMask) + # Step 3e + dbMask = self._mgf(seed, k-hLen-1) + # Step 3f + db = strxor(maskedDB, dbMask) + # Step 3b + 3g + res = oaep_decode(em, lHash, db) + if res <= 0: + raise ValueError("Incorrect decryption.") + # Step 4 + return db[res:] + + +def new(key, hashAlgo=None, mgfunc=None, label=b'', randfunc=None): + """Return a cipher object :class:`PKCS1OAEP_Cipher` + that can be used to perform PKCS#1 OAEP encryption or decryption. + + :param key: + The key object to use to encrypt or decrypt the message. + Decryption is only possible with a private RSA key. + :type key: RSA key object + + :param hashAlgo: + The hash function to use. This can be a module under `Cryptodome.Hash` + or an existing hash object created from any of such modules. + If not specified, `Cryptodome.Hash.SHA1` is used. + :type hashAlgo: hash object + + :param mgfunc: + A mask generation function that accepts two parameters: a string to + use as seed, and the lenth of the mask to generate, in bytes. + If not specified, the standard MGF1 consistent with ``hashAlgo`` is used (a safe choice). + :type mgfunc: callable + + :param label: + A label to apply to this particular encryption. If not specified, + an empty string is used. Specifying a label does not improve + security. + :type label: bytes/bytearray/memoryview + + :param randfunc: + A function that returns random bytes. + The default is `Random.get_random_bytes`. + :type randfunc: callable + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + return PKCS1OAEP_Cipher(key, hashAlgo, mgfunc, label, randfunc) diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi new file mode 100644 index 0000000..b54cd3f --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_OAEP.pyi @@ -0,0 +1,35 @@ +from typing import Optional, Union, Callable, Any, overload +from typing_extensions import Protocol + +from Cryptodome.PublicKey.RSA import RsaKey + +class HashLikeClass(Protocol): + digest_size : int + def new(self, data: Optional[bytes] = ...) -> Any: ... + +class HashLikeModule(Protocol): + digest_size : int + @staticmethod + def new(data: Optional[bytes] = ...) -> Any: ... + +HashLike = Union[HashLikeClass, HashLikeModule] + +Buffer = Union[bytes, bytearray, memoryview] + +class PKCS1OAEP_Cipher: + def __init__(self, + key: RsaKey, + hashAlgo: HashLike, + mgfunc: Callable[[bytes, int], bytes], + label: Buffer, + randfunc: Callable[[int], bytes]) -> None: ... + def can_encrypt(self) -> bool: ... + def can_decrypt(self) -> bool: ... + def encrypt(self, message: Buffer) -> bytes: ... + def decrypt(self, ciphertext: Buffer) -> bytes: ... + +def new(key: RsaKey, + hashAlgo: Optional[HashLike] = ..., + mgfunc: Optional[Callable[[bytes, int], bytes]] = ..., + label: Optional[Buffer] = ..., + randfunc: Optional[Callable[[int], bytes]] = ...) -> PKCS1OAEP_Cipher: ... diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py b/venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py new file mode 100644 index 0000000..d7a9b79 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_v1_5.py @@ -0,0 +1,189 @@ +# -*- coding: utf-8 -*- +# +# Cipher/PKCS1-v1_5.py : PKCS#1 v1.5 +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +__all__ = ['new', 'PKCS115_Cipher'] + +from Cryptodome import Random +from Cryptodome.Util.number import bytes_to_long, long_to_bytes +from Cryptodome.Util.py3compat import bord, is_bytes, _copy_bytes +from ._pkcs1_oaep_decode import pkcs1_decode + + +class PKCS115_Cipher: + """This cipher can perform PKCS#1 v1.5 RSA encryption or decryption. + Do not instantiate directly. Use :func:`Cryptodome.Cipher.PKCS1_v1_5.new` instead.""" + + def __init__(self, key, randfunc): + """Initialize this PKCS#1 v1.5 cipher object. + + :Parameters: + key : an RSA key object + If a private half is given, both encryption and decryption are possible. + If a public half is given, only encryption is possible. + randfunc : callable + Function that returns random bytes. + """ + + self._key = key + self._randfunc = randfunc + + def can_encrypt(self): + """Return True if this cipher object can be used for encryption.""" + return self._key.can_encrypt() + + def can_decrypt(self): + """Return True if this cipher object can be used for decryption.""" + return self._key.can_decrypt() + + def encrypt(self, message): + """Produce the PKCS#1 v1.5 encryption of a message. + + This function is named ``RSAES-PKCS1-V1_5-ENCRYPT``, and it is specified in + `section 7.2.1 of RFC8017 + `_. + + :param message: + The message to encrypt, also known as plaintext. It can be of + variable length, but not longer than the RSA modulus (in bytes) minus 11. + :type message: bytes/bytearray/memoryview + + :Returns: A byte string, the ciphertext in which the message is encrypted. + It is as long as the RSA modulus (in bytes). + + :Raises ValueError: + If the RSA key length is not sufficiently long to deal with the given + message. + """ + + # See 7.2.1 in RFC8017 + k = self._key.size_in_bytes() + mLen = len(message) + + # Step 1 + if mLen > k - 11: + raise ValueError("Plaintext is too long.") + # Step 2a + ps = [] + while len(ps) != k - mLen - 3: + new_byte = self._randfunc(1) + if bord(new_byte[0]) == 0x00: + continue + ps.append(new_byte) + ps = b"".join(ps) + # Step 2b + em = b'\x00\x02' + ps + b'\x00' + _copy_bytes(None, None, message) + # Step 3a (OS2IP) + em_int = bytes_to_long(em) + # Step 3b (RSAEP) + m_int = self._key._encrypt(em_int) + # Step 3c (I2OSP) + c = long_to_bytes(m_int, k) + return c + + def decrypt(self, ciphertext, sentinel, expected_pt_len=0): + r"""Decrypt a PKCS#1 v1.5 ciphertext. + + This is the function ``RSAES-PKCS1-V1_5-DECRYPT`` specified in + `section 7.2.2 of RFC8017 + `_. + + Args: + ciphertext (bytes/bytearray/memoryview): + The ciphertext that contains the message to recover. + sentinel (any type): + The object to return whenever an error is detected. + expected_pt_len (integer): + The length the plaintext is known to have, or 0 if unknown. + + Returns (byte string): + It is either the original message or the ``sentinel`` (in case of an error). + + .. warning:: + PKCS#1 v1.5 decryption is intrinsically vulnerable to timing + attacks (see `Bleichenbacher's`__ attack). + **Use PKCS#1 OAEP instead**. + + This implementation attempts to mitigate the risk + with some constant-time constructs. + However, they are not sufficient by themselves: the type of protocol you + implement and the way you handle errors make a big difference. + + Specifically, you should make it very hard for the (malicious) + party that submitted the ciphertext to quickly understand if decryption + succeeded or not. + + To this end, it is recommended that your protocol only encrypts + plaintexts of fixed length (``expected_pt_len``), + that ``sentinel`` is a random byte string of the same length, + and that processing continues for as long + as possible even if ``sentinel`` is returned (i.e. in case of + incorrect decryption). + + .. __: https://dx.doi.org/10.1007/BFb0055716 + """ + + # See 7.2.2 in RFC8017 + k = self._key.size_in_bytes() + + # Step 1 + if len(ciphertext) != k: + raise ValueError("Ciphertext with incorrect length (not %d bytes)" % k) + + # Step 2a (O2SIP) + ct_int = bytes_to_long(ciphertext) + + # Step 2b (RSADP) and Step 2c (I2OSP) + em = self._key._decrypt_to_bytes(ct_int) + + # Step 3 (not constant time when the sentinel is not a byte string) + output = bytes(bytearray(k)) + if not is_bytes(sentinel) or len(sentinel) > k: + size = pkcs1_decode(em, b'', expected_pt_len, output) + if size < 0: + return sentinel + else: + return output[size:] + + # Step 3 (somewhat constant time) + size = pkcs1_decode(em, sentinel, expected_pt_len, output) + return output[size:] + + +def new(key, randfunc=None): + """Create a cipher for performing PKCS#1 v1.5 encryption or decryption. + + :param key: + The key to use to encrypt or decrypt the message. This is a `Cryptodome.PublicKey.RSA` object. + Decryption is only possible if *key* is a private RSA key. + :type key: RSA key object + + :param randfunc: + Function that return random bytes. + The default is :func:`Cryptodome.Random.get_random_bytes`. + :type randfunc: callable + + :returns: A cipher object `PKCS115_Cipher`. + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + return PKCS115_Cipher(key, randfunc) diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/PKCS1_v1_5.pyi new file mode 100644 index 0000000..b69f509 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/Salsa20.py b/venv/Lib/site-packages/Cryptodome/Cipher/Salsa20.py new file mode 100644 index 0000000..79e6701 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/Salsa20.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/Salsa20.pyi new file mode 100644 index 0000000..cf8690e --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/Salsa20.pyi @@ -0,0 +1,26 @@ +from typing import Union, Tuple, Optional, overload, Optional + +Buffer = bytes|bytearray|memoryview + +class Salsa20Cipher: + nonce: bytes + block_size: int + key_size: int + + def __init__(self, + key: Buffer, + nonce: Buffer) -> None: ... + @overload + def encrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def encrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + @overload + def decrypt(self, plaintext: Buffer) -> bytes: ... + @overload + def decrypt(self, plaintext: Buffer, output: Union[bytearray, memoryview]) -> None: ... + +def new(key: Buffer, nonce: Optional[Buffer] = ...) -> Salsa20Cipher: ... + +block_size: int +key_size: Tuple[int, int] + diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_ARC4.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_ARC4.pyd new file mode 100644 index 0000000000000000000000000000000000000000..37e083a79cc94a7bcb7b9832ff0e74362bb5e690 GIT binary patch literal 10752 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_EKSBlowfish.py b/venv/Lib/site-packages/Cryptodome/Cipher/_EKSBlowfish.py new file mode 100644 index 0000000..c1c3249 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_EKSBlowfish.pyi new file mode 100644 index 0000000..49c8448 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_Salsa20.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_Salsa20.pyd new file mode 100644 index 0000000000000000000000000000000000000000..1f77d38dd99ab908352b8aaf8e7105e63d58042f GIT binary patch literal 13824 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__init__.py b/venv/Lib/site-packages/Cryptodome/Cipher/__init__.py new file mode 100644 index 0000000..8823711 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/__init__.py @@ -0,0 +1,91 @@ +# +# A block cipher is instantiated as a combination of: +# 1. A base cipher (such as AES) +# 2. A mode of operation (such as CBC) +# +# Both items are implemented as C modules. +# +# The API of #1 is (replace "AES" with the name of the actual cipher): +# - AES_start_operaion(key) --> base_cipher_state +# - AES_encrypt(base_cipher_state, in, out, length) +# - AES_decrypt(base_cipher_state, in, out, length) +# - AES_stop_operation(base_cipher_state) +# +# Where base_cipher_state is AES_State, a struct with BlockBase (set of +# pointers to encrypt/decrypt/stop) followed by cipher-specific data. +# +# The API of #2 is (replace "CBC" with the name of the actual mode): +# - CBC_start_operation(base_cipher_state) --> mode_state +# - CBC_encrypt(mode_state, in, out, length) +# - CBC_decrypt(mode_state, in, out, length) +# - CBC_stop_operation(mode_state) +# +# where mode_state is a a pointer to base_cipher_state plus mode-specific data. + +def _create_cipher(factory, key, mode, *args, **kwargs): + + kwargs["key"] = key + + 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") + + res = None + extra_modes = kwargs.pop("add_aes_modes", False) + + if mode == 1: + from Cryptodome.Cipher._mode_ecb import _create_ecb_cipher + res = _create_ecb_cipher(factory, **kwargs) + elif mode == 2: + from Cryptodome.Cipher._mode_cbc import _create_cbc_cipher + res = _create_cbc_cipher(factory, **kwargs) + elif mode == 3: + from Cryptodome.Cipher._mode_cfb import _create_cfb_cipher + res = _create_cfb_cipher(factory, **kwargs) + elif mode == 5: + from Cryptodome.Cipher._mode_ofb import _create_ofb_cipher + res = _create_ofb_cipher(factory, **kwargs) + elif mode == 6: + from Cryptodome.Cipher._mode_ctr import _create_ctr_cipher + res = _create_ctr_cipher(factory, **kwargs) + elif mode == 7: + from Cryptodome.Cipher._mode_openpgp import _create_openpgp_cipher + res = _create_openpgp_cipher(factory, **kwargs) + elif mode == 9: + from Cryptodome.Cipher._mode_eax import _create_eax_cipher + res = _create_eax_cipher(factory, **kwargs) + elif extra_modes: + if mode == 8: + from Cryptodome.Cipher._mode_ccm import _create_ccm_cipher + res = _create_ccm_cipher(factory, **kwargs) + elif mode == 10: + from Cryptodome.Cipher._mode_siv import _create_siv_cipher + res = _create_siv_cipher(factory, **kwargs) + elif mode == 11: + from Cryptodome.Cipher._mode_gcm import _create_gcm_cipher + res = _create_gcm_cipher(factory, **kwargs) + elif mode == 12: + from Cryptodome.Cipher._mode_ocb import _create_ocb_cipher + res = _create_ocb_cipher(factory, **kwargs) + elif mode == 13: + from Cryptodome.Cipher._mode_kw import _create_kw_cipher + res = _create_kw_cipher(factory, **kwargs) + elif mode == 14: + from Cryptodome.Cipher._mode_kwp import _create_kwp_cipher + res = _create_kwp_cipher(factory, **kwargs) + + if res is None: + raise ValueError("Mode not supported") + + return res diff --git a/venv/Lib/site-packages/pillow-12.1.0.dist-info/REQUESTED b/venv/Lib/site-packages/Cryptodome/Cipher/__init__.pyi similarity index 100% rename from venv/Lib/site-packages/pillow-12.1.0.dist-info/REQUESTED rename to venv/Lib/site-packages/Cryptodome/Cipher/__init__.pyi diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/AES.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/AES.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..095bc10e7548cbe7ece4a6eb403be6d2c2167af0 GIT binary patch literal 8232 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 aModcgE+_t;-0@c5TQ9C9_rD$&to;`WlmHh1 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/ARC4.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/ARC4.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3964f9c39e84e8b0ce5cb5cab5dd0c2413bc126 GIT binary patch literal 4845 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 Ar~m)} literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/Blowfish.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/Blowfish.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b4bf2b6d4c6689813bfe1b595a6380a61614899 GIT binary patch literal 5623 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 YnW6R6U(@^E9)5dnD}C?>Ng>#O0Pi#wx&QzG literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/ChaCha20.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/ChaCha20.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ffc1975dc2295825b66130d008da8a0033d2052 GIT binary patch literal 10075 zcmcgyTWlNGnV#X06mOz+zuM8UWxEez`EIU?WHMT4zVVqDS&PbxfTV{q* zL{O=k=7CPyMnNB}U>AtGS)dNwMO`#NyAKN_dD#>TY^kt-g@GQtSS_%Avn>}XvcPu# z|ICe))kf(q_P{s2FYXWdD9Qp2*45R>un#DXd*kmnCalBosb)2lVcl7bjcEkxvnl$wN!5;T|($D$KjO+=Oi zRSGMr98FAxC(@IXlB@;wKIhGE|5!3AzL1P2R45FL#06P3zdVt!63s|qRr5!}X{d2L zoKj`23_fDX#FSPYRl@UfRF#B@m}K;qX&$g<(m4=KO-piTI5I83zn-JQf5OszWQPEq z6SG!0nuw}xb1*G(@W`1ic`|?RL9H*yYk?MiZ~R`Yjrp zr;$vn->RLlKQSq>s}(AeH2c>qFP%`LQwd2Vc%{iiEE$;%Pe-Swce}!!+Q*Xf-@18n za#E4hzqHh8Q$X6bp9tLAS9*JPc_^iaNv~h`u~)i}?XtOfoJxAa7#8OIuq4714HZb0 zT^Yov_O@z0Tlx z+k)yfGwd;o@~nP}@*HO0rpjLAvYZ@L{bo-hd}rK@wT8FYtYd`Xox^tsRJl_DQKo%R zmXk6$B$D}QDM3U@j?RHTCi(`F`KUTgo*kGL;9t*C-mP(P<25g;dqI|k1+9`Qbo1<~ zX7^fGLB^?QzA+(|mgqRVQ{&)VG#5Qs&8?53xn)U7$5aJ(2oLM)CkOkl2+{D|l{qOf zcjfu$#1#b;c}Gf!%nDPIa>dr-UAh+UGN;&?TF`u9YsPXjbU6V3l@vrv%%(q>Q{Fwk zEWh(q-r1CUY6HI0@Aj`$ed%w`JNM@O&70+Q%ksOgE}h*df8r5bTQDXQ!N?5e zt=l>VIoBA839%v*a)@k*6CEL^$N|{8M6c+2n+>@sIG4d!8GLy}50rTqoV-s9nyb|p zpZQ1go3z1MzGQy!BtjvMBqwI1h}!AHy*-m8i6p=oMPCwCi5QikFt*T1Miq(lrxyAr z(}_s`ctV;VCs9BwNf0}A<=;Oi$j};Kq@P@#mh_~4N8nma!BsilPP%&tOroccP)a9stjsbb5P68 zk{d<>O08L_D0MWG%C z2hDmnjFnOC(xjq5(I9%V9L(2ae%rs3j#90o?la5&%=%i)a{Jd>pS@qiE;Uo;Nfz($ z0?T_dSIz@ViwZGdE<_-vKy+E6Q7RcWwHcA1eoRRcy#8(cI1yB$!cC7S#dJ&}F=v{kVA?wExuC5 zeq}scxe_DXbwRJ2o(Vv}+mR-`k)YhvkUxe42P!gP#qI8$#f)}+%$!K>Kl zzad&;9{8BL{i`*r>h;k=ZEw!`L*D}r6WC)Z-i@lgDknnF*9=KI` zbglB}dc)oi{U7*mHFT~ubQT(pZZx#64ip;NHX6v^SFetI)KF+Rvfi*y{~Z0OsnF2A z<#$ze=G^xJOrQ!Tl;3yi)3Noz^Zy+BEOeJ+2ic44J%)YcBD=+~)tA`23|oGQ-K;yX z+V`^)KRxlYr+@l%p|x+LweMEz;9Be87RT0~V{^_Q`Q^Q^1;Zs84v&^h zL8h!j4|e&Sv@oBP#fJt0{+&wiViaJ&ATG%S(iK^vvZ;d{PO@m?ghUmB=AR0zMoo5- z^OIzJd^nkq#>d;YHN&d1q^4yc+V)H@(VUXqpnd2w9S3YwcGV*hupZsM@o~F*LcR-% zMV^l;QoGfUT`V7hv&?kpLS+Cri3kajOvDz*ghbK`SOt@Sw1!@RJ>gl}isxjYs*L8n z43JBe4T!68Dp1x*%dCUd-1>qPylQYjRKE4m>$Zuu(Z?cGRQe!VV(vCEf!dWb9}aym zwB|p&QPrH^`&^;w`F!B{_1gU?n(KS2-&?%8xbpIKcVSOg-qS_pA!1!?=moVBesBE- zZs;|D@TFRtVA}#DzoI;={p{nY{A{uEDB)eFes)wK|5;qZNY**iy+u*SM5B`+y~X72RqHttaSs`4unN#)+sj? ztqi_lZm8|Ih3zm7C*!v%L)IF9gaOEPWtvRwf;I!(DROq?0(ecN$gDD)>C-P6iKoE> z0=HM79FUq2$QA`Es?<|MY{im!qPW$xFsIAA0w4%TO!+3r7Q%Bh0m_4rHZWtTpz)dg z7Rt^~M*+EwyNf_eZJI+0UoL}fWZ)|vnB0vK#YYOKHZ&TIWgaWEW8}w(;^}uVh4hYh zQPGlnF$2Xz^Vyn7rWlHP8br(#vL5(+7(b1{-h)CV4-rV28!!oMmBx;rM{e>r5{1T- zR{;xKazmTdhgau*U){M;*ODh=g}N8>6)$e?sak&G-8TW}#y)EPa!>n49RajDaCD>R zv76Cfb>8FH1E&zh>Q5tzRi0)axS6WfTa~?QmA&hH$1j>cZvI8f$1MfEe}nJ4`Er4O z8h=9t{+SKF`;%7eqrjiq@;a*qSino4iI>lOdiIMmzZ?4PP=4UWwS6xZs$R+mUIH@+ zCSJWCaJ{-CALzJUUH`BKz}=%7;7dsS?*Y-fD@bf*R6Kqf4l*(idc-E_wlQwq@)jy*>tluL zzI>qXj~ja$?=!6T1Tfye9a*jXo3RgH`{1?fgEt>5?0ce6)t?Xa{}-@d?}@LK8W`vA zD*KpEyr&Lx|8(%we(tmVE=ca|NV^ZUi;edz81E(>y#hw`BH%Wd-i{0i1|Sj`;Te#* zMVD$B*gKM1X2z0P7{CZKmb98V;PNt(wlgg2G9|Pq&uQiXnwj|M&bk2~Ed&P_0XPA6 z!tU+(xZvX50s{*IBXSm*us|Y`tO9{1sU-NXkhMY@@d|uk1TKOk#EZB$u*-#Hn#_Yq zh^^6OT-pnD|JtrwV1Pgzsb^Vt3@6g@2}veL$gw^isiq~753zc4I&DbqrzDv#=KO^E zc7zEf8B42@J$J;-hvwgoOQM)-bJsi1!0yLTqyOo9fBGKB$a^4}d1MLc$oKS zZZSFsmiBgQ7Hbw^ZvcAJVH&ZQFVh*V$J}ErP`n#JZ>j4Ve3sOC4$g1Qrzg>muH!N) zenWBT<}Fyj(rl)B8~?@3&!DRECPZM?)-mMp>hw)Vp`~}tvo{x5o?NdXtNm*=9XT)X z-_=WNwcpA4HZ7yH`>|g)|FZelEx&9jbf4bnKK`4gLiZW`Z7g&Ttam@Y<#ko{7Mq|a zKdt+s=66lMZOT7$d2Qe2Le*$KFnX5*#HAq0v%}yF1XCQ{0^u5h6_n`9R6U`lkwb!}ESiKu;T%sgU(C~6>IY3rQl!WD} z25&nO@IPb!X4$2nP5MPkh~HpAt+0usw)tQaXVHcJc^Q1FSyuP;CHC%E&q?cXS?DWK zJbsy}D!~755rr(6D?j&`ift!FBznzu=syErqpyj9UmyA*v+N`Xwz)qepFy`fvSKxz z0s5$=E`7@6pG|g;N8DXoJF_&e&2*R3PBG0xxU_N~K+4N=isF zxQYx5SC`2St5-^j&HE14@at)C3o9_AUZW#WS;Kcw^zNYJNj?Bk=GZqjPmtpsNbpOh z!#ix}l0u-PZwl1a2K<`3!YDz<`=fENP~GBn+8t_v6!^U)F-*5cbI3|5qH2v{`p6-L z&B=#hY2lO*mF3IWEBse}0ucy!fbsZqy+3$kx#z7nsfYjBLhyXvbN+T&U}Xy?*c2z$U&FTr31HOmrk$y%X5*OoO^uv^s>CHET3B$&HE4JodRyvKM`!PK*EIsCzZ(E>=a1-3=92mi%g3i>fN&ITT%jVRA_ix9xc&lL$Uobh7xSf3FHy+g$D3?S*sXffZ|(p0w{hp zyusQ1IPpM~vOx;FUB1Dzsq_>&Dm1?L@^!-qK_Btog@j2h_) zaCOUQs>_n)YC?Bj61`TIIh{=S4B(_cBKX&I`x>Z%f-5OvAz0%qY@E4?KppHA9oMx) z$+Aki#+KHWmozn>nvBgTX+>3}N>XxiE(%Jaog6ntn2*L{banLaSHPua>Bo}xZOF*b z?KT-rh)CVyWC9)`O&&KsPPZJKfr1Ku$1(wYi8ofLDss;qpby$LK38`v-`? z0&3%2ee1!R_hzontkf2QEjjM4hbgaqZ|LgK^8Bi^5ID3nxK0&!1zD|x_uHInv&>hb z-p>_+&*nYPV)kP{$gDK4l^vvNf3y%B%X`NDt*m?_Sf6j`{G|Hk*sq$`8lEf!Pv$)* zH~oz(tt;t*|4`m}=#LNfGl3c~s$6|~<(rjj4LyZmFW>~)Qm($Q6x12>HR zDVBTz>*Iq5<&Ix_p492+Q}Sz&hY+HSLj;?^vVVArVY~i=>Hf;$VjusCf#?qy-3v0c zo%zn^?mFsf8@9Om+QvLndB3lmt$IMtIM^|EdF%m06ZeOmO>FD^{=@9yyO&rdxM#_S MezM^AJ#+^D1Np#SHUIzs literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/ChaCha20_Poly1305.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/ChaCha20_Poly1305.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..add3c3d5c9b221c7adf4408629f0b897b68540da GIT binary patch literal 13406 zcmd5@Yiu0Xb)J24$lc}gC6SUSb3{^)l_^T1B*$Kh5-EzdBukVd$!SWsT@H7KFk|WL~9K#L=<(+Y7!Zqw-c~{(>@Cx&I12x zDxN-g=)jRe)rqtHuMGC6s8TmBYY|0EN~uI-G_A>07Ko>k;}I=o6gUgMNHjH-)*lP* z(Uc;gR&`8`j82b@$x2iow4Tyj`tY~bisU+{IrL%D!>^06$js|Aa&qSNv$4_F)tDyln-Zg!#c^4EeLzW1X(-H|&%g!!F5*Wpzs~q#ntQ)GGxg@0*U{D%`7Z=OrGc)r?_k zq#ERXk`Jk0@*@pM0i?CWF2ljJCsbG1Y|eu@4f^zCvS#@{^M!z=7rwc^ILhWzNR3X) zQLVd1z;!YuBvYCYRb)|2BdQRTjci>G0TeG8!I9%CjRvEU9X;D0SDc zw&593LF;5x4hxqiWIZd)#= zA2l`%n^|H#dS2U%WyCgi%yAL+f)dTDIq9|vt<0Qb&Z&9L$B&&Rn}UK>TdOkPZ$#l^ z*G*%U(ar=FZjPH|&||jN?~{SjXL^#{H;wHAaPWYJ)gyc2%@&du@2brwt;x(yZZ>oF z9X0*tQ`#G<%8Z;&#B_tNOD5FhWO$oHddqN|Es0kXD zGm(;}<1&_VMvixfJO%IclmsRzRLRLG?a@M&Bu6A;5AKT$g2RQN|ku zuikISsdQk>N+*(seUzhV9SQ}om6P%nO`(-4xG)BVR;N%K5vMVXq!x>cT1qKYMRYm^ zw<^n*3w#7T77;}WFDMt)P?Qj(5ltK~1R?{B)h}wIHmxcxM6W8MvL}oV6yjs{XjI}N zOoY-v_4r66hRKXXGHvEOn)^y8+HF?oMRj!o$yM&N8pmc~!Tr6O$6l^&_XqKJ<2TgX zJO7ct`^?uD+;{nH51QMq&%HBu!*%P(-R2ii(Z9<3ulX1KEBuxmzh$ZYF2DVL%ND!{ ztTwl>_bsjTbg#K{rTK*%wfVkZA*P6$n1eiL?G8i8VRuYYdD%7NP<-}Yk(?$+zJdBz z9F;iV-WPKYvvvmD9d$;m{?V7ky>^F_Bq+)*n}&l+yFzYp5ky{9QW~I!@tUZrsb~z` zB?;g$(Eu3Y&i>Lj!XCz|my@a4q#&xoUQv?3`KhEB7mE1BptD!lC-nE93^7$oKjmx6aCCpC5;<80X)nak<7mufA0a~mc zP*aY9{{<~2=-U8js)C9pk1H`Pt-~$*qNE^S5ff9`TNn<>Jy{bb0IRa17JWD&YT2|1 zd!|yV8XJwL1$8P8um<%Mh8)*oL`{{)6WA|m2z0HXj$tZTwQxe#Cc-27CLR$+<*}54 z9+GJxiVvY-8#RnwJwmu`6d5~y#QuoWZ0*iUjmR1`72KOrYlN_r+H&+3#T#1vuco7gN0)*_b8Qa1@B`ZWAuXbO-?iA9M= zR3VjQtD*uY?Qc<@0lQ`deXM&z0!>s(!eEmm8b@Vg*h3+&vKuuE)t4Z=1{EcxD5QE6 zT)-bCgd8IToI6ORZW^;no5esDy_@YDfQsJxc~nP&w*v1sE?s&L=+XZD0KjC0-L@NU^n*q$- zw1jBU2rVIKj{u_4dPs92_t3*2p4V9Ghjqw?s+0q`Df=lQ$-oxTUO#0E%06>*RA;5a{jgz|E`>W*YfPG_S^2i4g4hV_wL;DXLCL0a=VA_`p+{-5Y9D+ElDs` zSy6fm->NH0mDcx3qM*`>+X_@AuqS>{>aczlK>sFYfG(&#SYdlrP`kpqP0})zU8KN$ z>^9Y}c~F6{qBShLG&%*a%N8_-u(AZyob&2-^lYhBW($s+Y_{`eZq8-%+nnnn?Uko( zX$e;cM=e7hkw^{dIun#L3%1GyoieT#L)=tcB;j#I+ru>His%^96>p+M0B*o^7fCh( z_EMO8MNZG+lqd9;b(EUcrly~wmv{<_7*G_lkl>Y6L|r4JL6%@M(0&#&Pm>`+Q{4h& z#mLA|Dk+bQbd@zD@uA4tw2~yTK)6oV1y)ir8;piN(h;0P)Tg3I3c|<;o4%1E*(C_) zF?eM*rpjFw9lLj>4P21fVNB-6^57#UtEucj^^Y6{uRgkvp9u-&FiOjT<|vizrG&ar z_EB<#5?gqUHMt-jKS3I#8u7{t6vnla4~gCu>R&uk!2jPb|OLj4d4B+6FKziH{@ z2WQ?rlk@Fj66JWlp)c$2yAL=zx_I>c-j!{=xoy37e7yjrYv&fveeeAJO?#n-*4(e( zbiMVR)|L95x%!>UvD@Bk{my*-@dYo_W8d<>?^-(jUTu!w^?m=UuYTcJIjGIt^>=^f zNzjxtR82-A5|KfZklOtSa;(}R+sPX7OalC^a#JfR))MVMr@`fWi{ zMS@=ukpyr+W`{A8PedfDskBpa9LX1gQ3VLn0gC8^Tsj!l*vrn)sN}q?P|eInAY=@A z5p~pWBl!(Mh|bImYtFnE%<;Q{HD!u#_%075VLI1Jup<}jSUz)WCL8R?2ajd>V^2_t ze*v|3Bb8Wr7F*3yi}4l4r4bsltCA{QqAHsei|$OR`0`Z0R-}MGxwWPG*quI|x`wZ< z0Axj~eXUK=%uSO0wd^uf`weMTQ0<>MqfjD&TKa`CKIJHil*5XE3HzKekCF%fyno`N z0|4o4bTOFyDm_*D>aW&Q1@+Wat;^JEeaIy#z`iQe`%(<{5wZ>1N}I4JHiqLd48Bmz zV9J02SW1VOG94S}HN}apXHr z{PgfA7d|o|3nKV61rtX}I6TW^0W-_ifm&QDH!(wXac`7VEIwWW2X<=I@zvnwq< zxt5-M3-uBpPz9>ke_Gnw4E9UxMr0nehRAH5nuA9R&+2 z>Al59Iyy_hS}W`UmxYQfUtwMU51SlFmAXiB9(=BnI?tFX1IGo~pf?tdAqT4np+-g= zT|YlfxiU7?$!%n&(R;a#c4`k2@ST4nGtKHIW)TLrtptT!P{;?{vwZvdm7!h1R)z#5 zt<0o_awsq^;2qT|yUh7M$z5|qo#U|1{s9!pc{t@XYjtduF$0D39q0EN+^9EiS#>Ys z$-zoyA@MUGl&snmoHCj?8ke7H;Vw-;%QCEI$i-uq;X%^Pj{3ae5N0W58?LelW9SuF zL!+?-jJmpC$UdDFxQu(}fu1X5#-B{Zl5DvYA11~$yg9BETipuPpr-epu^c0127Rl> z-+_#J014K$maA*HHoG``tMkXt{_xo!?fXS@-;J*?c|UAg7XPw2-?HaUb6=j!IsN~I z96Ol(*`_dG**gCcR`fUDbM~6rKBalMUneb(lFc3_XE->G_={bYJXY{Q5rqoU>SM3z zFPnEg1r0}0efONJk~zm5)13QBZ!bf`fw#iaC!{J<7Qf+0^Py_-Q%vSJAkJX*&;{C; z!4{Z?VQ?@^^|9nk>at8O0h@0P=NC-)Y1mUF7%Wm2%SI>U=w$(Nlf-D5)tSjt7+rJ` zN)-&c9pa}`^Q1Q@;X5%^DCAAD{fbE;Z11B7J= zYLXDflvILMRq>IsV(+i;1rc@;Rlp2S>qhR#O-y(s|pa)Ue>qTox> zEoLLk2%8tUs z1Z^^94<$_J*@0Z4#-62+M?WmpnNw`8Qo*a@oGohwH?*3AEbUPVo#_(|Lkmb2NsL3xx0Mg6Bc~j^*}z{mun1(>}=0NS?^x=4*en z_(#j?E$^z(`B#BI4?K1`>h>?VOI{qH!kz`Uu2sFb_~LhaVK{o_-B;c_cgGjH*U*~X zzCYh^AnQK>YmR@fF4UYDoq1Vy8&V$G!K#8#vt5$5kTN$r9EFaMQ|w!}*?(&yNuSpe zk)&@yUF47yGS{$l3l#6Py+y+TC;d+DqajE}wjD@=Fr}og==0XeOMPmdBro+E{|lCY18Dp zWl=NQEP^mhd$kd!11q@IiU4CD15Mi^!|ZDEx2B;g89_HdUcyytKoy#s@`11q%C%KP zIfivHI7I13zJxOxjCqYT@(4mmQLq`yKcDu+V_#~ zW*{3plI4%+OhZg!UKZ1wLCF_04Y`Rb>B@8Ejv0setM#m72<;NqF@WO9tYfc;&O0S; z9&*kYl#398@lA2Nr(v8TEx}Y|{*M&`lT}M}8WyI3V2mOMiydVVR(^MM2tt~W?p09+ zkykEJ!g$+_9BnDxzuRCe5aVtG05{_9^;N6DO6pD!1b1)cHf_0n_MNlKTk}m_3)SQy z0WM~nI`8s3SA#8CzJ)P)$T5VdK7<=3#e^J*Ah0u{hg>1=k3?uo8*i#25h)doL=-x5 zvM>ULnOB$>NuV;Oq3odCc}f`ClLuO%xJ2a-DIq@u>sR+3wbCOc3<8p(6h zpu-{(D$(>xRsbKM!FAQA(MZ^3A1!diu?|tT?^ohyI0bFy-N}O$-&Zq(YKs;yDZ*pz zl3Y^FR?ajk;xO(*S&ih{%4JXuw0!n)O7h#|FY**w-e=WUbm$A%b>}#xx#&%;eOy8` zt}zSLo0)&ZQDg>n%vpxWd5=con_U<;zSTVR&3Pi$Jk5D7avhup`iGuP!9+6FjG-Ll%I7Nx5HL(BB&6xS`@ozNbE4q z49t~{yNvu)kRqc`Nq`apog*!zfR&1MGD#&Z63p1D%X&Jlq5mQ!|2~SX3Iid7chUh^S?P!uT4CHZ@;AeI@P9Fx>K{r*%{Cl#-f>Niq(-=)+b- zW+~VWy^qUDSz$4HdTe<-ZS}n;otmcenJ^ZE%7w2-Ocw&%NMw@O7#U$x3D3Q#AsA~E zHeML~*j$$f0;^r@>sTCE7tV8LAegQNSw=!c=7H57WCO|&Y_hlHTNK} zjRion{@F<|({wI|xH_C5nRJykEZ$Ca=%Ijpk=gPJ4yfh=lyH(B%1Wjas7x>8rpQPh zGV^yBIc5~Xoy&A0`XP#lS_&?tWh@ViX6upZVv}UmVvAff8?^TJd}NwlOX^XO)|l0> z5b_sXQ>m!}k3s7ZYAgFGdk?&;Q{=HmP>uUS%9N%`Y+Q0DHcelQ++^OCILQ9QH^76p) zg{8@SZD_%@+J5A==l1CB=$-A_?G;+*La?a9DN&tZan=e+ zyAqlg*v~~6f8dt})^9MnUqh&CH-2d`Dl5!?Q`l1eaw>g@{5GPd^AJgmLQ8oi{2XOA zB2L8^+p%A5umC(n&9J?w^C0m{fd?o?C~~PxWBHsvs;fuGlv&gxA*YfqhbeV9{^JqAM;F&`Cm1KSK$Bv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/DES.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/DES.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f689b1d706e3e72c73238e4abded7a00abb75a2d GIT binary patch literal 5612 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/DES3.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/DES3.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b18aeaaaf5cc001af533e65b9b71df66e983600 GIT binary patch literal 6973 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/PKCS1_OAEP.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/PKCS1_OAEP.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b4f0ae9f7004e778c04d8d4c2e94612b6563ad6 GIT binary patch literal 8939 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 Z%$@k3h#24p|HvWzd?I{=pWx}R{|7Hd;;8@t literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/PKCS1_v1_5.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/PKCS1_v1_5.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fb597ced253a04877a536af3f19eb6824eeb099 GIT binary patch literal 7040 zcmd5>U2Gf25x(O;B}&v!V%e@;uOF>sK5yPz{DvmqXn$I31}Z2xDR>EW6{?Fg=7Y>a8MBgO$r$3gA*Ajkf+Y<-H}H{ z0fO|U2WX|++nt@6otbZD^tXZBaHFgsy z-48g_GYPd_ZM!LEIx6v0!VcxmeH$I&T+M!v4sdh{=of*4bQjAi?d3h{4)Doq6#T=7Vsu=L&Fyo9a zXTtU7@NL}rwf4AazR3)ImiGD2LE<=KL!?4)Sug^HgdoV5!D1_z>>$p^ylE3}3Aq3M?1k~G zvL-ED1syD0eN&sgYHAieQIeH;IZw^2O+y%Q3}M7)2qmB>Ng7$It?#iK*BX#vg5gi%rS7EtQ+P`dj2>d9m4v14oxeEI(n-4`QTM0e-e zKH$_ZIK=hc1$Q@`g70iU4qQer{K13}fgilQ?SFwHf6nzT2dpp>!lx?UcTHzGSPfPo zpe_OU%um9>?N-!TBLJj$t3DL-!g9#BKjeLZ$P~oADj(<10EH+c#??4z%XJ(4wj8l~-H$>w;&HPa{Sk*lGv4u3qm5lLtIzvbja3646feiC zad5{r`5Q2S%gj*A3Wj*v65;)Dg~7QhPP|1iK=WjAPE+RiyeB{0jeGf2 zZE}IKfza>~6oInf?;n@LulH$LGpR}5kqc#dfiZ)%>K?G)ql3ADqc=PV6C$&m%V~;6 zbx4GqW8r#KDi_G225A9qR>;dVEQq-AHx+agaZag zlLyDZHjiVMQV9omI!s8009M^>GYG8OZB4OQ7jBQiU`OOqiR!8yx@KrP!_=E$hy_%3 zRm(6ArrJ1o*-@8aTb#E;#W#U!pk&%HNay%Tc7PV`2ra_NmK}C}iHeC-xpaKs*k?yw z@*rzVYMplHUxYp86Bq#VhlGyq+fyG+JxmO2BnIkjzKOdrq$>PCx2M)&g6d-7EdK@~hpeS3cdlHu33!2c1VZ`+jlvgF7Fr z$@RX$+QqG8@5;s1x9+@APm;CC2g$+BuDzRyPCRa9?#slXr*Q#}YN1i@Jo=V)8G?>qD<^bi7^*eBJ%aRaWoruSFhp zJ##mHC;qUjf1|5^?R33ss22V@v2XS0T6aA$P!l(kUA344d3e9x(||nv=R%$zvKo+A z4RM(2^Z}g+!5>b$?}FloqSXK}A5?~aB*Zts%wrq?wgFQB7Y!J*8X(k!9`DTMXcKe* z2wYBBrw`;BvmgON^?pAPsQ|&KEs#N3 zuMotIUFbW-7s8xVwEzTAodPAS&?v@d438=laf;Q70Q5RwHq1#SOM=*kuw_vIwOtNz zqd4AI12vJXgQalxoV-AXu@WA|LZGbk5560B5sYx%x%jo?90!gl-~h)}3e>c`rUN#3 zS_1OOK^D>qM={wf$67^(iW-s&PvDgA;B=ZS%1j5i9B;iFzmYama})~H0Pt#RSSD7; zLb;$*#&ZCW)6xLZ^DXcsTNYGtfcho{-p&;$ATZTuWf<9UGb>5NSpi%%<2xZkL)Zs! zx%kb*h09*4KQ!cHA9pz3QY;l{5#*M6LIosgv1B3cL5^W*d91WiIZQL>Th8IYYC?wr zEswV&PJj^Z8!Ic8*~-^NV-c-~Cl?i7j<*6gWFUA@5vtt<3MmO5%2OJ+fD$t-Loo`Z zVw78$&^+#W#)w-M!_iepuehO_q$tl*2q3ds9{MG@9AyA>{v;LEG2>*K{C0*p z4Rg*Y7gT36WTU`+1?V!T;>5!Si_rK`G^1>$TG)aV(n4v#EzR;Q=n=eu3*>iNgS=nX zlzA|PvaUiW1Ufp9E&1=5LOH+4qOFT&O09?lEs zg*A2QZ*Q0_M>Sm0MC;FK*MWfRse{?<4)@MxQ^PI0`B5#t1Z>Ivo`>tFNF23jLP6l= z!7Y?fA)FfAzXF8?cnA-3ko!WSh-JTn-5=%_Gt!b5Z%nN~ba>qS0D2X9sRV>Ue*)V@G%2ugtL5B(wUK8n}M)>3A znJzm&$TQvf9BeWF3IpVs?}$H4G@n9#nXE0{dSz99(0+&~n3vYyn%+1#UGJG$Pt3sg zoMAi`^Uf;&eTEt`^!%KD(l>(Ax5P>;S)^ODU0GQYwy(H7s-`$!?P*Uclks z2}ydtEEn7_QAtt_MUoiS=e!}susOr9(ae4Y!)H#J;WVs*IE%v}_%ZR)ZwlWA#BfIZ zE|LiMe|I1dKK@;d56^|WpJv2!V)&rLmcr{4*ntmbXGmuIEDYG>z0qaCU(R#QztWvs z7Jd02wr$)s*sGKO4N2m8MiC}tufL6+>GrqLW&Mcg78tv@P4jnkW5YKJ)|6!IQ`69-(~kSyL?^WQEmwN#K{2hZ->c^WrOXh34C zm|=5@7stfywxY=}9PZzi4f~rkM?c#?t9ofw9z|Mi*2>v}DS%VAoKZ$W|K0&GE!r$!C*y z?A}od2`O*`KPYtyq-YB}NYE%qfy7XNxM=@@KD9uKLMjV5IPf7w{o*$}OpqW2iq7tR zkdm1;E{fj6-hRx^&dlxnX68QX=!hbC{ya6OEe{~{cQ){zpxdcepmPMG0}kIz zM*uyA)bM4bw)u0NYFur=nqDs@aN zo+mUVPbqm*8QZV?Q$Q$+TRdxt7+*yMWds#v0;-S^ z)xc$x394Z=2rdzVcL?6$vM9CL9qvVOE?4DkcZhTRvSDN90?An^eB8jgVPVG|ux4RZ zqp*-Kr|?;m;B>K^o-OIQbXF$|S^n`fum(}oRFsd>^9ltHa9h&&%z5H;@q%WZ$DrOE zyvBVxt6X#m(wO-ucD#?T=fozJ8RW2WT?O5*A`AS%c@~9Lw{Lk?LGuFLYK1%sRcJ+B z2_xj~e5IKp;LWOmi{D0Q11GVGlTWvaQ=5NoPz^2yR$VO?k?esZvSJ?1s@s88kjHtf zPOo>N$LlrTR>JEyY2N3}HOc4O#nY#0r!TwJYNx;I?Oa3`;@%03_l2#EzSr~gS#_G0>bd%Wk;u#e2H)#l-*oA#80K{R@-3+F#y?iH;;%Mfyegq;F)l-q&Wsr z=Cib&ZHy|aN{MO8#w=x8*&;+gyMNOr7vSyaOy0;{NX>I153DI`6sN^mxbHqH?2&?-X)av7uV;_O%_S{xr4r%$bjVu)gDLwRd_g zK7A|Jxm>!EzSi@TBb?xLZ3kZIdoy!a6do9^BOxK(K|+W0Ss3;2TG_Hll$wjQ194s_--7uG_VeJ6|tw?n6^mK?lx?9Iq>@TVPh&>c;-2ICdDL|4&b;8I`1 zp)42h5NZIF=k!aW{^Vj{No)WD0Ho`5X3T0pr#}lY(Sl#ooKNY3HM?*8QN<=I9}G8v zHP2)j`GpQ=S91%n71F4vYzu4^9oCIU$TaI z_Pmd^3Z+VUUx5@1TAtU)g5-pF#tB;nb`z`-#$D0NJgZ6hEWby}3kFs1IS5jqV(A;4 z0;m93X6SeUa$~~L)k$5Lkp3x5c+JEt<+g|pQl;?8S)9#I8al~lM>cI^q?A}CsuRdx zT+Q*bd}f0+I1fkCY?kf%CLFQC=(zc^*#>)zpN7yt7c>(RYL8E2d9rfQIS3a@kY>)X z=;Iq71Gp<(J6=%W#1=)$)C0h&wb&Njfq<;QCSqaWmM zNUM5v;5)CL`eb0|@~K;ihgRnQnn>09cdp^-YX5U<-Ot_X>V5sOD=!1cPQN?&m#&do zKL+65y}veg=!W*&6u|lJqXOXh)+Yp*?|DK1MDN{wvuAw0XZ&Mn^uxjHgCFj^zOyQ& zYtq3R&sU`*?47Af->pfH{BDTxs7goc?ZMt-0$?>n76+?O{4u<~W3t-&^jiGsPhveF zZ(`TV-fCiWEk625Vk_MZy5xM!fC0lyHm?5ynyaWC0cyF33KRabC@cm(5WK`_3Jsw~ zy1WNb2{75`+Jw$Nl3ehy*=Gs$yefJeSKTvT5!B$4__DYlETEUf=g|VgpWndZal&ga zxVxM1$MZSg`8MNF;|6?lAX1&v{(nH^-&|h}rq_SMA%EBZ3Wi!T{O?dm66nM5t!)up z$riz&lTwgMFhiN6+agqIb{i#dVvfKHb6`5m8oo;)euCyYs{2VcJE}WfhMnedXqcml z?Gqm-wq8B_v%@RV8;`zzxSB|>#nWHbx&}T)Li+?HHE&I=^t?I!_KR=4`2L9-hpIas ztM)RIf7}sa{VS76_)2dd`epmkHt|<`jt0cv2SU)jE=)ol3^|_;peW0BRF<9m9Qtut z{!vNEyDM$7tQt94rn{I*T(YkGP)ZGg(9DJ4u*Es(|bb6 z&rS>7p$TUXBcIIqMJkL~eCNJ<5IT@Y2@u77-&OsbWvMv_Vp)~TV+u(DMS{UG{^tr@ z3rY{akZ|0_Ey*E!=AjqfPQ*6BL5Nd?K-?~w1frzn$D2nUWnt#Pm{W=1yrIuI;VI1v zcFyJNlY&iWI==#Zzc`BLS&0FG2r48V;B=^sC<}9xfFLSnGB)P-N&n3l&1S z6PK*>;9?-o2IJg-6K12Hw5<$6MHpjhw+ai#=6Gaw6MOJ08A{$Y`tP3aiN z5x8ZBq;NYWs4I+s^WGo5XeHQwJsudLY+3A660TyWYA7flLKR?YL93;hRJpH)^S zyH*%G?kd7nqT?{}8e758fMf1Pk&a7CwQju9Q|%sF4&90+uO+ULYHZJ1aF27z*&hoj zaGRZTo9&{Hu!&xKph?`bmX?Rw>p;#Z6cx)UGn1Rwd5NhMHOidC$vRl7zzb1cL-NYf zNhEkC($mD@S^ixeHJM*JuFBM*>~{f8u!dE34R8J`a@c`_$LZs+z}(P00}UXGAbdWC zgt0FILE*UY1!8TTx1Yz6u_^JN_PEypv literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_EKSBlowfish.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_EKSBlowfish.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6a7437dea1638c0ec70926ef1ca52817179573d GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_cbc.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_cbc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..347ef2d9f5130396af45669db563c4950b418bc6 GIT binary patch literal 9614 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 Yp1mI6do~sya(Lf=x%oVQ&K~mL0hw2f3;+NC literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_ccm.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_ccm.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..009dd33bf951b3d52f7f60b32630cb0c0cc53005 GIT binary patch literal 25892 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 Zr0Y$Ot7T>KiA2AfH~imnxz4eX{{xsLr@{aL literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_eax.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_eax.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20323e097fe849f11895f58694334bbf7b3590ae GIT binary patch literal 15070 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 a)dhO*-Te1Dm&Aib2c{f8_7r{7?0*B_DJK&E literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_kwp.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_kwp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62f608441c3fba12093a19a1ad8773ce03818aa3 GIT binary patch literal 5252 zcmb_g-ESMm5#Qq-KSWYrlq}owM^?5Ri-A63%dus(iLJ_XV)&zu<=Bm2ls@rR(pl6U zvv-t2hAIjp4|JTuG8{l`5uglEq$=Ep0O^B){sRRH6r}iI;hF*l>Y{L;)JhM9`_h>^ zeo0o+pzVU#+nt@Ao!y!F?JR%a*ytxv{xCMB{;ipiKVzp-JmtpvG&GioLKGoR#_{Wl z3$w0qmw;_CF3w8h60{}79e2-q#yzv%aj!sJ-`+A|Vy1lZFjbxsppH(AU? z@ivz}1$i_ zPTd$lDiDl;@(~V}jA8`piayH*Ms3F)h~l22GxLf5 zL<%%0TRYuShJpSHr4yGKhw8^<%}4eec-+}r?Ci}-A2+WCn(v*ub1FBn5};p&_O20O z|7l^J2yG(*v>T!JklhqG8&`MkU;5zw2l>He@8h1KV$V=%=SiRkS9f$~rJwlMK{~M- zs9YW`zZEuX1U71vD97LODE!whNW#+DiG z+6=|B-70CYmEuW*uPuOoD&CAM4Z5UZGYg{PGpl~Qo#!eI+exhWvn@la?)o zSC@OJ4QlSq2^<{5BNn7U5mx;FI;;cMMSy>-OZ&)0ajCvm9|P?BP3b2BsyJCm}2LB={;!vBZ&c*DR4U!$4N&jClug0=&ra zbg+T}*gFh#<9AR&{CALG%e~=`h9TMu``#>t-YNv&dKzfTrtZFxdwV6Y-=?1_g(8Ju zq(Z;G66m(+L#5EkLh$61P}?W5T=;=j40SIH#ny1vv)bC3yPlsb?&~YI_GLX!n!0{* z_Lt{BJO73Bo7ki9ms+ViQf!K3MHD%A_dB_+mB60WP{&g5{oco+my4m7^TzVE&oZUZ zvFs>dR7+ddzu_ir?TcrYF5JJ6Ke+7qthW>z$c{c~4rTp(7w*(wyWcm#44#M$Gu>d_ z{}0Sy@NWX9YM|a0>cY1MOwtUjy=g`r%zVuZgtEO5rl|jxa;sqr0lGC9TySX}Cf+4> z*Da=Ehkl{L&mk8w2b6HGVGuc+5pDiv=7kp8>DoSF%oW) z=OJRxFdK@tLA<2)-(X(NJ-;RBIm^^=48s~SbGN-F3h_kCx zp%pjP1f;N#^$vX-WYxJkrD}5Af!3-AF6r;=Uqs3FuOd9+l&W*Zh4X#VtUx^ z0Qf6N6UHp*GFXTof}Vl74BCe}m<5wc7vFx+k?XqOnNy0b2jFrDv@VW(G@R?mcm1rhUJ5Mm@z`SP-D``JccO*H zeTBgO{Nd%Z#RErI0!KG7Hn%LcelocD-h<=0v-eLGnhzFy2kl$n61;mM_0{BA7L8i| zDCWfQPKS0d8htM*$IBz$DCFOPYQT@oxt!uVaV(70QK)`J>=kSi zaRgwy!iFJ3^&$DYtI6$KqXGAx)z0oU5x!44_T(b@lZCy##g4vpH&E6(_q*G2EFW1u zS?E4i-2d7d0m7q0>-bqaExh9H&hN-4m({}I6UDBfH3Ec3?`+`5S>0Y3b3n^8GcQA0 z#XF%B1FxtS^gM+B^*N}PNCR9AieQ7WtCpQ+NXAux>M?SVnAPdsaP0tWSJE5!N2LyQ zs~25;Zh2c!#0Bw3;=C|V-WT5`^FmmX4}nUfoMDP6Q+NbX`>9lZE>l&bU;i#E<57Lm zSbk2`kaJ|SJjcwv)RbqKMkl#GOK;X*Nd3+W>1GXOYWU!QqKzt!h7N8bFdiubYcDmD zv1uwB_;N2R2ini;T&d=ufM_-4P&)ke18*K1=^%lHWE1mP3~LG)=mfN*j{WRQhc2py zf&ZB#WDd>?|Gf-f3QLv`)^VPc4ftP^(-a|9w4E<3ISO5}1L`T*H!36x0AC z;JdK=_T;C51MO{`g$lrAujoFp+SI=I&Yjt;xZxwgw#5^<(NcgGB>K+{FA28)g9z>u zUp4J4?CSls@x_scbH!b+m70zhe8>N_Cc@Bj1K--W-EHJS!;tvt&Oz}@_mCKF`zNyNujIgnXIc=tvy&SHziZdTHlZu;UnB5Y?RvQ`+Hhd? L^)nmzwb%JKpe_ti literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_ocb.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_ocb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80415c43b837ba07b84b46329d2cda84f3b903f1 GIT binary patch literal 19822 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_ofb.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_ofb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94e6a54c9413c181662271abadd0802cbc793c35 GIT binary patch literal 9422 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_openpgp.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_openpgp.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff2f1de3fffefca87706593fc29db003668eafcb GIT binary patch literal 6117 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_siv.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_mode_siv.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..509d879b0f3ab221a445034f269953ddfadaaffe GIT binary patch literal 14485 zcmdU0Yiu0Xb)MN5ce$ka6iLaHHF{ZGid@RFEy;|fn4&00vZXkZ>?Ev$<#1<~9BOxG zJu}PoGL)kT{y`;9WTOR4p+(KKDPY3}>NG*?pas&RMgJ5i$WSfWg#rkz+ra;1$w1q* zLHeD0=e5hVEg1=rj>Nk&ckc7tbI*6qxo7^Nxw%om^^fPKw2{Mt@Ne|sTw(j>?zeFB zx}XT-f+9|d8=V&gG(AIUc6;^XmL z(|8kmZpb$0HjQs$_t9)iu64YX-N&+Rx%TmPQ3wc62}HKY_nH8dE%17Z)>fC|n@!N3hnUSZ*4p9BpDb-3Da$eDMyjGe|ho=Gi;qLRed0kKi z&{h}^DB^ff31GG%C5SYvgpfv*FwzDkf;6f$AdM+eq>V}pX`JXa-lS|&nqC&ioAKL> z-%aIsqQ#(IbPvlQs2bL*vRpTltX=L?4%_X41HEpR8yMNQ7NtGGk8LySUIbVUKB}oxQ2$L)PiKG*{sR>Fx0fF&8h}#4n6sYl-4mg zDP!n4NtR5#XrxuVmo3RqV7sA%~q8V+mErrDr0ErZ~ynx~zhWi%`w_C{JajA8+6X;b;R zd{(=tN>~@rnHG=j8xvGYPfKWEboBIqG&b@Ts{0h(%jq;*JUNTG6-`vd@L0!rJ&##~ zZSuM$fnQ|PGW5bUwrK{HiCVQQU%jrJ{(3%JX3eSCcvvR1#|Q~tlr2k6U&J`mc%XHW zO5jb_vMJ|OsgRYmyrsTqNqxjql*d|5G!7%`rkyPB9Ob&6a6N(pmvz<;zUXp>bZ6CRNfH zkJNTTW$gayv}BJA^+~+ZXoy~tJS%Hic`~aqQjd(Cv%5C!Ro*vP=c>)DeWoh=Scmh( zr;;?vro-6pQ?o{Nztj#_yYAJ{J;me>rR(;=*I#+FG z?K4&J4IU&JeE7g&-nHAC^zcDD$DW}iJ#xS+!+Wnoxxrde)jrpdj`jYyuVvoH#@-+G zjqumn`+>)tnL3oNGxvj!{`%(5Mt@FKrHQjAMjt!y_@Rju6UnqgCUira(jf34(+a9F zkxJQYnoLS5yZEp)ZCM3#cxcGd^{koHR4bFzjj5q&E0-NIGHGg)bwZU$aPb5|l= z+f&Nzrc^2=(`K@mR^(aDOsYz8=p{p+l1p-Vh|S9!!d56@1jΜlMhKEv=`EIe?$4 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 HYyJNKiI9uY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_pkcs1_oaep_decode.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Cipher/__pycache__/_pkcs1_oaep_decode.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0f023d4fd228002b334ef0b1862486b588ce659 GIT binary patch literal 2067 zcmb7E&1(}u6rbJAmz%V)NNMW_4ffEiAE{dLqb)@&6_rx4r6M7)Y<9X`5=DpvWPhDLiAoO{D zQGXl<;2Yfp6ln>~8$|d3G@x+?D06wP%;)*CkQX?>1ITH-Ce(QUZa$(#-hg~mixM7N zjY;tz^gt5a0mD=@*;-Z6s)bF>EJGP7E3%;%-GnOJ`Wlq6n^fhhUct9y3!}BcDRwnC zrCTM4a>ULx2_gl&LETzq@& z^~(F9&1df}euU?4Fq2I#Zvk4K}2!J45y2_OK(3HKgnH zr;aq~>q^^~9qA5{>m!bIm!3Uwq={xSnw;F2+E0O0dgEb}gaayr4%wv0@<7-i0s$f6 zK0OcLYUwa7hesg*F`$J&@-KkemJA~JFiUpIz|yvC1L!bIb{beRND1o#ffP3@MG-}w zn+&z2jSNJcN)bc>>qfl~$K|ymN|U`!p+j+iP7(o~3fOsiHb)rgA??%fo;bXftlzDr z8`r|NUteNOgvBRg83cCur>ZejbhlbxWtj%&14qoYw literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_chacha20.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_chacha20.pyd new file mode 100644 index 0000000000000000000000000000000000000000..6d16bb1712300c9462320be489e63753447d51f7 GIT binary patch literal 13312 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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. +# =================================================================== + +""" +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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_cbc.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_cbc.pyi new file mode 100644 index 0000000..526632e --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ccm.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ccm.py new file mode 100644 index 0000000..ac27221 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ccm.py @@ -0,0 +1,671 @@ +# =================================================================== +# +# 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 CCMMessageTooLongError(ValueError): + pass + + +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 (7 <= len(nonce) <= 13): + raise ValueError("Length of parameter 'nonce' must be" + " in the range 7..13 bytes") + + # Message length (if known already) + q = 15 - len(nonce) # length of Q, the encoded message length + if msg_len and len(long_to_bytes(msg_len)) > q: + raise CCMMessageTooLongError("Message too long for a %u-byte nonce" % len(nonce)) + + # 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) + 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 (2..8) + flags = (self._assoc_len > 0) << 6 + flags |= ((self._mac_len - 2) // 2) << 3 + flags |= 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: + q = 15 - len(self.nonce) + if len(long_to_bytes(len(plaintext))) > q: + raise CCMMessageTooLongError("Message too long for a %u-byte nonce" % len(self.nonce)) + + 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: + msg = "Message longer than declared for (%u bytes vs %u bytes" % \ + (self._cumul_msg_len, self._msg_len) + raise CCMMessageTooLongError(msg) + + 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: + q = 15 - len(self.nonce) + if len(long_to_bytes(len(ciphertext))) > q: + raise CCMMessageTooLongError("Message too long for a %u-byte nonce" % len(self.nonce)) + + 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: + msg = "Message longer than declared for (%u bytes vs %u bytes" % \ + (self._cumul_msg_len, self._msg_len) + raise CCMMessageTooLongError(msg) + + 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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ccm.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ccm.pyi new file mode 100644 index 0000000..98af96a --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ccm.pyi @@ -0,0 +1,52 @@ +from types import ModuleType +from typing import Union, overload, Dict, Tuple, Optional + +Buffer = Union[bytes, bytearray, memoryview] + +__all__ = ['CcmMode'] + + +class CCMMessageTooLongError(ValueError): + pass + + +class CcmMode(object): + block_size: int + nonce: bytes + + def __init__(self, + factory: ModuleType, + key: Buffer, + nonce: Buffer, + mac_len: int, + msg_len: Optional[int], + assoc_len: Optional[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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_cfb.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_cfb.py new file mode 100644 index 0000000..1b1b6c3 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_cfb.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_cfb.pyi new file mode 100644 index 0000000..228e464 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ctr.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ctr.py new file mode 100644 index 0000000..9ce357f --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ctr.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ctr.pyi new file mode 100644 index 0000000..a68a890 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_eax.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_eax.py new file mode 100644 index 0000000..44ef21f --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_eax.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_eax.pyi new file mode 100644 index 0000000..cbfa467 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ecb.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ecb.py new file mode 100644 index 0000000..a01a16f --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ecb.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ecb.pyi new file mode 100644 index 0000000..936195f --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_gcm.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_gcm.py new file mode 100644 index 0000000..9914400 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_gcm.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_gcm.pyi new file mode 100644 index 0000000..8912955 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_kw.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_kw.py new file mode 100644 index 0000000..41c09ef --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_kw.py @@ -0,0 +1,158 @@ +import struct +from collections import deque + +from types import ModuleType +from typing import Union + +from Cryptodome.Util.strxor import strxor + + +def W(cipher: ModuleType, + plaintext: Union[bytes, bytearray]) -> bytes: + + S = [plaintext[i:i+8] for i in range(0, len(plaintext), 8)] + n = len(S) + s = 6 * (n - 1) + A = S[0] + R = deque(S[1:]) + + for t in range(1, s + 1): + t_64 = struct.pack('>Q', t) + ct = cipher.encrypt(A + R.popleft()) + A = strxor(ct[:8], t_64) + R.append(ct[8:]) + + return A + b''.join(R) + + +def W_inverse(cipher: ModuleType, + ciphertext: Union[bytes, bytearray]) -> bytes: + + C = [ciphertext[i:i+8] for i in range(0, len(ciphertext), 8)] + n = len(C) + s = 6 * (n - 1) + A = C[0] + R = deque(C[1:]) + + for t in range(s, 0, -1): + t_64 = struct.pack('>Q', t) + pt = cipher.decrypt(strxor(A, t_64) + R.pop()) + A = pt[:8] + R.appendleft(pt[8:]) + + return A + b''.join(R) + + +class KWMode(object): + """Key Wrap (KW) mode. + + This is a deterministic Authenticated Encryption (AE) mode + for protecting cryptographic keys. See `NIST SP800-38F`_. + + It provides both confidentiality and authenticity, and it designed + so that any bit of the ciphertext depends on all bits of the plaintext. + + This mode is only available for ciphers that operate on 128 bits blocks + (e.g., AES). + + .. _`NIST SP800-38F`: http://csrc.nist.gov/publications/nistpubs/800-38F/SP-800-38F.pdf + + :undocumented: __init__ + """ + + def __init__(self, + factory: ModuleType, + key: Union[bytes, bytearray]): + + self.block_size = factory.block_size + if self.block_size != 16: + raise ValueError("Key Wrap mode is only available for ciphers" + " that operate on 128 bits blocks") + + self._factory = factory + self._cipher = factory.new(key, factory.MODE_ECB) + self._done = False + + def seal(self, plaintext: Union[bytes, bytearray]) -> bytes: + """Encrypt and authenticate (wrap) a cryptographic key. + + Args: + plaintext: + The cryptographic key to wrap. + It must be at least 16 bytes long, and its length + must be a multiple of 8. + + Returns: + The wrapped key. + """ + + if self._done: + raise ValueError("The cipher cannot be used more than once") + + if len(plaintext) % 8: + raise ValueError("The plaintext must have length multiple of 8 bytes") + + if len(plaintext) < 16: + raise ValueError("The plaintext must be at least 16 bytes long") + + if len(plaintext) >= 2**32: + raise ValueError("The plaintext is too long") + + res = W(self._cipher, b'\xA6\xA6\xA6\xA6\xA6\xA6\xA6\xA6' + plaintext) + self._done = True + return res + + def unseal(self, ciphertext: Union[bytes, bytearray]) -> bytes: + """Decrypt and authenticate (unwrap) a cryptographic key. + + Args: + ciphertext: + The cryptographic key to unwrap. + It must be at least 24 bytes long, and its length + must be a multiple of 8. + + Returns: + The original key. + + Raises: ValueError + If the ciphertext or the key are not valid. + """ + + if self._done: + raise ValueError("The cipher cannot be used more than once") + + if len(ciphertext) % 8: + raise ValueError("The ciphertext must have length multiple of 8 bytes") + + if len(ciphertext) < 24: + raise ValueError("The ciphertext must be at least 24 bytes long") + + pt = W_inverse(self._cipher, ciphertext) + + if pt[:8] != b'\xA6\xA6\xA6\xA6\xA6\xA6\xA6\xA6': + raise ValueError("Incorrect integrity check value") + self._done = True + + return pt[8:] + + +def _create_kw_cipher(factory: ModuleType, + **kwargs: Union[bytes, bytearray]) -> KWMode: + """Create a new block cipher in Key Wrap mode. + + Args: + factory: + A block cipher module, taken from `Cryptodome.Cipher`. + The cipher must have block length of 16 bytes, such as AES. + + Keywords: + key: + The secret key to use to seal or unseal. + """ + + try: + key = kwargs["key"] + except KeyError as e: + raise TypeError("Missing parameter:" + str(e)) + + return KWMode(factory, key) diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_mode_kwp.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_kwp.py new file mode 100644 index 0000000..0868443 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_kwp.py @@ -0,0 +1,135 @@ +import struct + +from types import ModuleType +from typing import Union + +from ._mode_kw import W, W_inverse + + +class KWPMode(object): + """Key Wrap with Padding (KWP) mode. + + This is a deterministic Authenticated Encryption (AE) mode + for protecting cryptographic keys. See `NIST SP800-38F`_. + + It provides both confidentiality and authenticity, and it designed + so that any bit of the ciphertext depends on all bits of the plaintext. + + This mode is only available for ciphers that operate on 128 bits blocks + (e.g., AES). + + .. _`NIST SP800-38F`: http://csrc.nist.gov/publications/nistpubs/800-38F/SP-800-38F.pdf + + :undocumented: __init__ + """ + + def __init__(self, + factory: ModuleType, + key: Union[bytes, bytearray]): + + self.block_size = factory.block_size + if self.block_size != 16: + raise ValueError("Key Wrap with Padding mode is only available for ciphers" + " that operate on 128 bits blocks") + + self._factory = factory + self._cipher = factory.new(key, factory.MODE_ECB) + self._done = False + + def seal(self, plaintext: Union[bytes, bytearray]) -> bytes: + """Encrypt and authenticate (wrap) a cryptographic key. + + Args: + plaintext: + The cryptographic key to wrap. + + Returns: + The wrapped key. + """ + + if self._done: + raise ValueError("The cipher cannot be used more than once") + + if len(plaintext) == 0: + raise ValueError("The plaintext must be at least 1 byte") + + if len(plaintext) >= 2 ** 32: + raise ValueError("The plaintext is too long") + + padlen = (8 - len(plaintext)) % 8 + padded = plaintext + b'\x00' * padlen + + AIV = b'\xA6\x59\x59\xA6' + struct.pack('>I', len(plaintext)) + + if len(padded) == 8: + res = self._cipher.encrypt(AIV + padded) + else: + res = W(self._cipher, AIV + padded) + + return res + + def unseal(self, ciphertext: Union[bytes, bytearray]) -> bytes: + """Decrypt and authenticate (unwrap) a cryptographic key. + + Args: + ciphertext: + The cryptographic key to unwrap. + It must be at least 16 bytes long, and its length + must be a multiple of 8. + + Returns: + The original key. + + Raises: ValueError + If the ciphertext or the key are not valid. + """ + + if self._done: + raise ValueError("The cipher cannot be used more than once") + + if len(ciphertext) % 8: + raise ValueError("The ciphertext must have length multiple of 8 bytes") + + if len(ciphertext) < 16: + raise ValueError("The ciphertext must be at least 24 bytes long") + + if len(ciphertext) == 16: + S = self._cipher.decrypt(ciphertext) + else: + S = W_inverse(self._cipher, ciphertext) + + if S[:4] != b'\xA6\x59\x59\xA6': + raise ValueError("Incorrect decryption") + + Plen = struct.unpack('>I', S[4:8])[0] + + padlen = len(S) - 8 - Plen + if padlen < 0 or padlen > 7: + raise ValueError("Incorrect decryption") + + if S[len(S) - padlen:] != b'\x00' * padlen: + raise ValueError("Incorrect decryption") + + return S[8:len(S) - padlen] + + +def _create_kwp_cipher(factory: ModuleType, + **kwargs: Union[bytes, bytearray]) -> KWPMode: + """Create a new block cipher in Key Wrap with Padding mode. + + Args: + factory: + A block cipher module, taken from `Cryptodome.Cipher`. + The cipher must have block length of 16 bytes, such as AES. + + Keywords: + key: + The secret key to use to seal or unseal. + """ + + try: + key = kwargs["key"] + except KeyError as e: + raise TypeError("Missing parameter:" + str(e)) + + return KWPMode(factory, key) diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ocb.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ocb.py new file mode 100644 index 0000000..1295e61 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ocb.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ocb.pyi new file mode 100644 index 0000000..a1909fc --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ofb.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ofb.py new file mode 100644 index 0000000..8c0ccf6 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ofb.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_ofb.pyi new file mode 100644 index 0000000..d28608e --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_openpgp.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_openpgp.py new file mode 100644 index 0000000..d86ed19 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_openpgp.pyi new file mode 100644 index 0000000..14b8105 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_siv.py b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_siv.py new file mode 100644 index 0000000..4a76ad6 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_mode_siv.pyi b/venv/Lib/site-packages/Cryptodome/Cipher/_mode_siv.pyi new file mode 100644 index 0000000..2934f23 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Cipher/_pkcs1_decode.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_pkcs1_decode.pyd new file mode 100644 index 0000000000000000000000000000000000000000..13059c4f67a81346dbe1ec9562d00ec7a0e87a8f GIT binary patch literal 13312 zcmeHN4RjONm431urY%2hmu{PLNH>QX((aKk!7?$8aZ>^%U1*z=4mj;GX+t2{boRS5 zBU>hEw>@XO=WLUKnfvqZeeb^e?z``f#@@Skux!Ry4sKaytPhYbhw}W(k4tF2YSzK4 z*z@_vX7}kl$7a{HwuLRhQ0K-_V~3@wF%ak!EF1imP$Xb!3s_uttg>`;Hv7v93yoH- z>ly2B{`&f*b*c1y*NTDE-Jqx3RzJ8F(7d94aGla#pXyThcMjGmuy$~@0`F4VAHQww zpbzxpx7BIz`ze)PtaCLrqugPe#fi#0%0RZ4>o(kjPM$=EjNqyU>qxq&hAE2~92#u>kY zjFo|SZ6RYb$C)33R4`Vl7^=0|&`&0Pg-W^L?-IZ(n~n#WOmo-f0Zh3pu&O-N+$c0M zHoXum^vSNmeT5+ogiX0B#yB|$4DuEGC)^pAgRw+;P!&|>Sc^s)^HUi@KpoUyC>&}6 zuK1(@2=zzfXIu_N&fne%LGlp`;wCxxBJ*-Ewk(tW7-!6$=pV|wcxNg6!$GR?Jq9y#@)J#Yk2%2ooWBk;iU2S zhu^0C$>D@C2^Eh)HV)4@dU3=#=T6yWJnk}%@aU*6@*E9naGLfX;v!6dX`YzJYFSmk z`Yvak^DZ8Jv&=1?bBkkKe3y%-c<-R8X8`HTBmUS*yU5!sn|k(x;q6VBdY%Qsqwh{J zJ-mlxs*ai-{Ti{v$E@8DhPF`1-Do*L8$~wnoQ1}i%i7=(&vNRhS=b!Y%3vUPEoj>M0 zXhh#FJIG(TUj=9&k5NJ#1r@H+~SaI9z-hhz-5?8?*L}#Jdh7lJYuu8!7UDQ`^#KB&c!58N;aN6 zUuhgxiLx|eNh2j`q$rITjKjv`%9^`O`?2a+N315n4?eWjcad(7wHqclFGBi+;$b4W z__BNcAeUiM$^&~;liW$E(q&9&HjQJJajaw8yf!?1i0nJ$G^UIISKf#; zgybP(3Km29s8@V#IO&;xnv6|4jfXtqt43f~-lqK*9K%PHb-3U#?LUFpAGtW`kZTh>(|}WkLYuYKX;2imA*6;zC4ms&g{Q)iN{>x zi{9SXO+DmNHQsE0&8{>K!xv(T!zNzvw*V~DJICDxNl(Ebe`nY|H{q5Oyg>3+9S%JV z>twSN$Al;DHM*mhWm9j@`?9RWo>RPhZn`YXYB-+z0{DF(b$Af0=7GLKa$<$mWM9F(gV9 zm9n{=xIk^#X{!4%w6ZBTE1MEV1_%+~=kx!>v;Wi7<5T#^SF3?|;+@#6$7J(N^rLOo z9y>LN16=$W7gN&rOvu)!vCg;XT;h8!@g?j92DOtcT z14GGE#87h=VQTIoOwC<~kVsO)NhPZ~Da(HFNYxUmaTuq9@pxofe7(+@eP-087_IpC z1=>$aCiw}0+v#v(;LnJj8~Cn?JjT|Z9_7M=Stw${)P9ofAj!eSg&LK!`#N8i;6#y*4u&gR2q z{n9_9QXJJwcL137ClsDr942@U5wD!&PbC$y1WHwOa3*CccX$>K%!g7MoM0j6IZRPn`Qb zhKMhdqnC7>Yq+Q%!#fDldBiw?JgQ8-ST^4erg)MvD<%3LLIYkCU!`+zCytDXrmti+ z6(ac5rl_oo+=xyqpk^N-wF_`L@4aYxDk&ZL6V4k^zgZnvxGF6pn{&WI>d{B#?1*E0 z#PW<0g&Uw*t(lx3U!z0iY#S|3%gW}YIc>veuKhH%iv6^dU04l=bG>gpRo)ZvOp9l6 ziIOJvAC%2^pc3WcOS1VEAhMY& zWa?mk4x@c#xrfW8ONfV>+5ol60|+#*9ng;gqqQ8+zpY_?*baSEWmNZkx#lqS&6N*EyS(0h_qK7NtNXM$xRsReUg%%jcLN?71QRVAX;gVG0XQH~@qgG7|s2WfdMviXf^ z@Y6t4&U)ZET0GzSd(vxXspsOG>JsSt=AiQzDt4b)@KtOcUezBFc+_8lQM@Ix`8@jI zVoeE;)fCC*S3sePSx9(7#p7O!O7A7Q#sW2D)w33E2X3z^;`SszKpCBWr{Qx!*e8bK zCRY;P{|uRcNZ}~OKz@Qqto*uum{>+ZRm7v!kHQHok}I2i7-%9B55cX^&Vzzn`dKs} zHsgig0DX?KDv#@T0q-A&=ui4BOyN<3ReD23vM^RzzmoH%e}xhpJ=@R4oKkvW=OQhZ266x$PH-1J;wD>{t)zCz9U`*fr4(0-tPH>tXL(thNl(QBnuppiCvRCZ29Vl+>B z5X3&6G9c+7`Bx*%ko=!g`%CxL3Avs`gp{U98&o1s`W%qaH#79572rtA@X(kOd$XO+ z8o^qkZP3e<%&=1m{cqZ@p9|&Q z!53(&nOyzb^jCwH?#;%d17ey7ilqjX$cMk`fsUTvj&6|}D4x~6x~or?q7(5{WMlNQ zZu94*Ut$rkl4ZT8BUV^>2(6MHx-gEcK1%f4s!Tb&Y;Q4j>TAdW(UklL(?j~lA%Ix? z8UT?5LGA%KqVK>{r+6GD9MEH2>0LaOIKc6k?DO7@;&!pV{tOC>F5XnQ4G0e38Uooz zw=SmN@glyy0wj=@#m8VPDkPHu%jh?ZOa2!w+DaFzItn5L;jEKuzz$_(9OZrtGZ9gT^&kptx z_@$udbR>^IYW^A}LB*A6KYj@uw*8cl(=!s8BE10xoTq01(i5f_i|Y?StUp@%Rg&&k z&Vza$|AE!<9;UeUO)5~tQ(C5e1Qjuc%n@HYcEbU5#H7R6d9XX~9dq^#=YX*SY$9dz zY$~6{Z%7d1@uyCr5oZIkp=>rOg>^z$lFowhvr4NXG?59h+2ay5P%flC39-;Ya{|8t zajmVa@Jl0FYkRb}w+4nS!s+<+Q+sMv+SfI29{j`E3z82@B1F()_RyO|{eWDVe zQwIIfVG^$yGd&59xU8H8{Q?b&(HydQJy3+-6u90H=h@PKDChVy)?qk{Z#_&tTZcSE zzhx=AmdCHZnlgX9dJ4ekG*nx33Lpi}Bv(ZH4OH%*Q+F!X(5J3LTKBg|htNF>kg0o? z4Ehk=LkM6Rdm?QV*%S6b({7iTtg)ZQtDAG{SU~W%JGWj~;SWSy;)pnAA9Ti->uL&8 zrrpl1Z?y&d?pThsrr;?0$q_HZ@rGEPbxNd`M+-ONg<38hTPmBX6S+DjlvOw6W-(!Q zb&$Xe{l3fpg__E;*~;=N}ZoCwZnO6Q8{7Xuy51J4GeFAq|#IDfBd z?14{`tr*=UQq_`^9@}*AH~C>>O+ga6@6V`bW^3E7=^Bh_a*tP%9;GkXfNFkMMphyJ=}7ByVpTEW!3-_wvTjOgX&5Y3=^a&gffpptdd#+%!63xCc4cgN1 z)(@AzQva`|@gow;>dxv;%Ri0vq4#6@7Hb2tVtJj1@CFo1%C}l;M}V3eN*TKmFwL{t zZ0yV6Ju%MfQofVYx8L$M`qpaw4C%rD$~V$-o2{v3Bfb@brt!*`uf*%hawo|+CiCtl z9-qW>D{{4yd5YYcNxWJ`u3<7yk!zjAt5f8H;9;toEp>`qH+T$joBsZc^KCb}EN*1f1)ioY0#nOP6u{Mi{N4fX}^{wh+Bw{N6 zS^B%W1GE8URr!W+n3~gnCy@T0&KeLKU@PCvt%zD&4PZPy!BcD^{$ILu_$kmRWHJ3B z6p&N%*wkf(V+D!)prIkJHrK}3?7|#Y_<9c0zf#C{V$nV|l`$(Up3U%106zNwA8V8$ zr<<0;rv31$hQit@w%Id{Y~~*gtmO54R{V;Q6&x;LIl@%76Tk6fBksGDexaX1>tOs; zvw@j~d}eOWW9CJ<%v>?`Y!UVVT*xGBth=sd%ATNk9t8ek2CYM>oLiAqJC)|S$iR#% zbAzM{%b5(hPt0KKSuVd^Npb09rtjwy_nR1y4b1`8qriy}~E?>v;H=x~+!wjLEV0J^6 zO|#pkBmXbTXN48HwfQvO9K@5>|FV89C zA82h1G`IVkYr2~JK@z{UtzGbk82h$2z%N#gc?IzmN&My zhuQXQit)C__O|={t2}LCfulRN6V|%?8zLJw`a@|eZ?9ST*&2_%qP)4ioz5YZKs<4tCQ7?(?&y%op~z`dXCb@{w^R z%-7TzXldIBANvB0p-|^$Ut?(Fz4&oR)l{dOZt@52Z3}eYFdgHO9Ak~awgnyG1qiAIO(9`HtG_Y0pnc(jg$uM9UeS)fNffX^ znIcQbKTScz=||@}w$3ur@`@~{zgnboIpuLWM?Y=Rd~r#InR#Dp`562^_CQe)W8cJ0 zb!}#SM)lmmtMPsSKEZe~N=@JdzlFP%1ZaDqo>GWHDc6yRd~nbfy| zF9DQr_W>tZfIobru_^&qX?PuAT*G$&9@cPzr!@REz#P0IlP@u#=o2T|{ZaNB_I0HpW7O5g;kHoXMj5~RA7aDr5G5>Aln!yec`unhO>z(2k| z${x_+{H6+kbx-yJ)#!+`58>k@KjUa?XkhH|$w~^fWNBANyX9VgD2%eMdfviv+dPXu zfHJ==u(5hxeci1KD(6|k0_wlUb{y>0^S1cI^OoLHXk5}54*NScv~RJXgFv`?UL+K_ zIo#Ch?`RA!=xA#Sb%r}zgau8V9XB_IJIe1}IM0Iet*r$W&+5$4sH;z>`vUPHHh!d8 vSky8&plDagF3Ya6UAA4@cJ0`;W_NIR*KW3_WRGP}*&f@TkF}0zK-8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_pkcs1_oaep_decode.py b/venv/Lib/site-packages/Cryptodome/Cipher/_pkcs1_oaep_decode.py new file mode 100644 index 0000000..82bdaa7 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Cipher/_pkcs1_oaep_decode.py @@ -0,0 +1,41 @@ +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, c_size_t, + c_uint8_ptr) + + +_raw_pkcs1_decode = load_pycryptodome_raw_lib("Cryptodome.Cipher._pkcs1_decode", + """ + int pkcs1_decode(const uint8_t *em, size_t len_em, + const uint8_t *sentinel, size_t len_sentinel, + size_t expected_pt_len, + uint8_t *output); + + int oaep_decode(const uint8_t *em, + size_t em_len, + const uint8_t *lHash, + size_t hLen, + const uint8_t *db, + size_t db_len); + """) + + +def pkcs1_decode(em, sentinel, expected_pt_len, output): + if len(em) != len(output): + raise ValueError("Incorrect output length") + + ret = _raw_pkcs1_decode.pkcs1_decode(c_uint8_ptr(em), + c_size_t(len(em)), + c_uint8_ptr(sentinel), + c_size_t(len(sentinel)), + c_size_t(expected_pt_len), + c_uint8_ptr(output)) + return ret + + +def oaep_decode(em, lHash, db): + ret = _raw_pkcs1_decode.oaep_decode(c_uint8_ptr(em), + c_size_t(len(em)), + c_uint8_ptr(lHash), + c_size_t(len(lHash)), + c_uint8_ptr(db), + c_size_t(len(db))) + return ret diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_raw_aes.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_raw_aes.pyd new file mode 100644 index 0000000000000000000000000000000000000000..70e520debf53270e8b0d55c4595f89291af8cc11 GIT binary patch literal 35328 zcmeIb30zdw|NnncKvWPkFx(Oiw^BpLTvC(KK?g-e#U(dDL8TCg#Vs=pP{%7SrM8)A zS(#Z`nW>q9xZswkWiF+brMP6cq`2~bzR#V(0qwK&?e~8?{{Qdq{rL>{+%xx{d(OG< z^StkQy=SuL;CWhkP19U?6&GvTI<{iL>hHh)Q^ea<>Tal_t*N-D-a41CJ@q2S#H9oz zB`1zfjvgB@GCCn4F*RUBY(R2aLO@(XfTef8fU$`&vCX}_Dh1k`t~tE>8^b#V<~d#i zyM38An0?Rg4R#D=>({Npj$!Kk26>ZIeZ3tKY8$X)fZ8@v@6YevbVnrn^ScMyw@34g z{f274Z`{Z+at+6b!b3DIX1crf>8RjH$OrAA&@Ko9=-sNz%?*+{vZ zrn#%CyIbu96*7rfIW3AqjguUkd-si+p!u3Mn{zg@jggbHHBIJKTdisNT&KkHH7$sp ze4D1#E~&h?P{{jjRY&dbMX`0>FLO%s)Yu8B)a5ZBs;@F``#2nj254GT^W>Q5)M!on z<#B4Gc(vx$otKjZ<2KEW!!)Z*&{AG9hN--qESOO?PcjZvV`QxAnlCyXM3LiynTB%6Y?H=UQ01*_v?;}bbh=160%)NwOq=dJ~7TIaia|Fd-|4-!Wte_3=afg~LTbu63guP7)`B`Wi}%{WuI8MR9+t|7*mu8M ztY9x%Y)`rJPDKv%;5cmX;@Y>&u2AF-)hY%ptpId;1QySWohi0y*FI{Q!~D(O zYb}|w8|=Myt62}r)HoCZT1-1Erf)+`heK?=d_ru)eM9sE7Sn+c+W>#FzS*=@&v#sH zGX)Q`Z9wf1Y2CPDQ4RC76J@WMt;?Y$SIqWaySdZ_b3#n~|4@jnYe0xxX?UR7w4Vz$ z);H69(^A)S9$n4*j;_?T^2%OoM~Eqpkp-Fc!)DV_vu$`Qi=G=|+RVkejxWFT`0~qMb6<#QAHxYYn~rcni$&jMbi!)ZbMAM+un>Kyu@8)Pu;V_Av|FIp-M z+LkPrjp;C@6{^IoSh9+eHGPYZdANDl@L@x8p;%R`ZE~R1d+j8joYNkai>RsQC_JDF zwu!=8KPcMQ*PQbU6lDo@u70=ppuK3#GW%L=K0q*=%XnvYHy~IcUIs7gUMOgkz~Egd zfx#1;Pzr+#uM{b=8FJ}Wlw&b%!^gm0q1klVbj)lUSKD+BcMCAxHro;cEv6sLwkeIx z`hKC*eL8S=5ktj$7jc;m9J;3iEMuTJJcz4vZ9uinV#*azh3I(}(;hGen)XRIbQZ&a zU?=BOgE7XpwDaAy@Et?Ke&7X6sfpYRYNW)2;Rpd%rs zoj4wSxj$LV`ecPN?+wMZrkyT*6HGe(=0Oo)C& z`avIT!{h0P!L_7PgO`zVQ&NoySexg);b!f!ci`U*-gKN>Jwc6qvPI{KxYNG$nRC^Z zMFIeOZ){6s^_%tF`*cHLz-b=p{GEB&Bn#i7Z&yA!UDm!?KV&RES^EkE(m`44MhBHs zsHJ+pKB={@vt+DWnEIO05N!Gqa9y?1` zQ!?vEjsC4+N6$5zc$iOLNBMr;*+_lKik((yAo>KAPF=E?{wk1I=gEpRP`19h1LK;mG?=hW=W}*QIa5t`a1mSQ@iBNhe}Fy z9f$GME|Sk3-kCGX%iY;btQIwzdDv;q>S!9m)pO1Ot9@oYkCI22EhdmZ9RhhwEhLoU z>UV=T!DlcqUMNFUA>0n*H0cYm9uXS_xCh|@yNcmKfzE_kn{0~9Q#LANZnLA68l z%OR#q7F$w4hZ(>AE7ML%gVMbTVTP>BAW#T4#q)^}QL;jPT3Jd2)FdYl$pFfm`M z8mst!siB%K-hZT~OU6Linl4*RS8YihLQHoUWpIdTFCzrHWyTglsHw*rSNTn@!sJ*T zlPbeIQ+jx3$`0?WDe;!+oNY{)#q=8^3peYx%%&T*2@(2UhNU02k4oPqb7~tjh=pXo ze<#We%3{hlV{VYnGSiAPF(H%X|K6ZCKl1_s(p2ySO+^?-01I3T_>yv!3o*;Htuu?Y!oL z`|(LHz^WfED0iv2*rFfG^39ZW5jJvX=Kd+e!?L<~gqZgC&T^e;&FbMXYM$PwC^UVu zt62{&>X{W>XfqdCvqF8?^$blv<7&2rd+2@6+sx;w@nO$X@53>L?D?|iqxZRDGhd

*ZvOL9ZJf;Gnn+1%m&Qsh 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 DZ|*QF literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_raw_aesni.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_raw_aesni.pyd new file mode 100644 index 0000000000000000000000000000000000000000..97bf6e8d73e98e6c78e082e8c8f82e5ac1edfb94 GIT binary patch literal 15360 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_raw_arc2.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_raw_arc2.pyd new file mode 100644 index 0000000000000000000000000000000000000000..53f802ef1d0d8b47a5844e18de0ec1de0dacb8b6 GIT binary patch literal 14848 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 D@^G`# literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_raw_blowfish.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_raw_blowfish.pyd new file mode 100644 index 0000000000000000000000000000000000000000..a03f7044891d59124c800a05c9dce5c4fabecdb5 GIT binary patch literal 19456 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_raw_cbc.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_raw_cbc.pyd new file mode 100644 index 0000000000000000000000000000000000000000..dce36b11f65b3166ceaf74de0691bd453f62f3eb GIT binary patch literal 11776 zcmeHNeQ;aVmA|qrTmFh1u!2Yk$e<8slemtR1qa7Oisj^*m5WK7kODzgWI0x`B~^L~ zc7_&bWYZ|G+NK>~+0xE5DV?%i*iE}T)JZ$Lc5GsYIBk-$#gHj+mzF+bmUTi24z#@e zo%^0_ISl=$(?7c9jqf`j_uO;OJ@>wI&U

eFs@KV=M>G~ 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_raw_des.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_raw_des.pyd new file mode 100644 index 0000000000000000000000000000000000000000..4bbefdd46bf8fd053f3ab02ec6f242568997fbf1 GIT binary patch literal 52736 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 J{{v6{zXLSHS7!hK literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_raw_des3.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_raw_des3.pyd new file mode 100644 index 0000000000000000000000000000000000000000..d24825edcb6c6ccca5dce66c3f40f08904a7a24e GIT binary patch literal 52736 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_raw_ecb.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_raw_ecb.pyd new file mode 100644 index 0000000000000000000000000000000000000000..2170586611dd024ade90c983cc0fbf97f80ec7fe GIT binary patch literal 10240 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 G|Nje@Vnbm7 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_raw_ocb.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_raw_ocb.pyd new file mode 100644 index 0000000000000000000000000000000000000000..75b56755ab4bcc6da26e5cb6a76d4e4150012628 GIT binary patch literal 17920 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 G!T(<&cy)RJ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Cipher/_raw_ofb.pyd b/venv/Lib/site-packages/Cryptodome/Cipher/_raw_ofb.pyd new file mode 100644 index 0000000000000000000000000000000000000000..2266fdc7ff57c8e922299600287481738cd5c488 GIT binary patch literal 11776 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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 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/venv/Lib/site-packages/Cryptodome/Hash/BLAKE2b.pyi b/venv/Lib/site-packages/Cryptodome/Hash/BLAKE2b.pyi new file mode 100644 index 0000000..d37c374 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/BLAKE2s.py b/venv/Lib/site-packages/Cryptodome/Hash/BLAKE2s.py new file mode 100644 index 0000000..43be5c4 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/BLAKE2s.pyi b/venv/Lib/site-packages/Cryptodome/Hash/BLAKE2s.pyi new file mode 100644 index 0000000..374b3a4 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/CMAC.py b/venv/Lib/site-packages/Cryptodome/Hash/CMAC.py new file mode 100644 index 0000000..8feb79f --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/CMAC.py @@ -0,0 +1,306 @@ +# -*- coding: utf-8 -*- +# +# Hash/CMAC.py - Implements the CMAC algorithm +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from binascii import unhexlify + +from Cryptodome.Hash import BLAKE2s +from Cryptodome.Util.strxor import strxor +from Cryptodome.Util.number import long_to_bytes, bytes_to_long +from Cryptodome.Util.py3compat import bord, tobytes, _copy_bytes +from Cryptodome.Random import get_random_bytes + + +# The size of the authentication tag produced by the MAC. +digest_size = None + + +def _shift_bytes(bs, xor_lsb=0): + num = (bytes_to_long(bs) << 1) ^ xor_lsb + return long_to_bytes(num, len(bs))[-len(bs):] + + +class CMAC(object): + """A CMAC hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting MAC tag + :vartype digest_size: integer + """ + + digest_size = None + + def __init__(self, key, msg, ciphermod, cipher_params, mac_len, + update_after_digest): + + self.digest_size = mac_len + + self._key = _copy_bytes(None, None, key) + self._factory = ciphermod + self._cipher_params = cipher_params + self._block_size = bs = ciphermod.block_size + self._mac_tag = None + self._update_after_digest = update_after_digest + + # Section 5.3 of NIST SP 800 38B and Appendix B + if bs == 8: + const_Rb = 0x1B + self._max_size = 8 * (2 ** 21) + elif bs == 16: + const_Rb = 0x87 + self._max_size = 16 * (2 ** 48) + else: + raise TypeError("CMAC requires a cipher with a block size" + " of 8 or 16 bytes, not %d" % bs) + + # Compute sub-keys + zero_block = b'\x00' * bs + self._ecb = ciphermod.new(key, + ciphermod.MODE_ECB, + **self._cipher_params) + L = self._ecb.encrypt(zero_block) + if bord(L[0]) & 0x80: + self._k1 = _shift_bytes(L, const_Rb) + else: + self._k1 = _shift_bytes(L) + if bord(self._k1[0]) & 0x80: + self._k2 = _shift_bytes(self._k1, const_Rb) + else: + self._k2 = _shift_bytes(self._k1) + + # Initialize CBC cipher with zero IV + self._cbc = ciphermod.new(key, + ciphermod.MODE_CBC, + zero_block, + **self._cipher_params) + + # Cache for outstanding data to authenticate + self._cache = bytearray(bs) + self._cache_n = 0 + + # Last piece of ciphertext produced + self._last_ct = zero_block + + # Last block that was encrypted with AES + self._last_pt = None + + # Counter for total message size + self._data_size = 0 + + if msg: + self.update(msg) + + def update(self, msg): + """Authenticate the next chunk of message. + + Args: + data (byte string/byte array/memoryview): The next chunk of data + """ + + if self._mac_tag is not None and not self._update_after_digest: + raise TypeError("update() cannot be called after digest() or verify()") + + self._data_size += len(msg) + bs = self._block_size + + if self._cache_n > 0: + filler = min(bs - self._cache_n, len(msg)) + self._cache[self._cache_n:self._cache_n+filler] = msg[:filler] + self._cache_n += filler + + if self._cache_n < bs: + return self + + msg = memoryview(msg)[filler:] + self._update(self._cache) + self._cache_n = 0 + + remain = len(msg) % bs + if remain > 0: + self._update(msg[:-remain]) + self._cache[:remain] = msg[-remain:] + else: + self._update(msg) + self._cache_n = remain + return self + + def _update(self, data_block): + """Update a block aligned to the block boundary""" + + bs = self._block_size + assert len(data_block) % bs == 0 + + if len(data_block) == 0: + return + + ct = self._cbc.encrypt(data_block) + if len(data_block) == bs: + second_last = self._last_ct + else: + second_last = ct[-bs*2:-bs] + self._last_ct = ct[-bs:] + self._last_pt = strxor(second_last, data_block[-bs:]) + + def copy(self): + """Return a copy ("clone") of the CMAC object. + + The copy will have the same internal state as the original CMAC + object. + This can be used to efficiently compute the MAC tag of byte + strings that share a common initial substring. + + :return: An :class:`CMAC` + """ + + obj = self.__new__(CMAC) + obj.__dict__ = self.__dict__.copy() + obj._cbc = self._factory.new(self._key, + self._factory.MODE_CBC, + self._last_ct, + **self._cipher_params) + obj._cache = self._cache[:] + obj._last_ct = self._last_ct[:] + return obj + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message + that has been authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bs = self._block_size + + if self._mac_tag is not None and not self._update_after_digest: + return self._mac_tag + + if self._data_size > self._max_size: + raise ValueError("MAC is unsafe for this message") + + if self._cache_n == 0 and self._data_size > 0: + # Last block was full + pt = strxor(self._last_pt, self._k1) + else: + # Last block is partial (or message length is zero) + partial = self._cache[:] + partial[self._cache_n:] = b'\x80' + b'\x00' * (bs - self._cache_n - 1) + pt = strxor(strxor(self._last_ct, partial), self._k2) + + self._mac_tag = self._ecb.encrypt(pt)[:self.digest_size] + + return self._mac_tag + + def hexdigest(self): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) + for x in tuple(self.digest())]) + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte array/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + +def new(key, msg=None, ciphermod=None, cipher_params=None, mac_len=None, + update_after_digest=False): + """Create a new MAC object. + + Args: + key (byte string/byte array/memoryview): + key for the CMAC object. + The key must be valid for the underlying cipher algorithm. + For instance, it must be 16 bytes long for AES-128. + ciphermod (module): + A cipher module from :mod:`Cryptodome.Cipher`. + The cipher's block size has to be 128 bits, + like :mod:`Cryptodome.Cipher.AES`, to reduce the probability + of collisions. + msg (byte string/byte array/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to `CMAC.update`. Optional. + cipher_params (dict): + Optional. A set of parameters to use when instantiating a cipher + object. + mac_len (integer): + Length of the MAC, in bytes. + It must be at least 4 bytes long. + The default (and recommended) length matches the size of a cipher block. + update_after_digest (boolean): + Optional. By default, a hash object cannot be updated anymore after + the digest is computed. When this flag is ``True``, such check + is no longer enforced. + Returns: + A :class:`CMAC` object + """ + + if ciphermod is None: + raise TypeError("ciphermod must be specified (try AES)") + + cipher_params = {} if cipher_params is None else dict(cipher_params) + + if mac_len is None: + mac_len = ciphermod.block_size + + if mac_len < 4: + raise ValueError("MAC tag length must be at least 4 bytes long") + + if mac_len > ciphermod.block_size: + raise ValueError("MAC tag length cannot be larger than a cipher block (%d) bytes" % ciphermod.block_size) + + return CMAC(key, msg, ciphermod, cipher_params, mac_len, + update_after_digest) diff --git a/venv/Lib/site-packages/Cryptodome/Hash/CMAC.pyi b/venv/Lib/site-packages/Cryptodome/Hash/CMAC.pyi new file mode 100644 index 0000000..acdf055 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/HMAC.py b/venv/Lib/site-packages/Cryptodome/Hash/HMAC.py new file mode 100644 index 0000000..615056a --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/HMAC.py @@ -0,0 +1,238 @@ +# +# 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 BLAKE2s +from Cryptodome.Util.strxor import strxor +from Cryptodome.Random import get_random_bytes + +__all__ = ['new', 'HMAC'] + +_hash2hmac_oid = { + '1.3.14.3.2.26': '1.2.840.113549.2.7', # SHA-1 + '2.16.840.1.101.3.4.2.4': '1.2.840.113549.2.8', # SHA-224 + '2.16.840.1.101.3.4.2.1': '1.2.840.113549.2.9', # SHA-256 + '2.16.840.1.101.3.4.2.2': '1.2.840.113549.2.10', # SHA-384 + '2.16.840.1.101.3.4.2.3': '1.2.840.113549.2.11', # SHA-512 + '2.16.840.1.101.3.4.2.5': '1.2.840.113549.2.12', # SHA-512_224 + '2.16.840.1.101.3.4.2.6': '1.2.840.113549.2.13', # SHA-512_256 + '2.16.840.1.101.3.4.2.7': '2.16.840.1.101.3.4.2.13', # SHA-3 224 + '2.16.840.1.101.3.4.2.8': '2.16.840.1.101.3.4.2.14', # SHA-3 256 + '2.16.840.1.101.3.4.2.9': '2.16.840.1.101.3.4.2.15', # SHA-3 384 + '2.16.840.1.101.3.4.2.10': '2.16.840.1.101.3.4.2.16', # SHA-3 512 +} + +_hmac2hash_oid = {v: k for k, v in _hash2hmac_oid.items()} + + +class HMAC(object): + """An HMAC hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting MAC tag + :vartype digest_size: integer + + :ivar oid: the ASN.1 object ID of the HMAC algorithm. + Only present if the algorithm was officially assigned one. + """ + + def __init__(self, key, msg=b"", digestmod=None): + + if digestmod is None: + from Cryptodome.Hash import MD5 + digestmod = MD5 + + if msg is None: + msg = b"" + + # Size of the MAC tag + self.digest_size = digestmod.digest_size + + self._digestmod = digestmod + + # Hash OID --> HMAC OID + try: + self.oid = _hash2hmac_oid[digestmod.oid] + except (KeyError, AttributeError): + pass + + if isinstance(key, memoryview): + key = key.tobytes() + + try: + if len(key) <= digestmod.block_size: + # Step 1 or 2 + key_0 = key + b"\x00" * (digestmod.block_size - len(key)) + else: + # Step 3 + hash_k = digestmod.new(key).digest() + key_0 = hash_k + b"\x00" * (digestmod.block_size - len(hash_k)) + except AttributeError: + # Not all hash types have "block_size" + raise ValueError("Hash type incompatible to HMAC") + + # Step 4 + key_0_ipad = strxor(key_0, b"\x36" * len(key_0)) + + # Start step 5 and 6 + self._inner = digestmod.new(key_0_ipad) + self._inner.update(msg) + + # Step 7 + key_0_opad = strxor(key_0, b"\x5c" * len(key_0)) + + # Start step 8 and 9 + self._outer = digestmod.new(key_0_opad) + + def update(self, msg): + """Authenticate the next chunk of message. + + Args: + data (byte string/byte array/memoryview): The next chunk of data + """ + + self._inner.update(msg) + return self + + def _pbkdf2_hmac_assist(self, first_digest, iterations): + """Carry out the expensive inner loop for PBKDF2-HMAC""" + + result = self._digestmod._pbkdf2_hmac_assist( + self._inner, + self._outer, + first_digest, + iterations) + return result + + def copy(self): + """Return a copy ("clone") of the HMAC object. + + The copy will have the same internal state as the original HMAC + object. + This can be used to efficiently compute the MAC tag of byte + strings that share a common initial substring. + + :return: An :class:`HMAC` + """ + + new_hmac = HMAC(b"fake key", digestmod=self._digestmod) + + # Syncronize the state + new_hmac._inner = self._inner.copy() + new_hmac._outer = self._outer.copy() + + return new_hmac + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message + authenticated so far. + + :return: The MAC tag digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + frozen_outer_hash = self._outer.copy() + frozen_outer_hash.update(self._inner.digest()) + return frozen_outer_hash.digest() + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte string/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexdigest(self): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) + for x in tuple(self.digest())]) + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, + as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + +def new(key, msg=b"", digestmod=None): + """Create a new MAC object. + + Args: + key (bytes/bytearray/memoryview): + key for the MAC object. + It must be long enough to match the expected security level of the + MAC. + msg (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to :meth:`HMAC.update`. + digestmod (module): + The hash to use to implement the HMAC. + Default is :mod:`Cryptodome.Hash.MD5`. + + Returns: + An :class:`HMAC` object + """ + + return HMAC(key, msg, digestmod) diff --git a/venv/Lib/site-packages/Cryptodome/Hash/HMAC.pyi b/venv/Lib/site-packages/Cryptodome/Hash/HMAC.pyi new file mode 100644 index 0000000..b577230 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/KMAC128.py b/venv/Lib/site-packages/Cryptodome/Hash/KMAC128.py new file mode 100644 index 0000000..afd91c4 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/KMAC128.pyi b/venv/Lib/site-packages/Cryptodome/Hash/KMAC128.pyi new file mode 100644 index 0000000..8947dab --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/KMAC256.py b/venv/Lib/site-packages/Cryptodome/Hash/KMAC256.py new file mode 100644 index 0000000..82da062 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/KMAC256.pyi b/venv/Lib/site-packages/Cryptodome/Hash/KMAC256.pyi new file mode 100644 index 0000000..86cc500 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/KangarooTwelve.py b/venv/Lib/site-packages/Cryptodome/Hash/KangarooTwelve.py new file mode 100644 index 0000000..60ced57 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/KangarooTwelve.py @@ -0,0 +1,222 @@ +# =================================================================== +# +# 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.number import long_to_bytes +from Cryptodome.Util.py3compat import bchr + +from . import TurboSHAKE128 + +def _length_encode(x): + if x == 0: + return b'\x00' + + S = long_to_bytes(x) + return S + bchr(len(S)) + + +# Possible states for a KangarooTwelve instance, which depend on the amount of data processed so far. +SHORT_MSG = 1 # Still within the first 8192 bytes, but it is not certain we will exceed them. +LONG_MSG_S0 = 2 # Still within the first 8192 bytes, and it is certain we will exceed them. +LONG_MSG_SX = 3 # Beyond the first 8192 bytes. +SQUEEZING = 4 # No more data to process. + + +class K12_XOF(object): + """A KangarooTwelve hash object. + Do not instantiate directly. + Use the :func:`new` function. + """ + + def __init__(self, data, custom): + + if custom == None: + custom = b'' + + self._custom = custom + _length_encode(len(custom)) + self._state = SHORT_MSG + self._padding = None # Final padding is only decided in read() + + # Internal hash that consumes FinalNode + # The real domain separation byte will be known before squeezing + self._hash1 = TurboSHAKE128.new(domain=1) + self._length1 = 0 + + # Internal hash that produces CV_i (reset each time) + self._hash2 = None + self._length2 = 0 + + # Incremented by one for each 8192-byte block + self._ctr = 0 + + if data: + self.update(data) + + def update(self, data): + """Hash the next piece of data. + + .. note:: + For better performance, submit chunks with a length multiple of 8192 bytes. + + Args: + data (byte string/byte array/memoryview): The next chunk of the + message to hash. + """ + + if self._state == SQUEEZING: + raise TypeError("You cannot call 'update' after the first 'read'") + + if self._state == SHORT_MSG: + next_length = self._length1 + len(data) + + if next_length + len(self._custom) <= 8192: + self._length1 = next_length + self._hash1.update(data) + return self + + # Switch to tree hashing + self._state = LONG_MSG_S0 + + if self._state == LONG_MSG_S0: + data_mem = memoryview(data) + assert(self._length1 < 8192) + dtc = min(len(data), 8192 - self._length1) + self._hash1.update(data_mem[:dtc]) + self._length1 += dtc + + if self._length1 < 8192: + return self + + # Finish hashing S_0 and start S_1 + assert(self._length1 == 8192) + + divider = b'\x03' + b'\x00' * 7 + self._hash1.update(divider) + self._length1 += 8 + + self._hash2 = TurboSHAKE128.new(domain=0x0B) + self._length2 = 0 + self._ctr = 1 + + self._state = LONG_MSG_SX + return self.update(data_mem[dtc:]) + + # LONG_MSG_SX + assert(self._state == LONG_MSG_SX) + index = 0 + len_data = len(data) + + # All iteractions could actually run in parallel + data_mem = memoryview(data) + while index < len_data: + + new_index = min(index + 8192 - self._length2, len_data) + self._hash2.update(data_mem[index:new_index]) + self._length2 += new_index - index + index = new_index + + if self._length2 == 8192: + cv_i = self._hash2.read(32) + self._hash1.update(cv_i) + self._length1 += 32 + self._hash2._reset() + self._length2 = 0 + self._ctr += 1 + + return self + + def read(self, length): + """ + Produce more bytes of the digest. + + .. note:: + You cannot use :meth:`update` anymore after the first call to + :meth:`read`. + + Args: + length (integer): the amount of bytes this method must return + + :return: the next piece of XOF output (of the given length) + :rtype: byte string + """ + + custom_was_consumed = False + + if self._state == SHORT_MSG: + self._hash1.update(self._custom) + self._padding = 0x07 + self._state = SQUEEZING + + if self._state == LONG_MSG_S0: + self.update(self._custom) + custom_was_consumed = True + assert(self._state == LONG_MSG_SX) + + if self._state == LONG_MSG_SX: + if not custom_was_consumed: + self.update(self._custom) + + # Is there still some leftover data in hash2? + if self._length2 > 0: + cv_i = self._hash2.read(32) + self._hash1.update(cv_i) + self._length1 += 32 + self._hash2._reset() + self._length2 = 0 + self._ctr += 1 + + trailer = _length_encode(self._ctr - 1) + b'\xFF\xFF' + self._hash1.update(trailer) + + self._padding = 0x06 + self._state = SQUEEZING + + self._hash1._domain = self._padding + return self._hash1.read(length) + + def new(self, data=None, custom=b''): + return type(self)(data, custom) + + +def new(data=None, custom=None): + """Return a fresh instance of a KangarooTwelve object. + + Args: + data (bytes/bytearray/memoryview): + Optional. + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + custom (bytes): + Optional. + A customization byte string. + + :Return: A :class:`K12_XOF` object + """ + + return K12_XOF(data, custom) diff --git a/venv/Lib/site-packages/Cryptodome/Hash/KangarooTwelve.pyi b/venv/Lib/site-packages/Cryptodome/Hash/KangarooTwelve.pyi new file mode 100644 index 0000000..8b3fd74 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/MD2.py b/venv/Lib/site-packages/Cryptodome/Hash/MD2.py new file mode 100644 index 0000000..47ecc05 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/MD2.pyi b/venv/Lib/site-packages/Cryptodome/Hash/MD2.pyi new file mode 100644 index 0000000..95a97a9 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/MD4.py b/venv/Lib/site-packages/Cryptodome/Hash/MD4.py new file mode 100644 index 0000000..668fa65 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/MD4.pyi b/venv/Lib/site-packages/Cryptodome/Hash/MD4.pyi new file mode 100644 index 0000000..a9a7295 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/MD5.py b/venv/Lib/site-packages/Cryptodome/Hash/MD5.py new file mode 100644 index 0000000..8f573a9 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/MD5.pyi b/venv/Lib/site-packages/Cryptodome/Hash/MD5.pyi new file mode 100644 index 0000000..d819556 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/Poly1305.py b/venv/Lib/site-packages/Cryptodome/Hash/Poly1305.py new file mode 100644 index 0000000..c03f522 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/Poly1305.pyi b/venv/Lib/site-packages/Cryptodome/Hash/Poly1305.pyi new file mode 100644 index 0000000..f97a14a --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/RIPEMD.py b/venv/Lib/site-packages/Cryptodome/Hash/RIPEMD.py new file mode 100644 index 0000000..35ad576 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/RIPEMD.pyi b/venv/Lib/site-packages/Cryptodome/Hash/RIPEMD.pyi new file mode 100644 index 0000000..cfb2252 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/RIPEMD160.py b/venv/Lib/site-packages/Cryptodome/Hash/RIPEMD160.py new file mode 100644 index 0000000..f959027 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/RIPEMD160.pyi b/venv/Lib/site-packages/Cryptodome/Hash/RIPEMD160.pyi new file mode 100644 index 0000000..b619473 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA.py b/venv/Lib/site-packages/Cryptodome/Hash/SHA.py new file mode 100644 index 0000000..95f8745 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHA.pyi new file mode 100644 index 0000000..7d01a5f --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA1.py b/venv/Lib/site-packages/Cryptodome/Hash/SHA1.py new file mode 100644 index 0000000..dea51bc --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA1.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHA1.pyi new file mode 100644 index 0000000..d6c8e25 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA224.py b/venv/Lib/site-packages/Cryptodome/Hash/SHA224.py new file mode 100644 index 0000000..fca7622 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA224.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHA224.pyi new file mode 100644 index 0000000..613a7f9 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA256.py b/venv/Lib/site-packages/Cryptodome/Hash/SHA256.py new file mode 100644 index 0000000..c1a81b1 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA256.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHA256.pyi new file mode 100644 index 0000000..cbf21bf --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA384.py b/venv/Lib/site-packages/Cryptodome/Hash/SHA384.py new file mode 100644 index 0000000..711aa73 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA384.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHA384.pyi new file mode 100644 index 0000000..c2aab9e --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA3_224.py b/venv/Lib/site-packages/Cryptodome/Hash/SHA3_224.py new file mode 100644 index 0000000..34888c5 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA3_224.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHA3_224.pyi new file mode 100644 index 0000000..2180821 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA3_256.py b/venv/Lib/site-packages/Cryptodome/Hash/SHA3_256.py new file mode 100644 index 0000000..024962f --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA3_256.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHA3_256.pyi new file mode 100644 index 0000000..88436bd --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA3_384.py b/venv/Lib/site-packages/Cryptodome/Hash/SHA3_384.py new file mode 100644 index 0000000..26eeb79 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA3_384.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHA3_384.pyi new file mode 100644 index 0000000..98d00c6 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA3_512.py b/venv/Lib/site-packages/Cryptodome/Hash/SHA3_512.py new file mode 100644 index 0000000..99b1c37 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA3_512.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHA3_512.pyi new file mode 100644 index 0000000..cdeec16 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA512.py b/venv/Lib/site-packages/Cryptodome/Hash/SHA512.py new file mode 100644 index 0000000..5066197 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHA512.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHA512.pyi new file mode 100644 index 0000000..f219ee9 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/SHAKE128.py b/venv/Lib/site-packages/Cryptodome/Hash/SHAKE128.py new file mode 100644 index 0000000..847b514 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/SHAKE128.py @@ -0,0 +1,145 @@ +# =================================================================== +# +# 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 copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + + :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 SHAKE128" % result) + return clone + + 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/venv/Lib/site-packages/Cryptodome/Hash/SHAKE128.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHAKE128.pyi new file mode 100644 index 0000000..de51d8e --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/SHAKE128.pyi @@ -0,0 +1,14 @@ +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 copy(self) -> SHAKE128_XOF: ... + def new(self, data: Optional[Buffer] = ...) -> SHAKE128_XOF: ... + +def new(data: Optional[Buffer] = ...) -> SHAKE128_XOF: ... diff --git a/venv/Lib/site-packages/Cryptodome/Hash/SHAKE256.py b/venv/Lib/site-packages/Cryptodome/Hash/SHAKE256.py new file mode 100644 index 0000000..637044e --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/SHAKE256.py @@ -0,0 +1,146 @@ +# =================================================================== +# +# 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 copy(self): + """Return a copy ("clone") of the hash object. + + The copy will have the same internal state as the original hash + object. + + :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 SHAKE256" % result) + return clone + + 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/venv/Lib/site-packages/Cryptodome/Hash/SHAKE256.pyi b/venv/Lib/site-packages/Cryptodome/Hash/SHAKE256.pyi new file mode 100644 index 0000000..72eb898 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/SHAKE256.pyi @@ -0,0 +1,14 @@ +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 copy(self) -> SHAKE256_XOF: ... + def new(self, data: Optional[Buffer] = ...) -> SHAKE256_XOF: ... + +def new(data: Optional[Buffer] = ...) -> SHAKE256_XOF: ... diff --git a/venv/Lib/site-packages/Cryptodome/Hash/TupleHash128.py b/venv/Lib/site-packages/Cryptodome/Hash/TupleHash128.py new file mode 100644 index 0000000..49aeccc --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/TupleHash128.py @@ -0,0 +1,136 @@ +# =================================================================== +# +# 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 tuple of byte strings. + TupleHash guarantees the logical separation between each byte string. + + Args: + data (bytes/bytearray/memoryview): One or more items to hash. + """ + + if self._digest is not None: + raise TypeError("You cannot call 'update' after 'digest' or 'hexdigest'") + + for item in data: + if not is_bytes(item): + raise TypeError("You can only call 'update' on bytes" ) + self._cshake.update(_encode_str(item)) + + return self + + 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'') + + return TupleHash(custom, cSHAKE128, digest_bytes) diff --git a/venv/Lib/site-packages/Cryptodome/Hash/TupleHash128.pyi b/venv/Lib/site-packages/Cryptodome/Hash/TupleHash128.pyi new file mode 100644 index 0000000..2e0ea83 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/TupleHash128.pyi @@ -0,0 +1,22 @@ +from typing import Any, Union, List, Tuple +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/venv/Lib/site-packages/Cryptodome/Hash/TupleHash256.py b/venv/Lib/site-packages/Cryptodome/Hash/TupleHash256.py new file mode 100644 index 0000000..40a824a --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/TupleHash256.py @@ -0,0 +1,70 @@ +# =================================================================== +# +# 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'') + + return TupleHash(custom, cSHAKE256, digest_bytes) diff --git a/venv/Lib/site-packages/Cryptodome/Hash/TupleHash256.pyi b/venv/Lib/site-packages/Cryptodome/Hash/TupleHash256.pyi new file mode 100644 index 0000000..82d943f --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE128.py b/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE128.py new file mode 100644 index 0000000..92ac59e --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE128.py @@ -0,0 +1,112 @@ +from Cryptodome.Util._raw_api import (VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr, c_ubyte) + +from Cryptodome.Util.number import long_to_bytes +from Cryptodome.Util.py3compat import bchr + +from .keccak import _raw_keccak_lib + + +class TurboSHAKE(object): + """A TurboSHAKE hash object. + Do not instantiate directly. + Use the :func:`new` function. + """ + + def __init__(self, capacity, domain_separation, data): + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(capacity), + c_ubyte(12)) # Reduced number of rounds + if result: + raise ValueError("Error %d while instantiating TurboSHAKE" + % result) + self._state = SmartPointer(state.get(), _raw_keccak_lib.keccak_destroy) + + self._is_squeezing = False + self._capacity = capacity + self._domain = domain_separation + + if data: + self.update(data) + + + def update(self, data): + """Continue hashing of a message by consuming the next chunk of data. + + Args: + data (byte string/byte array/memoryview): The next chunk of the message being hashed. + """ + + if self._is_squeezing: + raise TypeError("You cannot call 'update' after the first 'read'") + + result = _raw_keccak_lib.keccak_absorb(self._state.get(), + c_uint8_ptr(data), + c_size_t(len(data))) + if result: + raise ValueError("Error %d while updating TurboSHAKE state" + % result) + return self + + def read(self, length): + """ + Compute the next piece of XOF output. + + .. note:: + You cannot use :meth:`update` anymore after the first call to + :meth:`read`. + + Args: + length (integer): the amount of bytes this method must return + + :return: the next piece of XOF output (of the given length) + :rtype: byte string + """ + + self._is_squeezing = True + bfr = create_string_buffer(length) + result = _raw_keccak_lib.keccak_squeeze(self._state.get(), + bfr, + c_size_t(length), + c_ubyte(self._domain)) + if result: + raise ValueError("Error %d while extracting from TurboSHAKE" + % result) + + return get_raw_buffer(bfr) + + def new(self, data=None): + return type(self)(self._capacity, self._domain, data) + + def _reset(self): + result = _raw_keccak_lib.keccak_reset(self._state.get()) + if result: + raise ValueError("Error %d while resetting TurboSHAKE state" + % result) + self._is_squeezing = False + + +def new(**kwargs): + """Create a new TurboSHAKE128 object. + + Args: + domain (integer): + Optional - A domain separation byte, between 0x01 and 0x7F. + The default value is 0x1F. + data (bytes/bytearray/memoryview): + Optional - The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + + :Return: A :class:`TurboSHAKE` object + """ + + domain_separation = kwargs.get('domain', 0x1F) + if not (0x01 <= domain_separation <= 0x7F): + raise ValueError("Incorrect domain separation value (%d)" % + domain_separation) + data = kwargs.get('data') + return TurboSHAKE(32, domain_separation, data=data) diff --git a/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE128.pyi b/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE128.pyi new file mode 100644 index 0000000..d74c9c0 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE128.pyi @@ -0,0 +1,17 @@ +from typing import Union, Optional +from typing_extensions import TypedDict, Unpack, NotRequired + +Buffer = Union[bytes, bytearray, memoryview] + +class TurboSHAKE(object): + + def __init__(self, capacity: int, domain_separation: int, data: Union[Buffer, None]) -> None: ... + def update(self, data: Buffer) -> TurboSHAKE : ... + def read(self, length: int) -> bytes: ... + def new(self, data: Optional[Buffer]=None) -> TurboSHAKE: ... + +class Args(TypedDict): + domain: NotRequired[int] + data: NotRequired[Buffer] + +def new(**kwargs: Unpack[Args]) -> TurboSHAKE: ... diff --git a/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE256.py b/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE256.py new file mode 100644 index 0000000..ce27a48 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE256.py @@ -0,0 +1,22 @@ +from .TurboSHAKE128 import TurboSHAKE + +def new(**kwargs): + """Create a new TurboSHAKE256 object. + + Args: + domain (integer): + Optional - A domain separation byte, between 0x01 and 0x7F. + The default value is 0x1F. + data (bytes/bytearray/memoryview): + Optional - The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + + :Return: A :class:`TurboSHAKE` object + """ + + domain_separation = kwargs.get('domain', 0x1F) + if not (0x01 <= domain_separation <= 0x7F): + raise ValueError("Incorrect domain separation value (%d)" % + domain_separation) + data = kwargs.get('data') + return TurboSHAKE(64, domain_separation, data=data) diff --git a/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE256.pyi b/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE256.pyi new file mode 100644 index 0000000..561e946 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/TurboSHAKE256.pyi @@ -0,0 +1,12 @@ +from typing import Union +from typing_extensions import TypedDict, Unpack, NotRequired + +from .TurboSHAKE128 import TurboSHAKE + +Buffer = Union[bytes, bytearray, memoryview] + +class Args(TypedDict): + domain: NotRequired[int] + data: NotRequired[Buffer] + +def new(**kwargs: Unpack[Args]) -> TurboSHAKE: ... diff --git a/venv/Lib/site-packages/Cryptodome/Hash/_BLAKE2b.pyd b/venv/Lib/site-packages/Cryptodome/Hash/_BLAKE2b.pyd new file mode 100644 index 0000000000000000000000000000000000000000..6595612e9420a038ce19cb032e67e2269b683dd3 GIT binary patch literal 14336 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/_MD4.pyd b/venv/Lib/site-packages/Cryptodome/Hash/_MD4.pyd new file mode 100644 index 0000000000000000000000000000000000000000..605ff65c7ab73997a04c26850c627ccfbd0c3fcd GIT binary patch literal 13824 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/_MD5.pyd b/venv/Lib/site-packages/Cryptodome/Hash/_MD5.pyd new file mode 100644 index 0000000000000000000000000000000000000000..1e902247fe1664b0e2a3de39669404c8d200292c GIT binary patch literal 15360 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 W+xL|3aqW@!c=!CZ8|iLWNn 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

h5ho zSKw#{{%PP!oS3)$3S70A*N!_>HDsw4^Ezk*zM1;J1MCNL&>Zo92+l{_ngcBj=#%e~ z4;%Q$AAh`IE7W6CaCV`eFHrBSPy`=#cRKC?!N;18tJde)ufXZ^@_^e;e0J#nw~+e3 zjUun{e+(7+zdIN2ZLc8a0w~hSGglR4 z&qRN#-%rD=*3jGdKMMN45ujiP{J(^=SVVIza8FO;giPrE(T^!Vi{&@WWBJwBu>6v_ zEdTHFCa)dO8M!8GZ#SW=%v_OCY%-gec`ZslTPCwr&t$d|E3>VbT{|DI4QKsk2D1b* z+1>)iPUBKxxB2wX9l*2C;qkgKZJr5_705x`nZAOPGi)nm>g0FVgykEvn{{&d`6>hRk+a z3r(4ADfR)^no?Q`9NKr|y3gp}i}nL)yz?2*C1}bpu?+Z|DaXok8gNz5U^$?jvjRSlYk{o}vRu;vmPvDj{@63@ zmo5inD6ufxHM8M;7^fRP1O?q<(G@p3;HdGgrjNrz7+o)*e+bt&E=mj|H{;);;3vg^ z43PGc{ALQ{7Q~YcS3a&nTq|&`!$lM`@YrBx7M96sHfqZ9qV}B)tZHXPYg3>`AQ)k5 z>f73P>a7N^Kj3Rib(*%Js}D3`iQa18`bb0Likj^$b@erMet%PHMv%hL3$7I3sn6{m zv|RWzYAeEj1Go<0wx{8?pcZ)nxQ;a3F5tqz{h`la>bEN`^O1Q&pt-EBJrMMH%i8cz zjsI%fiUZI1-o?+&)s2b$Vi-K_!NPDG>yBlk7=0>QfGO|6eLwc;pw+p?*3dtGZo zv$w&$qu$$2)9-F-4tRZxJ#X3Q4gA636&dB;Kv~e|^R@=6d~Nk!r07GIYOk-QsTE$4 zLa`U53ct~5^WE*OBU!6_UO$$xcJo(*Uf<3tudlJq*HYJ74=sXF!^h;$Q?F=Xccfvf zxBI+x4M4J45+vEU(;x7*R5!JF6+aa4Qj3+C)Fyx3R`kSVPt#Ukoo{DZU30Ua?U5)Z zn(CUH9`|naz^65kW6wZZ)w?ygZJXDZl5)L!!#!?~yrQU~xtY$=nwqj2f4jH7sj;cP zMmHX;wGeoJprIzPv)xGX)H))fR7y-;36LWg9l#Q(aN%US3kH)BF;v zhfHntbaFQOya=g#Sb0cR__kvi~yOBu?4Kg zyTe-_40vm<7`PVvXdYvA?M=&C{LA20%j$iBW!t@V?aP{%FI&FM(DABq{FiJ1Ta-R! zHCd=0dFfB~Ir@-ewDHwsGW9J*Di>3p&cJo6!(ct7!&DwOuzvyn#VugRx%$xpL>cNM zI#VCPRf0C1vz@qBqn%!xQ7yOK$yhb;1lw>mqfKx(T{IuC=w`;AM4Qg)K3vbEonCuU zO?JaAcr67y!MkvsL%RyF6&EXq41i%=Bm=>dsJqO-j{$B$4Wyw>FoYWDduY@DXdlIO z1nm((bCIqK!IQXtNoxTsZbcc2wg+$u*Cg5mZ$M2#yfnaiqul`beWU#h;HyTP;8~-6 z4loCmHmxPN*k~^W{1z@J>Jx&m7!$WwEHdWuf ztaOpXA3(iT*NkIy&7z%N|DwCTl09oRo%JnSn|C@upw+)-QP9_Vr@wx?x24X%tfi^m z*XD0)3@oc}Yq_(|-%|AG@x$el@vK2p<&2M018rwQxapcQ*cNE+VS3G8)Pu#K_DTvW6RjoFJuW4 zNDnr0O2kyRfkn@u2YPRSwB_`1SNfuXwj3#PZ0AKB=Ye@NNgo$v!UZRRIDvxh_s`z4 z>;P?7PuE@R-qvev&CEYD|3CB3|C-seU3teQCNah`@g$RsZ9__b9`XAZek_cgcgc(A zv7b-cJ8hfAyLZ~s#-Wh!40zT_#lSpSDy<4PT7WF?q zIqhg2%0E6i(@YN^G0K;V@~usEjYQ+z8C7YF)qg#U{ruVD##G%1yVRMRao$DjDnOhD zbn85%4w3J~w2gcQV_5=}PT6Jvh?)4yU^QrJbV?6%%*~V^ha~pU!MTeVG`jSyu%*_a^la) zSWSt)zBW+HSic=0;1q4I5!GWq9*9qg(TwTDpc*_hha2#W`|~gsEonCziaEBUl4yFz zHA2=y`1~FII^+dUI*}oKM1S0$N3`=bx1k~Nh;70{?QW$)`p?7IqIBsWJ10lud&d9i z;Z<&j9uByR^zeGObD6SKS*9#kZqp;p?g72)ol?k<&aHcIMk4pmS|d<2F^)m<#hHdXj&?o&P@ZaN@uT5 zXXl~mT+y^F4ZJ3uoiDOzR3;iNKoJ?$y->_`y?aFpaBXgX>@8cWbe+ix1w9vto*scn z^j(zBmZ!5CntDW2H4VHzon4&HR-maWn(Arb4e9KS>1-vM>Y}MP4ZJCxy*Zt|1x>x8 zX;m6{YdX6mon3~eRif$AG;n!3ds{ktd+r%DUW&%5`wnnO^jejBMgUeSFWI2NXpI^Z zb|>Tud=>Sp(|D>yR*$Ie6~MR3eu>JM%B%M9S7O`k8h=fR#m`gtuGr3OKB~&EQg&EE zhVP5T^5y+VhI8cos`Q#Ft?0+|jv8KJ<7)?0zE9!PgGaY|ay7k@qXHw{tZ4H8GCV$j_+K>k2pMt|;Iu-q0hSB9+Gl zT_qO9*kdN`n8J6Ow1+`^zruH`(sn`H^G8KGqwzR8*wGc`TyWX9tbVVOkuf9j&tK2q~zoH?{)8toTQLy}EY*()9lso_wvHmPdcPOr2xnGH7 zPUbK)Qh(R>C$4y8k%Sra#iBV_LWR~03zo0B_MxGCLOMxx{TWypxqoy}I-$4@sjkDA za%^X=MstsY7Mdaj4Wzvi*(g_B9zb@#K)ap443vsAB=^%$GUWcn5w}B?eka%)%?2v; z?Ao#Kqv$UL9`GH2(E*?;)?B?nuJD7dcx+d`Dn~VbP?fL-J;1F=J1{Tl3`!b*2dFjq zJxG%4T>$t##nlJYs+^$dWouGGhJ3!Q$%kl4S(paOybpAE+|{SK;y|wOLtyVL>vv!O z#W2W8n9vR}hnPH|Nxd48+9CL{PaXhr&{3gOnTl(NN*p!_4aohPKrEP-rAmXKH`r_DAo90>&orR=V|gTsb6#L5mVYOrW9AC5rq$ed{_L$_0|B2wVuVOQ7{KQqFb{Y!M}e6iR$M*Ctjerg9=h%^2`yu))CY#E;aP4_ z)c9EvLadkk2`IWgL`mU$LC+)>gJ7z%;4Kk5L&VT%hepgch^a1`&;pDAyjJ)t#$3S4 zOi;5PT0QlL8h=xjqMH1cCV|H9$Rxm@W(wAkd>iXSG>JT|1ZEDFgWxeD__&zKqqJ=yx4&;I#7#$>Y zY5)2YS zc@)dz`T(=2f^{GkK)oOwhoLWhDL%pML;S#QjGIgrX+9=F3Qw|4tcSMA{Uq8jG6#Tn z6w0cAc_?F^WP_G!k*|O9lOvtdeibfIg5sSf*>;`chlNy=DDTP_Tr%t%20-!*0x%vB zFA&fo4}U-FjVFZ;37O`HO#ZA;TnC9*S5M%?lTd^mDkmk8KLI&clGel^B7x9AO0dG>NPzaToj%cD^efYkKmJpwHig zCYg%jdK0<=C7{J33kO|+GMKg#?jl!n?Eurdc6@#DOYiYMC;@0g4lFgyiKJf#=)Gf7^lo|{DW5O@oQ3ld{~K$YU- z{J?L)I{6LgjiDH%E<Oa2D(s*m3}Lnhow6_-Xl|4{$TWavr1Q zgV+679*{qR!kCM}d> zx&t?WzxnbpbAEsp>h3lo| zf_qM2J`^^dCMIV{sIOYfD>K`)30+0YCK6YM|nAj^dq4W_TM z+c4^Xg|h%JBBA~n(pJM?@RtQ^5j*~t#7uqz10caBhIeq0 z-yoxrOUq`UKgT_&k*}Z1J=U9Y5AX@Xz*cU8O8{Mdip=>a(7qat0|G**tO@G~k194rSB6R6+(O3#vk1X^&L7 zne;$dS2LLU`}u~-EuZBYz;ZYq(yMb_0|}|2VjKn-Y8ooiQ{83l$(vBP-X!8S54Xi0y z*1yF)kgd}YFO%yb?*KOeEq+C++)8@r>M>E1k;Ame^YqeU4q?#n5CiZRzskA$UU`(f z1lEakgv3^CPso@`Cka2;fF84 zs=*gv5;WqT4YT}@eJWY!qR@@AbE2G#PU_5*u z?LiR)BOroDa2qt!uUNpScpB8bQEX=e`OFI8gJhI>fwe1t!M#i1yL#`x#rBe;Yq ziO1j~g;Rh>0B$3^hwFjRk`j=l%cC%*t`EQ-(oL){oB~Bfsi6LIHVtqJ?yPSg{*+TV zXgCGPH}I$A8$QRh)g=7nARzCby=NdJMN3NR6?u5WSI&E%+yr?YW6w}IL|cZgp7zam zI}APe3tI+QW||7ECUNYqbP8|$*TkP#nN162x&k5eVxs^hkSY=33e!(q?m~dzWHvu-n+6c~T@*d5#8vqCfowdpRutzw*F?<5f zaLAyZvsa+wLlPEJ1dShpGobyD_70|K{l%}h&ZXYQImFoJfdJ%qQfE1^lV=q=&VdLR z$2sI|q(MbC_tJ{%e3a<8Ugg^R)*F5>bdv=Z19rZxaD1u@uLJSaWGal}-@Lv+3M7 z*KkS@K^Gl`kQMF`(RpPiY-wBFch{01!7h*di14ydGLlU!8HL2*sqWFi^2l7ALM?UM z;PndD_IHc(4Pki%)3ZU3j$+`WNFc~nNtHG_-{Ls(P-JoB;rb+HB?aztO{H)O;FBQ% zf=}IUTSnhE#Hk^zPRdl~DXu|CqzmW7pE?!7o<#^3?NPDcKO!IHy^vGa5fU!3m!ShL zE%MNZ$(J^fx4>2*nr%1`Ix|=KQIJyQ*C}#4B2_vtASkH{PQW>(c1Whf8X@H)lOzO< zD3f%75P4Xr650B$IR7@q9GzA>?J8%B*!!ttXy~68XQd9B7WUk`NHb*U zq2k)DS#Hh*Da~@54f>^7s&TBU@NC8MV1cxqhPBuM`-+SdRl;_~a$k`WUhL2;_f6G# zrBj#pB%Z-*FmL23H@%^);48~2c!#HgKcH9eKPc78YUNI4)t&J@o+Wzd9jDG;)i>-6 zPKqcNJ=Eh|8Gmst-l0Wq2qz1lycBPC!;-!s8qD2BFVBqzdY`AA?i;JL|Aor7T6#krDLg>)h~zJD;a*GO>1imyCX{;dX1h$^a5_+{$*1j?co<(& z^MVJxFW;rlf7xFCGC!+FZglF>E-b0e4<(KkFlKq6Mwi~xFCPs(P~!<+s`K56L&uWI zuJU@iUC{M_NYrpgO-EL!ywMVv1_HtFVLn*vQZHU{mFci*9vyGDbejF@__iF7JbqMw zw_&_^r9M`d;*61cmMm9j=2dvQj>7_f)=Jm)u?OuKoobb-i3gm2?1SG?AfQnbt zL^AiH#4P3Y^UCWx95kk2jvzTqS3r8zDb7w_UXzUK;UBp>(egJQ{OI9dyEh``d&A{5 zm-oxb&{%>PtP&0G1V&z7FWRg|oBECA)rlY| z=-e0`EmMR2l5UKR-q+?vGJhj-8@-t>J+d;B4lBm_0UHa``0t6 zLvpt_{Bw6BQHC*cDt3p434P*?1aU#c0bgi$ECXk>tyJT*PsTnMVDL~IAPAUPd5j?7 zqBe4pKVgT2^(8nvCk`CyXe`F8{UWOK16S3D}6|@3*&`M?z zRbj1QA!T6}wIWNvs&7aJ{|9kBvaD3}xa1@BShk5c35HG_>KBZmu1AtAyh;pp6Ad*e z%)wt6FL-7S_!2STP3Zw|0-50Dq&%ewyBP7~V?v5n~UR#f5DByWA_(jK$k0Zpp68dA z(83t(J+p7vf!{vsPf(yCB%)~49Sz)^*awfB_znb3HdN9wNMjlNcm^5&Rcr=lXU64Ml%afTND0Cqehcy*!; zGfU*q{4L-_X!>J-GfX2F1mr=_Bl{B5kvl!~rPo7$uq5t5YaT!Tj4_DCG>A=mbPjL2 z!s!irio#V`AKeDuLBS5<))D?8mT1FZ&_1v5i5ZMNm<<_x7bGH!lA$w}`!u+eXc71X zHs|!IBI;$w3zCI50?3CDB9)Q@`6+sUYh>nMPHcumr>p*Ld{sV#&!`F|Ey1gRbPl@7 zgVgN=SWe3RtyrQLca}hSu|YU+UaC#9@ZcB0z+}K0N=iY`7{!ut6azESGv6HYq{s>j zR-p8FL8@)C@KK;J#&A4Kew}K0oR)GeR>PyLu3k-^R;-(lXIeZ&GiUf~IzIs=30f0R zLIS*a0dzno0T~klgq+pG-^9?-e=Po&cP0xjxqt+1ce3z2WRitNqS*i9q)bM7~-5ft?UJi5bYRX8=`^i7f2TO&V*2Z?=r~2f1sq}sz;d~wnngIbkVL%4@IGV z){Cgjt@lzAw!SspXz4-zIJ)*(V}KCZKI^ZLBSG%7?l5!Ppbkv`YLv9+H`KE)(?XQf zaGt-A;9+m3GX+FkmhVgf(eWvaIgzC03-y$Nk%+5_fgS|V$-+?t`8xmE86cID8gu}G zVhwnhEc{-g76+D5ssJ&#WFTWh!B#6&!bziFO1ZHf1QtzUyJhm>553dm+8zXj!C zvZ{K-dJppPu@v|cZ(%5U$mUMGX=E}$3p+ldmH0k7fzi`^I?tS5N-NHF+i|NtzdukQ zM@Mw~Px8xvF!=5q!{%?b93LfppuS%<`erAdhdnwzC9wo$n9XhjoH-|YJUj6<6t>cC zw^+;##(yEi495Rk2EG)oHni)G2C38ei8V$cJ8?TQ$KM&(Kd~5)#3KBdz_e~Qn-{1} z1x1iMLOME}=&{ligBKvQ3{DoNL+5*S-j^)=SFs^k>Ry4Z2*P8bxy?`>*l-W6NA>Ve z(O1m%L4hRT0JFk0WE~zx{dZDX8LxoxdVg zv#arq)<2+}xEE$H(Sl|s2MWZV2!%=D*D}D5zx@cL zo%k&l0V`RI_}qvRe%*6MZnE0BTnEu=)+)isa4 z_Xt*R%Y^}Hn5Ps4mwGSXZvUlHphs>g(xm}pv-C(_r#F(fOAi;gE9UPH6!9DKyz^uJ z9KOg#5na>|W4OKe_)&@h2Zf{*gzk5Bs2N$y)$0`B9`cZ=Fx_}azxoSfJI0w2AGP;!V?Ie zbpD+Ln(2{m4WSag0oE{Cc$8{@XF}p_=*i1X`EZh>2jk7oOumgd=<=)2kBCh*<|5QffJDcc^TkC z)P^v7#Qr!qqPle=st{37^CSyPkcIf=f%UeCE+t+Pe*7u-0GNfnBJm7oV}h4LYxT%Q zb>#RW3s)gIem%?MTYf$Bbd<3`3Bjpw?x8MGZ(si<_)mIVD zbZfc0fG3lm1>BFs>~MGadgA$vRo23Rg1X8n zYROE|w!ip?NgX*_F0R~K_qxcVKa0&AVOPWXn~}A@_*Q{E^r!*g0Q@Qo`S3;EM%|Y> z)}h7Jjt-!=4Ct}nJN4WFojx3)D8qSa{F-?1Hf~*x)}ek|pH)MKWISvwM@~5%cLvHr z{mwq?EEKWAsQ5B++t3QH;fK`uL%||}$$f0Wv0#2EKNq#0@I@9Rw6et%3E-(aUr@NmR#{h-IXdK(_Um>1 zUf2GLy7&#ez@hVU2V5u;+iBGz*#o)we!?P!j*WPwey?lZ#<;)q zel2-y9C$1{u73J!=KVU45q$74JO zIQaL^zrTV5Bdd%?nRgoL#b!FkOm8yNW;5+H)5pzptC{XH(_?0O+Dsj*4ZO3=bdi~+ zhE{Ku*PH26X8KZfs)dnmH{sjNG*$b1vpiy^8D_t!X1dFS-(i;hW_s9!Uu%|A__`I= zNhT_lI#r|WIVVlE|9hoXH3pp#Gfm-zdQSLL*)?nxtHsmK*0DO~$8S3eur_=(+QwR# z@6XnBpnV-$Gy+2heyiCMrZa`jK`wy4Ex^@`I?9)zB}1DIHk)0Gd=Pz`0dHkawgAr} ze5QFbD`z(fEEVhyrlCE3W<%fU&=)TBX$gJ#L7#Te=Mwbk0)0|ISO4j{KHZ_Gd+v1O zoUV-1t#G=NO?Rv5$}-(erW?I2)u?hNTy#^e&U$9@2Y8dMQS4#OQSxy$hokVe}S^UV+j3FIv~s zx5i}TS0K)DF2i#j)tvLqt^xYH{Mycus}xelEr#4V%`^ocOGz32Z~iSa#&a&oB6EDj zW?Gs`8$P@Jx&1${jPn?l(V5YisxQJ?*rt+=cZG5eg{nrS$q&G}@KTVZb-8&6Ft_EZg!$G5*cKHN|aX z7g(-fIU}}#tY~IC=u{D%D$H$~ErZ$Smar;t?1y+d1r5|qD1+v?ZK&TLXS27^ZaP*w zYWAC0M!$2~U^on9+2leS<~NBI)@QTAxmm1m&g5erj0rth(bbGSjE8ic{@zCZgK=eZ zJ*p-X-?0Wcw`R3dUvQgUQO4L!cmg<0&vxpsD; zA9B$Cg&M+3WVhp!tR0&zY9PF3_WTD+M$-*YBLA@=L+5CdnrI!3m zmOpnA%b$}~HHl>CQmnCwci**)-44GL1zt)m85WiS*|QYbSV29WrP-_ixC`bu+AW1v z@ajcYXxYZHsEwF^7R#BF)ozRfW0-4Y_VaVwiElJ+`lD3fEfq!aLjezEK7nPRdfIBz zvkm2gct*%#IFLfSIw8+aq$9HpxgZ(Ofo@O1Gab)dJd5z$gr^Y?Va#9>*2BuOSoIQJ znKNf@N&C8bR<*98wJA_-f|yZLUDwvWE|stMbp-rv>0;Ae0Hi9L&^eWFU-Q-ahB?)Z zEwy#kwH+Nz=~hAdcNad4g6vP~Z#l)H;8~3sixd2NfOP`4aU5)YHDk{Kws{=vDZrwD zecspB9ymZeQCKBWT_@KKJ< zwWv)UwQEokjlE54{I&jd<+aVt9qbW_G^DAvx#@o25-+4$2RgPHqg8!tf_L5J^QT66 zqju{}npd7vQs3N6{=d4qyt<>^SJ%|gR99^<58Rp#ct@bVI5(4wu?w-y#8K#GX}eAN>wE&x4h$5?H9)9jXx*$}JQ zb^gHYMqh3F?B*+HUpd>H<2m*CFG>L{(fB3{h(mR-P=E8^-aDOx4F{9S)LW>O?IpWQ z{_YB=iTaF@rtG!}{b%z3I0qaK#@>VPq_~=V=vw&CDDvc2AH~y;Jo(gA+(_xYi06(0 zPU+Y1oI#$_$M85-OpNy^Hr!eYO#z%z3BKBkJf&0c)F4m(`#n7E$d8ZhDCXOR=PAG` zrTA?t^5f$;itjE%q<#=^N@wFqAWvyIo-@c(T4};5y$uiHX-E3s@HlSAbp)ix@X&lI zJ$*G}1%RJHy1op18{{ed@jS+UggpH}u>Xzc4dh3Vy00<#M(Jrh?*M)VY14eh-bcO} zY0&}*%N<5KA94=%9bRJ?lTHggo`^5t8P6lt!4eJI-GQHo~;@|5DNOyoBr zor&179&n1`zl(?F_#9FRF=RL3I8S4j;#rG4&eTL4-HANK(-aq1fmf7LOiX!7DXyhF zr4)-EM4r+iJhRaEpMQTZ4p_uKxd`e%5hKOSj6r=r1;?cgoFGDOQ1d9#bN?1xx3;C( zd9TmkfiP*|j4Mk@XE=SWb#3)ct#>V)v25w}v&&{UI|7KOYMbFE7tUDc>zHxfwfQ*< z$d|XQXmCl;i25r=3q1KVACt#-}$uop_dQv2EG3<+&|ew`|)I O-SUslr2l{C|9=45iP;DM literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/_SHA256.pyd b/venv/Lib/site-packages/Cryptodome/Hash/_SHA256.pyd new file mode 100644 index 0000000000000000000000000000000000000000..0b62e23bf7c575c9f8759d0ba889c971e6275e05 GIT binary patch literal 21504 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≷8$sI0`zM!xRW+biabEtywcR$fw8UtgJM z)j*#+^X0kNe|;@R@D+eH0@j=ay9;ZTm4Gczf;|RU3t(UO_n-A$Z_4~V zb$YOBa#>xlA>f}}i%lwg_4W&bDYdn?H`HC#P*WbPtgR`m2?iEIYb~g`t}+m8D65)T zGrzK?LWoZ+Gi&CR)l^jZD+(8s`|GIrRh3mie?W+*Ei?SVudN=NGQ}U9+z<%(Yl20A z+HyZ!$a+h$KTus+1F0}TVx?KG*9*0QtNdj&)}nyF9=D0Q)N333frUl>z?|AZby-b0 zX3>CY1cdvmy~`Ei(j;i{ynw%~0zi>&#zHPdPEpR8U!8b}LHU zSgE`n)C*b9Tk!##24R_LAKte|M2X@A{~g z8unX<{wMi=oC0*f>L>7>6jzfEeHZ?;1$pwT2XJjcJ~R!h?7fa7q{BDng#ppW&)Np8WSO;LC%^C&zUZ@4bX;IpCC1?Dl))lVdoF z?cTi#aXa9YeuV2&- zjI|B&l-@E`h~FSj--CY~*Sp9sN4g6aw#PVKaW!xOz7pwRMToy4KLlw9E-Ttl+J%d7 zW&2=fa8Z67(rP_lhxBPZPw5&x|0>dt^*p7=^!!PrH(w*f1oTho{kW)4N|)<-N;`4U zI6p-?A8{S!7a*lIMJDo;j>AQ8N^jBgbx2>q9z+q~uOdB)i{yk-?3HppAL(0&8B5WI z;`f=jXbiKEzKH8Cz_FhycH*i-9($@BM=wC0;%SO|i$E(%DJG^or4-jvo>GcIcOg${ zGp=#C_dkE%76nYaPR3ffv3HLYGeb8|1IHm4>>z{Z%Y}HL_f1@yaOHyPD#soEKs~~w zi6br^lQ+WQuPLvssH~Ygam38xt48OKaMTA8PnA`{O->xK&|g2|$}2L`Cy+0%zO`zh z10B@VPaM$@sJXnpe4f9$tbTNLWqF{szIIM>`YWq?4C$gV#JdyK6-V@DFEPcYd!m%P}#i|t@E4HuLvtr+he`^Z; Ie?9sC1&`=%p8x;= literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__init__.py b/venv/Lib/site-packages/Cryptodome/Hash/__init__.py new file mode 100644 index 0000000..80446e4 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/__init__.py @@ -0,0 +1,69 @@ +# -*- 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', + 'SHA3_224', 'SHA3_256', 'SHA3_384', 'SHA3_512', + 'CMAC', 'Poly1305', + 'cSHAKE128', 'cSHAKE256', 'KMAC128', 'KMAC256', + 'TupleHash128', 'TupleHash256', 'KangarooTwelve', + 'TurboSHAKE128', 'TurboSHAKE256'] + +def new(name): + """Return a new hash instance, based on its name or + on its ASN.1 Object ID""" + + name = name.upper() + if name in ("1.3.14.3.2.26", "SHA1", "SHA-1"): + from . import SHA1 + return SHA1.new() + if name in ("2.16.840.1.101.3.4.2.4", "SHA224", "SHA-224"): + from . import SHA224 + return SHA224.new() + if name in ("2.16.840.1.101.3.4.2.1", "SHA256", "SHA-256"): + from . import SHA256 + return SHA256.new() + if name in ("2.16.840.1.101.3.4.2.2", "SHA384", "SHA-384"): + from . import SHA384 + return SHA384.new() + if name in ("2.16.840.1.101.3.4.2.3", "SHA512", "SHA-512"): + from . import SHA512 + return SHA512.new() + if name in ("2.16.840.1.101.3.4.2.5", "SHA512-224", "SHA-512-224"): + from . import SHA512 + return SHA512.new(truncate='224') + if name in ("2.16.840.1.101.3.4.2.6", "SHA512-256", "SHA-512-256"): + from . import SHA512 + return SHA512.new(truncate='256') + if name in ("2.16.840.1.101.3.4.2.7", "SHA3-224", "SHA-3-224"): + from . import SHA3_224 + return SHA3_224.new() + if name in ("2.16.840.1.101.3.4.2.8", "SHA3-256", "SHA-3-256"): + from . import SHA3_256 + return SHA3_256.new() + if name in ("2.16.840.1.101.3.4.2.9", "SHA3-384", "SHA-3-384"): + from . import SHA3_384 + return SHA3_384.new() + if name in ("2.16.840.1.101.3.4.2.10", "SHA3-512", "SHA-3-512"): + from . import SHA3_512 + return SHA3_512.new() + else: + raise ValueError("Unknown hash %s" % str(name)) + diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__init__.pyi b/venv/Lib/site-packages/Cryptodome/Hash/__init__.pyi new file mode 100644 index 0000000..b072157 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Hash/__init__.pyi @@ -0,0 +1,57 @@ +from typing import overload +from typing_extensions import Literal + +from Cryptodome.Hash.SHA1 import SHA1Hash +from Cryptodome.Hash.SHA224 import SHA224Hash +from Cryptodome.Hash.SHA256 import SHA256Hash +from Cryptodome.Hash.SHA384 import SHA384Hash +from Cryptodome.Hash.SHA512 import SHA512Hash +from Cryptodome.Hash.SHA3_224 import SHA3_224_Hash +from Cryptodome.Hash.SHA3_256 import SHA3_256_Hash +from Cryptodome.Hash.SHA3_384 import SHA3_384_Hash +from Cryptodome.Hash.SHA3_512 import SHA3_512_Hash + +@overload +def new(name: Literal["1.3.14.3.2.26"]) -> SHA1Hash: ... +@overload +def new(name: Literal["SHA1"]) -> SHA1Hash: ... +@overload +def new(name: Literal["2.16.840.1.101.3.4.2.4"]) -> SHA224Hash: ... +@overload +def new(name: Literal["SHA224"]) -> SHA224Hash: ... +@overload +def new(name: Literal["2.16.840.1.101.3.4.2.1"]) -> SHA256Hash: ... +@overload +def new(name: Literal["SHA256"]) -> SHA256Hash: ... +@overload +def new(name: Literal["2.16.840.1.101.3.4.2.2"]) -> SHA384Hash: ... +@overload +def new(name: Literal["SHA384"]) -> SHA384Hash: ... +@overload +def new(name: Literal["2.16.840.1.101.3.4.2.3"]) -> SHA512Hash: ... +@overload +def new(name: Literal["SHA512"]) -> SHA512Hash: ... +@overload +def new(name: Literal["2.16.840.1.101.3.4.2.5"]) -> SHA512Hash: ... +@overload +def new(name: Literal["SHA512-224"]) -> SHA512Hash: ... +@overload +def new(name: Literal["2.16.840.1.101.3.4.2.6"]) -> SHA512Hash: ... +@overload +def new(name: Literal["SHA512-256"]) -> SHA512Hash: ... +@overload +def new(name: Literal["2.16.840.1.101.3.4.2.7"]) -> SHA3_224_Hash: ... +@overload +def new(name: Literal["SHA3-224"]) -> SHA3_224_Hash: ... +@overload +def new(name: Literal["2.16.840.1.101.3.4.2.8"]) -> SHA3_256_Hash: ... +@overload +def new(name: Literal["SHA3-256"]) -> SHA3_256_Hash: ... +@overload +def new(name: Literal["2.16.840.1.101.3.4.2.9"]) -> SHA3_384_Hash: ... +@overload +def new(name: Literal["SHA3-384"]) -> SHA3_384_Hash: ... +@overload +def new(name: Literal["2.16.840.1.101.3.4.2.10"]) -> SHA3_512_Hash: ... +@overload +def new(name: Literal["SHA3-512"]) -> SHA3_512_Hash: ... diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/BLAKE2b.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/BLAKE2b.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56b2c0d71f95b2a01d9f386aaf0d5567716ea0d1 GIT binary patch literal 9225 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 z zH=Zd4&ipszG(6;Ayf)wsRM`^-&Twf7w6;^U-b~1Fd{XBoUd~QHd=}@j;EMw+A`zB5Y(cSW zns+!!6W7@z727?*N~Rx;V+e|<5syE^>HK7jJ*$J|!O5DrdY2*Mtifhi2lRC=lND8< zX;#u9n1Cn_8;4zS0xk>}*Z=XmUo{?IU{F_G7?8DJW8Z-_8`2QuL4 zQ!hr|iZNa>lWj(}-{6bVQ4c3Sm!aMGiQD|Y#M3MbxRZ1^+XOi#<)~FPG(`Zy+o;<5Tfv*bzc~Ao ziKXfCj(EAH|JQ*78}&KPjaJFpDM(PC7wH*VZ3ZaDcO!5al&^n^v_Kz&LKi%HC8|jO zoc=Q!>_w*VT}umd;1bPRaS9$Hdgwh_`iB^TRdGd>yGvqK=+K1(ufu#QPWo54S7<}2 z$04!z%|AWMfrI7VGE!d%SLr(-=kK7G)(Z)26L`|wmbNSh_ujqm<(B1rr&qe754#R7 zcO6_fb^F9}s1tSYVoZNRlraPRz{$y&C7*Qk#WZG z3H4;Gh#abF-%uH+$Os`cPJvPsC-MmE>tTn0!p&FSD1@CI^i?d6qR*ZK)-kkh{3g5Z z2Aqr9>e{1-?!;M&PS~>mR8@LZLb*k{=!1Rq++$3-L42FJe+5_?BsXs$uPDL9AG7ZO z>QGRt&6JmpWRSktAD@d^ycOWmF%sVZ5X-YENd*Ve38A=*3k=UA85KytA;1;^%R&5J z4(=2n{z!uO5b+Q>)ed<;w?szNClg~;KwyRt#ww$k?tyt<$#z>o_h@y%rkY@K@n9KP zX77EKdx-8nB)C5wjj=;wii1!;651c%I3ZXwzi&P;9|e|6L;P0ebg(sX=&><3#bd6O z;J#c2)9QKjkqM9B81aLL2+5i*W+C{KVvj^C^x-fr(xGjo4lOo!;Od3@gpFac9Nr8m zwm0t>f96IVI$+-4tegLAiWr_6ShP|~5`}&6NzBDr38Go!A`a>bd2JFT1~L^T4d&`| zNj#Zn1@nZ!zHoCo#?J7f3#TDBoNxwm9-?w0OJeC&yo{V`d6;m{w&@>Z-<<@{fW+2P zX|UpQ$HBKENjUG^c6R z>^r+Nckz%(WQl+ix?Y(I{=$_a8N+E0jIH<97rOp9pWrA5;&((&&UXg zk32z-zp%@SC7Kemmz)#a!ojsa+_v?_V*T+ac$x47L&=4>(-@d+gT7>q(fjb_lX z4L?yKM*Zp;%M3<4?hlu@oh&h}kD9mMNqm%8lDKr4iLsPfA;1RTZ4_gjG0u@gwdPnaXMK|wnyAXO*7rxbVv*-4e#ldnNdwp=Vrf#AC`*XKDZ_KYYw3W6VFE^Yh z1x|cjQ%`7*ecJr-)n9F2ZaY?PI9>`Ie;jOGWET0QW2L^Ka&WlB3|qETvk|~pqQ*-S zv4oASm3x`k6f5~q{s2C+M^t3XCZm&rD^)VPEhpD-%$Pk zNyUEaVd&o9QjmN@k`UGMX6en-Pd%Zn?Q7opmW~n?{+2!Cp*wCL`j*1?+Epe_pQ6dW F{14WE+PeS% literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/CMAC.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/CMAC.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b9c4deb4f758b208182a09ae07ab08cdc7456f5 GIT binary patch literal 11599 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 F{BK>fXG;J8 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/HMAC.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/HMAC.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a584f1fb5f90e4809553b6efd81b29684afccb2 GIT binary patch literal 8189 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 DSMq#~ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/KMAC128.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/KMAC128.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0fd3bec20e775c06c3eda56bbe21f65735f2a78d GIT binary patch literal 6373 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/KMAC256.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/KMAC256.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2749db906c125fe29caadb457bad1b80537dafd5 GIT binary patch literal 1904 zcmbVNO=ufO6yDY9&r+o{*u*vkGpR{!g+~5sf-K@t*FQ-~oRr!QR2Z!B?pR)Hf7IDo zxl$D{ZVxdOtXq8aF~t`{(|hiPqM}P#TySW6&@Etk$*FHvyOx_0`ZI^sn>X+0d*8fy z`XP~s39x=#ET~W8g77Qf_$%NEr)dzL2#TPHnxKn0Q52MbB546#%1N#q)Pi~_7Xmr- zwU7%}!l_7$JEue^s#>dS6-KO<*j9AiU6`I(y@Ra{IPH=b?@ZsF8^3--=Jx*T0s+tn zry4jt5o*FFcYbXtq7pdtFg_BQL(kfZvyiVnujFCeYqQ%3U?Vk5q-dFGIZv z&p@aJYGO^Q1(hUA`a0#pp~uIfka`<`4>ZhBf*C;=8DtCb`+^HX=GrEaSvnR&u%>Cj z%DNKY6-fmRySF^TznD^78PSPu(n?t+Td9sEw_e&Ht_L%bZ4m@NvZvZc=g zbMucG(rt^OH2}nrMli@6&zj0Cq?twm4Nr_CH+!n%sbGfx1EvQhrkV!U(k{9(p%t{Q zQphB4*hUeV>n=8(SQak0kg*M54W`OKR41#4SG5rN+*Zq20~1~#HW09)RgjD|jVrP` zVH?@}*;`24B|uE_olrWKSHT?(s|F(lLSG~CuYfJJN_>##kU>d^;lle!HQEGq!gHjv zWF6ZYLjd>22WhmR8meyVe4FVQ%D}y;|1T=1QQKLqV$QA$0a=Wy{Lb?E#eALvTl@rN zMn|uWWv;{Zxi|kQVKz0+_184Y${Mz;bA;v528(fk|ZDdjeZ-6-AHV>y@ zE>wG#jiO<08K{IQhBhG7$|5H)KH7Q=$Em0zmCO?5$#Zno$ zR>E=-I@?;Ap_LLd6;mf8d`6FWw53ZGM}lcU`ytX59`Xo2+rrCXA%1c1>h9J0^8Rcy zc6oc|INn{K`DW@k+1u#LG?SB!=;U!E_ITo}FY52^JUUMHHTv&0lM9XL!U=e0ceC~N zeWe*6+@3v2_Uvu$ZtnLVeAG-1ZQuSmlB{3c`OJY>nKa1F+?PI@Trlyp%*y X{Nt7&j{GhR{37(8hOdaXMc407A5!MA literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/KangarooTwelve.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/KangarooTwelve.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ceb5300f0d6b2d72046496abc6f103d44742509f GIT binary patch literal 6909 zcmcIp+iw)t8K2pkcfGq_<2AOijTykOUK~seG=-(4wYV2-3U;JmQ4Qmru{~xl=FF^N z%{p?UJS+(jCKuUMk#MA_F#;((_J4@f?%J-{j;KUcD%E+SKwk2ae&3m!*Q_fVsmJn} zb3fnhobPwO{Wch^W+45ke?!L5Rx^2^fGfW^ z57{h}16nV4FbrX{4%Hf$W9}Q}DK^Kd1|R9ZeAoCL!C#2NG#WV8IMMYMn-Qz<1vM?ek7mtwa zxSAHzNomhXK^fh1T1bruB%L0(DkUbQuJNo^!^5&8>L@Rz;%QMLL0GsQ{*@?X(@d$# zo9}slq7-U)>fJaaEP0!zdrJPmP4%-QbL^+bKgt#TEd^K03mD9-AW&xKpmiLhsaQ61Km@O+$x3JD$Y4fg_>VfY>weg2{0j=;V^WWg4zQ^Ajlg`<>i#D^8942VMJYK%R%T@vXD(PPy8EZ20nbdw6Q6F{7K{H zuWBAB58t|feTh3%Y&?{A-3&Z#*a9Dasi_q{!Ixg9vHej)q}UKyxU$^Pt#@t0u4f*m zv8BAeu>tD7zxzX_K<%y5H%`yF{u0>y%*h05sT|{$RRAd{Q>6dJAE1O+%NSJFCe@lj zEzxgZDWY|yyw9#P*Rni1cL+vVwqx(3T2^9fA8nXgyxqr)S@vVkHLViIi;m09U@7f6 z2iTfr=dfo5iyqrxuVI$#-C2-DKcm)JJq&La*OQVp7CD_^Nl@KrPO;aWa#ofAP!3X7 z9KUAXXVpe?UM0DRz*{95PQtmnZ)j=?&f079>=d0jSF`0lkn?M7r5$pvNw_28jxxzs z(5B7{0Xq9pR+UG9jC5{A*OdEzpw?~bdwn`Z_gXsDO{PT0z&_R{(et3nTovrbvK7$_ zwU9Yl^g*rGtf||~6118{{pvQoB~a~w)OkWS^veJs@K}nI#fkorRu)X1n{xUn&=th zUL7y`jJ+&N%b6NwZ+?d-D(V-i0U98-qPQX@T~oPnS&B z7PDHg^>~_aLz1dWgd3O0aGE5AR9t$4Q!+zIS>@uRnbc*4yDF=roWSYMkxOP0syv>c zn;hsqxR;|ScGXrrWJD?725I3sa2%(o1f1_4S{4WqvU`$JGEK4*vUD{X;|2g9Q9kI_ z$Oj;%GLktiDJcp7OioQx5T-*X;6C3n|25aUqf5BD%khaKbS1i0ErrCW^{M zh$M&+nE}D~DR?iL$ZG{FE9hwmUfL8~P{6UmK{Z-W@B#r~aqgXC#|BUJozQ#(*>UL@ zA!$OIaKdKH5QY%Eya}ElvK2DTf97o83B)3N|C?I1&9&xC0*FEHNDu@OJT+tsW*lUz zr@gDWkZeFFL{cO*T1~d&uy#5OrDot4&5Hu(VGGSEs&TDKlqY0>*P2^SiPAOA3!3C9 za`6HD0hoe~uJ{BmD{wR!6s4XhlA+X3)|enhm*_bdr(A&RWtw@`0D$7wp&N(3h%WlK zKdx&jwDvC5^%VkrPy8XPz0}-xclVv$54JCe_oKz;efiT*Ld{?F&)0w5`ep0V=B{F> z>tXw1=&cghIpg{)SgNg`_22eCs@+zs-8R2}xwfO!*fQgP>0w%S=8xVyZ7$upmZHhvbLYyVW9uU~L|6TBBJZvEL(-COx1 z1|)hEXe$QV=B_Qc7Q%DyEeE==z4yc3x&C5+`?&W>D12+`#?+j;7}`z=0F+hVME5wl z815(pqJ?nBlZMXxiSqTXE(ap!O6OpMk9(gsM;?!BdOS0T^^o7UFfx_;yO7nc`9(SmnZArvjuZpgbIhZ|

q3AeZ{KIdLhxJ?|~mgl9$qN+SXC`B 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/MD4.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/MD4.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aba0265e76aca60d13426b245881b0a39db15902 GIT binary patch literal 6115 zcmb_gTWlQF8J^jj*SqU$oEwSlLkzLkF>A*$B6dhhaG+31fS6Ks8#FmPGwU5Qm*vc? zoi%oGs|Xo^l(syOrz#OhA<6?(R4Pw>>`SF8uGKmnb@KDK#Q=#(I|37otv12Ha zI+o9#IrsCQ@B9A$%%56XG6Fn*o|@L)d_WNXfiJ<6^fMcmAoISU2t`2=m6$FXv0_Zb zd|ZzkiDJS?7L!J*m@=A*O-8zyHkymgMy8k%g_xiwl!TJJ9`nX3W@Ezl1toPsP@2@- z^|)W!qGXij3u3WVZJFuuXN~+6+n}683jA!by`Iiz>06>8WS&1YMl_q)RaMr?nyL`Z zBxjzUJbYwyL?YBwNR?SiO;&BypL^G-ua|p~AvKAQM4><=--r{W;yBfb;bF(Jbi1IbPPt&Q>EViF=)fl5cYN z>K0X`YF!R(C^0%G=~~InzG7+0ix%u(Wo~ZDpv(#0x@4w;y(HTK^Gr*nTDc5uTBlWq z_x9h@vSe%Xs^qv?S*pP}N2RL6=DW6>S3!akq5ndN;IVG^;29Xon53DSGcXIwB7=i= zg-$uJi2Skt*$vF)FsttOypN7PEW8;j_Ru%Zbnl{N%Y-xbcI}WsFvs6X7tt??D2l)4A$!5{HLQMuYQNQWvg1>JTsGrh_?vEcD`i6i8=Ob=3eW0^>}S0#bn{{9M0mhq=Fe0+RX8!-dhp(Xo-j;loEB z9UF(2vD0#}Mra@;;2))NLjc&mFF25T&vpNIG3JErX9AfH8o}>EY^Evl>Su%A*ZuJp z;|p=t>NE!}6>%XxpAv+i{uiQ?4eDUTmLT8w4MvQtrnONUof*y*pyQ;dN)J*<$qil&2D0s5)wXw(6LKs)C%49(!?xI!SAQDf2p ztKAG$6b4EvS!Fl#3e{^WACbXs1vd`L;%2d}Ph~d++5_ZwQyxY02{&P@df82Yj#D@3 zSHgfb-LdhskfC2c`qac(s!6kFL5ye5{!lBOwKYe5q)O%2z^~Y68_G0{$Qg!p7piqP zEpg?Mr1^FqQ-z@91sK{kAz2b`weNecWjT4PqkFC6;7Z5A%eA%s$5#3uTkRiT?U-0j z{XN@pt8@R2?(f~~efV}<>^TVF+0nl)h%Np9+;!mcqgThTjDK+KR^RYi-?5dxV;gaC z_wnV#yV)Vu0ngU{b(xY%`YYv3#6jw@C|-W7bs8O~g;s z`=bX%sjC@SgQ0?{o_B~`shO`~Lj-^yA>f&xQLE^x6e3ey2huZ@sIS+wSqj?f5XT~v z*f0=478{T`aKU^~m_mkrCIHwnGdL1HxDaTCvr;x)<3ds(&zi)7B1Y!GsoE1>c;a>7 zQHl}77c_s2gfAtCB>YC`^Ea*P+r~H)?KtrwWz(oXoMSqOn|8zm3U5inCB^D zv_5R8hQ;c$nmQNhLdeVa*b?{Y2VJD3qPM@e-h61(| z6O3OO;?s?T(ODPd@^Q8oOCg{Y*nUWCL@BJFbz{jMNakAuu6Y9%vDJ?uSrYCZ5ITF- zItErc20rTgc;B^sANOACUCmG2%8z~WGXFjNyS`79PxGt!$2XF(&J)Y2+bJQ}`Azgg zN_Dbc7+Vg79A1zjoKk;)OjP87KB2fnmH%81L|b%1a&1Q`=pBk|&{q&y~) z^5^qO6w>Wp5;X|cpyCurG-a^7GpbW#CWr6fU`aD6s}By60n;)c;ejqK>1sX_a!1b} z-Di0000RJoYWjE}wnfU6MQF!kTEJz+Qix(fOpj5lT%qQ)%BSZ7jda2(5LCn}&8V`| zK-N#J8c@R65XLKw5C$2-5FoQ+5e$eV519`i`vh9a(K1 zTaI)0bPscG=7+%FbQYFVUwpHdx|x8jW1J39*eieJSGXd=u!&qbr-b7w92X>>aTj3r8 z91!o>DS%&~a6CW^kR6_&r+EKQgoi^%aOsIOu4r^{3o096?uflF~cs>;7=f%0V=RSGp_lJIa=+j63w)=^XUb>X}u&dp=-j9X zMqCi@x5pM0&IV)NtHKK+*W9rN2q_3zwN3^O$hu{!2l4^1!ZCXq3QCL`3Lg)qLC~?Wf1g1K+A6ACmQhtpDt=Q?FaT1^Wlh!~8q!ho zjA{*H1{~2N3E-^khY;QsDqJJnF(H`3eHjLP@4&mchO4TTJTPxBz>)n1Ca`f=PQ9vz zL(f03J?CF*6Cs#WsZ{#L#wskG% zJgtm|3Y8|(sJKEzF+ec(RQw(FP9 zJBv5c`}zEA6iVS*43`-b3@%A-Mv@Hp;-+IhCrPi@sP5M^Ns?m8lEfZ@K5nL@Tk>n% zN4jzN_`>i5Adk^J2^qpylmd1Hl52uD9S`LANnvsd{_V#gxggw*iOKYOTG+93>ABB4 zb}aqi^Gwguh*tu4Mn6ki&MH0Qb2gJ^}2xHGE~Zt!2Eh*k#hkiyx@5tf37jW3ssDdsO}Rq;)Q}< z=X~MdI|cCZW5mM+JYvXhqi6SHbu8uw{}EPTz|Z-U+wso$#p7=uztpvw?YWWYiD0mU zArRcXjoWtNM~2Kq9xm}qhIifI*O8Pb ze~smHJhP+Na{?0#`T33G>-6Iu6;814K^bn(J_pHqTolFICtAeBzk3An&{v6sIQ*3W z$!(tGg!cT+J%#mH^WOa%$!vS~Qts}4DvI69<+}p@ZafpuioNUmg|=O5tq-oWKDd-! TPYJC%*IIg4T6%w;;Vbwr^dGni literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/MD5.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/MD5.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdcadc4867dddfd0fa5c28c847c00e2eafb759a2 GIT binary patch literal 6817 zcmd5=U2GiH6`t8YuXoo!>ull}Y-bvW*z1r@oS%X>B;eQy2?+t}K&5TaWV|!$9cOoE zxif2LmvynKJeY!-BC5s@6$%0=L{SA5mC8d^^{FqFDw|bncjQW-B2~OOaU@ipdd{7> zGwVMfRUbN*@817&?>*oB&N=tbO-&&VzQ2r)tM5F-asR{u`}}rhwFsFToXp95j{CKT z$DAj}=RGM;-kb8~eJNkwpYrDesX)FV)sPRSf;{Kp6p!qceRn+8EU88h_cSN_uW@of z3ElD9wP86T2e0v|h}@WJl0&IxIed*vwUis;O7iXlSyQ zS41LBi8*!548NqQ^7EQnFce}&M)MLeSSgk!iexCFZVHl8R*kIt{8N*T@I#2 zU9BjhVTRLU3FdiREE=Q|8+K$R&PaMTAwD~DRJsW(4+&d*J+hKf3yJ_8#gVg5pBlX= zj-E}O5(d5>+HwrYqy5!_YV=LQR)qe3Ju8hGu<-b?ZyhEpusN-4k9>fErJ@WH>~UHB z(Jduy+-q7Z=!RgOlp*xPF+Rv>>#T*GQur?0Q^#S0eU?P)bl4srL?&CSOsD(NI{m!- z9Tt+-isiM-An8X1Yelkdzzka+Ak%Ph?24Q@BxdtcT9kBMUAHf_P*BK&Y)TO7k3}m1 z{{Nfd>})bB(G78n6MC?T-6;!F?te3-jT#j;DH$pN@EdfNw#dawZT{g_N1%LzQ@9i_ zb19F^r@XQ!<&(WBzwAo|fQJIWLk)5R@J|ppiAy!gjgW@q5TwXcVdSZ@Ki*_E0DzDZ zq+jwJH-y($$U;%j#wL`sk)TKz(S(9#2r66^sbHvZ*92K5(3~q<9bVKG!N@8?GE*v~ zla~w1)MWv)xVwafrldM45dkM8dpgD0xht8+X_KMDQ5tI(?eb>V9g9n0y5T@t)T8NpMs>)Hjp@!c>Ku0#K6Ge zqeljzaP&f&!2&vPKKMt2w90`xZ*T^r)_2GLo%R?`{|ROmStt0ddL|m`iguQbzGKff z?X7xAv(d1{|Rq|SsTpQ#PaSho3U;+&2B5pF_T;6#2~Ay@}#ZGO>ARj z_qWP3`8-#KzqseZ*TN}6G$K4A3sYG&hnQg?MlAr`;~|2_U`D7N&C5rrB@QC5q8&3s zk}M-KL@i^6UXpSph0aJ|x18w(`)h`=uWh`{09a_aAZEZaN^zg*)0JGt^nrt*aoBTZ2f%2u0*4kO4$u2l`E5?Ya;2if6L!`zA!X z7<9GoV$X1p=e9D8Fvo4$Q}qCrTbNM5vS%%p%bvKm^7~;8xUW!B=+#B=0P9FD)s(3T zE9J2Txv-#IHH37wRJej2QTsL%qQZyBxSkAQj(ylc=tDXaEcQD<^AaIa`9NODYot7> zDpT>KaB;)rD9)igg|UkwTjY!q2vW#}c#uTl*9;+GEqs!8s36-hLGPKMwoETLG$aPO zxR-QbEx6Mh>4Zc_o#A|4ShEw7N;5;AHQ^}s`XMAU-2G;*t$Q)rw-D|7Aok(Iw;%p+ z*X>=kcyc*@2p9^m zKR~9Q@&HT@)j^Z}G4)ULh6A9zg5(oQ>&LlH@O!-DuG7z4^n4%OY zP8C_uH6bIBI`Ab46=5NX8hdNDM*+cku!%56n^Xv00)=IfXlY=;y15WjYrd0op+ZI@ zc^7p_YSNR`NZY7(Fi#N)fJ9?shU;u!9Yn3#I*1}B32Ma#rs*Bakd44J1J+0vn^swZ zk@_V_0Gq8`OV7-IdJfl`kIZ^0J#N72(!K=nUE9Igz~@`DKq9OR?C+gt~b@&0?HsM1Ctr6}zpZ1Icv%U;Bd776!hGV;303mC=<$1Hs z2mPiUTQ~|Op4LpkxmEtL24D`P0Ato6{r_OOmKHmSg_NP90VJ`4~?56Zydu?amr|nPGT88F>L;r>xHSOF=*v@& zNdQhmE2j~49GC_>>seDIM5BhLWCBk5hr7Fy-zW@nv;0`Xj^XbtMr zdhOlUYQ2vy#SE@c6L_{#T&>Dv~Zat0jZtT1|JX#YU{87AU9Jr4T{Q-5U5CH6wdSwTPi z4B#RGg`a^$9Rmv3Ca`n+&y6>x=YySejkoy=5cq=cTmYbnq8Sp!ye5}&n2(6!DqGv_{wZku`LvrzZU@T#xT-+gaK#NT_bv&G+YZ+FmtlD`*g^>4qw$LsI1 z=ERvUtYH@CsE*vz_Aop=q^Ahp9ib~FKJxJCnZtXq@_92#6r>e0F`>~lqo z^`%^bx~Jehlm+?-<9fjLPAc3-yuhxfa28${bU}Hg1g`|(eA2KS?yn*dysi?k0}M%m z;B4|T)3W7nUbZGl(#HezR@S&1n>*3=UM$Xn_Xr`G&cQ2|Gxg>Aozv?Iz@sWe#R3-5 zAJ)-`+m0|+Q>Fg`8_=5u*u}WWwl@Z^AAkM$T&x!Ep7(WI%0sV^AT-lHNZ98%2?t@` zdIeTJcTf_1u4%Z^2Vy+Wa6f^tTjsBfu#)Q(xP95^X`kVkj?D}PI3V=>+>*u8ZwlSP zv^?ktPt{lF`Fh#f?%2-Ew7=?yP%O%%%bu!#Z761JV{KI*8x7#~Rt^kXzAGhl4n;>55E0ed9DE^)HoX$bAwddvPEQxln7CWushT zZre=aFm$>F|N5JdP|l0A%vNjR&iBKghWE|;_RWX)Erqww@jpE=@9UU7@kOZnSFhGW z`(}ohn>rSo4lXnuT#9wvIRDo9#n_&O*q&N!@5ZvQ6l-6ObvKOa2*MYv^VjhL7|dzYacOvHl72 zG}Pf8(=S4@;^le%em}?eedY7<2fpGUxl5A>*BYOXKe^(Gc66?K+giJ3BKP|)^L*EA i=01nNtEasoe%H!FTuXE&yb|D=TW3P6fhfO=O8pOJi7;;f literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/Poly1305.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/Poly1305.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..728ea5675fb2b6fe7c94a7dcea3d4a39f5add423 GIT binary patch literal 8728 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 Yt=py(i&4_LaiL|)T+5ap#<}$W0``)6`~Uy| literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ec80a193f403b6ea89ae8d0b17c0740500d277d GIT binary patch literal 268 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA224.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA224.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06b393b83e0b235142d4f7adc6347067d49c479e GIT binary patch literal 7124 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 Ucds>cuQqfq1~>dIoaK)G3l#5f^8f$< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA256.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA256.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cea376797a5d21daf579b80195ce1cbb12a26816 GIT binary patch literal 7120 zcmd5=Z%iD=72mzRJC3{K{{>79cnvt_FdPOG$GJGJG1wt->bN0^steV!-0s2RyW7j` z9{4UtizIw zHJvv#p!2<;p8bqAb;u{>^kZ&PnSpKgm_ki8**o2j*wS((I^TYVS}QgOQVcxa%HwJ# zSGjHy@8iuaNSY3lJXGlpcx0xpNQog~HYLUdQPY$ix=_+-ne1mbJnvMcngw(CD#J_q zOejRth5c)lFC!?Sq{ZY{n!-971vVk-3gB{oTiMsi#+_7TF&ncz2DR52nTfFy6LU#y zjFVh3x5ULfk~`*=f|3^)u1cx`#_|E%F|lgOUVh0BDOuCR8JVY}9(F)VI+N9TU8O_gYAQou6fC&3^2&ud zSAc?MWa3<)!&V=$LJ*Nn>OlEa!Ic6kX0Rn77k;Vj*@eY_mBbl7x z6X^9W2>B+n()19l%I86Vrb4#FY}Ft9pk~>#)xd8w^sP7a-F$7M|GD-4=ZgJbFE*TA z_Wmu)*Th_Qe(VUxMv-IVM=Y4I-HekRog-Nbf)aK#Cn`n#0;1362_7 zvm-qUq-9u^0a1pdUIJse)rO7jEH1hVE`WEPEfnDGs)TpW73T6EkE%e2>8wmG8u0{V zB$gQ{M=!r@3R{pO)ACiFkI!b)SFj_3z#>RI_YpFqMg3T^6L#QxkmY!j6bEQoBt*;& zq~w%Ja`TG35RUS%?wTCMm6%YrNk^7ULPrVtqdP1EX&*aMu?vbmYgxyou#eP(CX5;j z-X@w!Gt`j~X6V`zJXC`NM~k3khB zJuee%q`&?QjFWr!LFdUec&Fs(@E=tB8~N>XJYN2&7=rS5=bC?zx6MgJ-B3S!(up0%QI zH9-^@0mm&|iFmWYfp`Qv#W}%Kw!m(1(+RR0?1tAIUV(SBY6=ExDaZit^-NvYjp2>1 z6YE_kinYVb9A)QS_}?5D+8TKJj(g+O`1+~w;=l_C{)-jh--ERuc$xZ+m3XnPbIsSe z+Xza8{2f>eMBwb4(?p;S6F_k0T`Y0U!YGXM7qaF*Z*_%yZl|AWVI`Kl<%aU}(Qr<{(fl9OOa3#iaS@^zna?8WK`XEytXZcnaGmfToyNgGFi6+g8++0%FC*W1q*8!xN{FKpI@mV+h9E8bvD_j_dyD4K>Ye>rqDIEcVWJJeG5%jBJ7_&I>tAY`iy6=wQq^k6Z=7VT-st}*vqL67fl z2h;S#(#202nwDPt#NW9zy6vv^blh(adXC<2tM_!>@Ai4lvG+suo+lo3a~|HD6KA?q z!89d>4?~kv;WjVqb>9?9F(w{{*ba7GIuB5y6V>+XLq;T^G%!`_+LnFnmoxZAAtoc# ze+FM9$J6JfvWxEYqQO3qAbZ9B=*V} zOyYWxf$$$?(4=D@nhLI4R;~TJ=>Fe((fjthT?Mzp^XBZemFph0gIm^Bx9BN&Dk4T# z!BZJAI(%`rEdwCTr?^(GGAA;kzw*$@cq(>EM#XFwmsxR*R~4KleI_dxw+jH9T}phKD}m8bRk< ztl=-eijpHJhX#G99rMPcoMJQydq^CCPB-CSdj~RbVjzlZUSYp~X3gEYeC9KM$A{XD z)5Sx_i~hl-(XE=cjhd6|H77Sit=C_A|D}yk_j;(i7*-qb*#Ee4FX6XA8eJP@$28|kM#B9dSG`#kj zE<)K{DT5OvUV4J`UfaDCfWxRg Tuu;>wUemec-}W}J=5_R6_Ooyg literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA384.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA384.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0344ebe5847eebe811722e4344ef49c3f820cfd9 GIT binary patch literal 7120 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 CJli1v literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA3_256.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA3_256.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5905c0c1941ff2a7cbf8883999d34eb53b3c13d0 GIT binary patch literal 6344 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA3_384.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA3_384.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a26c2c42039005f938da01e7d39d23e200c877cd GIT binary patch literal 6542 zcmd5=U2GKB6`t9hU9Wf7e~ZBeOc;I~vkqQ^?Kox=2nHKWsAwDh)D6{mc4yWedv|7Y zXVzvnc0yAgj2a1|sDi$vREbn99w17kATG8*|c^?uGFYV6>kI+MdhjI-1*sE zW2LFoO1&%H|GD?+H5cpr1QL)P&S+hvy6v1&Pd#4M)JvZ zx4qWdiF(O@nMpLr^%K0kTSbv*lxh-9g+R3SA@)XDlS^tuiU!Qh8BLUgTp>jYIYX1Q ztSk_5TF59#GjvWuhy{5_LmIDY2Ct~PA*zM~|C*N+0>hbtHQ}r- z^TxQ$$J2Q=6(3dQ=}{i5hN7vlAYCJ_Oo@bt(~R?jr%%Q9^WUc%@F#|>VHh&}1c(@PFwz#P$ zw!c3%(6=wPKem70{#b9UFV+(~@NgUkQ?`Q9yQqO2+p8HCuVltE!w7T$Gl_*3^jk^7 zG3N>y1HYu{wq4G8jas|POi<`JEvuaIPSjQRV9WX1XmG}6n2AQGUM?kX5kPm_md4oN zj7Xf*=KyDxo8d^kvC*C3o8gN7^0)7@MvF5BG6A&LCRe6_GcvKosg=vy_F2HG)H}U1 zEQx^p+nsi~oM9a~S*8HLsQ=WlhaeU65SMw_3fa@=hY8UL-!Adf<4OhOTbsb#nI#}v@b*1aYyV6qsvBmylzi(RXf34JYa;2;9?(4VT zSoL`#@j3rjekL4QiL@N zv}Ea)`o3XmzE(o{X4#StWQRlaEOsqwrz zi4##dZ8}HI8zf_TJcuvwqjCPsGmGPPt{gH7 zfObfhEDM7>6bF8!<@uDT@|v0fNySWt@2~*a!2=6)jLR3@rV8>aU>K;CDehRq6BJ;$ zN0}l*1UZgug3PQv1E$ErFeQOH8@^&v*GQ5eS&?m+;Z0ji;LXS?X@h3eOLk!IPR!aN z(@_CIeDXZ@@Q@XotHEZ$eHcdcJY<)cNA;l1OQE*=p|+c6mf8>9Z$GpW*}Bknt`s@H z5I+9^u@+lwirq5qyfy#Uop5kv)qvcDVd+!bXwzkxL1aUURRs!wtvq1Y> z!-lyK*#kSLT+;;&)NP8LLlisIv_Y4Z3>={e^qq6+<PrRXDQbs=yKQG_{`u&yV7Wp#GV4j)9&+vub0@^d{5fS!|hpYu&Z*vU<ePX4%|E}@b z>?gCO?%~xMZ{#>aEbuM1?1`UwZttz5rEUArbZ%L0*s#>FW3ge!LSVETIn*sG18ws|Rz(4;x~xvMJ9P7{ecfXE@7Bp0X(`n-Me-?|a^ha4>JyRp`^u zVrkDbnvB0zDXy!kpu5(&{{QIehWUMS>?A^-vx+*^4^*1~z}2wXTsVwp6pYJCKFxItCR~(;6dJr>{)k-Tm1M zpSPV|HsWY#gAG_t$Xgb94<8sE(8Yu2{j#w=);ZiKot+84?=nPK2#v! zVAfLy=i-5HUA0(`m*H#lO4p7e49_vEv5-9$Xc(21#a|+eW2gA zmWjYsxdOjuXDS08`Oc`LU6jt8n6ykbK&Ev5v;w}sxHx5np}LsGPyqaV6;y%x%{-7N zQm;moF`zV@tdG0vI14*kaRyxnbTpDOpGST)G+s`pm6Rf@5cE2HYB4EgY#M@Ex`i8w zhP$>tE)to?|CP;ZDu|^(1PxN5zv2yF|xaKar+v#2G7FwYG^1Q z^_yM@#;YS4oK!)*6+VmUqo=+OvvT-RF;cDY*f$L~tDl1mbbS-kwDEf2{lEvo%5dP! zoj2y+xFgI9rLIHET|IX$%wKQ=1aRjggTS3%hMH&;aOiiN7PlQQMMf6FBg+lVb74x3 zr>b0f#0Z5$94go0g~V{#amI~yXCMw=&!u-%6V#3^?mkLiaNusz5LAs@4cR``08hm-dJxEJA29*NkN2ChV4l~Q& z8ZHOJbCuVT1VB(Leh3@5H~^KcQhw_Nt~$>9&M}@#Q^=|q?}6`G;L{2L|JDsDE2BOj zS!Ct1pNSuyfOkiom*338`yqr_22wE)vn&!P1cZ)wRyM}tqgEU>T3%qCcN7RuH7z5H zYP33ZJwFahfOBjwW%)LvjuA*}nT$3Kh5#aD5#B;8X4;!p{o6f~oEG6FGR}{V9uqUV zJUSY6-a#!x2d|)fJe3i3Jw94R8>5vMKo_NKbBgSO8$I?A)uGsa!ZsrGF2FapzR`2w z{G=5$SJO&LCa7@5=CkUgs!gkWP9%U(u!(w{N4t>Ia%3;eu$=8qsF_}{NE8K8&g4Xh z?oI#XG?r8ZDgkv-@Lnt^A~q>Ne-0I0gAACi4IJUC@hkCb=^IiBkT|rwh5u#eFFF_6 z3KDk>Q2#Fu2Co2Cq!dabMQdt<<+Hw8nn3 z;qJLlw=TB6QmQ|=5IFcC)Ow?NVS7(0)Vsj-TFAxM&r{Kexw-t-6+3Gv8F=FA#n?wQ zs7q(It{tau?_y3N$hg+4AA+9HxCH|c8r)l9K4Qq+RI$PcDy#J}U|CqdA^h>ykfEBA#xh}@K*I>kUjFUEcW)o#T&syQF-b)cYb!) zSZONtp?9@+?%&*d=HByt=bZb;hK3*m=})J|mEW{8%s;T=B%fVaDM8^HBQX-2VX|z3 zWwGqZc(UGvH_IistS{lq`V;!kqXL8%_{kQA0em)JzO5R5jM4W~wj280*; z`h`(ZpC~>Z;<2Fz8u$rl;I-tWoHAlT9@4PJtD3G2x~8^ zUzC(_SvTk&#_3YHn;;R7yQlM7nl=(y&u0uc2Ko)P6W7du2RSYiI^yAB*wbQLf2?nB zY~SFXSYNDfPhV^xHW-7ZJr75rH)U%U6d9%t{#akhuy__FPl*w*ohFHe8noLr>~qeJ zG4M^AZrjgUuTgIonMsNnr)E7%-pPjA7OXjM8%<7MiJ5G6%9W?&EdttZ+tL{8oF0jD z+8o5pawU#58tdH=z7kjTSKfV>HQJm$kZGe+t~_0t0#4iHCZ|++-nRDwcBRp2EwLm5 z@^5wOm1l`{whH;2gg_P30Aj&X2QzFJ1W8k6Ga%$dNrE>C(i90pW`=A?Dym|bLFfi0(*-R} z@Z`);m0FPywgk_LnY>KJA}Fls1u8Hb?O7zyVxkpHKkx+zWBM(jqCS(;sM%V)ia^Uu@aE(6amHnZ=%i3q1$RJ>OgIdGW5axcAt?-eZ4gS=jq(x#z@k&*0tHZ@;nP z^F-ov{;&K@IIk-2?bUoOx{l<&G-v6upA01fU(Z9H3 zXko|DikEFW%EGdtFGEdB;pQtRE}yv0{W-klk(UWKuYjCP$^{%$@Q^5284Ik;Bo0}X zNE;|%^;>qo9x@zr1!l@oMgW5g2h9=hLoXgRWZzT<2;a&A6+ z?g3&gw$Kv0Y2111)?0Vpx%E!D_waIW{N5mazVx~G-th10%e_YsXTxkY&<;Nfw7)m4 zn+uU$uyV>ZT~I;Yrr0?|u|rK8G+D{O9-2VkIj3BCIvP6rKSxW6tucJxvUUYSAY-H= zn^SURylu}h`yWwMWd>cOf-yrKp$XPOv$QHv%-| za^N}|VlpE~!LdR|$8l&JJQx$AfpFlHvaH&;;B}2pi=+yVaYC1{z(u_{Yqs40>TE7= z$P%wj%Y=$Rk(wh~3Xl)&&RhtynskH;%BMAwtpG7jeYH4szHFeoG;o@r8xd`=(1c7$ zHe*(UBTKF-93f9r`$=&BD2@o~pV{CT=xH>oHnvP}GEJVvmg%?VT@5d*^&Cv6Ux5tZ z6=AkmHta#;_8WtXI|deZ43rxO=e*R4J%g;J-u~s@m+of{wm{&EICdYh;RTwJh#-s4!gL0~u&qGt(ToGIM$6?#|C% z_~eC8d;ZdP_~s9<`#)~IA%4_WZr^pk?QpqiXg)CXFDU6qL?5n?2Wog2eGtmS_n`m* z2eXzsI0p}W>#D_CybN!nSGp=qqROpG&Wt7YzkS1T^KCvwx0oidAgjF+7P!$P4uXE$ zS|$Ql;AH(0DnWR#J+rLe%T| z8t&Zsgh*r_zbl*7R1iyn5E`V)C#~UY5%>@l&vss%Eude8L9#n_aqB9#2KU1DYG^DU z^_yOZ#%m)P98^WURX&U9qr1KavvT-SF;c7W*meOgm68{?>UnKmd0>G6dZDWvGQl0f&CSVPVTF<;duKcyy_$buLWF z@nnrlj~JnFh(qBTT#XnmJC@vNw*+zcS}wh#nxJ-UapzHbbpvOUhM;P~z5(g)tKR%r z)MIkE>C`c_If43i)vQ4Ffh@(A+UpFWgs3?L3sti3<^S4lkyoXhXvuyyqK|j>I8^ZQ-VP4s_BJ06*HL3 zXsIcBJwm!*IqGFvRJIqZ2QWh!Z!vT+%N4~KoM49jtd3(YF<*J=eSt^q%)0d#Pk_jw zofnV7Bhq^D)yG_u@43g@n|-a1cdqwse;f<=jPMQ%GzTR}Ei04tIAtFTa_GJ2;3^3}iFlHd!Q26a@|O ztZYog$E;9ftTMqGR}m25X<9}W)o5+>cWwfv0RPgS%5o3J93D+;nT$3ATna&^2=|Fq zBke_NzIK-+r$xBUi}Pb+$Ha^-kBvp0yF|-Yz)d0_Ph~`1kB`+LZ>;(N=%f^|C&>;t z(PIx$9g3aDZ62m)0q(8!j-CVmA*~?e&nPLGpu!bf&!|(XHly-6kpMWstmttbsWqqN z$Zi;6`K#SfGQB|R6jM>oOGBxH!DDiT`EyFS_SDck&*fE z2zZxQhc3^|abMOoEH}2zx5s|F?(W%7H!rlmTy8u#A2|3R)PB8nerta@G%(K%Sjfc- z#FNp8xv_Fx6gy)m8Mq}H!0_kT^B>Zc8$$H I3DR}`4IJp(3IG5A literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA512.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHA512.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24eaa80e1ffaa56a4d6e80fc8e1fd5cda146bd7c GIT binary patch literal 7914 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 CQ$4%@ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHAKE128.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHAKE128.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..135bec8dec9ce971acb8b034be39b97bf0ebdbdc GIT binary patch literal 4762 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 ScTa8*{M~prloSqdo&N<3j!-lJ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHAKE256.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/SHAKE256.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdf961e3d6c1eefc036deffc985e5c42a1b29b8d GIT binary patch literal 4762 zcmb_gO>7&-6`m!R6h%_M{)wDe_Efekvxz8K{)xjju2sv91GjP!%Wg{xSS@##(#qUj zdUh$742>9pQK)Euy2!ykrs$y&RKU(DE*iAG7bv92g@uI<37SKFvn>Sya_W1t++9jC za_S12otZcL=FQCaz4wOyY->vrc>Z;1T0gvtkpE!Ae`1ZwdI2hTiAq$VL<}J>2w0Dl zB1SYHHN?DV#PTsCo{t+X`4%IQPZ+KFRwJ2D@^R5p%1Gza0*R2fh$`MDYD{ZejC#8B z?P@}8xh>>7s_{(g6YR_gu2`^`nn}2ON|vlj<*LG}Wyex2Lz9?%Ln`S7H+99*)t_0q z>1fPNUovFo_^q7^(_}}JY=`OQv{a}Ri!i2rT66f{R6LWtGSXN1m&dBx*wF zmP2*Zc4X7hVS!ZD8Hh_&Z@^_+qt1**bH$3Oqg!S+$#vxPIhj$|xEvk5 zG@d;|FY*cK+hd*>q)xT0c_X~-}z`0emr57s4+D*R>Q<4;b5_(=~Gwf?h=S&a6p^u~-{(wd+EFb|M(?#X@_ zoM~ssUWSvpsRo91Q+M2?tg1}2ZOJM!+)##Ay2&eYsiN@-7;F)7qd*t8z44){0T`^R z8wXAS@Z2^@w3*y{fNXHj9_p>-nc7^o^Pi|4lG0bPkLUC^8jfEmgb8`Y35 zAs9oNH~~pQsZXbXc9D7nXt%@HtwMVqJG6zqd^oE1@e5`mcam%mY@ORW0iM_+BqwoOgNt&(wpf9oM_{|LK%c{z z>_$tP$smZs=CZxm+lvLd0~_%LRx^q{=y_^8{AoFDJloHLz&4<`MV__;Rv)K&KTq|p zb-%K-_opk}<4fuBuaHF9<*w|<&i!{6-o5|c!h0)2r`LvZ50CNp>z_p*j{UWDW$4F9 zrZJ(JO=q{W>5GmX^C{K`Gj3u8VwN*v11gYs2;e@U<~<<~LJUG+`9JfZ9{Fx20JA!M zi^6xng+_2|grH_FYz;wpUi_&C0Swt8&p?C=@O;KH$`t@|K!dWbDG;ZN6nq}FDh^1S z$dJuquAt>M6QT*Q704BGhUU!Vro5A%qOw^9N@&~A%dzcPfhh?7#;1tusitYSa}WSI z?aa`_n5Io@47i3XkPWM1I%qvI(uO|W2D&*jmP(BZFotPPg_&N?!sqikysx<%c)|MV zVNi(br*()Y)SEgJ*q!64O^#35a0r2HqBgLFoZxDh45<^)v&bwX;Aker*~u_X@q()# zBfW5_H4!t2uIyzTjR(yT*%^_u(~Wy3y3se83_|+_h zK79Q6a#INT`@$6Pg>h^)Nc}u*%^K^%iz455ec>l;H@!#|L__d1TO*YKT#VHI_6`Rm z1SiERSLxwCrDT~}Uj`wJh})E`ho}MxAAduK@Gv9KdHl6y19LZs5vE-7d_I+t1i)ve zPwUu=3Ijd&G-c7+>4J1>I;>bL7dy-6-4_HfM`Cs0qzYam9`C z^>2?Xu81FPfh^Yp2WDS^0wCK>x^~@7{66tvvNV0WJS{XdGIyiEFa$z#a z(jdR;9tDtond;(c*{Of*UhaKsrThF+`uu9g&iVBA2!c%Fm^=iPyKwakFC+Ef0#FzJ z93DI1ARtL@Qj!cyt(35ymZa+yxzv!fNRnzP&>e-#8v7pT>AxaLsXK4vFE%7t45wmP?ITm-7}2muQ+(O0sR|rkb%Z)mSDsn2o^hWdwdQyl&$j zHxe;CM1GRLhKh}s(OYDrhopP%O*~5VEs379Wye5}>2&vm_o3`%M=!xO=%@mTf$T6m zC%0#-od13ymvx40@a}_nNAQ9dMk4P5$P-9(g6{4n4S3_qdO4@(7vi2D@>aqv&!GxT z-Z%okP5jV9^C@;3`f!;xF8*m$5QMK!5#iNuL{T{T4S`}Ei?7o}IJzOi&q@7vPHeyr PC_?{6Es_=vaGn1HtqD+v literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/TupleHash128.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/TupleHash128.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00c23279400c8ce74be5f24bb80468fc526603a8 GIT binary patch literal 4431 zcmb_fZ%iA>72jR|1)GF3943L3$>lgO2~HqKge-!>#e`JHkxNM;olCS{yaO!QyYB27 zV#lc5={|szUWn8RT2(rvMk-alR8>{A>WALZ%-Uv{$Pt3z}0yoCVu8%p{jlEAC)?BeV+4C_MtIv8v zbdksWUbF62 zCY{9BC4DY8HGRCagXk>^BvI4{hXU1+nQBlCG)7AnpKd7&~Y zbMR$rWWmo9`*cjN17hzk1jsQuBi#e_$5+Fnkts{7qExI72a98R40%XZm;dFRp;m4*1h1Vjr))8Z(ZDW|I%Ly zUS4%R@b3iMR-HfalLnAXR6qcI&JB+Tp8ekd*#Pg%!~1ai&}Y~_lldoQ{g1%QQSR;# z$1Mv+B`CPOP#M>2wQMeEar1Q5Lv5a(z@cXNDvau^mDzdj!LSqTorE*Y?T%ysQGm7t zg&PHzitic7pm0Un45ER9AT$(pR<|HVPsa8pn$1WAz>2ZXl#|*l%#=hrP6MCf5=~=c z31byuDKS?&UAUfso=!JHX7z~uMLDu$NT{1d?RiQiLZs~Z6i#U*yQtu$Pz2pj!9aq5 zgAt%21qNs=rmAMtGX^H8%YtJUov3RL-z$IS&Xo0# zrY5t8H0hRTS_!$yYv5!E?Q9y45~2}8flC@G(`~IoyzminkO1X5>84C4vz3AZwn<)x zH#q?$*J%4RZ0Ys`SC0W%;a)Uy{>FzxYeNO!ncYBJq5W1VaJ%5Yz1Q6Ol5^BuT#fEF zwQWX!IK11^Q9z@mma#(P*bbKH9`zPQlvIU?5UnJAX$iG2xFijH1b)_G@S%X za)@V0(`lNquw}ZfC2QejaiSoj-vI*fI%dPG;~;7pw&iEx;bM6Bv)78@cS`8$=lxn-L>312+p zEYVE(qXQ7I4;@hO|2p;S_?{%=gpz^;X%!vv*H7Qdwf4cAT+Z2fq5mGeG3PZ!HC+sK zqyrp5s5?V~m0kFIIt`d|PBH83Y?f=PW)_=y6GZg^Anf!T0}q$hmVVv&Tjw8qzw`aR zq11ovFTt_xo15;(&0EsXf~D5(r@^t(@#_We_5VOmrzi9C*GC-Q12-b&(g5AR285n) zo?qlilPs|JaX3-nA8t@@@Nf~}MN4+!NNs(uA= znyK~kK)|E*od4ujOVQW0{oZFS#dBjjouOx)1I5mP)obg+MgJRL91pB5uisf)E_mBn zpiG47XtAP7DJ+U+y(p$MIg_M)zbJk$BPGit9#NFFgea00Sjb8N3<#a{lNv=rl+aqm zx?1RQ5K5?oej3Qf+`j~e%loq4LlQ?n|-+L z5Vq`QI3j#yT0EBX_A)J3j*@|T*_II~IP$`b06?iNdYqN~{Shy_EQy6~*oq*#VP5{j zMu3fH0ahZN)dEWPR<-gVNyl{;^gJ{H!2EO%tjTo;Bt1Ehe5Jkhvd^~HQIlRAhJByq z`AW$Qko8Odgl%7igbbyVg<2aaP?*{!Ka24LrB5v~Q8(N=covgTwKBSqrWKWx46_@B z7TA@m$kIFq;b9dgRlG;>jFd^jUxkh?y&XpHK|!3#r0D0MEmT<-V&I#WMUpBbDG7y> z3Z>m5T!0#i$1BRTCW^=HIls|Fwh)~S?9~mN*6BV5LsjJ(s|Wh}510+RV4i~@w|*YV zb>dNestBTyvaFIT7p2r%R@I{JcziM*rV}3SyKd+M*(3IV4O>Jih`; z!3=pmn3? zQP1XGs5=9FEAQ@jeCy*|XA4c?q9?q2ELdobmX3`UyrVmwrcM9WLLu1y)YHEcJhAEr zPQlZ$;|p${e(G!64YU_dT`2`d3jUEjU(03yc$@dPZ~o-_F!F-qzty|X@l9dqHH7zq zZ){1$VAraDuc7H-Y%R9w-8xfhcx&a_7ry58J3swk+h6hx6r2O)r0X+JRDU7Ew+$r; ze~lLtS}H9W>~gg#dYU%KX-cS*SWV9=FVk(^IxN8+m43hS4q1tOm|Ox)nhe<==L-kV m^Zy>^_~9aV`R`otuUy}k?#ukCb@!JXy!NjMXZTCZ#{UA)qAt z*p-bD0dXiN+EXmVA;+NH_&1P{TVE`zNRi-@3yNfM>4`VCcbgzuM%vvsJKuZnd*8g7 zU!&2m0OPk}Ro|2a;SWA>hd4Dxm%!K+G(kg#P)8+%xGfrDT`EanOWz44U(1*DA0YrH z(eO;Acs+lkkj|{|$*qQMkn5^*r{V_YUq3vMP#9eRr(K~V+~v;y8XD5XgDH)#&~q@- z35=+T9n=xG#U`RMliYBc?_e7JTcr6Xh}yg$P*Dp&T=dPk4$^`($VA^^oY{D2p=Vwl zK=O6R4_2@p0Hk~ZdFB){*aqZt`Gz&wt4U%(H(N(yAn^FVR5*-b zA=uH|1Y6sffj#kjAL}L_d#Buxc#UkU4TE9b!7Eo%_+#DF>y0{}W<8LbS7$Fwi&ay@ zs=){~Ri-xyW)@Zy*O`-66fforDUK8IXu#KD#CCWc+2k|l6Rb1K=~J|!3b(jQ!(mn( z&yP#~FP&T<&f^JIZv%5{DiWi*S;g~;QdAVqr1%NWE-fuCXEVTL?3(+Gum&}A;Ge4) zs^jDoZ!4AQMvj5Q$VnMChO#?_O4|!JO{0Y^)7>U)t5mHM&=J?60=z}AO|7P`5iKch zY#d#MwmRay)xJ3A#^LJDd2p3sgQ(z|Z7=;FWaY|fm4|_e6eHfeN&ir?EgKGf%O(X% zEjkQuszzgCQy)Mm@9d;+7^vM-p;;*$C4ur&K>1DNa0qYYr>lirS=Dbh%S~c7%j^19 z+0hwUwAD&Yg|;qVqb-|RnpG#4`Q>ui6B5ou%5DuMI4JZbh&Ic^{sONZ;rMOg{A;_p zhqU>ir1(=>^{!$cgU7$MWk>Vi$UET#ZzEKQ-_I5d+MXa-2KR5H2y>B`%*WwH`|ZCyYtbX^7#jwKYhL*>C2g( zFGKkaxdEb1R2xRTBA3(IiJH8^pW!ls4?PF3r=bt)mew%HDt#HI{MvJ3@H&@rcHX!YOX@~u=7#WZh7|;wWus>kHU{5XL5gyQC9kBeC)ENr&r@eO+ zN!bpD{jf9qc;D~c-TS=vIsK`lBS|3r`P`JgkRjwBSnyMRA_qodd%kO(im zwb9O7qPIpdqb079Vpp|2m%NWvxi&ZTmZfWNTDs{_=BCdX3UmC@c9l`Zp|b5T-JFt3 zmB~ry(>X;QnJEi?Iibq7UZb+(rc}8C^Nh-K4s+X}P^vmKC%7GD3x+$EjAa`tq9t{j z-4{>+!Oif=W~r(wvvOH4sh+N$j5G`D!;rZ_C@BgWDMmD*C~6VdN>md;#EZ6QP$1AL4ojY^v^^-N_m=uPwJ>4Qg$W6>j&7M=4>j7NdmH5O+}F>-MsE-Yx69M5 z=J#^cY2FJVGp!?=?e*vk&ao-^qn&oYp)TBN&h4c9IxVR4@BVVE9%G$ON6;fukJaLY z_+x(}IAEDxf|av=KKuqN`YTL3k$?(V-o~@gFODR_jdJuobsM)@|9o zSfR8A>$>f-s>~^>?o{12S+fj9H{Ez;PJ^zwxEr-;dD2Y;U9w&e*`{*}Q_!H?D0Efa zm^XPGw5yaI8}5sstxD3jM@|+lD7rjSS`;~aJ_AfwOC0}(t_4AI!*jiS)mmOHi4%|F{ zZ}9NS;NiyLk+s2>?o9LVp*v@9{b)TF=`JkBAI3?#d#!u-a__0tr}sY;g+0%%6JcBb z10r+k$7b8mQTWq7QyD~t-Nq4P-UPKMd5DIu<9BluB%nbr21mDexr9!}k00G1I zT`-x!1KyNiuEeG)D9!}t9JU1j3C%fxVF)fKfK~`x-?Rg;M(Pm&>o$LG4aytAS|{g7 zPON=)+yY-^Rw(ypXz}ClqKV~`NzbAr z=@^@`3qc8Mv4eB~-L~Wffgzq(7*nc41~n{Jo!99?t{{zXnH-l3^q{B!x?HMxt`cXj z4ZUquBvmod@2X06esA2uEDwNuAk_)DMwJ>#rTygmvB>rw%O`6h(|B*-kh- zw|%@i*Mu;KeMb|$O3AiZi9HE@*b^x5iaGXOu}n?29f~=T?Z(=tQ9J{}MhgSI*xE-Ks(JyGwg5AT$7~n&Mqo1Z(zz%{ zryKW_bj8vn^H7R*gD1>k>PGQ|Ync|DV#Nsbu`3_|rF+O8FYv5&?)~`XM(1;jB9C=L zE7_qt(N9yKq(04jl4%SdTOEFJZFuzVj>hoOwc(Mw(LbhtpKc7FTyGP*Pa{ebe%L#+ z6{U~jq-)OyY9q6EIkA_cb!-D%@hCW4--OH!VDBMctOpzo0Mi=upeH7%Z9>H>dlCSL z^FcaCmV~jK=tlAKSP#_jqs&D@_h#d?{)vgeY-^n@2L|P{&~Bq6yh>IxJ?}Z!PyDR* zLElID5A!$sZVxOC+>JIehnEwFJwFssT^N9>@r}I)nN}M7zi;Kg(coLnwJr;F0lY*& zioxFr8@&X?P$CDB9tfm3w#8(DW>JS*Y`A?dpq$FZJxfhDBM9%>VyE0NG3NN^$|FYW zxyEHaW<$*Is?NhO`zVO3gj?R=N_Oz3c6)Yd_O`WTHS$Lq*`tf`zoxRBR6WMJICc6W zv5Ox+8$vDGk>Ht%L1o!Z%Ccc;l``hjvV5_kl$$MWGLTbMmf1cS!$TSy#N0s?hd?Y5 zZ%!Wa@PWWkAn~>(5ZB1Vh!{(Jo$QM3`TE(e*!HjcdSd(5UlwAouE%4secoUkqQZZW z@EVXnt^X1Pr)#Yy)9j`RTEu@%To&LBA*hi{ky&s93?6*=wYy9~AYm}mVw*1=u<^K= zCPLig+LfQe@Z;byAaE$ao)%iX81U%e0m+XdJx%JY`kMBVGYl#HirYImhB$F4X2VcsJV;y;#vf6$)_) zdMKtu6;=iYip&lwHU`UP%qyJbajF0(QBcc@Z5Jj&=uI@wm+R@qy`#F%`50Q@{VO19 z&%S1=7Q=`7W6sh$nFIT^9H(*jB^Z$tcpm5-XMP;GXrbUDYlBzYPMy$8OT|^he1LlOK=X9B=G=VLAE)yjPaD@BchKcyl|5wa%T(J;zpio`Z+b zuIJ$)lo^1BQ2W4_sqFiOcMI1i8>!x_C)QF=TrVx}dj3w|=c$q9=m-bSST5`C3?Fj& z^NwE5^PfwUIo*5AqI>n?CNjdRr(RUk=kZ-^g?SB>Nu4#{^;D^&O80e%DKpZNey@^gr!`cftSw literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/TurboSHAKE256.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/TurboSHAKE256.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b82d18d06655c365f8dd898319ede02be09b8c9e GIT binary patch literal 1069 zcmZ`&%}*0S6rb5G2rU%|V1Q_tgBU6w1rmj9jM^XuqR~W%iKGdg?oQjK+ub@l+fq^@ zF~-D`+=yQEh{1#Zhlyzd2hw0-;;A=GZ=8J74@-=`WZ!(f`Mux!z1gq9pdW#KTS=M$ z6``MU(KMwosa}G~9x{-DEtJ7)7$ZY@h1QgU8uC>z9ENb&zv}V0v$7O3ToD4N>GG^L>B^eL>IUwY5R+x@WEiy?W%{Z53DW`Iu#0!E=kT?^0#%waZ zIXy$DZNOyi{!|m4kku3;21`)S5+p}0j}g;_n3-0LK?Nma63q=uPdTTBaE4_ZUdWj& ze~!{QMiMv2c!4BL?h2x(JUdOC1QD>GVXjM)j0lIMsGDlBSr#%od+wP)h1o(zP@6zX zt3Y&WS#m?mFp<(?UKWV4SVJ@I2@@W-HBds+E$X^jtfg?Qp>M6~a(i9U$_R9e%Xd+E z0dDKsvaLIuLmU2~WnG!EQ6p6LNj)le;YtYe4mqf0HOWNT|5VDi$T^_M*28{#I!~dQ z<=%SA^;UOkH(eP9JwCg$s70x{o{Q#~or^v+<5AZXY%)vrH0b0;7kD8n8~|bAB@is! zDh(dbRJKr7;YsmsK$D2>GjKcT^fDS6`QU%&|2V(DdN?>+@(mn!^_2QYkGdxJ`@x-D z94rk*j)$)QQt|M372)oQQ-nJwegt~oYHzgN#9`pd&b^bsz;3)WJpSeCQDCm*o2vpi zdIZG^AR%rTm}VAh=T%WBeVBR(*YVz83x) DA6pZr literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48b0353a23c116d660963a05fa176ea9efe337d7 GIT binary patch literal 2271 zcmb`I&uiOe7{?{cwq!fD(_cy4u0ssEqOiD@{3Bi{fz(M!$|F`Vu{qLBbisS z(+F#XvBN?RxeR(8yN&d)KVkR5u<0cTa_TO-mF3pcp7+(OC6qbtU;@4G^Stl(^SrO0 z_tER$(&;1v&+qlk=C3J+d4rwsiBRM8G8iwJO-5&aVxKZP`yKO?-Hk|`l=Gv@s|z)s zTU}IeQ^HNzPds_>cxiP}t`z)eeR)ClUlQ06Ky36BSc zAIV&!%mgq=PXI<3$xKpa3Ye6a048xUvLM|=iffY>x`M>8A7XX1ut8@gzjV$-ojQ`UF$7#gE;7NcA_7Xz*#4sMsB+^kFPK(cZIuUw?*8@p)7)sTX5VDZZ*$$GDeiWB43H6~-Y+M|;*n{WY z+|t~-)>OOeUBm3If6?4nx0{YJ)7Bc#wN1lbuc6(xW9inmaR>jA+)>r0*>qGj-`+)^ z;H}~2CcJh9K7~Ezt-y?pAI|O19o*epJmypVtUTc56XE)C_R8Ul{TByrU&xX1`2jzF zB7Ah5y>{sCy9d3#aN~a+zdzvbpT+;N{Jr}+EA<75EOO!Gy#askMELkPJ9*gK?;U*8 z7j6>hzmC@ieC@qBe`Kcmx#?H+U#=c~J;+sFXJ-4t>?x#=c_>AEURAYLOI1lye`e5a s7)PH%^G>+CZRwqsF^{If#g~qK37WSY%d&q>$5S(V{OR~@wn~t{0V$X5?EnA( literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/cSHAKE128.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Hash/__pycache__/cSHAKE128.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3670a2a9d9fcb42ed9f133fa1525b7d6d55504c1 GIT binary patch literal 6062 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/_ghash_clmul.pyd b/venv/Lib/site-packages/Cryptodome/Hash/_ghash_clmul.pyd new file mode 100644 index 0000000000000000000000000000000000000000..55b4f7140f73bce644d23b9edb974104d99cd826 GIT binary patch literal 12800 zcmeHNe|%KcmA{i@l1V~%gJx(%SzmM_VO!FWp)~|kCNhB+cF++5QWPd3^M*{D%*@Wb z!N7->&`G)uuhYd{ZQX7Cd;q(x{jB{gy8YCE-F_w{k_5qqhziA4tgW3Gw#2&CU~S)i z&wX!_3D*AA{?Y3D>2dPj14B z?=}%2JcqG-&YFR&8w?5}o*dQ!QN2?Jyr0%No?6BpL!T)?A9Zd4PSC^H4X`u)gc+*@ zabzj@)6DlHqiCiYDj6Wj0s*3npl~%@TO28tW zb5RzcWIawSn<`z5NfaP3C|2BYfXw4$EL9cO1^E~~Xd#<_pOMg^lk`QRkv5P#CM`fn zUlmH$Ir1~>aWZy$7Wom12sly$r?MX@aj)Haw-morEvY||)GJc& zh|seT!IXN(gq~6$$E@gHTlegzc>b-VJiVs$M2i_7w1;S#* zF8YO9X8u$;V}9YKlwSyq`i1Db7F1&^QB9hJV^e}(m>BJ!60~8dZCFzK;}=a*!ew_# zea0Lee@pnH8}!Y?oDWI?m2lfVKwWl^U+5V23zyG8{c~>#d#{nyT-b-{(90-;exc4a zXrlUME5y!$cb2HL@Tt!Ai+P|2;L8Q_Y6{im*HGYRo$Dkd!pHA`z>8qPMxE;nvHFSi zoGx|wEKGW=y3I1!ZHJN2FHxQ$`2lYDH8Ok=ycdY~Jamv-(U+%9!W=iG+pKdG4nnrx2tQJT>we`ZBtB~@Y#DfyahIZ~=41%b+}B`58>M3d}R&-0ab5N8oz zX_be+EuYx89({%T72@?BWkZ#4*^B6o7FC@lWI{UEwZ z+K90DhxP+Np`^#&ts`!G7-X}(1$BqLnsj}xTIwIqm$ZJc5F27e5FsM>*sVnFwo3gM z^Zml!Id<|j1y#b0+>g61QoD()@3O8-HaWRpgZ>71_a5rdBvqKF&}Ev9aVu{>3uc|` zB?jX1^Qb~6N$NPM`s@+j_Kb-OzKpugb=r!tV|F3)8dU>SUEp#jNUqNHvw58Q8ROt} zD_^h>N^yF~#KAkn#-a!fkt_XJ+n3X5fbrQ28n&?Yu+`AkuWzdcA$s1zm7K=%qJB2?<@r)fn>h(C&%rn$W-GwtyH@#*;&LU~pxo8a51bPBHg&1U|vDs-0A-yV1gihGYZuL#aNcz`M(vuQ;hS4z{Gc&gT-2FIL zoKKnJ^{>(`Lg;-4^^o}t2ufe+6oh(G%AM&S7lL{hw~}-@SW?n<4Q@M9vLqKE{fA=4 zaO5pcZ`H*`wErA8MYKN;kUod@A@d$6MOI9GP}Jz8vKy37Je^_Wr|%= zhtoHr2}aA@>WO32p-FuXiQTQ11fi@!JENH&!o7yaXd(wG6sIhXXT@GCseAZ&D>iH! zI0_{!eG2sfObU++KgXT>uc+pY=-->#TcUS%B78Wawc&*MHZ-K~!7zDb#CZM5C2%@+ zYdVCHrHg3%CPX4$@g(>R!zhLU$Cz{fkJA;v-adEzh4^cx^glvc9hf+*JF$kGIB-f* z2c^Vj(VcLXC2&3_B+I6|`2;ze)JgSSOi}MxOjvH~Tg2Gj0!M26*D#U1U5ihd?rW4( z^Jp33gfJHkx$M<6I}@dv?H(}IbGRK;VG!w8g3{i^^j3 zTxhslnA~i_%B-F!&B$uDLr|gnFp=-LK&|QkO=TBm!`ZOSyN!;;ne|MQCpM{5bPanG zni57@_GAHQS4L zThfN&TF#y)X!5+ykaLN|%x@ilivUD zlO;*e^ot;;cnkYzr z0mKm#H%NVu{OhsIko+Ig^<{L0AlH+MQKxIt+jXKK{aGLrm$Le&*MO709hJeH*_$17 z)+qKeV}o9yWQILDo*p#Q5M%S>zca<=@zf!yrzLervwizo8gH|Gvx-+1W9N2I`li)K8e<}8GYd#d3}uN-|8||h_VB>7;^;$AU>?&{lUBs0$7Xt z0f;0B@?QZ?n75)f@rc8Pqfm-77!_X!I3D}^)@{Ly0otU?;7zxC`yrC@C?Ed(1;i-mFDS20!lsgJEUrNsDb|>eYloF-(rWI$DGIi}7 z_lo{Vk$Sr&x8J=Y6+tpQUODlKV+^k%e5I7eciY()Xw4L1UFHMk@MT&ypvP$c`ScJ% z>li~^ihC}^3Z#Fs?Z1W39>$T0<6dys{_{#+&sc0u`gL@`dHM=KX27(@lIHJ1Y#?5d zAZfhT;C{1FNUkqm@5H+}Oy;T2o?d(uidcFOI}d&**G)F`jbakg zYrrN_v(1CBq&|{{n3R0z92#*pARB5n4HqlQg12R|VDchw~Vl z4w@6BKg`B~9>Klyot4qc-M4)Ycq@gAfhCtx$JSpX1-Ok0MyOwo=Tt zA`ek4`L30c3v(&+C+pusW}Bej3uydEf$x#h_<%)P@k(S|->I}e^?AtjeF>e=cl4^h zsSoIT91ECi&!i2jBjp$o4!hL;M#lx0`fS6#$)F;4H0*nGjU0@*)G>9^G18D+Woj%Q z77jP;`%NGyHzo4yjm0OSCr`bCz*`c{_Bk<+6fe0O@3UIPfcd2x1$;;Rlj=feGEov<8N8kUwnNIY9h5Fg^}h*)QI9F;)^U`8ZmgiG}3= zG_#d-8CGzUjt^SBl<)Y_2gH$DZZ3roj*bDXVheup)GF@f^)_A~}q;FAW-Sn-v! zZc2z5*nP83AG``?v9m|HTZxTw%lkZ;b*%^^?O^fxOc2DTaJ z=s^bx@)bR`x`hlqa-P{dF1L9WubIoWfQO+PzBF^WF!8X)Gv6OEzf2?<{yoyZGt{AU z`ashjpuJ%5ckkZq+m7L}DU6zrFQT;Bn;N(s3fv5D3%6s*<~8eb)>%AVt_-|dveTu1 zzs!8Ut&(+`zTDK$g5*{c2W0~)& zPS6&ti>mF>C^cuk6KB4svKHtDn}0X8(@cT}M`M`zoKP@tZ03HxZIq> z%u=WN=PXJUD`V@L%#tibd!R$iXZ%JDuhug}aZ%jUE0YZx0r@laon zm3gL2tRbDls?O!I%E$8AO%E5a8}7HTYr6`WrM-yD&c7COYS^N_*>tu(8V5qj=GiRF zrW7)puYlQ>YE2y z0h3pS@;^r3Jm9NQUNq=Cfp5ubCz^hy%(NFS$Y%?d32Z@R{>9SpwJoHV{Cxm2_u&`b zH$W5QKCI92n1p;LUzeSsttduO(l7(1oKo`37T+zjx+vNAebB98okA+vqf^AA56l@GCkzH6NX0&VyM3h)-$Hw4& zfuN7E*UcM)?U=X@+1J?BCWlFUb)Z9$BaD5^yg^nzu(>8@jjXJSMIv%g@kByxGE(NC zxmk{M27;}MoMExYa+{(C5sIvqTgg{XM2?~x3+LSxlOwx4a>O5sbhZZDFp3z45n+z^ zYj5(gTeG;$?Gd@v2PP}Zg(n+!MHRWTInXILL@@xFFt*I(3PfACgW|&O!1hRMWY?>#{#$=hQ)cF2*8m;cbX{*Fesqo&H&(LraM*SpFa z4a;o-f1u5)2M^Jz06(huyvnYy>#7k=yr%090@BFosF({v}C4YlD=h0cJ2&~&m}XK=5~Rx)o?Zuk26q* zZ_sT?fNciu1AN554+5SwaDw9oehH9%3nV`YE;jH_0DcAK|Dd1X4-G!SQ3EG<9qwS{ z=M8}0F>w0-BPZ@-r@$xZLm?T0NdrF!I3XgJ<1Tawu(BNY4&VgwTLs740Sj^0!-q@O z4frLLTHpr(>7MHZPLS@c7U(BPcT&O$(!G;#f^`IRMYq0YM2XlK>VrHe#d&jNm2{5NG=BUPWw=mK%IgCBMp?=F=TgF}`>)`vj~-4Ro;*Btm_7Po57OW6`2QcU&8JuZ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/_ghash_portable.pyd b/venv/Lib/site-packages/Cryptodome/Hash/_ghash_portable.pyd new file mode 100644 index 0000000000000000000000000000000000000000..4da569c12d9523be8c2a2471b6082f34b4e1a401 GIT binary patch literal 12288 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 SiG$L?>4P8Z2>nG*{yzcb(q|6< literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Hash/_keccak.pyd b/venv/Lib/site-packages/Cryptodome/Hash/_keccak.pyd new file mode 100644 index 0000000000000000000000000000000000000000..9aee0e89c43ec8df975e18f7a7d3508253350732 GIT binary patch literal 15360 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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, concat_buffers + +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 concat_buffers(_left_encode(bitlen), x) + + +def _bytepad(x, length): + """Zero pad byte string as defined in NIST SP 800-185""" + + to_pad = concat_buffers(_left_encode(length), x) + + # Note: this implementation works with byte aligned strings, + # hence no additional bit padding is needed at this point. + 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/venv/Lib/site-packages/Cryptodome/Hash/cSHAKE128.pyi b/venv/Lib/site-packages/Cryptodome/Hash/cSHAKE128.pyi new file mode 100644 index 0000000..1452fea --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/cSHAKE256.py b/venv/Lib/site-packages/Cryptodome/Hash/cSHAKE256.py new file mode 100644 index 0000000..a5b8701 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/cSHAKE256.pyi b/venv/Lib/site-packages/Cryptodome/Hash/cSHAKE256.pyi new file mode 100644 index 0000000..b910bb6 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/keccak.py b/venv/Lib/site-packages/Cryptodome/Hash/keccak.py new file mode 100644 index 0000000..f2af202 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Hash/keccak.pyi b/venv/Lib/site-packages/Cryptodome/Hash/keccak.pyi new file mode 100644 index 0000000..844d256 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/IO/PEM.py b/venv/Lib/site-packages/Cryptodome/IO/PEM.py new file mode 100644 index 0000000..61fe920 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/IO/PEM.py @@ -0,0 +1,191 @@ +# +# 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() + if len(lines) < 3: + raise ValueError("A PEM file must have at least 3 lines") + + # 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/venv/Lib/site-packages/Cryptodome/IO/PEM.pyi b/venv/Lib/site-packages/Cryptodome/IO/PEM.pyi new file mode 100644 index 0000000..2e324c4 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/IO/PKCS8.py b/venv/Lib/site-packages/Cryptodome/IO/PKCS8.py new file mode 100644 index 0000000..e770199 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/IO/PKCS8.py @@ -0,0 +1,226 @@ +# +# 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 (bytes): + The private key encoded in binary form. The actual encoding is + algorithm specific. In most cases, it is DER. + + key_oid (string): + The object identifier (OID) of the private key to wrap. + It is a dotted string, like ``'1.2.840.113549.1.1.1'`` (for RSA keys) + or ``'1.2.840.10045.2.1'`` (for ECC keys). + + Keyword Args: + + passphrase (bytes or string): + The secret passphrase from which the wrapping key is derived. + Set it only if encryption is required. + + protection (string): + The identifier of the algorithm to use for securely wrapping the key. + Refer to :ref:`the encryption parameters` . + The default value is ``'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC'``. + + prot_params (dictionary): + Parameters for the key derivation function (KDF). + Refer to :ref:`the encryption parameters` . + + key_params (DER object or None): + The ``parameters`` field to use in the ``AlgorithmIdentifier`` + 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`. + + Returns: + bytes: The PKCS#8-wrapped private key (possibly encrypted). + """ + + # + # 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 (bytes): + The private key wrapped into a PKCS#8 container, DER encoded. + + Keyword Args: + passphrase (byte string or string): + The passphrase to use to decrypt the blob (if it is encrypted). + + Return: + A tuple containing + + #. the algorithm identifier of the wrapped key (OID, dotted string) + #. the private key (bytes, DER encoded) + #. the associated parameters (bytes, DER encoded) or ``None`` + + Raises: + ValueError : if decoding fails + """ + + if passphrase is not None: + 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/venv/Lib/site-packages/Cryptodome/IO/PKCS8.pyi b/venv/Lib/site-packages/Cryptodome/IO/PKCS8.pyi new file mode 100644 index 0000000..c8d0c10 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/IO/PKCS8.pyi @@ -0,0 +1,17 @@ +from typing import Tuple, Optional, Union, Callable +from typing_extensions import NotRequired + +from Cryptodome.Util.asn1 import DerObject +from Cryptodome.IO._PBES import ProtParams + + +def wrap(private_key: bytes, + key_oid: str, + passphrase: Union[bytes, str] = ..., + protection: str = ..., + prot_params: Optional[ProtParams] = ..., + key_params: Optional[DerObject] = ..., + randfunc: Optional[Callable[[int], str]] = ...) -> bytes: ... + + +def unwrap(p8_private_key: bytes, passphrase: Optional[Union[bytes, str]] = ...) -> Tuple[str, bytes, Optional[bytes]]: ... diff --git a/venv/Lib/site-packages/Cryptodome/IO/_PBES.py b/venv/Lib/site-packages/Cryptodome/IO/_PBES.py new file mode 100644 index 0000000..75d8cde --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/IO/_PBES.py @@ -0,0 +1,546 @@ +# +# 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. +# =================================================================== + +import re + +from Cryptodome import Hash +from Cryptodome import Random +from Cryptodome.Util.asn1 import ( + DerSequence, DerOctetString, + DerObjectId, DerInteger, + ) + +from Cryptodome.Cipher import AES +from Cryptodome.Util.Padding import pad, unpad +from Cryptodome.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_DES_EDE3_CBC = "1.2.840.113549.3.7" +_OID_AES128_CBC = "2.16.840.1.101.3.4.1.2" +_OID_AES192_CBC = "2.16.840.1.101.3.4.1.22" +_OID_AES256_CBC = "2.16.840.1.101.3.4.1.42" +_OID_AES128_GCM = "2.16.840.1.101.3.4.1.6" +_OID_AES192_GCM = "2.16.840.1.101.3.4.1.26" +_OID_AES256_GCM = "2.16.840.1.101.3.4.1.46" + +class PbesError(ValueError): + pass + +# 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 +# } +# +# PBKDF2-PRFs ALGORITHM-IDENTIFIER ::= { +# {NULL IDENTIFIED BY id-hmacWithSHA1}, +# {NULL IDENTIFIED BY id-hmacWithSHA224}, +# {NULL IDENTIFIED BY id-hmacWithSHA256}, +# {NULL IDENTIFIED BY id-hmacWithSHA384}, +# {NULL IDENTIFIED BY id-hmacWithSHA512}, +# {NULL IDENTIFIED BY id-hmacWithSHA512-224}, +# {NULL IDENTIFIED BY id-hmacWithSHA512-256}, +# ... +# } +# scrypt-params ::= SEQUENCE { +# salt OCTET STRING, +# costParameter INTEGER (1..MAX), +# 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 + from Cryptodome.Hash import MD5 + from Cryptodome.Cipher import DES + hashmod = MD5 + module = DES + elif pbe_oid == _OID_PBE_WITH_MD5_AND_RC2_CBC: + # PBE_MD5_RC2_CBC + from Cryptodome.Hash import MD5 + from Cryptodome.Cipher import ARC2 + hashmod = MD5 + module = ARC2 + cipher_params['effective_keylen'] = 64 + elif pbe_oid == _OID_PBE_WITH_SHA1_AND_DES_CBC: + # PBE_SHA1_DES_CBC + from Cryptodome.Hash import SHA1 + from Cryptodome.Cipher import DES + hashmod = SHA1 + module = DES + elif pbe_oid == _OID_PBE_WITH_SHA1_AND_RC2_CBC: + # PBE_SHA1_RC2_CBC + from Cryptodome.Hash import SHA1 + from Cryptodome.Cipher import ARC2 + hashmod = SHA1 + module = 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 = module.new(key, module.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 + + pattern = re.compile(r'^(PBKDF2WithHMAC-([0-9A-Z-]+)|scrypt)And([0-9A-Z-]+)$') + res = pattern.match(protection) + if res is None: + raise ValueError("Unknown protection %s" % protection) + + if protection.startswith("PBKDF"): + pbkdf = "pbkdf2" + pbkdf2_hmac_algo = res.group(2) + enc_algo = res.group(3) + else: + pbkdf = "scrypt" + enc_algo = res.group(3) + + aead = False + if enc_algo == 'DES-EDE3-CBC': + from Cryptodome.Cipher import DES3 + key_size = 24 + module = DES3 + cipher_mode = DES3.MODE_CBC + enc_oid = _OID_DES_EDE3_CBC + enc_param = {'iv': randfunc(8)} + elif enc_algo == 'AES128-CBC': + key_size = 16 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES128_CBC + enc_param = {'iv': randfunc(16)} + elif enc_algo == 'AES192-CBC': + key_size = 24 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES192_CBC + enc_param = {'iv': randfunc(16)} + elif enc_algo == 'AES256-CBC': + key_size = 32 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES256_CBC + enc_param = {'iv': randfunc(16)} + elif enc_algo == 'AES128-GCM': + key_size = 16 + module = AES + cipher_mode = AES.MODE_GCM + enc_oid = _OID_AES128_GCM + enc_param = {'nonce': randfunc(12)} + aead = True + elif enc_algo == 'AES192-GCM': + key_size = 24 + module = AES + cipher_mode = AES.MODE_GCM + enc_oid = _OID_AES192_GCM + enc_param = {'nonce': randfunc(12)} + aead = True + elif enc_algo == 'AES256-GCM': + key_size = 32 + module = AES + cipher_mode = AES.MODE_GCM + enc_oid = _OID_AES256_GCM + enc_param = {'nonce': randfunc(12)} + aead = True + else: + raise ValueError("Unknown encryption mode '%s'" % enc_algo) + + iv_nonce = list(enc_param.values())[0] + salt = randfunc(prot_params.get("salt_size", 8)) + + # Derive key from password + if pbkdf == 'pbkdf2': + + count = prot_params.get("iteration_count", 1000) + digestmod = Hash.new(pbkdf2_hmac_algo) + + key = PBKDF2(passphrase, + salt, + key_size, + count, + hmac_hash_module=digestmod) + + pbkdf2_params = DerSequence([ + DerOctetString(salt), + DerInteger(count) + ]) + + if pbkdf2_hmac_algo != 'SHA1': + try: + hmac_oid = Hash.HMAC.new(b'', digestmod=digestmod).oid + except KeyError: + raise ValueError("No OID for HMAC hash algorithm") + pbkdf2_params.append(DerSequence([DerObjectId(hmac_oid)])) + + kdf_info = DerSequence([ + DerObjectId(_OID_PBKDF2), # PBKDF2 + pbkdf2_params + ]) + + elif pbkdf == 'scrypt': + + count = prot_params.get("iteration_count", 16384) + scrypt_r = prot_params.get('block_size', 8) + scrypt_p = prot_params.get('parallelization', 1) + 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) + ]) + ]) + + else: + raise ValueError("Unknown KDF " + res.group(1)) + + # Create cipher and use it + cipher = module.new(key, cipher_mode, **enc_param) + if aead: + ct, tag = cipher.encrypt_and_digest(data) + encrypted_data = ct + tag + else: + encrypted_data = cipher.encrypt(pad(data, cipher.block_size)) + enc_info = DerSequence([ + DerObjectId(enc_oid), + DerOctetString(iv_nonce) + ]) + + # 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: + # Check if it's an INTEGER + kdf_key_length = pbkdf2_params[idx] - 0 + left -= 1 + idx += 1 + except TypeError: + # keyLength is not present + pass + + # Default is HMAC-SHA1 + pbkdf2_prf_oid = _OID_HMAC_SHA1 + if left > 0: + pbkdf2_prf_algo_id = DerSequence().decode(pbkdf2_params[idx]) + pbkdf2_prf_oid = DerObjectId().decode(pbkdf2_prf_algo_id[0]).value + + 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 + + aead = False + if enc_oid == _OID_DES_EDE3_CBC: + # DES_EDE3_CBC + from Cryptodome.Cipher import DES3 + module = DES3 + cipher_mode = DES3.MODE_CBC + key_size = 24 + cipher_param = 'iv' + elif enc_oid == _OID_AES128_CBC: + module = AES + cipher_mode = AES.MODE_CBC + key_size = 16 + cipher_param = 'iv' + elif enc_oid == _OID_AES192_CBC: + module = AES + cipher_mode = AES.MODE_CBC + key_size = 24 + cipher_param = 'iv' + elif enc_oid == _OID_AES256_CBC: + module = AES + cipher_mode = AES.MODE_CBC + key_size = 32 + cipher_param = 'iv' + elif enc_oid == _OID_AES128_GCM: + module = AES + cipher_mode = AES.MODE_GCM + key_size = 16 + cipher_param = 'nonce' + aead = True + elif enc_oid == _OID_AES192_GCM: + module = AES + cipher_mode = AES.MODE_GCM + key_size = 24 + cipher_param = 'nonce' + aead = True + elif enc_oid == _OID_AES256_GCM: + module = AES + cipher_mode = AES.MODE_GCM + key_size = 32 + cipher_param = 'nonce' + aead = True + else: + raise PbesError("Unsupported PBES2 cipher " + enc_algo) + + if kdf_key_length and kdf_key_length != key_size: + raise PbesError("Mismatch between PBES2 KDF parameters" + " and selected cipher") + + iv_nonce = DerOctetString().decode(enc_info[1]).payload + + # Create cipher + if kdf_oid == _OID_PBKDF2: + + try: + hmac_hash_module_oid = Hash.HMAC._hmac2hash_oid[pbkdf2_prf_oid] + except KeyError: + raise PbesError("Unsupported HMAC %s" % pbkdf2_prf_oid) + hmac_hash_module = Hash.new(hmac_hash_module_oid) + + key = PBKDF2(passphrase, salt, key_size, iteration_count, + hmac_hash_module=hmac_hash_module) + else: + key = scrypt(passphrase, salt, key_size, iteration_count, + scrypt_r, scrypt_p) + cipher = module.new(key, cipher_mode, **{cipher_param:iv_nonce}) + + # Decrypt data + if len(encrypted_data) < cipher.block_size: + raise ValueError("Too little data to decrypt") + + if aead: + tag_len = cipher.block_size + pt = cipher.decrypt_and_verify(encrypted_data[:-tag_len], + encrypted_data[-tag_len:]) + else: + pt_padded = cipher.decrypt(encrypted_data) + pt = unpad(pt_padded, cipher.block_size) + + return pt diff --git a/venv/Lib/site-packages/Cryptodome/IO/_PBES.pyi b/venv/Lib/site-packages/Cryptodome/IO/_PBES.pyi new file mode 100644 index 0000000..0673364 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/IO/_PBES.pyi @@ -0,0 +1,26 @@ +from typing import Optional, Callable, TypedDict +from typing_extensions import NotRequired + +class PbesError(ValueError): + ... + +class PBES1(object): + @staticmethod + def decrypt(data: bytes, passphrase: bytes) -> bytes: ... + +class ProtParams(TypedDict): + iteration_count: NotRequired[int] + salt_size: NotRequired[int] + block_size: NotRequired[int] + parallelization: NotRequired[int] + +class PBES2(object): + @staticmethod + def encrypt(data: bytes, + passphrase: bytes, + protection: str, + prot_params: Optional[ProtParams] = ..., + randfunc: Optional[Callable[[int],bytes]] = ...) -> bytes: ... + + @staticmethod + def decrypt(data:bytes, passphrase: bytes) -> bytes: ... diff --git a/venv/Lib/site-packages/Cryptodome/IO/__init__.py b/venv/Lib/site-packages/Cryptodome/IO/__init__.py new file mode 100644 index 0000000..85a0d0b --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/IO/__pycache__/PEM.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/IO/__pycache__/PEM.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e04d1e8f9a03e5233bd7e6511ce9ae1c8cb03be3 GIT binary patch literal 7048 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 R0_~y?J`LTX=|Q66zX3Y^cCG*b literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/IO/__pycache__/PKCS8.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/IO/__pycache__/PKCS8.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc8d913b5c3e34164a157ea9fd1a844338e1137b GIT binary patch literal 5574 zcmbVQ-BTOa72nnBTObJ;Jb=M0V8cu1#y@f$6kNhf~kxp#N9f+2C* zW!Sykd(Y=R_nhD1ul4m#0-nD`XZUOfLHrZ_p+6RFu$zRz#{^5TWQzE+i9{n)icFiP zOlfM0N}H$5Y0H!a&r>OD+BRiN+o$Yl$CLx+%&cX`H05Ni=*L8GriU6^)|#}iwqKJ| zF4n=?;aiup`khbEs-LWoFZ#_D+bAbRvZ++X1%oJeC(8*54*zj=dX7sdVYcFim8%Jb zQ=*E*3p0MIV!3uX6zx+#{T0WxX-*DFk|m%cv2mW~~ zZ_ZmEYI;TqznOW-N)R`|hcrWHBz~SzIQll1qj^CQVd~n%NVNMLJ)IJ#>7GQ2V#QNM20jS-MA7!)vcrB920uXE{LuhMYwATn&%e2Y^l#e9CeVC>(2;9|dx7w>-_i2H zCsA_*n)8k02G?i7B;+{IJ1cP@vZ^0CC(zMQY?4dDIRed)#3hH~XkCk4Bt64OOqx?T zNj?v=G5n`|F-{xwC|X%A$z)RsJ!9jsuM$}1+z#=C?8e>u^W;#`C-6SkR$P3x@G{nmcCvehUx4(koTb>oOU@?h1guRlL1hfk$8X|_xFRLp_>dJo4+~F z3G+9v@Y6SCUg1tp5t+K=Fwu2zFck`S#~^jw`_SEw!AId-lMC(Dtk}v*vv=V zyM)=}SsLGQ5{Ftp4t^Lc`?{7UzO^*~+bvIP(cbzGSJSq;x!7{D><$#|fu~l&*RtAL zZaB8|+LpSl>E&hTw#)n53->Op9$A~)YUy5k>ru}xMb@3)AxO*lUC@?Dpd;5Gba)i} z?tTMrz**$GuN!#CKvxBlH5E(_!a!bgW}Suc%>(^IjeCIrG-Co3)B;onrunHdZB=rVQOHP@ie7~ed>I=*mL^|2_2^tHT2=f%2i_rP)1=Se_oRb0l_ z>FamNyoIfA0YbJO?`%Ghi+i4wUaFz@96;~=5&8z8KYTF#56u2F4_H_)*4?iNKY-j(aR9M73oB*PH*bKTs2B=3J~MeLufL(2LUE zjwB%p3d2L44j_oH_6XH#Kd}c8Yhn#}i<^>aUH$=7Y!nk6;sDZN0V+dr#h^p&i2&}Z zjYe&CbRv;zwbhI5Fs)=W02Va80XgV!nC=c@e$^6G+k$BLSN8!FFWi*`_I4W8)(+J7+kgPwCA|&_nV)f>hS~> zq$j9SJV5{h{`cS#q!^dt($Lk(68u+$SbQY{2#Y~@9(qBwr_~q%RLeroDM8DWW^#Z# z_Z{seKgK+MlSBg}sS|PQuH|-3?Vut4!T=#?9qm3r<;PDMR8kk3FiFP{8>E!qBYDx- z4zG$$3o{92iV6iD_Sw5NUYe=8{;Y$9;w}tU_y{91FNy_Kg(lMz$Q@m4v!iRf?$G`4W?fsUu5I;=wa!m&d{cLPtM%ye#8W_d zoq+H*eg2ZqzkcFT=jSh$eS@363nkx$rHLIoQQx$3d+n8?tG8(G{m;{|iSV}k8%#d6 z)!hAAV!iXzWT`puoA9%351#gKHTT>P?@*+}|Lm!oXl#eQ^=ANLuHO7&3*Rq~cv+yUn*4R|=0!cm{BMGwSJF|rZJPxn# z+yr^9M4a8R5_P_nb46#{k`2Zudp8EQnpz&re9CVe+oi6M`JpQC1RaKv=bL!Nit4@8V_}|TD0|n3joW2n~b%~<>0bk^& zs*rg0zaa6DVkkxxqkr>NXUstt zV+pz$YtX~kf(?v4*vL47O^h?x%+v;3n7UvqQy-+&)C9%2-lG^d>-|_G=^tz(R1Z)a z*ds-1JE1lLwMjwkSW@|#pCaRwPbF$6!^v5Qbyvc1CNb~RipFu4n`Xbg$i^eAXn~iD z5uW9zc`h2iK{791pJOBZIYu-<=D9e}-e5V9pgDDB+NTyZ3t>jAT8u;F(}=oDr_Ya{ z9Vo;BQJ0KxOAGvR?SMbvA35Id9~c-MI)1`G;2-i2R-_Iu*HtJx&|jH6P?ypun=LGX0>8+!TzIJ`{?F=h;w5 zG=xI)31%^dX;Ucl?Zt3R%K3+LtA*WXS?dA4sM9Jv|3 z!6x4x!y!(g>GYXt|H2Yy16~r0K_ZEt-g{JDtLN%udYR^GpyKn4hM=T5 zqY7$REu(&q`WSQJ305s>VA@t;H3Q3kKF%(1Y$VLH3=K0FHHjwTbTTr_&a?FGC_hUt zgpRx*CK`ug(KvnS{Mhu7A^H|f z)?WJhB2OpzXe>rUeMvUXV~K0G0{;GMp^(pSAcFjUIushEXL){M^w_c6w{QESEI;E< za5s)|GZFj`jGP$p^LKbsJR&z5+f@z!_otNAvx5H z$^%l0d>UR}6~DM9HKSJY&FS{30ocswscKkPRg4zb;S{XNLUpP}(5DRX2=LUG@zn3*!L{3zG8TA@DFdSu zbWHUtz!V<`?uIgMtWgg&T2iKcHJS=Fb^}jK84uQ|Ek0 z1+j%OH&7`@%C4pa!(6+}Rf+{W(2thh<&@x<(L^ah_Y>9cs!~qDIp>peO0l4o`zTe* z_sDdi7E1TZZ>3o7lWEFl4c~!JWt=5z1RbUqqHKhv6Eidu=EL-261F>}!eX&7%fU)P z!v;xrlU1g>@Ok4}adj4QVmDyL;AiJ)J^`F89Zk~VMLsbPOG>1$itw;!vW$Xp^ir6E z1(#>Jiv#`G4rmM)5sw>wNs$`@__!T7;dVh(qQUeRh&m=fmBK83f z4Me3%(nqhb{2~`GQyaUXpav|KSiYAILod+RVIAd`3QZ}=;Baz2#kC4ehYRCF7>$Dk z0Vc_*D`SDDuS1q-V`pZd-=eqJ5G>O%HjdfTlc!*te=B}7p12*SFPkKL zaj--~X~KxLuyKYK$c{+*Jrs@4Bt&OnJ7t+ralVU|5|N0hUbxPN5>ZApM@R>R7I2a$ zN&iTlQ9TR&1@?uglZ*_~e5rW`WR@62Z899=MFZFs9NCwXq7G(2D0)lOKrE^up_8f* z)eC$QZ3y`bDvLQ>`ndrJmd#{}_zPX}9*~l2FahsT&s!+E=Y!OC>tMEZaAQ2zdLpB5 z+G+89Fu&ar$hHJBgA<>rvV(8rTFz(mjXR#soX5BA>CbxlGXrNn4QB@?bDneCp37O! z<+SCAqxt>5ZO759<7lRHbaNovc{1mCb=xtXb&RL0^X`VUId63Qw0>~QIQVl@&(BPK z`Fc-!B46jee>QKf{i%Cs%REFf{Dllp`fR>GkiL*<=-qng(-@;~CTOCw27u?`+rkvUR>p_sPw0w)^$Z!kIc>uI^IWuw!k`SzEWQ zN3+(WYs(wn4^uho(6;qt)_O9n&DXWAsUEzOHaxMrRt;<8>uu|Eo1HoP>9j8IaIZR6 zy(`_TGi#UEuB^_bucS4*_QsX^hYb%JR>#)r|ETrD){VBT{p_Y00^l$^fB5eGcUPx! z=AN{A$6C8`Wwn0W)1CEn=d3*$eGjn@r+hljjw9*7zzKm^9SSjt2->Jg9@kk|N@o)c z8EUQ;OA))048I#+F-XCG62H~=sDDyxtMq#&O6T||^=MV^GmV^*_^@;Y{)>;Mka`w? z#0&Ol6{C4iC7U?GDzH$s3JX=Yr1t3~3pKF(J7>POS*ox_ugS*f*EKl(Q<0*b2Q9*d z0h{U>gT18@wD(#{mdBjZK83>g$c>)UO7F@L>_1#o$uoxw@VSb8K<^1od1ofO%&Mn1^MlQj1FxphLpqs;qwC`c6 zNa!%2cva!QLxctOrQPZK+(kO({M8Imosb zWP_$9d54f)w0w)2m&^ViAlp%p?fi4MtS0kZ!9WY-eeJzvl#ZL*Y73_V`7OF?!W z>G67HpD->sOT`8l5&b^gjriyGi0umL#Sr7q>caO0InvcS>{SP zdEC3nQ)%_Nt1rr}0A=T7Y-!mC2-F*#Ro6*Vlb zpfW{Ok%J$XdF66Ky`pvQ_@BY3RFhHpy#q((h^#-H#VU_?duhB=o&(BsFh`4W8u$rW zui}__gocmNFo!3l9J6BU`AI3awDv3d=#V3;7;TT-BMMrBOuJD$U6%D$vtl3WJYc^# zD$7^~b>;N;RIsv`E6rq~PO!|to-5eMX}3`@a1BD^+;Z>hZC7FtV^N-0H+EizXrH$@Bd+*`8LQY^1p)6@})e^sWpQyic-icxHnC4NtJ zo4TX<7Ijk9ud7()efjs7YKK|qNR{3{;x3#YBpF`8Ba6kq3{UyxY&pbyfy1OgWb zp^hE|M?@JoW=ChDEQja`!UeKW;3^&!3($yCbqUP?qc*%4<7sm6M&zXP+BM=e2z(PD zmB|aI#`^Fyd@9bs>AUaD_?f{zI5l6p)~OVQdKQk3pePe1Dg*9dP#y+LfQziCqIpF{ z6%Y+F_w>E+R3N=jMoH)?(?X!n1L9ov2=q7$j*+N@RhMN|d=bh7_MCj-sX%(6jFPZl z!{V_!6iF-sv<=@D0zBZ#Q4A;y6~`{H1Zq#Rx8R^2qxtAOn}ne**HCz|6#|`%C2rFU zLO9pCMF6`1!~y&*%=6$zNYXHMWSl;U+=md@g-{!SPu)}9Gyp<%HR^f&)yDmyy6Qbuqqdh#;?P4DA%y! zw5c>f{A6~%u#k)#YT6*unv}apR{X%YT*C?-R)O?FzbOg(`>=$~6?72j?yka!CgQOr zUpIY$%<4WetGhUu&dO-~`Kp@^VeZhy}`x{ASjJY zxEa4pN5T6zn^=r7bT|@W7bO3oJZr-=dM{$&hmgGU^py0K5!fCK8Og7Jn;>eEn3wSS zG8LwX2O>$w67d^;`rHg1Pe6?eYy>xY2C#h^5N7(y)CBlc!3TQ1yaCZTU~*s-kiB7s zgBq?~Q-I@A`>tJ6Y_$jZ6bh!qp?nI6B1p(MAL zdaCX_GG)IU#0~`-pAPznycq5+WxDE)G z4RAAJATWYv3x_C!L^u&Z0!askhB5t=E@ndMiLnb}RXhQ=FrFf$f3?U38AUEkH_5IL zh1mtzI!kwUBs;~L;-V~C_igLZe}v|M(ze<8a3qAde8KTg;COq?*JJU0z8Kj3vL)x1p%yR|@zG9sU`LSb>>+kJ@`z zMVVX~V@tlFDSdv|=*$=!cU;X6mme&@FKoNIvaYW5B)Q@ zx{4ZF9``-!OP}AV?*zA!r}@#Hb=3#o$+&yIe=cvXTW#7hcaYLMb?)@pordPey^nga zbcbA84GOq>@Basvra$aj5B#_{<35%?mv_4EkAJ!H{~9b$aHL+|oXs|$%{eAArimv` z*J{nSyDRJN%DKC9&YtyCS*Jg({~N1o)%e)@$hvOaxSVspl(UYcwR<|sWM7%wGB)kj zwm!W0;9{nIXoJtyzLGw(<8FGaf27ZN2XgK}`rH%nvNgcyNp zH&M-9JG6hD&(X(s=l@kDH&!M=9ec~RtvzdN|H-faSn#BwA0a4^iMWs z?V}qt5Ttc~W3=Y$o3`tZW$TY^Xmj;L_b1Y)S2X$N*0m##e(nC$Zu61H?>>6>ld%o$ z#?1EcM0R*0*E^YOK9`=_aklK(8doQBw)P!c%j%t+tqb~yHb5WM8q<0hC%Wf}$pvM8 z^hVCs2{C-d@CSvO9Z<;b+^f=gKzE(l`rJa98&_Y=nY#C!hF%b1ppD?4-m9lJW zHp86=cc^C~@&A>4elmVm3Dp+h#?>ck89Dq4H_kN5n`5cN-#F7M`F_P4XJtB6zHwG| z+YGUPBVY6|mOO@E;cgbuzpT%6hwNz`L-Z}ml1+kT2_z zvK?|nZ2Q_=>As^i{@XAfML#eZ5AKk9$>X6{jEDV@<6+;YTgCBUYR0J_IwI;DR7Cv_ z`1rxAXBQmU*ALV`sL=v7<#-#`lawjtgnN0VF)R8C7y}t4onSBc5o_WWoP%-YH)fQ3 z_R!y$PMRk&A9#?^{wL2Du4HxlT3u;G>cMLdUb>PuoQ#Qw(J*Gb;h%D=D8UVWFZUc> zs8SK78W>Bek+G(l;{O|Dw8>dSMx(;}>?x%WkYg*z`3&R~y~v9dH_$K&6VUHe@DU7?+?}Cf# zs?3#Y1Ns@6rxe4T8=cT*q~H#-7Gp-&KoxDBBf^ns3iyitYbBptYpR_;C)0)Y%C(nE z1Ro{dT_X?pD77l;Thxl?2h*}oG6KIy!nO4_dNW59C9UAiEZHXYcdg}jJ7j*J=WE}3 zF7s(3;#~BY{pYP`_?5|_5K00fa=7*rz)(WP98&(WeNL z`PAGGFpaARWFnkaDnYUk#!N0QEF?J81@F2B&|!C$dlSn}VL%|sc1+=Q0PYe5SC>66 zvPsYky?o+AG)Yi6z<2rEEDJw@k;Q^{PQJZPu;nCNx5f+Zw8XpYR7xdSVMmg?3KcFl zTumhCSd`}hpT;}GIC~0ra(x{VHiny;1dw%N3hWDt!wrh#FhCQPi$fr4;6}Jub9HH< zfDc*-!iBYk&}Gaeuw)2>9t?^wA$JX5(J1_aVWNSL5(+}l{%QD_iBhr78IZ3|{}z&}5z|6&%Yq3+(xB-#_*w2Zkqeh&ZW_yJW9$q-TT$kYXp!+TPU3VZ z-tp57;Vta~KvuxeRCl=FMp3_m!S^w^i-CXv={!X4xbI?sH)%yv0mCEg+;1SMc0ZPk zT61_WgL@r=(^#k)pf_v)H->LD3+TFM7?w$P!25xan=)hnweEm?t^50M$VvV`_+nnT z*8OQX(>j=Ioy5D{&X)I2ZaX`(&dyBNE1Q?IU9aVwuc!5gzuLWaXG8VjcXE!wZO4hM z;{@P#M#t~ZZ5inuykXs+a|~om1Atq+pW1fyWL-V$lN*;mI{)eAjH@T-nn;_T>!{jR zS%-BKWLhE9*_m@rfEuMMuF9~5Giv0{>?3;_eoRd2N$-R`m;^_8}3c-pEiEx z!|I!^rZ4O`y*cNRZD)7Z*}Z;p)1K{lIp=(3+c}<6_|q4kIO|tZIcLYZ zD(mz?hQpa2+qF7Z!r#BMr>?epb~^$agV~OkHoe)7msh6pweHnZ56-QO=WAW70}m!w z5Or$lO;6<|o}G^VAHTERaU$DsVzcivO?LFnT*rlst!>BK`{U+q?@-n|lo_7<%$^-S zpYy)C?Y)xqUU^{IHP`;gxMe=_VtbB~_FVq5_UyiL=Kp9^gA=O!OCx(4>i8+ur}o_7 z7@#3Q%bJd*FRuRD+MOp>$I8i^)w_0T%i59m`q#gm^$tMo-i`-waldpozQXY2oFiW{ zG7_o^SNl7+jGaFRShWmMl|a_U*86Y54gMclx6Ga880x=Mep~v@0wDSYN_?e4q~BiJ z?8-Ks&N;?1rm?>>dRF5b`mL4`_!#ymRrBC83UE9~nU7<~ww0#k$i}IUU{=1g?R+ik zd@ZdnP3%3b#yqLo>FoKVr4N_3J73FozV@jl+j%i#YX=#0`{O&0?!dR3Ydr~gH^D;@ zH{1y2yGNe`YWT|iF(~HrNN^&MJ>InugcJK2o{w`jw@%quXtR*|x!){doHH zuGOBd`Q`Iz4dwR!f>PT(e_!j~tAhCd|Dp+J@-LrHs;Sy0nAX@k^{p9tXw#CV&*thU zGPVgo`hfg-61VujYIj^YNqtslnl@|yx}|yAL2aF^nKo#0H7X1p?&)rgPdzo|tKRp+ z3T_;@xic7`d!ynHD$wfXF!)ROPvSWPe^8;R8U*xL=lF&CuDYs^{GwuyB==71$geBD zsjhMqerSP7>6aEL#&?wa7DS?<bqGV5?aX{=BQ70LC!RC8Vmy(1Z_B~QX#bNfBR zuBGFiF>g6~&$w&vxM$g|?aEO0yrcV`HSg#t24%0$wJKH3is3m0(Q{sPTBYhupM6eY U{QM2|wJMb(efFOzjLES63lR~~jsO4v literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/IO/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/IO/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa4a0b50f1f52b2d1888273f751ef0067f52d30c GIT binary patch literal 191 zcmX@j%ge<81m}X&GnLsG7#@Q-Fu(+5eC7c%rZc24q%fv4MKM$|X)@np4si9o#Twx4 z9BkpI$#{!BK0YxgCq8~9!)K7DUly)bF^QS+Wie%`d1Wy^nMpClnI);Z1&PVoiRr1u zG0sJm1ts|@`MIh3p8opr@tJvV1AdvXL%*e?2 U!H$7PaDw^;E~!TLBA{y-07a59%m4rY literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Math/Numbers.py b/venv/Lib/site-packages/Cryptodome/Math/Numbers.py new file mode 100644 index 0000000..9e96686 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Math/Numbers.py @@ -0,0 +1,47 @@ +# =================================================================== +# +# 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"] + +import os + +try: + if os.getenv("PYCRYPTODOME_DISABLE_GMP"): + raise ImportError() + + 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/venv/Lib/site-packages/Cryptodome/Math/Numbers.pyi b/venv/Lib/site-packages/Cryptodome/Math/Numbers.pyi new file mode 100644 index 0000000..b0206ca --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Math/Numbers.pyi @@ -0,0 +1,2 @@ +from Cryptodome.Math._IntegerBase import IntegerBase as Integer +__all__ = ['Integer'] diff --git a/venv/Lib/site-packages/Cryptodome/Math/Primality.py b/venv/Lib/site-packages/Cryptodome/Math/Primality.py new file mode 100644 index 0000000..33814fa --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Math/Primality.pyi b/venv/Lib/site-packages/Cryptodome/Math/Primality.pyi new file mode 100644 index 0000000..7813483 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Math/_IntegerBase.py b/venv/Lib/site-packages/Cryptodome/Math/_IntegerBase.py new file mode 100644 index 0000000..03dd591 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Math/_IntegerBase.py @@ -0,0 +1,412 @@ +# =================================================================== +# +# 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 + + @staticmethod + @abc.abstractmethod + def _mult_modulo_bytes(term1, term2, modulus): + """Multiply two integers, take the modulo, and encode as big endian. + This specialized method is used for RSA decryption. + + Args: + term1 : integer + The first term of the multiplication, non-negative. + term2 : integer + The second term of the multiplication, non-negative. + modulus: integer + The modulus, a positive odd number. + :Returns: + A byte string, with the result of the modular multiplication + encoded in big endian mode. + It is as long as the modulus would be, with zero padding + on the left if needed. + """ + pass diff --git a/venv/Lib/site-packages/Cryptodome/Math/_IntegerBase.pyi b/venv/Lib/site-packages/Cryptodome/Math/_IntegerBase.pyi new file mode 100644 index 0000000..ea23532 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Math/_IntegerBase.pyi @@ -0,0 +1,67 @@ +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 : ... + @staticmethod + def _mult_modulo_bytes(term1: Union[IntegerBase, int], + term2: Union[IntegerBase, int], + modulus: Union[IntegerBase, int]) -> bytes: ... + diff --git a/venv/Lib/site-packages/Cryptodome/Math/_IntegerCustom.py b/venv/Lib/site-packages/Cryptodome/Math/_IntegerCustom.py new file mode 100644 index 0000000..20eadca --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Math/_IntegerCustom.py @@ -0,0 +1,162 @@ +# =================================================================== +# +# 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(uint8_t *out, + const uint8_t *base, + const uint8_t *exp, + const uint8_t *modulus, + size_t len, + uint64_t seed); + +int monty_multiply(uint8_t *out, + const uint8_t *term1, + const uint8_t *term2, + const uint8_t *modulus, + size_t len); +""" + + +_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 + + @staticmethod + def _mult_modulo_bytes(term1, term2, modulus): + + # With modular reduction + mod_value = int(modulus) + if mod_value < 0: + raise ValueError("Modulus must be positive") + if mod_value == 0: + raise ZeroDivisionError("Modulus cannot be zero") + + # C extension only works with odd moduli + if (mod_value & 1) == 0: + raise ValueError("Odd modulus is required") + + # C extension only works with non-negative terms smaller than modulus + if term1 >= mod_value or term1 < 0: + term1 %= mod_value + if term2 >= mod_value or term2 < 0: + term2 %= mod_value + + modulus_b = long_to_bytes(mod_value) + numbers_len = len(modulus_b) + term1_b = long_to_bytes(term1, numbers_len) + term2_b = long_to_bytes(term2, numbers_len) + out = create_string_buffer(numbers_len) + + error = _raw_montgomery.monty_multiply( + out, + term1_b, + term2_b, + modulus_b, + c_size_t(numbers_len) + ) + if error: + raise ValueError("monty_multiply failed with error: %d" % error) + + return get_raw_buffer(out) diff --git a/venv/Lib/site-packages/Cryptodome/Math/_IntegerCustom.pyi b/venv/Lib/site-packages/Cryptodome/Math/_IntegerCustom.pyi new file mode 100644 index 0000000..2dd75c7 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Math/_IntegerGMP.py b/venv/Lib/site-packages/Cryptodome/Math/_IntegerGMP.py new file mode 100644 index 0000000..be77372 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Math/_IntegerGMP.py @@ -0,0 +1,799 @@ +# =================================================================== +# +# 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 +import struct + +from Cryptodome.Util.py3compat import is_native_int + +from Cryptodome.Util._raw_api import (backend, load_lib, + 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); + + size_t __gmpz_size (const mpz_t op); + UNIX_ULONG __gmpz_getlimbn (const mpz_t op, size_t n); + """ + +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") + + +# 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() + + +# 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()) + + _gmp.mpz_getlimbn.restype = c_ulong + +else: + # We are using CFFI + from Cryptodome.Util._raw_api import ffi + + def new_mpz(): + return ffi.new("MPZ*") + + +# Size of a native word +_sys_bits = 8 * struct.calcsize("P") + + +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") + + num_limbs = _gmp.mpz_size(self._mpz_p) + if _sys_bits == 32: + spchar = "L" + num_limbs = max(1, num_limbs, (block_size + 3) // 4) + elif _sys_bits == 64: + spchar = "Q" + num_limbs = max(1, num_limbs, (block_size + 7) // 8) + else: + raise ValueError("Unknown limb size") + + # mpz_getlimbn returns 0 if i is larger than the number of actual limbs + limbs = [_gmp.mpz_getlimbn(self._mpz_p, num_limbs - i - 1) for i in range(num_limbs)] + + result = struct.pack(">" + spchar * num_limbs, *limbs) + cutoff_len = len(result) - block_size + if block_size == 0: + result = result.lstrip(b'\x00') + elif cutoff_len > 0: + if result[:cutoff_len] != b'\x00' * (cutoff_len): + raise ValueError("Number is too big to convert to " + "byte string of prescribed length") + result = result[cutoff_len:] + elif cutoff_len < 0: + result = b'\x00' * (-cutoff_len) + result + + if byteorder == 'little': + result = result[::-1] + elif byteorder == 'big': + pass + else: + raise ValueError("Incorrect byteorder") + + if len(result) == 0: + result = b'\x00' + + 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) + + @staticmethod + def _mult_modulo_bytes(term1, term2, modulus): + if not isinstance(term1, IntegerGMP): + term1 = IntegerGMP(term1) + if not isinstance(term2, IntegerGMP): + term2 = IntegerGMP(term2) + if not isinstance(modulus, IntegerGMP): + modulus = IntegerGMP(modulus) + + if modulus < 0: + raise ValueError("Modulus must be positive") + if modulus == 0: + raise ZeroDivisionError("Modulus cannot be zero") + if (modulus & 1) == 0: + raise ValueError("Odd modulus is required") + + product = (term1 * term2) % modulus + return product.to_bytes(modulus.size_in_bytes()) + + # 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/venv/Lib/site-packages/Cryptodome/Math/_IntegerGMP.pyi b/venv/Lib/site-packages/Cryptodome/Math/_IntegerGMP.pyi new file mode 100644 index 0000000..2181b47 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Math/_IntegerGMP.pyi @@ -0,0 +1,3 @@ +from ._IntegerBase import IntegerBase +class IntegerGMP(IntegerBase): + pass diff --git a/venv/Lib/site-packages/Cryptodome/Math/_IntegerNative.py b/venv/Lib/site-packages/Cryptodome/Math/_IntegerNative.py new file mode 100644 index 0000000..5f768e2 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Math/_IntegerNative.py @@ -0,0 +1,382 @@ +# =================================================================== +# +# 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) + + @staticmethod + def _mult_modulo_bytes(term1, term2, modulus): + if modulus < 0: + raise ValueError("Modulus must be positive") + if modulus == 0: + raise ZeroDivisionError("Modulus cannot be zero") + if (modulus & 1) == 0: + raise ValueError("Odd modulus is required") + + number_len = len(long_to_bytes(modulus)) + return long_to_bytes((term1 * term2) % modulus, number_len) diff --git a/venv/Lib/site-packages/Cryptodome/Math/_IntegerNative.pyi b/venv/Lib/site-packages/Cryptodome/Math/_IntegerNative.pyi new file mode 100644 index 0000000..3f65a39 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Math/_IntegerNative.pyi @@ -0,0 +1,3 @@ +from ._IntegerBase import IntegerBase +class IntegerNative(IntegerBase): + pass diff --git a/venv/Lib/site-packages/Cryptodome/Math/__init__.py b/venv/Lib/site-packages/Cryptodome/Math/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/Cryptodome/Math/__pycache__/Numbers.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Math/__pycache__/Numbers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83ca990141b4b0eb36c4a6202167244f24afa2a4 GIT binary patch literal 784 zcmZ{i&ubGw6vt=wcYZ5U+gKxrwGe8Pvm%8x4H9h9U<#5DST^o7uI^@+*-2_nRxc{O zc(eb4^x)N_ISZ15hq#~~iU)5?dnq|N(@h#ZbPjLckI#JHn_<2r5>Y_c*IL_rp#X5m zg6R?`&hcmJyaxto!v-**!C9~YBY*=4J{6|$Y&ZA=7)Ds841X{wy@K?tURR&%Ap8~Zu3h3FGCPvb;*j^@iR6Svh_21o1<*}R7tiHc9M}MXef2Sm>uw( zuY(;p-Lr}>mpTNs5&pvls`v}ldf{Qcy0y8!SuSeprJ8zgqp004SF_NMPS7w)nzm~p z8+C|IOs7NZiAlZC^@wBtlc-Rlhq5VO)->I+G|lH6&zIVWpia+^m2B6+q=>PD{lx{jqY_ zc8sot*6?Mj#6E@RQWNkH!e9-==iaRB%7-8l2yvJh$rpC<>;B9B@Z!oh`PTPjde0sz zi@yc+r%*l_DVN?o+V2eI)gvImOu&g^=7;j&m$G#-iqG%Q4`bJl0C$=jUAelK3Pc)= og9v5E-ZE|a_GTV@RMZUrDXvP~KuW1;aWDsIVz2<2pBAY97r#&2+yDRo literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Math/__pycache__/Primality.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Math/__pycache__/Primality.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93df83d663c69c5ebed3eed19fd344b8881e08e3 GIT binary patch literal 10645 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Math/__pycache__/_IntegerGMP.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Math/__pycache__/_IntegerGMP.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f036a0c3765e0d61ab3f538075931befa48d231c GIT binary patch literal 33680 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Math/__pycache__/_IntegerNative.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Math/__pycache__/_IntegerNative.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6df66bcb6188a1f269d81b4f86620a78cbaafa72 GIT binary patch literal 16257 zcmcIrdvH|OdB1mGT4`5WY4t=Pv3el1V88+)9s(SJjKKsslsFx0NVcoJ7g$*BihEZA ztrwdxBwaxqgmH%@#)I5sYEjZLQ|Aw->7q@2nw9>;Ws^2<*{3|7 zynNPiFdP+6h|*raEPhH2yq0WbC=x#5i$;7SlTlI5RDj}41R+XxnW-5hD`!LY!*zHxM7Q62DB1F!#2SRSSHv2?Lrw~xv*8RU*d-= zM2FBPlwacSs$&m3g$mSH3J$<3!3pRRDgmp7D!>}S1?U#40c*wD;X0uPxq873*dWvb zHVSosO+r233ZVh8S=c5t;aw~7y8^$fgl3es;AthET7^}3S}n8ydW2TMHeoejyWj!r z5ZVAcg?7L-LI+@%&W*+8Nf}#2Eb>9 zjetGECcw?Yvw&NK9>88E;Di|4GT;e> z{IcwcMm(btK@55Pp0GbUF8M>Apt9PY?qE0&8W)1$6P}nTMZ5u%VIeKZ(^@WF2DrgR ziB(vN^HIIsT{R~;q8ej@A@8bfFY@JFoIhpLdggxPoKNEuZj$TZqIRvWlanfV^fI=1 z1#Ql9=ghBgXL+w_D7In1b37EmJc0OF1her(C&xrjQ1*l)QNujLxeqavo&r; z<^~t%PT{vO9p&!uLw9(I2E$Jceq`$Ck!k_6WrQ@%rM`GBD1MfjI{_|mbFSK}uTH(1 zvNtc`najh3xQAh~4jCi2MRh)ja~fZ1zehQ#0nM>aW;rTl&A>xyLO}s~s4ImYE8arQ zs{uf1m;0?P)6wfYuDq7Aw@5^iJQVc}(TW;KUf!@Jbkt&C_M^aPD5lBO?lrR4%S)@! zsR%hRf+UU+c14V!l=q>ROcW>Tt-2-8^u9frc6F!h-NpD3p%@9DLB>czEUUg@QKhC5 zL_8^;W2;<*C)OBsrHIIicVfsT1xpZdy7xx^wf>B2b;`c_X=8cEB(>mWrLin0P81lP zjm5mkDriqhodnqO>b!*#eR8zIgIOy^9e2Wf(M6a6|3Z_?Xc#9<#d36|5{XkmtoH6NvCD|_yamKTqF-W)fd za%knbU+qlcxoD+Un!|^B9pwxd*fdNp^4_u`iAeTnVClU@#dLS%=g6DWd zf;0|q2#Y7!f#gwyu^d~$1TT)Ih$rNiPKb0siQxc_sH}M;cp_^H1*6fB_^9?E3MEMl zL_MT>L?i*Cyi8g7D!f=Ck&!ir#BjEp8u%s2Kbb9)L`5&LGJVBsVe%?lF%pUdPW$9w zOjKI4;j%VKl*dC+nI_^vQY4yPQ+f(_rB*(G=JHJd>`I60YX4M!vgY!0Og6pLA*L@}#c?Szs_3h+rhEyIt2sj5UI4hj8E8IN*`ScRxnt%~ruo^#p*d&c z1Lx|rbM-$t+kQnyuS(iaa7^r;S(&Nbka2BH**7YrHVRncCcK={M0wCXvZl zHL+{1wn;sPZv|#L-wvi-Yg6{M#d9G1*&Mo%VbV~=4v%`u;p_y)%2~`yyHPLo0~BHz z7E57Cr6Xv)R0jYoYa8kKNJcZYohesm%HCOwoK9e3f#pPXNz!7OR752@v`V5GB4wtC zm{cmFi(IduspvAdj?UD*{Yu)^m9lpgWpr0B6EX-4#S-?(iNqYP)c(sNCrJimzpuO(In_mvMA{d zEahy=XoXgG+zdOj99j=qCM*R^uYd-cmC0n;ow6)cN@hhvPuC@}axBp_v*llh-Kp4+ zRYQ^J!O^jhI4Z)r7K&LNI<#L9u(U;X5-Xm>cuUU#T;RyKYbQCl=h~i`&iB^8yZ$HU zdxIa8r`vaAYImlbJ3pVVZoW126xjW4RHuEp7 zJYb$(|MV#jsy=1POD|y(B}pickCY-ID}J3ieVxF|0Kel&L!bIxOxmj+^S0yuKr|xd z9iiZ$(eY5J>9gYRVAAqqIB5R|j&yr}rgm4#x$AKp^cd=W4X;>M8Tj&B6n9FkJAcPlb-31Ayx@gK(#ZBZn$Wg^> zR?VxX!x3RTG%kBa$7NVTA{<_DH^IXPO_}sMMH=bE^O~8OD18%E*-DjoihCLp=8zH^(iS2OSPd;u4nPI6AymWyNAG&z~EMgmDTeOGYk9ESq+GN`HVJj~cX9 z4fw-q1LlFX=GHV@GYnN=kk}ulwQ|Uq$0BFh9`RZgYrrn5@5+{8*@#cFbw#-#oF;Y9hIqi*`l<=u=4c4geV zQ_kHF9qyE)RpXO`b1v}7<@56mo>W_ZreRmAdKVQ9Tz+l7VQs4WE18CYRQ15ard5f9 z^9?JKowwKDTt72;&x@uB%l8~$sf0t>l1BE?x8wofv%C<}7L<8BjQ!Dz5q77>EQUfspM26EJ}t8o&udfUHDfh5HRI1^ z`ALQA=$s&~({`;zJ|jhA?)>wP%I>0}{0;zo8r5|-9M>EP>zu=#cy7)`n{|?HMRni7 zUsThO7?`VZPanBfpX|Bj#Dlwb+W+R7xw`skey+YDSwGWuv-#S$X8ClTcbZ?Ya?={}p_~F`2{oVu`DrfHTjB8EGzNYw? z)sKX|z@6CY9DfSA!c@wXkHKFVF!}VRB!ZbLv5a9)F&9PuE^@Ui<-fpCODh1dYwgaf zj?0d>b1q|UVOqH-;i5=>2 zP?GG6Rci+^oY5>;s_k#4gNbOOC}OnTH63ghmD0w}*Sv@mnT}QHUe?P0p1KSI;M8^3 zPYc(*i8AcwY5(P2^X`sRXJ5v>E#=%sMMp08=V@aK<4&JV+gq1qTADmNV4jjTkHbro zx!M*yhF6p{-~8c{Dkm%cXLMRBrL6C}XSsVY-MTg7>Py-CirM>VPY6fBmzxkguMrB~ z6*&v3^b?}NMFKdYz*qoU(h+`Y&JToqawr>}A8>QjF`uIG{VE>VC|D>7j*m$m|0d1( zaYwa1KK&mg9AUa~!IaZ%(B(t7_RW~zK9F{HzHw;5$yL`S9G`#Y;Hq(9;Bmwx&)CJ* zcJ7axo-_ZPe{LBk5;6Ewao<5AEz7}9IO_DErtx}-&asHM!>y*p3mMya0+I1>6oyhh z`$~+$EV5KYX0U8%S(epm{*#DIab(3&*Z0LN%a`{tA>EsCZ%sM3lAo^ck!&aWlAo@A zPd;sRE>(OF_oJrn=_1vNX+zH8s){T9SsU-w@Sy8>m*y znuudE*0eI#d<@ZuDeJf86OFbZJJfn{94%*{=$ZkwWXTx4FIT+KT9x4!0Z_w}mW_cW z1#=AVBg3auixTfMI2^FBCg!O&ijXcQthHAdeqpraz3=g3zrx1WwnxE%fGdFle;#6= z-mkUM-51_)#4{3%dgua*D8r3`@I6BNES|5$@)e%~Gj?Kb&9lLJDVxq<_DEnzj%_+s zEz0s?#k!$I&`q1N6Jped*A{xm)#Cp`Tlp^lpqv*(+z({j2UE_23#N+l#syPZW&d1r zD|r-VYu<0V)0A%RxpySJqHo$ZS6g>u`?c*!|C_t!n>$l$c4V4&rs{Sg_+IB(sAe(r z&p)f=>e?4Mvtf{Q^SW7odc`I-!1S3nw-$C@v0zuj_2~B7&+x!*Vl~2!n%WPGAAx); zU*7mg_5%HP`UV=fUpB1YYc+qw^Ly>wM;4y)Rx{=8j=hcMj~aNuyqiaKb~EPgLS}j9 zCRPMnbW<<~H;~x!l#b`v5VVO1LZRZKlvZMxB{j;a7?Vl=HP_5Q+F-jba&)!BviMAw#Ie)xbbX(hy9$GU7v&V$`~f%<|MyjRb1Rl2H`EAD|T* zeihnE{G_>beJO7PS>}{5XVsLDh!5E8wS%8|2P(k)K3rxw5j|NH8FbRU72Iv24I&r% zyNz|Vpo2`YO}g7q@?wfs+;-ow5<7w{bX>`M;97&#%^2R zB{d{#mzmqkcP`(St-*F2gEfF#T0W&kY<2#^6*chC;(Z5W=81B;m!fiPSK8r$QuUBD zgsDTxp0smSf(NfA`D=X%`@^b+WZmtRH&@=T>YS@tksQ2z=;onx&Dz-`_iFCEoUYyi zZ&o9m&DSOp2jIAJH7cz$Rh=ZK>xkQv{+XVe$J1YQxrFq_e)A>Wu392N7-g1Y1WV8|Cd?qhMD z;0P{vj7-Mb^B160n@zL^B!{pD3Yl+pBu{6W*QK57X3yMrJj?Xeo{W2Q%DI`Yr>Q$h z7nbO%8?nQ9AUb_{CDlMZojQ!mAM4Z8^#^~JAIWFKTDX>?!LiV!&mRbkfGUDr=1EN`em5)#i^(ide2C3!BiFCCrL zf+I%kb>}M9fJ}#+!K%(hadQzSny=cWMVQnNMPe=alPaj*NfRW_rwO*GQQ9rDXYcOH zG;A-33K=J?FT;y$!jOA9$x)!D+|6;4#gD&UMK@~;;zI9Z7)=sAEQW z@ASK;GwqvyvhOd=9}fPk{DYxP>%NR@Fl8SsrVYKH)_>_g0P>h!--5WjT9WYMr}rS z=HFn;@aL#1cDtHGfziShK+%3$0dmx0$I+$zE0YO}b_A1ln2gSx`N5>--Dsohn9fc$ z+>g7Xz3=tE+kdYv-Ldt<&cEvZY4~oYkw)z`n8PfNXmYsc+qt4Mi}qU zTQq&L=kq=`(xy)Lkg-@$_w(X?`T+vhKd+eM`XNlr!ICk~9|zef{&yY=Dws(XVr;;2 zif*s=$E95|ljEEkuLQno4dRb@6a0aw!8dmlib6Xo%eA2>CDr9hP=DSMb}}Ul?-y)P zB9$_eP=**NFW3n$p`37%92n2|jGG4zij?w*j1uV=p~=BW8n`e zXCXkOhYLy9Wh4@0*~(L_zfb9p*yk)trMIYx7qcdRPnMUnrf`pp8Io@RiQRFQev0Qp zlOS)buY%6l43W@>+80NQ7@TdBS>3guH7nBF*7T{AU+0nqN{>ElyA_WZEgofyDN5@)8iP7hq( znQTv&dgFz@`;){o<3ULjz;et@DN@S~1c(Iqn$=3z=6jT% z%}iU#Rw!SjkkMW60f?LK*+uDo)Obk!{x#;wS6_--5HVzWFWKJ3kvT*BPQ5iV=S0vQ z2F?J!`e6FD8rS<(ebcR$nX{P{n=qXxDFyj0tm*`QAY}WOB8;S zJOnxjtR>J3kae(Yu%lx1WJHkYy9VXrIbAnY?x7D-Za;wo1P%cZ5+jiaZY)ZNsq83$ z-zPvOgY+!|BLq$p7$q=9V1mFo00|M_5 zm?7{(0)Il_PYL`Pf%ge8nZ*uG+8kR$6L42@Bn4j=0&%i$}D)L(~4XbkX&r%(HBhs>_81YHZR&Lfl#Z- zx3;%Xo~Iy$}J4>tgzfV$g|R4n<&fpml1Nv zYX@JdyNfzT8*-n~ZhSc!3~f|)E8EW!9S_Rt*|qhM{+4pk4mh?@kLQ?3i$RQ!%#4hTMa)1J0G+-j8vpL8;AQ)pnQ1_yM;%)q&D2co>l3X)(FNNV0pW-wSS z!GUhZ<2*}!+Uh>Fp9ihFZtJeJ+hv2=?hHW^UW5Qv1E|FJi4l!TNkrj3-`}}+$Rx$K z`#k%3{@88s&iS49bAIP{esAa8Yv7J8%*+_G;L$Y3+7Qy8NB;ilpFw1gz4C>z>^Gxd znbc-dUzxO|s=CS1&{)5=adoYue05!2eb8}NrK2%a=cul8_!cd8)Yey2PRq_7<20H+ z_2UC2+fHpYC!ZY;yUg1We`n(pX}?DJ)x%Gu{fo?h!u(U2{&d=lGJGnnO@=?0`5QJq zE6Z=#xHaupNZ+ur)U1b3%J^;7^7w2 z>#6-q5avj@#Y6$YX^dsaq@j>?A%T#Hzcf~cqI#ud@W*jIrGEos_oGft3&um0w=qU| zWm~ZZ=>!;mF?~pm5MvXQX%`4R$S;xuH8LAeFEu`*&a_}%EOR;&)LX6)-+B%w`q5uRmuQvN&`@-)2|x*YKM%Fn*wk2#G>MaK0H{40aLS)YmaD9(M?tx4F=SG?b$C+#JdE9v68$R(47g(L z`&0isOBXM@-MhrQ)O$ORKIbgcG>vckcq=G~i}cq)tlYJWM>f;Sazg2w2BX>UL6MeQR{v4n93V{PpAs!E&5v+oom-?6GaC2f#N2SR;X0$Qms+_pU-j6)_$SJf?_4 zi3~SmsI_?>B}aba?8i7&5qb=5dwBHD9KQLuZPW5hYWuWp(;@&~vC#5@6=Trszbd7X zm^pR(0?0`CP$}GQ)nb^ZCp?(b7?ah;4X<{etmbb)J&b92TJPC0grhsR^6*!tbywJ~ zq!}`A(M)G3i);H7Z5L(S`-vK~X|gTJI`Zd6`8O`&3Mkqh#V- z4)wdtvSSoR!Q=0kHT%y|nq%Uen!T2bPR-tuZ1-LOFVaSn?N;mUW>CA~o6KIZ$`ULH zh=n`p%F!_%TYx;7q8J!%E9F}$AZ;9al~~z zu=#M%9T5AKf>VkZ7lov~TnAPzg|MLBrIG50oNa6Wxh(mr*C7pVC-ehmpJacyNJI@b#KCwktPbNHjB( zwv$IJvp72Sx|dlRPjV4-mh=G?s*`K>raKKJe;0tn!)gG)?>SHt7XwByHCe0}K+4kk zs8+=PtSS7w3B8sO-Iap=Fdolb7qodQ=cVO0oY%#l$k}4$wC!cVMM#tPL$t zsWEbGdP69rh=qj#@iLDDX(9Inr@0PG*gI>PW!)qRV#+=mG3Kj8SRm@Lo}cnZs_qrLtd-8?RJsZ~ zc69JkZ(BYMAZovo_C_>&E4HU*|Mdz)!kUTlr|9__ty(m@2gNk|Bgm(XR>Gr}6L`fcswzhXLj<4 z4LKz!#FdR}JsO5QEO(I=*~^h#GCUa*T2zMQ<-?QnkX(i2vf;@NBsU;=c+ZQldlxk$ zxj_zw21Nr}RH%r*Yr&k5(>y$I+w=gIQxaZ~)^)RH z+jKVogYa$uDCy0d1P&U6cY`E6k1R@)=`fg~L3n#d(B2QP1MQ8MrPmp>w+eWXWOpu= z?4Bh`i)K#&b!m3@-yi}(l0tT^dVV#yfo8vq^2J*qx^+DMt|cILDdrPAn$^xDsuKiq zP<4M8%GQZ7@y|A(Dpv)g?f`3+^eK)cp3T##5v$I*SmInRi4lu4j97xi*~g&FHxuRj z3lru13lru13lru13lru13lru1ZzRh3AWEGgMPQ3gmA80+CMYgaKD|zK=}5RQ0ZKOL z)bnQ+kX?nMOa7vwzXz@LP5Fz8UV14lAozw?dzpu0RvKQ3H+~m@!o5xoeuvg2o-di`+Ee~(;uZpmVVsfPgoG^ z@b^<-%LydZh##SUa1FP8zY{oi*v187wsHP0(yg{**dnxFJkSYB!ibj(e-{Fe6aY#2 z`yw^9W=I|cK(NFrAj}l;d&s23e6VaD?lXnn^I>A1&8I^-zoWrJ-N;7o7^TJVZpJE$?) zjOV(8vgKmi_FU_ckHonf#2dEd(>l2^(#FvWbH}pl0HT8;69=G#HUh+sf3j;O`MeyfGV>XfHZOD1E9qyp^0rnbzn4fQFNYJB^8v1cP%&i zzjH-LXTWnb9STvv`Sh4mp@(rz_cIt`%rmuLz02ALa$sx&vCEs?pQV`IqX z;OA|Q-MOguBG97hHitqs$HBy>5P#5G?}g1FPLR#v$A$<}S3ufhxB`ZYi z6DP?2SU~p2H(4JrDr}oSLT93mR6Xj_N8IZ*@n+%y*<B9(D6KR!v)0vE4{6Po>t5(5_>0Z@fbX4KiQvU9cIq_mGZU>{8(d&>QNx!ysir*9fGXw9CH zobB0#gjr1c6oBNatK!q%t(ZwbV3;V~jXa5)g8+us_>fGNb|ma=onWx70^*at$`q6H z7bz_hNk|6(IX0-^Y*lnhl^tvc)(OnL#LlbHNjEZKd0x)Nk0irV#R1xfTO@uv5^r5a zWx$ys5^j{kAdyh0Ll6nq=nzE0L>+=i7%w64?9l-F(xqgPMD=CBz(GF%X?cGr0cn=M zAwiw@iT2)o(3EsGK8$JZ-_N7zvziz??*#J@?_S2k9~Z&j^VPf-xmR=!>*PM;O-&)&9g#y}tlN zeon0KGPpNy#|k@0AhsYgAl~L;rL$Qfp7$k>&Q0U)?k1S=K4iko&m&rjX0Jz}+4n6# zgd}Jqn3EqqCx~-cJiF9LjkAmoRAM*Qkk+zHQ%s}0(eIg{o*->+V8TAXXb((?DdBg% zRs28!Pbhyk_W z1emmH{ykh^uG8>O(MY1VS%>4aQx&__2?x{(yY;yPPzLTA#5hKzE-?8n8dSvmK|Ng| zGvl8~`Km&@ija#jNDE%3nBz*g3w!kt)7M0SfrW@%7b7D;_@zW1K8&XWWcF3l6eViW zc)^LJzHfr0$G#Bo4#)=dvgr4H(y>YDb3o}^xeDxn=vi{0Eg&P(IEin;GU{<14#1d$ z84>S+g7sPA=hqX>!fmmNI1~h+$1B;W^!q8|4RU~$C!7Dc4ZA8?wbyU+~RYn;Zbm^_2ZED!k4UWo&^ zM?$Yjx8tH{*2Tl@JH<5G6*GLg+OQWBqk-te;y`3o|H7z635YI* zupjTcSv4OHxVw1x2y^Y>=9ud4wmlM`AGM6bER+aliX5)(M$e6ZPh1%S5FTbAk6bNZ z>#X4{m#pCj3bBT5^AMr+Sp}2eygjhe36uSPXHGz1TR?`CV2d3CJNBA++v>*3y2`cd zYq+Z$EP}U%Dw`TAYwMd-R~K&!*H_f7Zmh3RU7fs*NE`|>3z)%XW2l{`#N*ik*It9; zD)F5Tq?(MVZF>^pZB3QI^>~+W}FYy?%+fiBXqI-C? zl;OypP)#o{$Ai(LnjE0f%>~<+BWoWvlkPuNJ~^J0nalE^a_+)Vk1MWta`+oRdy}T+ zieZlEfo8@dqvW`ZfsSm23KEh>V&OkJ%0DWvh&=%p1{%+%$t{RlOz4N7$28Yb%rObz z5KE1cSlXkm7#5po*Q!QJ!CXL&27RjHjirmhIK;=`9c9pYz9Zy^}pNd ze@BlLwgxb)-lA6j`>p=>S_2=p20n;{uq$z}woHk9&!OOqBmSv{-`&x#n&Ahbk*~oWcH^Kf2dzmp>j*cr+w+1Ret~IfG?4g)CKjOy zX-6+jaIr5jWd@oSfk9HlHaX?qF7pnV`owYLx`p3$QVk;%PlL|K2TP+G;$X$u6AtzDt1rOr!x8eDC^%iQ14mCqCiWa~# z@&cuZeK_v~&_+!Yfi#dbD*_iQ@s^g}+3wOhigRfAk-Kx@!e{~H-+a=x=_vqGdPHxx zkTK;USzPFMo%V?jU8lYA_cEfhe~U5@hLe5bWcaMbXPfttJTEG?O5feZ-26H`Sy_eP z_%9@^pfTI?yUm^9w{7va(-iam#4iiMQ+EfV8?51TIgK4y$`-U2e)(&X0L@y565gF= z3`r7!`+ldRv4w;)yZ{)HWZBRLuK`)KjYZY-ladQ({E##Re-1ixh)L)9T~N8Yx%lkg zQ41J6O6u#4YVwK| zbnpn74b>Vghrhy^9(99(=XoJyyds`7IE?MLi-;$vClQdqDuugD1fFI=LI|GM|>9#VxPO?7!9Ph`;hI?cqWt*3}f&4?vva8JPIU{{*JIi zB&VyzWFhaaaeKhh4fdnxC%75_cp$xx?fob zVN3Topoe>iVx!qVL;ydc2NBRJCyASswy@_gcpTiQPKWfwEj2DPER%Z^T_?R^(DY%+ zeW1kO!@)1y4Qk{m=T>wBb%8Xdd!~{`dG6nl!j$lb=hm%N3v}<98g*Vjj2~qx(X1<^ zF$a~M7j&p}%qk5=D52P*fE|g=UqEjqjW4<)M{#S7&_H$DgNw%vUz*;(=k#uzVg4h! z1)9DXgmQS=wTBi1tgA_la?l}${+23U)Ab)HOyr0H$5#fNQ=q|;=4kRl{qjPAf&S@^ z=_(k=03Lsw{E}f9Fz+|`(FOG{m?wq`)h4Ne1>z}Kg-kE4!f$V)fj;hRr2&U` zd7zrE(mkSvLzDw2krHe!Ze0xSh^@I2W|BC{BUMoFVJY!QL%-`Zk2EJ-ni?tVfib2= zs^CY!;Xy+eI0{*_RebZwU^5X8S0l5XewUV{zl9?AEAg7^G?Y2jeRxp>vDZDeM|LkV zFFDI78W4LIxd|4Qufwn5U|#N+J-lFVz>Q6lHR!QD+L7EZ@Q(Y%xy&zB_u0m$sXLD< zW;=m-O)Qh8zx?^i>HOGT4+9zLl zZS@lr2&FG<^}tXpXN|3X-x}NTBWr9YI@j3x4t-(UFoA>?Cnfoi=k&`k7;Bs*K|3kW z1BduzsEcMkc_)NCk7NSJg}UOO!oMy=>Ls))F{}!?E5JKRfeeswi?iowRtJw5&e7=1 zIMJ>L`gSNsI%Bc)2NO?&Ui&Tzkdp_8V06?cz{?IMeg+B2#dFfP17;)MRYf1|A=UgL z?I7w7gw8F(9;2zxKCxH~x= zEObaSqTqmHdw!mkYtW{A;Gbrk6OqHi_B;+AUWboM-(30qnnuz<3Gd1Yxc|`jGs$LX zhi$wjBA6oj>LEz&c^%z~8CYfL&0cVjCp6xUd)gPfIqV}0Y z=+W%=5oq=faW;YL?G=;z)^wHu3&Ic4r7n|ry1ipk+%CtBKx`#;a zxW=bPk>RcJj$%NxzJY zC4zdEkRf%05!?K{JdymD&xUsa3kCytN-hhC5&jk~K3BqDTgam7(-FOI zwnX&fa|qF^ZlwNRa<(8(o^XGx7kWl7^tZCmEGlI1AZWxD|4u3)EPN<8IG}7-qu<&I z_gZL-5A^#ANTn|uu3VD#xNiV-g2kwjCXZJfP(>z4P>s0wKsV0ZY(I{Zbo_CQ>uWZ! z)(RDCGzu!_7(|>^6)UXZugZkiU^^1=PI!%*7GoFTaUX`9R|eLSbAz^zsW?v+3-VNV zXJ7(MO1N)!2fq#ZN50@L)nvi7r>u4bQqD__z zCn%h7CH(Oay(FdO7$J;k(wH1tP{dA*5vF+R7!N1MxYHQpxa1gN=f`L?5{J-acFHjx zQ{BhZ$O^~EG3KMEe9UTSj5m3A(8bXq``|Abtv*s}3&X%@f!Mel@HZ_v&G-B4pC8Q{kEKFRK6JYnt+`Ggg;0SC^}_fK=6mI>It)R=_k3ld?K?u=L_GvdAMk&6wJ#*3CQsUMT&b7g@r)DPP8@;Nb%voJ9DpB z+lxGE1=;z-v}J8C^kwhlo#@v$8D&8Xi*VRY1+nxgYIU-pUWx|fwxN^DVkBMt*!<8V z!aZr=aSI&8`+D=lNH}uax#s7#?kyr|dUYzoCSc>7V zGKl|ukIccSeIFJWg633_vwmHP&ddNh zcx1XP^}3D)SW(!2(7KLbB5HJIKKh1G=~pB7Sd&x3s1rZ{k5q%j6RK3<1tZmQ1+PAA zK`g>1XA6xq;stxgC{l6L4%|3^8*ntj4Ss_+N%lneP)sX#fnO}4A5=0h0#^iK1Xduh zid7Q#(1Jj{*SkqU4Q!OZ2s@^c$O)Xs8)k}WfkrUyA-oV`Aq0rNz{4bB2~qk02+gq0 z3vdAjLLX#L!}K}`W#nAOxdzGG)O_R}#FS)3a5Tb6K5&vRabheJVP>jsZwd z__+Xn!X0KFj_0Lp-msQod+@i=pOr9nm1OYtG}`O-ZWjgFdvL8pv)?_Pj8GL8GV$-F zU~a^Vlll#hm;+!+MFFuCZj^n2g1zAMqr0hy7?%yq+8eT>~Xq;?GC9 ze46@l#T}49$%Um!z#)&&an4K4=z@auTjJC}T#7433YQKD0!R)tnuqe#0Sv?x=^~vr zBT7PE$&y8Xwj>0WELnKLl1YgLIu0-?vLL5MNT&{eCb3yql&RvWCn=uZgJ^nH7ftoM zAco=)L0u3*IW%2ZsF?X&5>N2LLRz8lekl(P`|>DCE+=V57h)h8bsUwT{Cj( zsmIMgQtH1vNnYGf={*l6{yt38laObSVu8p5Yzy>MNF|W%AvN;7er4boIo+g|4-pn{ zpTVIXM2i$U2jy8%(v?NR2HOlAf!>V(o0WQ>DU;92lw5T$Y7%!DfOA0C|E$petU70w z#VzAu1wce$$4xkx6k*9uAft*U^F}Aswk!F0D~ab7nf@OPOn*@*L(v3?$e>>{OH89v^L!QW&pSSSHKun3*O}d7nP3i0+_Dw z)eQLyVF|nTED~9{X)nJM7_ON{T()nPLyabBJgKZZV1uulN+NlW?&Q3!1q3 zBeI75jI7~3eBdb8_8j_@bi1R{0du|R*aFH2BbM%$v4;H%J?}X5y!v)*0DUtJvw>eB zA53sO@!iRpe4vX@&fqu;ie%9KDx3^d zA8+foMSxG~ecd1dTmfANz$?62wA~uGyQ^uGyt~l1#w!$f*>OkHtKV!DuMwp$$9*7N z&@^t@Wq6}=&-6`Cy)H$E3RRl@ZQLt2UN0$<7iVHf@J9V<niCAvraO|TL44#igKV5*mgEU%tFY8tS*y!?ooJ8VcY_{mU zK{&4DQ4pV%9~!F^;GE|Z+@tBe4rRg72jD23J%A-^Rh{#2`c#Bd84s;sJW&YHtAqIf zZ_z;qz+xTD1L)Ji9Dsfuv;v&VqiDuclpmVRwU{D%^tS1@t?gkT5lrn31e$$2U4hjO zkhc~WsMn48?HFu`-l*Jp-8{Mk!qxnSQUJ?l9}Krd7fs3xL+?|(iFP_zm7-tUw$H<@ zo(+SoW^$_|Hnz1Go_9FG;)(p$Vw@{U(9v4_l@8^#7JscnIjzNKb;#OUd=6C+!08M; z{h}}Zw`L4R-Wc1NPXI3E?EoNN?mc}rd0U2I+td9RIt2i|9yRO}(JSfoL)!oJHpE*= zdi}jj!HVq%pbGt(mn3Q8GF~y7E=4^EP`)0qAPMB^KoG{6DLA%m9APQEiAGuTWI#tM>u+k7ggd78t=@SQ1&rn>&6z{~DR!jeOiKAwi_zbsd;hs`(3A%BXYq zqUg8I85Y%ObeyPp3$h4rQ0NvFCE>1LV$Fx-HZAr9;0+fGIMjN2g#xe7oPVE(Mq8*v zvYf~-K~c^(mXCa^NA59&E*PT_wrg?fyFJ7o9F&ROxd3dcczH_el%9ulaIWIiS9~bl zf%FEXSB)s2k907x;?z-6d2Dylf_WjU8ALf+R)g)1tRh-E5tg~g0Y7(o5@#@X;x8WZ z7wgNTLbOvM$<)uU=AT*nC*itFS^GazIta`5FE714F|2g*rl3xf=Y5+55HY6cL-N2( zUhC+W=XSj?GuF*i3UH7Y=jMHQ%P{fg1bGvC3E_rrdA7`Ap?Pp=6Q3z~nclZJiR*wj z@`A6p_&t=0QQ&=vXZ1=~;#`ehp_@Q&X^aOG;_%299N_MQvQl~*ol=rq!lKZzEqJ*H z_)Iwu)8FS^#-laPZFrHlgqW;IAL~OP5BUpW_?J*CB%A=_+C9Sw#4&&DBMsNj{ zL0Cf}B{U>~W*zXiP}t#bHKGqAJck!WengFQ_#ZctdrSb341~)Niz>rGBg97tWZY_m zIYyXA;hGM=L*{NZQlB-#ZAM7=piW~(yweD~WJv7j@8KMlTx<&fI@}#gH#2k2-^`Tk zsBeXByYEVEpzB#v=o5OUFO=>natGi29k2&e`Z*^DK(51=oE|`QA_g|HelnT{$#Y0# zQWtR4J~cWQI+R|XbSWy08wG_VU}w-sHtwPo!R=1ER?vZF5cw_mBRHbw2(H6#VenS` z76qr^_ZHjc2at#NvvBpH2T~YJDDhqJZ*;ZR+cAoGeBUbX4tRs;a>P~~R8tAAm++$m z`ec2xy*r?6qXbsbC~~!4-+@=vYO3h; zMiyD37O9?lBlB>v;GV0%^dj>h+G3$mu06d^U_M@fdjc3X^moyjc=S~|TVG@`UT*d1 z74qmd!$BS?l*yEj_d)b52fg@=++TUaH=EIdU)*c4ZK4-2pnd)UgT<;m<$MhBfLKdj z0oP&qE*p>B;1#Fwj^!wM$R+P>z9i@NEq5ULeU0v~Eghu8pZG^NllFSqd|~OBFVqfP zLFv62o-;3w2yxW_XCv?PL)Wg^f;XeaOW!MW(1VHJogmx?m(rUqDimMbrNdP|>3KEo zr>Vl~I;@IZh;t7t_IRKGuB%R^U|+!9jYCl!|Lnx^5cwvK!8lekk4k~P$91^x$Moin z2lqt&2Ef+CM~O7|lM8K(k*yi6S#E!*xaO z`Xc;+g_}TO%CcWu+VZkAm?=>Vz0 z(SLj1!l*^AQKB2yFqFu>`6&zRLn#nTAy(J6=^)6AC`FoBxY&!=&z;CO?!WvEEk3n} zcMJ>tVxA>^bQp6(MOy8NKZdR>4{NDL!W-vNzLvu>i+(#q#AY{&@h>^fB(?=26t!QiZe)Xtav7!ALG!knBvq9V!^d1@c|mygoW!w#YAm7V-Iyh zZ}xcp%@m%qz8HzN&4m4q^lC)V8cVdH(56^$QKAF7QQ{2vQQ{ILfo_joK|%ID1c`Gn zKCm!T5=-^s4&?tr&;KdqcO$Ua;!Sdgo{`Z`c!A) zVq~FHctCf{J5)Fn;Q}vFWnYiRyxJix{X27T2Z{#RmjB&HqabH+=Pcq%%yzj1F9fJr5mBTn^}T_hrY!@0t?TD2-Rqp410%GYw)3{5-f@ zvD~3XJbA_y3*2_0JHQ@j?&1uV2;9mx%f1|A*f0uLp*}$u(OWcZ+IwN(bJ$w(C4w5MoC{u(uaHF9wsNNmOS9Ljn$H7gs$r)QD0ydI6tKs7Sq4kSLq z8WHFHaXhgb76v-LSnoJEHd#iqKQ|Ew)Pm_@%^dQa?{Qj6kC1>O{Y@03A&-tOH_^=j zQnmHbY4&R5>0{{2a2=;yk~X;4kJa#yh^14SA$m4cw?Vqj_!%}yC_O=MazML>-+~B4 zYE?u8q)_$#9fpqj9=gQ>aded4eL8U|5gK^M0RVX4Mn*ed7;Ry+uN*75cJ+QrgK7-V z%Ev`JVE3V13~7)WqjnJSzJfP>ve)23LE;|~Bd1>xkE92%WMqA!^BC04^f&3ofk?le zk|XK=aHC$*1NfK7=}6y*6zaAk{d<6DEj!XT8<76i$lWp8T@O&r4vUF;9!eM4XX%VF zqFNluMCgFoJ;_8=tho#$)M)weHVP0)eh#8EU_!J18{U!T;$H^Qs0)WjF|v5efJ4px zH05Bfvv|0|S%eX&9A691S@1 zcoD_@4pakI?Qw7yV3$7!ULU@L6i50l7N3lWYp5%3^TCag{xVc8q7+V!qDcBbQxq$I zCnV#?`9xGWC!BNbr9eywmoPugGq?=O4(7UI{oMAe>_ITM z&?hr=Ucb%MH$eM<>fWu_9hKM)KGb(fVlm=imk;a7mKm|WQHjlnY%|FYsScR_9FP~7 zKJG=xSr~2Ii*lP{A*wV!@m)PKDzO?s-^VHS6N`|Nn2#SLacEB_eayzj#PyJV+MB(J zU0{CL^B3Xe)X+G|GPr=9*#SBM-sBevU`>}8J9d~I)cXSJ%DHZkjRfH*%^sv(MDp%m zk(M~KUFy&2iGPwsu`tFwpElyXj|0&6y={B?zo7EwJ@WMlo3Fh!{pW}$)`9&cLMUcn zAU9E^M@9o*cLMDD=pi%m2=J%bT z+l+@LrR0Y1bFv4BX2yUnGZ3apGRSY$ zb&B3Rn*FryhR6cytx+5||4z#9$DLh37Hn6-8SZ&XT*_U`qnH13BGsPr6oNiD(douH zy?MW%8l?jU_ld?{eWzj#OZ9a~*4?1jZ5~l~%Qw{B2?D0RbL7z!HG)gju06IVeIgEH z%!fmQjs11O${O#+&*oLug?!?$=y&b$MvG1U%ud^r-i@DE*HzMeMStdAv||xplBC9E z{;W_54`*w1V0Cr>&6;gaEW^Zt`E$xL(pYfPoCXRmP2cwA*U+UL_c}SgzeN8qMcdEg zO}Rdi{%R34%W$X37fIg(ux}L7VgTBpx-nmrf93AKA0O$mJ&E3Zg0vM&vTxf9?~ZO7 z(of-Z2rG4!&^pB020^@oUU# z$X?TWjHF>fO8(WqMm5h;j33MM(L(_b@wPjAzs4QZ{VBjWA(^=Zr8fthYPU2}^$%sF0 zgjLCMMuRV{WG%#klVMq@9&Z^DCj0+?4NJD@?e`mDvOTbyVShe$BU{N<<7r^)SvhOO zZv#G%T92>E*0Wkx`6qLlP`(@`D)H&n3RaDF>Hs(4-!xVwyKF#OBif_98s=a(;UOy{ z`S+jGe=Q54b?T)7;d)leu4gkbhVo=L$SY;{Vn&S^XOkSq9Q>|EY8}!YtN_mplrER! zB`i4D9Q+$TT8Pm96nx!ziaTU z9_mU$`K*~;hg3bc5V5&`=HF7L;@=e1(D5~0wi9G4fY0kBcJD-S*>v{DEvL3SvIg~=+7HdHaM-`;!(xT# zL7(05@y;4C{u>bg?)f?9qtJWd)Z$y()u{@2jt#}`8>q?n5{9DU<(tpaY zb;Q0;HkyBr&KHV|FqwWnG@Xb3zW^=k^zn@Btk4*r#|XI*=Ko}P`8-riYe{QK)_)AR zwNfMpIQB9&uXu?{aLFRZ|GS za7yFTaZW6my@WKFaLF{>c4e#!X(?+%EQFCRVlkgDN6Ra}A?`tt{I0lX3&u|U-__Ja z*=#GcXDF`8?}^j*)60-7zZ>o>oDPtcA?>lDG&v?p|5JaL6pUt+_t5MCys!PK~E{3tg5$+7)eU1MU_hEXLMg(#Dr z#?s##!%E-+e*(`+Sq}?0GL71=$Ypy_rU%a^qy5x+m*C`N%v~8hmIiZ48rr6@&uIJAEE!jj zHZhs@UN)onOV=<~NNE_y$T+oez7FzJ+ck~1u<%@pMe|M@B!CpBhiCW5N;37<{%heWr{myj&#}xi6=yGa zxNHL(8R=|f`uGes{=E#Az01ndG4CsWVv{OtY|@gkY|_kZHtDv@ z`!DOcr0e3Cy+O}I`VyqiM7fkaxo6%1g*TYXl6!^|9nii+Tjb~b5uSb;E8+4~CiZKV zO#4TqTOTmWzM9P_{sx|jl!i7&#;Kk2b&x--ZQ{Uao1txnw%CZiO{3G<=m#a=k$Zd6 z6;^fyKDuguZyabVho$ebu^bFMj^{C>|J1lC*UECS_PI+&v0SWw?u?v z6i7GLI6LMM9L?+%qnI6Iv(FgUL*JAKM`FuwgTo6C$#VL;ZZTuu!IO-e;CjoLkybK} z_BHs!nAQU~0;Q5(Rw*v4pc(xny=K;Tvl27p$Q}Rs~6SLfcgS1OC*rhXV z?9#@IdU6{klu`RY5&H~fUthx5UbIJ{9LsHKC2|j9E;h`?HY2maG}^>Q--Udug;^VQ zN;Ae?Xd>P)b2Q7Ikx??5`n!s;Wc#D;VC;u@NPtmjN;5H%IVO8L@bm(+o7z|g#pT>H z*q9j^4SL_`cV;@XjYr?8PJa~2`q=X$|Hy!(wCh{+a%RBv=wjt z#ZyMd7YRlJ%(# z##V*#(||p(QAXv@KO?OLX)P&f&uoGlA8F5~r0qspH_|Tj_g8<0j+ITo5&eCWKjROU z+k!R4s~du$#>!$W8U0^i&Qh9MUw?O~VQ#3dJXl>{=dTMkLVK{JBWGE4V=%P3W@+8M z)pZq&eUQGiu4;8%MNMUezq!1!fr`(qt_fB)GWJyZ;>zGRX3t2QR~al0HR9t}!IH-M z@=B<3yV93bHr7_xtqxWuli0InrOAlYH_okGO=B%-tZYIx)?m3cRN1(`q_S~MePiwF zx^m1SglRM~*B`g8RInRTQkPUUR<5o}1eaE_n^|d7WmV}Kxum5ufjm}PUSGGS zdM(zW6rUz*tiQK(b>muC9xlD6j*?_nW!<{!#`?NiS}u5VWIslU`nt+y@QffKnBlYO zrIpQ<<)L6@>9CB8&>xj!Y;{BR)Y_)0AiSyNjlro^m8%=3)=Zx|eX457$rbbR1rT>zK(~6iL}&0&++mf7@YTX;2R-{jY!jbuf@> zuaX^mY$Eh@>QQ+N)~bAVHAP_jjTg6CDF zQ}|DK5`Zb}cEbJ#OyS3PC_U9aOtl?T?MkvYi(voxV7F2DAfDxbDcpvq3NVE);b{h( zY8$57jbuN@@H|Il5MB@GUkosXci`y)T!!!rZW{FfPPP3~?Lx8--^Y^+JBz~4@#F)h z@H?;rivXwEZ)6*iy|)DEsdgXPe<$#4LOO*X;Moe8!c%y*0cPK3Y(1VB;1-0R;gMr2 z9J2Mu=4-+829-hBiRTpHE`%#)K(fQmNwv39ZLw54jqEq43;qg}r?3o91Jy-_amLcm+(*-3g0*2L4?ICp;aQ?hp+|DZvaz>^Ee5|5UySY zxl97jLp8exwgi!uClQS=E0n6 zr%x-q)=^nkUSCmNw|368OP9=@T6C?WDF{1abq$oiIoGbQY`XU5o3h8uCJnXruA21@ zG*H(x=h{$X-HlD EccKey: ... +def import_x25519_private_key(encoded: bytes) -> EccKey: ... +def import_x448_public_key(encoded: bytes) -> EccKey: ... +def import_x448_private_key(encoded: bytes) -> EccKey: ... +def key_agreement(**kwargs: Unpack[RequestParams[T]]) -> T: ... diff --git a/venv/Lib/site-packages/Cryptodome/Protocol/HPKE.py b/venv/Lib/site-packages/Cryptodome/Protocol/HPKE.py new file mode 100644 index 0000000..13823ec --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Protocol/HPKE.py @@ -0,0 +1,483 @@ +import struct +from enum import IntEnum + +from types import ModuleType +from typing import Optional + +from .KDF import _HKDF_extract, _HKDF_expand +from .DH import key_agreement, import_x25519_public_key, import_x448_public_key +from Cryptodome.Util.strxor import strxor +from Cryptodome.PublicKey import ECC +from Cryptodome.PublicKey.ECC import EccKey +from Cryptodome.Hash import SHA256, SHA384, SHA512 +from Cryptodome.Cipher import AES, ChaCha20_Poly1305 + + +class MODE(IntEnum): + """HPKE modes""" + BASE = 0x00 + PSK = 0x01 + AUTH = 0x02 + AUTH_PSK = 0x03 + + +class AEAD(IntEnum): + """Authenticated Encryption with Associated Data (AEAD) Functions""" + AES128_GCM = 0x0001 + AES256_GCM = 0x0002 + CHACHA20_POLY1305 = 0x0003 + + +class DeserializeError(ValueError): + pass + +class MessageLimitReachedError(ValueError): + pass + +# CURVE to (KEM ID, KDF ID, HASH) +_Curve_Config = { + "NIST P-256": (0x0010, 0x0001, SHA256), + "NIST P-384": (0x0011, 0x0002, SHA384), + "NIST P-521": (0x0012, 0x0003, SHA512), + "Curve25519": (0x0020, 0x0001, SHA256), + "Curve448": (0x0021, 0x0003, SHA512), +} + + +def _labeled_extract(salt: bytes, + label: bytes, + ikm: bytes, + suite_id: bytes, + hashmod: ModuleType): + labeled_ikm = b"HPKE-v1" + suite_id + label + ikm + return _HKDF_extract(salt, labeled_ikm, hashmod) + + +def _labeled_expand(prk: bytes, + label: bytes, + info: bytes, + L: int, + suite_id: bytes, + hashmod: ModuleType): + labeled_info = struct.pack('>H', L) + b"HPKE-v1" + suite_id + \ + label + info + return _HKDF_expand(prk, labeled_info, L, hashmod) + + +def _extract_and_expand(dh: bytes, + kem_context: bytes, + suite_id: bytes, + hashmod: ModuleType): + Nsecret = hashmod.digest_size + + eae_prk = _labeled_extract(b"", + b"eae_prk", + dh, + suite_id, + hashmod) + + shared_secret = _labeled_expand(eae_prk, + b"shared_secret", + kem_context, + Nsecret, + suite_id, + hashmod) + return shared_secret + + +class HPKE_Cipher: + + def __init__(self, + receiver_key: EccKey, + enc: Optional[bytes], + sender_key: Optional[EccKey], + psk_pair: tuple[bytes, bytes], + info: bytes, + aead_id: AEAD, + mode: MODE): + + self.enc: bytes = b'' if enc is None else enc + """The encapsulated session key.""" + + self._verify_psk_inputs(mode, psk_pair) + + self._curve = receiver_key.curve + self._aead_id = aead_id + self._mode = mode + + try: + self._kem_id, \ + self._kdf_id, \ + self._hashmod = _Curve_Config[self._curve] + except KeyError as ke: + raise ValueError("Curve {} is not supported by HPKE".format(self._curve)) from ke + + self._Nk = 16 if self._aead_id == AEAD.AES128_GCM else 32 + self._Nn = 12 + self._Nt = 16 + self._Nh = self._hashmod.digest_size + + self._encrypt = not receiver_key.has_private() + + if self._encrypt: + # SetupBaseS (encryption) + if enc is not None: + raise ValueError("Parameter 'enc' cannot be an input when sealing") + shared_secret, self.enc = self._encap(receiver_key, + self._kem_id, + self._hashmod, + sender_key) + else: + # SetupBaseR (decryption) + if enc is None: + raise ValueError("Parameter 'enc' required when unsealing") + shared_secret = self._decap(enc, + receiver_key, + self._kem_id, + self._hashmod, + sender_key) + + self._sequence = 0 + self._max_sequence = (1 << (8 * self._Nn)) - 1 + + self._key, \ + self._base_nonce, \ + self._export_secret = self._key_schedule(shared_secret, + info, + *psk_pair) + + @staticmethod + def _encap(receiver_key: EccKey, + kem_id: int, + hashmod: ModuleType, + sender_key: Optional[EccKey] = None, + eph_key: Optional[EccKey] = None): + + assert (sender_key is None) or sender_key.has_private() + assert (eph_key is None) or eph_key.has_private() + + if eph_key is None: + eph_key = ECC.generate(curve=receiver_key.curve) + enc = eph_key.public_key().export_key(format='raw') + + pkRm = receiver_key.public_key().export_key(format='raw') + kem_context = enc + pkRm + extra_param = {} + if sender_key: + kem_context += sender_key.public_key().export_key(format='raw') + extra_param = {'static_priv': sender_key} + + suite_id = b"KEM" + struct.pack('>H', kem_id) + + def kdf(dh, + kem_context=kem_context, + suite_id=suite_id, + hashmod=hashmod): + return _extract_and_expand(dh, kem_context, suite_id, hashmod) + + shared_secret = key_agreement(eph_priv=eph_key, + static_pub=receiver_key, + kdf=kdf, + **extra_param) + return shared_secret, enc + + @staticmethod + def _decap(enc: bytes, + receiver_key: EccKey, + kem_id: int, + hashmod: ModuleType, + sender_key: Optional[EccKey] = None): + + assert receiver_key.has_private() + + try: + if receiver_key.curve == 'Curve25519': + pkE = import_x25519_public_key(enc) + elif receiver_key.curve == 'Curve448': + pkE = import_x448_public_key(enc) + else: + pkE = ECC.import_key(enc, curve_name=receiver_key.curve) + except ValueError as ve: + raise DeserializeError("'enc' is not a valid encapsulated HPKE key") from ve + + pkRm = receiver_key.public_key().export_key(format='raw') + kem_context = enc + pkRm + extra_param = {} + if sender_key: + kem_context += sender_key.public_key().export_key(format='raw') + extra_param = {'static_pub': sender_key} + + suite_id = b"KEM" + struct.pack('>H', kem_id) + + def kdf(dh, + kem_context=kem_context, + suite_id=suite_id, + hashmod=hashmod): + return _extract_and_expand(dh, kem_context, suite_id, hashmod) + + shared_secret = key_agreement(eph_pub=pkE, + static_priv=receiver_key, + kdf=kdf, + **extra_param) + return shared_secret + + @staticmethod + def _verify_psk_inputs(mode: MODE, psk_pair: tuple[bytes, bytes]): + psk_id, psk = psk_pair + + if (psk == b'') ^ (psk_id == b''): + raise ValueError("Inconsistent PSK inputs") + + if (psk == b''): + if mode in (MODE.PSK, MODE.AUTH_PSK): + raise ValueError(f"PSK is required with mode {mode.name}") + else: + if len(psk) < 32: + raise ValueError("PSK must be at least 32 byte long") + if mode in (MODE.BASE, MODE.AUTH): + raise ValueError("PSK is not compatible with this mode") + + def _key_schedule(self, + shared_secret: bytes, + info: bytes, + psk_id: bytes, + psk: bytes): + + suite_id = b"HPKE" + struct.pack('>HHH', + self._kem_id, + self._kdf_id, + self._aead_id) + + psk_id_hash = _labeled_extract(b'', + b'psk_id_hash', + psk_id, + suite_id, + self._hashmod) + + info_hash = _labeled_extract(b'', + b'info_hash', + info, + suite_id, + self._hashmod) + + key_schedule_context = self._mode.to_bytes(1, 'big') + psk_id_hash + info_hash + + secret = _labeled_extract(shared_secret, + b'secret', + psk, + suite_id, + self._hashmod) + + key = _labeled_expand(secret, + b'key', + key_schedule_context, + self._Nk, + suite_id, + self._hashmod) + + base_nonce = _labeled_expand(secret, + b'base_nonce', + key_schedule_context, + self._Nn, + suite_id, + self._hashmod) + + exporter_secret = _labeled_expand(secret, + b'exp', + key_schedule_context, + self._Nh, + suite_id, + self._hashmod) + + return key, base_nonce, exporter_secret + + def _new_cipher(self): + nonce = strxor(self._base_nonce, self._sequence.to_bytes(self._Nn, 'big')) + if self._aead_id in (AEAD.AES128_GCM, AEAD.AES256_GCM): + cipher = AES.new(self._key, AES.MODE_GCM, nonce=nonce, mac_len=self._Nt) + elif self._aead_id == AEAD.CHACHA20_POLY1305: + cipher = ChaCha20_Poly1305.new(key=self._key, nonce=nonce) + else: + raise ValueError(f"Unknown AEAD cipher ID {self._aead_id:#x}") + if self._sequence >= self._max_sequence: + raise MessageLimitReachedError() + self._sequence += 1 + return cipher + + def seal(self, plaintext: bytes, auth_data: Optional[bytes] = None): + """Encrypt and authenticate a message. + + This method can be invoked multiple times + to seal an ordered sequence of messages. + + Arguments: + plaintext: bytes + The message to seal. + auth_data: bytes + Optional. Additional Authenticated data (AAD) that is not encrypted + but that will be also covered by the authentication tag. + + Returns: + The ciphertext concatenated with the authentication tag. + """ + + if not self._encrypt: + raise ValueError("This cipher can only be used to seal") + cipher = self._new_cipher() + if auth_data: + cipher.update(auth_data) + ct, tag = cipher.encrypt_and_digest(plaintext) + return ct + tag + + def unseal(self, ciphertext: bytes, auth_data: Optional[bytes] = None): + """Decrypt a message and validate its authenticity. + + This method can be invoked multiple times + to unseal an ordered sequence of messages. + + Arguments: + cipertext: bytes + The message to unseal. + auth_data: bytes + Optional. Additional Authenticated data (AAD) that + was also covered by the authentication tag. + + Returns: + The original plaintext. + + Raises: ValueError + If the ciphertext (in combination with the AAD) is not valid. + + But if it is the first time you call ``unseal()`` this + exception may also mean that any of the parameters or keys + used to establish the session is wrong or that one is missing. + """ + + if self._encrypt: + raise ValueError("This cipher can only be used to unseal") + if len(ciphertext) < self._Nt: + raise ValueError("Ciphertext is too small") + cipher = self._new_cipher() + if auth_data: + cipher.update(auth_data) + + try: + pt = cipher.decrypt_and_verify(ciphertext[:-self._Nt], + ciphertext[-self._Nt:]) + except ValueError: + if self._sequence == 1: + raise ValueError("Incorrect HPKE keys/parameters or invalid message (wrong MAC tag)") + raise ValueError("Invalid message (wrong MAC tag)") + return pt + + +def new(*, receiver_key: EccKey, + aead_id: AEAD, + enc: Optional[bytes] = None, + sender_key: Optional[EccKey] = None, + psk: Optional[tuple[bytes, bytes]] = None, + info: Optional[bytes] = None) -> HPKE_Cipher: + """Create an HPKE context which can be used: + + - by the sender to seal (encrypt) a message or + - by the receiver to unseal (decrypt) it. + + As a minimum, the two parties agree on the receiver's asymmetric key + (of which the sender will only know the public half). + + Additionally, for authentication purposes, they may also agree on: + + * the sender's asymmetric key (of which the receiver will only know the public half) + + * a shared secret (e.g., a symmetric key derived from a password) + + Args: + receiver_key: + The ECC key of the receiver. + It must be on one of the following curves: ``NIST P-256``, + ``NIST P-384``, ``NIST P-521``, ``X25519`` or ``X448``. + + If this is a **public** key, the HPKE context can only be used to + **seal** (**encrypt**). + + If this is a **private** key, the HPKE context can only be used to + **unseal** (**decrypt**). + + aead_id: + The HPKE identifier of the symmetric cipher. + The possible values are: + + * ``HPKE.AEAD.AES128_GCM`` + * ``HPKE.AEAD.AES256_GCM`` + * ``HPKE.AEAD.CHACHA20_POLY1305`` + + enc: + The encapsulated session key (i.e., the KEM shared secret). + + The receiver must always specify this parameter. + + The sender must always omit this parameter. + + sender_key: + The ECC key of the sender. + It must be on the same curve as the ``receiver_key``. + If the ``receiver_key`` is a public key, ``sender_key`` must be a + private key, and vice versa. + + psk: + A Pre-Shared Key (PSK) as a 2-tuple of non-empty + byte strings: the identifier and the actual secret value. + Sender and receiver must use the same PSK (or none). + + The secret value must be at least 32 bytes long, + but it must not be a low-entropy password + (use a KDF like PBKDF2 or scrypt to derive a secret + from a password). + + info: + A non-secret parameter that contributes + to the generation of all session keys. + Sender and receive must use the same **info** parameter (or none). + + Returns: + An object that can be used for + sealing (if ``receiver_key`` is a public key) or + unsealing (if ``receiver_key`` is a private key). + In the latter case, + correctness of all the keys and parameters will only + be assessed with the first call to ``unseal()``. + """ + + if aead_id not in AEAD: + raise ValueError(f"Unknown AEAD cipher ID {aead_id:#x}") + + curve = receiver_key.curve + if curve not in ('NIST P-256', 'NIST P-384', 'NIST P-521', + 'Curve25519', 'Curve448'): + raise ValueError(f"Unsupported curve {curve}") + + if sender_key: + count_private_keys = int(receiver_key.has_private()) + \ + int(sender_key.has_private()) + if count_private_keys != 1: + raise ValueError("Exactly 1 private key required") + if sender_key.curve != curve: + raise ValueError("Sender key uses {} but recipient key {}". + format(sender_key.curve, curve)) + mode = MODE.AUTH if psk is None else MODE.AUTH_PSK + else: + mode = MODE.BASE if psk is None else MODE.PSK + + if psk is None: + psk = b'', b'' + + if info is None: + info = b'' + + return HPKE_Cipher(receiver_key, + enc, + sender_key, + psk, + info, + aead_id, + mode) diff --git a/venv/Lib/site-packages/Cryptodome/Protocol/KDF.py b/venv/Lib/site-packages/Cryptodome/Protocol/KDF.py new file mode 100644 index 0000000..5f8170a --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Protocol/KDF.py @@ -0,0 +1,647 @@ +# 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) < dkLen: + base = HMAC.new(password, b"", hmac_hash_module) + first_digest = base.copy().update(salt + struct.pack(">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_extract(salt, ikm, hashmod): + prk = HMAC.new(salt, ikm, digestmod=hashmod).digest() + return prk + + +def _HKDF_expand(prk, info, L, hashmod): + t = [b""] + n = 1 + tlen = 0 + while tlen < L: + hmac = HMAC.new(prk, t[-1] + info + struct.pack('B', n), digestmod=hashmod) + t.append(hmac.digest()) + tlen += hashmod.digest_size + n += 1 + okm = b"".join(t) + return okm[:L] + + +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"" + + prk = _HKDF_extract(salt, master, hashmod) + okm = _HKDF_expand(prk, context, output_len, hashmod) + + if num_keys == 1: + return okm[:key_len] + kol = [okm[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 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/venv/Lib/site-packages/Cryptodome/Protocol/KDF.pyi b/venv/Lib/site-packages/Cryptodome/Protocol/KDF.pyi new file mode 100644 index 0000000..80691e0 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Protocol/KDF.pyi @@ -0,0 +1,44 @@ +from types import ModuleType +from typing import Optional, Callable, Tuple, Union, Dict, Any, overload +from typing_extensions import Literal + +Buffer=bytes|bytearray|memoryview + +RNG = Callable[[int], bytes] +PRF = Callable[[bytes, bytes], bytes] + +def PBKDF1(password: str, salt: bytes, dkLen: int, count: Optional[int]=1000, hashAlgo: Optional[ModuleType]=None) -> bytes: ... +def PBKDF2(password: str, salt: bytes, dkLen: Optional[int]=16, count: Optional[int]=1000, prf: Optional[RNG]=None, hmac_hash_module: Optional[ModuleType]=None) -> bytes: ... + +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_extract(salt: Buffer, ikm: Buffer, hashmod: ModuleType) -> bytes: ... +def _HKDF_expand(prk: Buffer, info: Buffer, L: int, hashmod) -> 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: Buffer, + key_len: int, + prf: PRF, + num_keys: Literal[None] = None, + label: Buffer = b'', context: Buffer = b'') -> bytes: ... + +@overload +def SP800_108_Counter(master: Buffer, + key_len: int, + prf: PRF, + num_keys: int, + label: Buffer = b'', context: Buffer = b'') -> Tuple[bytes]: ... diff --git a/venv/Lib/site-packages/Cryptodome/Protocol/SecretSharing.py b/venv/Lib/site-packages/Cryptodome/Protocol/SecretSharing.py new file mode 100644 index 0000000..1034909 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Protocol/SecretSharing.py @@ -0,0 +1,297 @@ +# +# 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 number of shares needed to reconstruct the secret. + n (integer): + The number of shares to create (at least ``k``). + secret (byte string): + A byte string of 16 bytes (e.g. an AES 128 key). + ssss (bool): + If ``True``, the shares can be used with the ``ssss`` utility + (without using the "diffusion layer"). + Default: ``False``. + + Return (tuples): + ``n`` tuples, one per participant. + A tuple contains two items: + + 1. the unique index (an integer) + 2. the share (16 bytes) + """ + + # + # We create a polynomial with random coefficients in GF(2^128): + # + # p(x) = c_0 + \sum_{i=1}^{k-1} c_i * x^i + # + # c_0 is the 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 index assigned to the share. + + def make_share(user, coeffs, ssss): + idx = _Element(user) + + # Horner's method + share = _Element(0) + for coeff in coeffs: + share = idx * share + coeff + + # The ssss utility actually uses: + # + # p(x) = c_0 + \sum_{i=1}^{k-1} c_i * x^i + x^k + # + 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 containing the index (an integer) and + the share (a byte string, 16 bytes long) that were assigned to + a participant. + + .. note:: + + Pass exactly as many share as they are required, + and no more. + + ssss (bool): + If ``True``, the shares were produced by the ``ssss`` utility + (without using the "diffusion layer"). + 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/venv/Lib/site-packages/Cryptodome/Protocol/SecretSharing.pyi b/venv/Lib/site-packages/Cryptodome/Protocol/SecretSharing.pyi new file mode 100644 index 0000000..5952c99 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Protocol/__init__.py b/venv/Lib/site-packages/Cryptodome/Protocol/__init__.py new file mode 100644 index 0000000..76e22bf --- /dev/null +++ b/venv/Lib/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', 'DH'] diff --git a/venv/Lib/site-packages/Cryptodome/Protocol/__init__.pyi b/venv/Lib/site-packages/Cryptodome/Protocol/__init__.pyi new file mode 100644 index 0000000..377ed90 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Protocol/__init__.pyi @@ -0,0 +1 @@ +__all__ = ['KDF.pyi', 'SecretSharing.pyi'] diff --git a/venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/DH.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/DH.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66bbf993010c74c76210dfc1a0945c1d16988c42 GIT binary patch literal 6372 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/HPKE.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/HPKE.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c12a870bdb52a15bc814745268df43c7bd8659f1 GIT binary patch literal 18385 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/SecretSharing.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/SecretSharing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69eb129cc6232ea1abe6be25c207fcc585f6fd27 GIT binary patch literal 9226 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 Sh;T;Wx24|sBS%+u{{I8^oSex3 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Protocol/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ed005336fceda7d8665c18ec547768be539d7dc GIT binary patch literal 206 zcmX@j%ge<81m}X&GY#1o7#@Q-Fu(+5eC7c%rZc27q%bUEjAE!{)MV0RzQyeA;&zKS zI5oK_wInzru_!Yy{T7ppho2_nE%x~M#GIV?_>~NwK}P(tbG3>|%#1IKDND^Oi}A@! ziYd-4N!2Y#OwLYBPc4pdE~+dj$xq48P1O%5$}h=J&d<@0kI&4@EQycTE2#X%VUwGm jQks)$SHuZ4juD89K~DO>%*e?2$&P_rvyr`s9Vh?*M}jz) literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Protocol/_scrypt.pyd b/venv/Lib/site-packages/Cryptodome/Protocol/_scrypt.pyd new file mode 100644 index 0000000000000000000000000000000000000000..0353374dfe2fd78db05d77dc5ad41296b03003f8 GIT binary patch literal 12288 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/DSA.py b/venv/Lib/site-packages/Cryptodome/PublicKey/DSA.py new file mode 100644 index 0000000..dddd304 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/PublicKey/DSA.pyi b/venv/Lib/site-packages/Cryptodome/PublicKey/DSA.pyi new file mode 100644 index 0000000..354ac1f --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/PublicKey/ECC.py b/venv/Lib/site-packages/Cryptodome/PublicKey/ECC.py new file mode 100644 index 0000000..bd9c8cb --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/PublicKey/ECC.py @@ -0,0 +1,1342 @@ +# =================================================================== +# +# 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 Cryptodome.Util.py3compat import bord, tobytes, tostr, bchr, is_string + +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Util.asn1 import (DerObjectId, DerOctetString, DerSequence, + DerBitString) + +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 ._point import EccPoint, EccXPoint, _curves +from ._point import CurveID as _CurveID + + +class UnsupportedEccFeature(ValueError): + pass + + +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 **canonical** name of the curve as defined in the `ECC table`_. + :vartype curve: string + + :ivar pointQ: an ECC point representing the public component. + :vartype pointQ: :class:`EccPoint` or :class:`EccXPoint` + + :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 represents the private component + in Ed22519 (32 bytes), Curve25519 (32 bytes), + Curve448 (56 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 Ed25519 (32 bytes), + Curve25519 (32 bytes), Curve448 (56 bytes) or Ed448 (57 bytes). + point : EccPoint or EccXPoint + 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 + 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.canonical + + 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 + + # RFC 8032, 5.1.5 + if self._curve.id == _CurveID.ED25519: + if self._d is not None: + raise ValueError("Parameter d can only be used with NIST P curves") + 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 + self._d = Integer.from_bytes(tmp, byteorder='little') + # RFC 8032, 5.2.5 + elif self._curve.id == _CurveID.ED448: + if self._d is not None: + raise ValueError("Parameter d can only be used with NIST P curves") + 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') + # RFC 7748, 5 + elif self._curve.id == _CurveID.CURVE25519: + if self._d is not None: + raise ValueError("Parameter d can only be used with NIST P curves") + if len(self._seed) != 32: + raise ValueError("Parameter seed must be 32 bytes long for Curve25519") + tmp = bytearray(self._seed) + tmp[0] &= 0xF8 + tmp[31] = (tmp[31] & 0x7F) | 0x40 + self._d = Integer.from_bytes(tmp, byteorder='little') + elif self._curve.id == _CurveID.CURVE448: + if self._d is not None: + raise ValueError("Parameter d can only be used with NIST P curves") + if len(self._seed) != 56: + raise ValueError("Parameter seed must be 56 bytes long for Curve448") + tmp = bytearray(self._seed) + tmp[0] &= 0xFC + tmp[55] |= 0x80 + self._d = Integer.from_bytes(tmp, byteorder='little') + + else: + if self._seed is not None: + raise ValueError("Parameter 'seed' cannot be used with NIST P-curves") + 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") + + 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._curve.is_edwards: + extra = ", seed=%s" % tostr(binascii.hexlify(self._seed)) + else: + extra = ", d=%d" % int(self._d) + else: + extra = "" + if self._curve.id in (_CurveID.CURVE25519, + _CurveID.CURVE448): + x = self.pointQ.x + result = "EccKey(curve='%s', point_x=%d%s)" % (self._curve.canonical, x, extra) + else: + x, y = self.pointQ.xy + result = "EccKey(curve='%s', point_x=%d, point_y=%d%s)" % (self._curve.canonical, x, y, extra) + return result + + 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.canonical, point=self.pointQ) + + def _export_SEC1(self, compress): + if not self._curve.is_weierstrass: + raise ValueError("SEC1 format is only supported for NIST P 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_public(self): + x, y = self.pointQ.xy + if self._curve.id == _CurveID.ED25519: + result = bytearray(y.to_bytes(32, byteorder='little')) + result[31] = ((x & 1) << 7) | result[31] + elif self._curve.id == _CurveID.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_montgomery_public(self): + if not self._curve.is_montgomery: + raise ValueError("Not a Montgomery key to export") + x = self.pointQ.x + field_size = self.pointQ.size_in_bytes() + result = bytearray(x.to_bytes(field_size, byteorder='little')) + return bytes(result) + + def _export_subjectPublicKeyInfo(self, compress): + if self._curve.is_edwards: + oid = self._curve.oid + public_key = self._export_eddsa_public() + params = None + elif self._curve.is_montgomery: + oid = self._curve.oid + public_key = self._export_montgomery_public() + 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 must be present") + + if self._seed is not None: + 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) + elif desc == "ssh-ed25519": + public_key = self._export_eddsa_public() + 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 output format: + + - ``'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 Ed25519 and Ed448: ``bytes`` in the format + defined in `RFC8032`_. + * For Curve25519 and Curve448: ``bytes`` in the format + defined in `RFC7748`_. + + passphrase (bytes or string): + (*Private keys only*) The passphrase to protect the + private key. + + use_pkcs8 (boolean): + (*Private keys only*) + If ``True`` (default and recommended), the `PKCS#8`_ representation + will be used. + It must be ``True`` for Ed25519, Ed448, Curve25519, and Curve448. + + If ``False`` and a passphrase is present, the obsolete PEM + encryption will be used. + + protection (string): + When a private key is exported with password-protection + and PKCS#8 (both ``DER`` and ``PEM`` formats), this parameter MUST be + present, + For all possible protection schemes, + refer to :ref:`the encryption parameters of PKCS#8`. + It is recommended to use ``'PBKDF2WithHMAC-SHA512AndAES128-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 Ed25519/Ed448/Curve25519/Curve448, + as compression is mandatory. + + prot_params (dict): + When a private key is exported with password-protection + and PKCS#8 (both ``DER`` and ``PEM`` formats), this dictionary + contains the parameters to use to derive the encryption key + from the passphrase. + For all possible values, + refer to :ref:`the encryption parameters of PKCS#8`. + The recommendation is to use ``{'iteration_count':21000}`` for PBKDF2, + and ``{'iteration_count':131072}`` for scrypt. + + .. warning:: + If you don't provide a passphrase, the private key will be + exported in the clear! + + .. 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 + .. _RFC7748: https://tools.ietf.org/html/rfc7748 + + 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 use_pkcs8 is False: + if self._curve.is_edwards: + raise ValueError("'pkcs8' must be True for EdDSA curves") + if self._curve.is_montgomery: + raise ValueError("'pkcs8' must be True for Curve25519") + if 'protection' in args: + raise ValueError("'protection' is only supported for PKCS#8") + + 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.is_edwards: + return self._export_eddsa_public() + elif self._curve.is_montgomery: + return self._export_montgomery_public() + 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].id == _CurveID.ED25519: + seed = randfunc(32) + new_key = EccKey(curve=curve_name, seed=seed) + elif _curves[curve_name].id == _CurveID.ED448: + seed = randfunc(57) + new_key = EccKey(curve=curve_name, seed=seed) + elif _curves[curve_name].id == _CurveID.CURVE25519: + seed = randfunc(32) + new_key = EccKey(curve=curve_name, seed=seed) + _curves[curve_name].validate(new_key.pointQ) + elif _curves[curve_name].id == _CurveID.CURVE448: + seed = randfunc(56) + new_key = EccKey(curve=curve_name, seed=seed) + _curves[curve_name].validate(new_key.pointQ) + 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). + It must be an integer in the range ``[1..order-1]``. + + seed (bytes): + Mandatory for a private key and curves Ed25519 (32 bytes), + Curve25519 (32 bytes), Curve448 (56 bytes) and Ed448 (57 bytes). + + point_x (integer): + The X coordinate (affine) of the ECC point. + Mandatory for a public key. + + point_y (integer): + The Y coordinate (affine) of the ECC point. + Mandatory for a public key, + except for Curve25519 and Curve448. + + 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 curve.id == _CurveID.CURVE25519: + + if point_x is not None: + kwargs["point"] = EccXPoint(point_x, curve_name) + new_key = EccKey(**kwargs) + curve.validate(new_key.pointQ) + + elif curve.id == _CurveID.CURVE448: + + if point_x is not None: + kwargs["point"] = EccXPoint(point_x, curve_name) + new_key = EccKey(**kwargs) + curve.validate(new_key.pointQ) + + else: + + if None not in (point_x, point_y): + 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 + } + xdh_oids = { + "1.3.101.110": ("Curve25519", _import_curve25519_public_key), # id-X25519 + "1.3.101.111": ("Curve448", _import_curve448_public_key), # id-X448 + } + + 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) + + elif oid in xdh_oids: + curve_name, import_xdh_public_key = xdh_oids[oid] + + # Parameters must be absent + if params: + raise ValueError("Unexpected ECC parameters for ECC OID %s" % oid) + + x = import_xdh_public_key(ec_point) + return construct(point_x=x, 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 + # } + + ec_private_key = DerSequence().decode(encoded, nr_elements=(2, 3, 4)) + if ec_private_key[0] != 1: + raise ValueError("Incorrect ECC private key version") + + scalar_bytes = DerOctetString().decode(ec_private_key[1]).payload + + next_element = 2 + + # Try to decode 'parameters' + if next_element < len(ec_private_key): + try: + parameters = DerObjectId(explicit=0).decode(ec_private_key[next_element]).value + if curve_oid is not None and parameters != curve_oid: + raise ValueError("Curve mismatch") + curve_oid = parameters + next_element += 1 + 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) + + modulus_bytes = curve.p.size_in_bytes() + if len(scalar_bytes) != modulus_bytes: + raise ValueError("Private key is too small") + + # Try to decode 'publicKey' + point_x = point_y = None + if next_element < len(ec_private_key): + try: + public_key_enc = DerBitString(explicit=1).decode(ec_private_key[next_element]).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 + next_element += 1 + except ValueError: + pass + + d = Integer.from_bytes(scalar_bytes) + 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 + } + xdh_oids = { + "1.3.101.110": "Curve25519", # id-X25519 + "1.3.101.111": "Curve448", # id-X448 + } + + 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) + elif algo_oid in xdh_oids: + curve_name = xdh_oids[algo_oid] + if params is not None: + raise ValueError("%s ECC private key must not have parameters" % + curve_name) + curve_oid = None + seed = DerOctetString().decode(private_key).payload + return construct(curve=xdh_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: + x and y (integer) + + 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_curve25519_public_key(encoded): + """Import a Curve25519 ECC public key, + encoded as raw bytes as described in RFC7748_. + + Args: + encoded (bytes): + The Curve25519 public key to import. It must be 32 bytes long. + + Returns: + x (integer) + + Raises: + ValueError: when the given key cannot be parsed. + + .. _RFC7748: https://datatracker.ietf.org/doc/html/rfc7748 + """ + + if len(encoded) != 32: + raise ValueError("Incorrect Curve25519 key length") + + x = bytearray(encoded) + # RFC 7741, Section 5 + x[31] &= 0x7F + point_x = Integer.from_bytes(x, byteorder='little') + + return point_x + + +def _import_curve448_public_key(encoded): + """Import a Curve448 ECC public key, + encoded as raw bytes as described in RFC7748_. + + Args: + encoded (bytes): + The Curve448 public key to import. It must be 56 bytes long. + + Returns: + x (integer) + + Raises: + ValueError: when the given key cannot be parsed. + + .. _RFC7748: https://datatracker.ietf.org/doc/html/rfc7748 + """ + + if len(encoded) != 56: + raise ValueError("Incorrect Curve448 key length") + + point_x = Integer.from_bytes(encoded, byteorder='little') + + return point_x + + +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: + x and y (integer) + + 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 = _curves['curve448'].p + d = p - 39081 + + 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`. + + .. note:: + + To import X25519/X448 private and public keys, when encoded as raw ``bytes``, use: + + * :func:`Cryptodome.Protocol.DH.import_x25519_public_key` + * :func:`Cryptodome.Protocol.DH.import_x25519_private_key` + * :func:`Cryptodome.Protocol.DH.import_x448_public_key` + * :func:`Cryptodome.Protocol.DH.import_x448_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 (0x02, 0x03, 0x04): + 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/venv/Lib/site-packages/Cryptodome/PublicKey/ECC.pyi b/venv/Lib/site-packages/Cryptodome/PublicKey/ECC.pyi new file mode 100644 index 0000000..3d64727 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/PublicKey/ECC.pyi @@ -0,0 +1,80 @@ +from __future__ import annotations + +from typing import Union, Callable, Optional, Tuple, Dict, NamedTuple, Any, overload, Literal +from typing_extensions import TypedDict, Unpack, NotRequired + +from Cryptodome.Math.Numbers import Integer +from Cryptodome.IO._PBES import ProtParams + +from ._point import EccPoint as EccPoint +from ._point import EccXPoint as EccXPoint + +RNG = Callable[[int], bytes] + + +class UnsupportedEccFeature(ValueError): + ... + +class ExportParams(TypedDict): + passphrase: NotRequired[Union[bytes, str]] + use_pkcs8: NotRequired[bool] + protection: NotRequired[str] + compress: NotRequired[bool] + prot_params: NotRequired[ProtParams] + + +class EccKey(object): + curve: str + def __init__(self, *, curve: str = ..., d: int = ..., point: EccPoint = ...) -> None: ... + 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: ... + + @overload + def export_key(self, + *, + format: Literal['PEM', 'OpenSSH'], + **kwargs: Unpack[ExportParams]) -> str: ... + + @overload + def export_key(self, + *, + format: Literal['DER', 'SEC1', 'raw'], + **kwargs: Unpack[ExportParams]) -> bytes: ... + + +_Curve = NamedTuple("_Curve", [('p', Integer), + ('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 _import_rfc5915_der(encoded: bytes, + passphrase: Optional[str] = None, + curve_oid: Optional[str] = None) -> EccKey: ... + +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/venv/Lib/site-packages/Cryptodome/PublicKey/ElGamal.py b/venv/Lib/site-packages/Cryptodome/PublicKey/ElGamal.py new file mode 100644 index 0000000..95c219e --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/PublicKey/ElGamal.pyi b/venv/Lib/site-packages/Cryptodome/PublicKey/ElGamal.pyi new file mode 100644 index 0000000..9048531 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/PublicKey/RSA.py b/venv/Lib/site-packages/Cryptodome/PublicKey/RSA.py new file mode 100644 index 0000000..476785e --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/PublicKey/RSA.py @@ -0,0 +1,871 @@ +# -*- 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.Util.number import bytes_to_long + +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 RSA key, private or public. + 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 + """ + + 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_to_bytes(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 + # then encode into a big endian byte string + result = Integer._mult_modulo_bytes( + r.inverse(self._n), + mp, + self._n) + return result + + def _decrypt(self, ciphertext): + """Legacy private method""" + + return bytes_to_long(self._decrypt_to_bytes(ciphertext)) + + def has_private(self): + """Whether this is an RSA private key""" + + 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, prot_params=None): + """Export this RSA key. + + Keyword Args: + format (string): + The desired output format: + + - ``'PEM'``. (default) Text output, according to `RFC1421`_/`RFC1423`_. + - ``'DER'``. Binary output. + - ``'OpenSSH'``. Text output, according to the OpenSSH specification. + Only suitable for public keys (not private keys). + + Note that PEM contains a DER structure. + + passphrase (bytes or string): + (*Private keys only*) The passphrase to protect the + private key. + + pkcs (integer): + (*Private keys only*) The standard to use for + serializing the key: PKCS#1 or PKCS#8. + + With ``pkcs=1`` (*default*), the private key is encoded with a + simple `PKCS#1`_ structure (``RSAPrivateKey``). The key cannot be + securely encrypted. + + With ``pkcs=8``, the private key is encoded with a `PKCS#8`_ structure + (``PrivateKeyInfo``). PKCS#8 offers the best ways to securely + encrypt the key. + + .. note:: + This parameter is ignored for a public key. + For DER and PEM, the output is always an + ASN.1 DER ``SubjectPublicKeyInfo`` structure. + + protection (string): + (*For private keys only*) + The encryption scheme to use for protecting the private key + using the passphrase. + + You can only specify a value if ``pkcs=8``. + For all possible protection schemes, + refer to :ref:`the encryption parameters of PKCS#8`. + The recommended value is + ``'PBKDF2WithHMAC-SHA512AndAES256-CBC'``. + + If ``None`` (default), the behavior depends on :attr:`format`: + + - if ``format='PEM'``, the obsolete PEM encryption scheme is used. + It is based on MD5 for key derivation, and 3DES for encryption. + + - if ``format='DER'``, the ``'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC'`` + scheme is used. + + prot_params (dict): + (*For private keys only*) + + The parameters to use to derive the encryption key + from the passphrase. ``'protection'`` must be also specified. + For all possible values, + refer to :ref:`the encryption parameters of PKCS#8`. + The recommendation is to use ``{'iteration_count':21000}`` for PBKDF2, + and ``{'iteration_count':131072}`` for scrypt. + + randfunc (callable): + A function that provides random bytes. Only used for PEM encoding. + The default is :func:`Cryptodome.Random.get_random_bytes`. + + Returns: + bytes: 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: + if prot_params: + raise ValueError("'protection' parameter must be set") + protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC' + binary_key = PKCS8.wrap(binary_key, oid, + passphrase, protection, + prot_params=prot_params, + key_params=DerNull()) + passphrase = None + else: + 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 + def exportKey(self, *args, **kwargs): + """:meta private:""" + return self.export_key(*args, **kwargs) + + def publickey(self): + """:meta private:""" + return self.public_key() + + # Methods defined in PyCryptodome that we don't support anymore + def sign(self, M, K): + """:meta private:""" + raise NotImplementedError("Use module Cryptodome.Signature.pkcs1_15 instead") + + def verify(self, M, signature): + """:meta private:""" + raise NotImplementedError("Use module Cryptodome.Signature.pkcs1_15 instead") + + def encrypt(self, plaintext, K): + """:meta private:""" + raise NotImplementedError("Use module Cryptodome.Cipher.PKCS1_OAEP instead") + + def decrypt(self, ciphertext): + """:meta private:""" + raise NotImplementedError("Use module Cryptodome.Cipher.PKCS1_OAEP instead") + + def blind(self, M, B): + """:meta private:""" + raise NotImplementedError + + def unblind(self, M, B): + """:meta private:""" + raise NotImplementedError + + def size(self): + """:meta private:""" + raise NotImplementedError + + +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. + Keyword Args: + 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. + + Keyword Args: + 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): + + oids = (oid, "1.2.840.113549.1.1.10") + + algoid, encoded_key, params = _expand_subject_public_key_info(encoded) + if algoid not in oids 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 + + oids = (oid, "1.2.840.113549.1.1.10") + + k = PKCS8.unwrap(encoded, passphrase) + if k[0] not in oids: + 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. +#: +#: .. note: +#: An RSA key meant for PSS padding has a dedicated Object ID ``1.2.840.113549.1.1.10`` +#: +#: .. _`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/venv/Lib/site-packages/Cryptodome/PublicKey/RSA.pyi b/venv/Lib/site-packages/Cryptodome/PublicKey/RSA.pyi new file mode 100644 index 0000000..85f6c4a --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/PublicKey/RSA.pyi @@ -0,0 +1,78 @@ +from typing import Callable, Union, Tuple, Optional, overload, Literal + +from Cryptodome.Math.Numbers import Integer +from Cryptodome.IO._PBES import ProtParams + +__all__ = ['generate', 'construct', 'import_key', + 'RsaKey', 'oid'] + +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: ... + + @overload + def export_key(self, + format: Optional[str]="PEM", + passphrase: Optional[str]=None, + pkcs: Optional[int]=1, + protection: Optional[str]=None, + randfunc: Optional[RNG]=None + ) -> bytes: ... + @overload + def export_key(self, *, + format: Optional[str]="PEM", + passphrase: str, + pkcs: Literal[8], + protection: str, + randfunc: Optional[RNG]=None, + prot_params: ProtParams, + ) -> bytes: ... + + # Backward compatibility + exportKey = export_key + publickey = public_key + +Int = Union[int, Integer] + +def generate(bits: int, randfunc: Optional[RNG]=None, e: Optional[int]=65537) -> RsaKey: ... +def construct(rsa_components: Union[Tuple[Int, Int], # n, e + Tuple[Int, Int, Int], # n, e, d + Tuple[Int, Int, Int, Int, Int], # n, e, d, p, q + Tuple[Int, Int, Int, Int, Int, Int]], # n, e, d, p, q, crt_q + 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/venv/Lib/site-packages/Cryptodome/PublicKey/__init__.py b/venv/Lib/site-packages/Cryptodome/PublicKey/__init__.py new file mode 100644 index 0000000..99b67a4 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/PublicKey/__init__.pyi b/venv/Lib/site-packages/Cryptodome/PublicKey/__init__.pyi new file mode 100644 index 0000000..e69de29 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/DSA.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/DSA.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f190b27ca25e6b904a2478aac30d2fa4b833837e GIT binary patch literal 26603 zcmbt-c~o3idgpt!Z&XoKu}X*sT3CdT00~K0mW@ENkSrt_$qQ{a6ubfzf&yL@LXe_O zJDsFtdt!*42&Fw^)bTk+V<)CFooV+;CUKw4(lg1-RH4j~4b6ju!P4v2V7K;?a_x z5|*})l#Z75l#Oob*)qDdXDfT>7%3m!*0XK2qNie1=n;6%z&*i<&hK!dD_HriQ65iE zm6-P(u4lVgEV{qL_v{c$L=S#@c)1Oh>UA5-4 zsej;-gm_F6)7I!%|8z7MNt>f%D2n{ipwue`!b8DYK5cm_5EjQqYYl1hxzp|4htkG# z$IsCF?vrgz2U<{-JNhgxs!HLOWcp#W|;Gr`d4Gsk*_Ce0mDW+Zca4Zz< zj!L2M5UR2&xoVARANmpP9hb)X1N|dGBtoMYQ~TL7=gxL_UO1k1pL^=;v9@DRKG%Eh zsm?RUQKF(Zcy%0I?2SyaKJ<=H_K$=HXtced@ZcCS3`jvt%~xg+P(xG-3`D;w$AAKX z?8l%y+s*in2yz5|Jw|}00ibCTjaVwPXhLie&4{g{1+h)EBDRY*#17Gp*eN;? zy9hLT@~bD z7!VsAtg+V6m4GCSx3Vsbj){{alM(p?-bbg$gY+#VgHdLQiB{pPBnBm6Y*2_^3JO^M zA!%%KJi9D%1_(M}run*eU>;fvl&4)AfQ3$!Z0+%xQi)%@3vd@iae?=C2N@physD#~)Fa`%R2W zMiI*)#t$nLM}0%T?_Kez18MWsu@zw1`om#)NvBkJv z^hplWT&=n5mPy)%N2!7$fuc%8GdsG+MuQAE2gX20!&s(>5RihxXebgPBzjcX8M(zv zRg`(l#qj0u*i?9Pe#%p8O&cS@XxfAYjihZTJ=sssj;8}7lfmPXG$tVf=&wl(fs~qv zf)S;T1V;wbHazsQ_x4bDd=jLJN-Cs|(so9}=yik^jL=y4vh{fD^MO$BmFKSn!&jbv zGSvTk1hjq6cwpdiU?>=QzFnFgkB))52lvYGeL6V37o?zJd^&CG1^Em`dwXX*@;=g_ zz8FINk>5fz$F2K|7j19l-N^f{C*`k++t&+A5~U5P!o6|Fnx}NtQ^`d;@+(YxPBRvt=~AEwf+RQeGr{m5N^$zsXtU2)StvEN6}xPeTVrwL)W z@ixPa7&ok82j!K6iV+cKR4c1v!b{*bVuk_3Rl{Xqom7fCh^TG~^es}H0kax3zr^!g z?)RdpgL}<5U>M>C3@>QqOqJ7DteJkEnQFGk6R^Xc-NfuPat#@6Xd49feKJdzui;YRw);PbGSF-rz za$|C9{qocY-dn$v+}fJVd*p+Or0elGzwRk`qj}N0*tTd%c`6dNiZ3>NT+vBBLWKRt zuA=rlQx+Yd*NhIxdt}V;JaA&xIBODl;Gj7J2hG4iWZoQN<}4gEGaLl|&Dv(|z%pR5 zLLbaAE29(nVZijX5#LOkzeSAGM*5~xo0v((y_|clRsA~a0G7$vW>xUdf&G-QPkwgk zlm?jTjM-Ft&3JE#x%Bs}tc~hYYRHS_#f+D0I8MV#GqBRs1x#XlB<+kkCP_50C-6bkmA~-L&W+I4OdpNMlaBpAa->|RwN&xCRb}mi4eR#R?dxw?h zJ@{RB`R3bRIkoEAmUL}foJhGU0ibTreC4&^{KU0y#0^;w>v{R}-uYvT{3|cK*}ddl zI=0Mz_l0C$-SYWlUc*Xd($$R8p8WZ?YggiVUu<|7#D3wT79>XD$W75ldi;K@ssUz}OLmjuA0sGzUBjtrvcXBt@t_flaJ*7|EFe zWl}Rp;A@nR2>Bd$&%)*VWXw-6)RXq(eO9OOEO*+3#C2|(uQha?xW!3N;W4ANv=fxQ z7Y9b-MYL8k-n~KjXu`V02OnM_L`3 z@E;Ju!6~72fX;HQeeyElti?{hTE?uUpx!s*@BZV6ev?1V@fbmjdjT8QEFa^q8FCUk zo`~I`;kWqfJkPyaY~rT5-!)G0xA-pUJig%UZD`mhwIL}(5Y3Mu%rO}H(td zqcb}cNK&{}z+c0Wk+FfmNaSdPmg^=8M+m%s_P5;6=D6F!`IU*K%B2hMJa_ZC<%yfm ze^l9&6wZGUp`rZpmTkPW1BqILv>QL{e2X;OTD?j$I=3Dn^y!mfTjQD0iy7|&9s6zM zjBH1QE`09h$}3aC`NWZP9|`AEThAwKrR$!;L{W9hQRYyqY|S%*fQ9fna7A; zr7co0GC2}u`vO~Nf_jz2Kd?A%zm2z%> zJGy*)wf@m${iCV+$5Pdg-*!F@5`M>97`LqXORk?;IJ3bS?8o?c$6Dc*4UR85#=l*> z?0>)XR_RK|2Rl-gkF8hMEEm3CcB^dV!Uy|Pm5<}dQPsv@J8{oQ<%j|n#q%D70$OPX z1-pm47m~HZM`!-ZMF25-=`vU9-rg>##XcD-jc9wd9a@vDm{yw z)K4&IyuzTB5!K2-7H&8b36Y;dj8QKYwQy|O%8pIE#?bI!XbdywEEB^K`N}#RszfD?=mQfaV5%OYH0`zOw9zJ# zHEkBTc@4bf$A3xL2#T=Zy1Aw{{u58zvi}X^e8=_9h0aBB;q1rxJ8pa061KK4@WW8% zS1PKrc?aUn7&yKRI3V#kD1J`n7R2J4gvK$*G6|uj!x?*5PV%D8?l7&^rl1lx5FdV6 z6AS5?h+Q7!GsQyKW7_nCYz(ACJsL*%SG#i8q6?x>x)0=s8>R!%rl9sk^5(8Z)Q;&8 z-zjc+?NIF-_1VnuqB)xGCu9K4_#dgGgGs7@*9U$7^`ki>t-W$>Qcz@qu~MT7Kbm z*Me*DnPt<`RI5?^O7-LU-}KybqON-`&XvFF+>&%|`N&zm=JLMw zZ~hm%!@|ETE$@edDu*!}OG{qeIu3I1tsqVi(Wb1`AN z_#lNgq1y~4L?o_5bovh?Cf(e2E=qNb+!8EK^j!*ZzHdB(dxM|UE`g@alcjP~kvU(tN@ z`t-u|l7HdFl&?DBs{Yx!rx;ruz7+^d{#3!PglpG5Bc8vE5I68raT)j9g?o)%14J~` zK(w08)~{mB*w2jLc4o|%hB`oW^IU#ZBgMJ+ky&#L8xA8b-xG}>=@x~gLmo400pex0 ztF#}p5F46{gs5l@;$CUua0<7O$_4T*Yevl^WwsbN$fqnSxk7#y^4pQ$JjBQB#6ZkC zM9VOZbW?~qP?uBb?g{3Z)xzS<+mcD?BH zKXU$1LxWnk{+oL)hAgw*jJ5NsJ$dNdc*FvXtQm8jISQXz_9Z^rsJ5%mQr4>E=$~3T zmZ$RlvmVhun~zy5WO!VS+HeFl?v-ACm6Sqzz;#Njx$x6Eao5{j!u@cijX+8 zHfbp9;0%c|4%|WwR4m|XYqQVP#0EkJF(%S+oMg*5kO*UwQK(v4^(v{_JwjbIG~m^B zLJjn&0i0KA8-%v*_RdZr5D~^9cIkWSM0?}@rpCVBy=uC-uUA&BQVkTSmX703Ro68L z$3o$NG>s~{8XC1eJed0|Hu>)ElT<=(4XUU;;Lp)uM!Wl)4m{A7Ae;@4OhZ8$ijq>D z4Nn)WN9vi-oW`6XA8m@ZYda&t7@9*jX-=u6pcIXcp@p$1 z^vD^ro3UVM=kh@0kWkZ)b7L?N-n2wH+vpq=`uZ+Nlfk||eLd<~{eT7%ez8>ziVk_+ z<#;L-y(ILJIm7ltSQ&xUasmPgR8ud6p!(LzL08La8<>nl$40Yikyqr&y~@f6P<%&m zh6qa8W0Hp)8Vi5b+_BX`Gmu#H0~Vr`mGv-?Iem56AfW&(3C$>fWZ+T|YD!Eov?KKM zH8U;Hm|N*Y-rC1zy-$b+E(asR6;eiOb4oLbxxhcd2YJG><{&UKG$vs-N7beYj-Ztf zT_HrGLXjZMFQQBpqX_x%C94j~rGlP@#+l1?0(AyxdT``|Mtvj{iIUb|Ya1XO3F0sY z>w(rjU8mX5dA5O>tn@uNbqeaz$m-4=JKb@j=^2dTOGP zr~Ozv=02;(56m5^>Fd(~hz2y)9{~`fx1bdSgPRsAB-=Qsqa>9Uz>oo6KhR7B4hd&E z4lrCLKxR|QK%<^b&K$rygguwbq~!b{K3`!va)8V-niW9^(ZJ zA`>F}`p^&v=%b8o0o_Qs)+Yncqsq{!N>b7VMn=Y_HsM?d3zkVpkaZmL9;nl^8YV3o zS(XSj5D<?JrGGXY9lX5C$XX@l#kkFL)9AOlk3UFs|a)i)L z#Y)0Nh-S`RJoaQ~d)f$WoG}Tfk3ToltXc>WwkQ~1y)#nXAhgQ{4)Q!Rf}n1Ou;3#J zn&d*1&fiR=m}D_+i;l@OOPZow7LX;f0X31WPue&V45w|xTto&!p|qpFDbP#XOv`@B zOBD+g(fLg_ej)*qL;_-o&T(mrOw}Yh_@+%$64^40g+!^AaxnER9WvRZ*7{_DzC|8c z+RS(hC|xuL5@~Gh`D$@PvbZ6B@{ZFx|J-fowzUJDpZHF#@QT1T zu<+!nzc%Tw{n)=d;X4)YK(t{p<&{IowX5zEU)>VF(6Q+K%_kDRI{H|*R#G(|TN0DS zb@7vHC0pLI-LS1aarTp~=RPcW^Xa#~apN1y{`Vp)P47;n$`5`}l`21Sd+WLTMnmbg zcqh~o{))FtRx9@>EBCKF2X)4W#t#b;l^sc6N5a+dxs59*UliXOyfL^WzB71pa9MnR z@YZ0W{6Nav0u71Nqs!bp{`l-#$<}%Eryl>O#g%K7$LCM2Z>xc>r07;rYTLfmZ3mOv z4yLvpo_DU7SH0D9qi0Rn4O^|cHKA_h%35vX=T_6Us(Hsx9h`sLT1C^s$vYJ_^C#EJ zD;FGhe5H#Qf8(*6GwWqL5<5?&%1$Tzr`JkK7x%x_a-(Hw|2r)=TbB2~-*T&EW&aOb zzTfh}{y%B?QA?uu*t}`I99>A2H>{Q)NTS>22j?AYTWS_;f93J77YT{VGpVAkM1I%Z z(nEjbTNmo&T2eyO%8C0%zU&B=t++y7s*5i_w&p8OxXRbCZg^NPD!o3uFpTampIo^D z4H8S;Hyew$#h<{;`L`?{O!>AaT-(>(uy^Z9oPQ=+`b^6GY{K^J7aJg<{?q&y8~L1n z_ZJ%$uKYY7AuPMKo)j(OggVq@t62phOU|2 zWPHo)WP?Hm2h$BME&xs_*wE44jh!|Ug^BGgKJDuoi*^#@EZdjL${eGNrTm#Re>y^~ z0wrWLFfr}8Q=$3va1r$VJ`qgNcXwr?>TJq=E@3+-OI82DBam*PCh4Cef}(`Z|I&Mi z(spWzbw9g17RACtRr|@0&(cQsJ{2Z$XVx_0i#(0gV@xArIlLqbVKbXf+s8+6UW=0D z~Ie9&Gc&xfs2?gVIq7Jj}?DEey0KxiDwPwGXMxYsJ;;6x@7 zs&$L<{7o7>X@-8m!QaZ9cm7!Rpv}y>e!TLF}o?6 zM>SBI;m5-k_5p(rfb&cc`!{ohXrPCotR`yBY}@KWsNE_}qK&kpw^zn4=u4o@oPc$_ zqCK(p_QFsb8j%37zKQ;Kx zwvBo&zjp5AhRI>xzER>a3ma8-bJ0eT5h(|6F5Iy2X8(r8X0F}v+wj59n|EzkjOMKy z4y*YXzfs^cKh1BHnatJLq#kSM*XsA(H~tcDevZEvgGJz$xz4rxvboL;8*e_(Q)O~o zMahilK0V6)HKB7^rt1*V%S-#~X2Mz0NsC6&^rkVV;#?CFlK6Qplih{UUbYZXSJLEC zEQl5|dn0pO7|)>#qLmEDkp?QuX_%+0Z%wj+9Wz=t>xSr}?Og&)1Sk_=8Y`EZ0ib3Y z<;E<~|0x6_N=zIJOeoz4)dU3kS}iuc?p*4HD0(c1T>3~D^eMd=rX$0qpbFX5JTa@% zTa&uafN6feinBj>}%{$j?=F(c%RnubY(v?-`P%xv*tvj(M22b4xG7(2Vrvphv5 zgx=5QJ$%g|T31#Db(FF?@}gVR?qrT%&4>EkO8w9}&$?l%>82rI_S^~_0>TJ-QDXs9 zB~c!elE+MQtFJ9esnDyGQekn{qxT%5`>ffA3LyWXE6b5WKwjBce#{~|s6T{%vtB%V zmG*&Avjwq&udhk+XFyy*PJBUo5+5exR|QgLa3Yy?%=52qj}^%6#Vmxqv%YA#I={no zK-m;T&6E~44>&H(`d_q(Of{#gOY}ShAsO@JS6Aulpla5xm-+>8S)&OLgG#k8Sjp|` zAhD9ZSb?U_DU210R-!eqqL|{jFb^wEw{LwJ~w@RiP{57^9nwuDZ6c84OE7=p$7j03g*j03y$83)2Qv!yc(0dq){8Q95) zfP?7}WbtGI@fmV)QVSKPE#kAsDI%)LY!ZfGPFP!zHsbUvA3VuB^AKAzx0$W}@EJCwMLX^#9Q zW=S#0UGyzACv7#Ww)&*4e))XLws)>=&1##QW+#=F54_3J)|C5^gzb^LdA`-Wiez5J zQe`r4``n2&yCeSewX*rZwQY+hlD4X)^GVw-6vpfG*9zw==LZ++lJ@esW1m|%d;UEC ziUS|vE)ZC(TnH|><~r9M<%@x(l9Z$Fz3^?vkxxCvi-uQXaTBbjWsB)Iue>#LV`h0r zs$%bIMN6`xB~@`KwNV-pa>^@1JMZ4oX`?<5H z;S<-sW&YKnRkx6I3rpUQ-8cd6i}Q%qU7jEGe8~Tc7e2{v$7$a?-?-q1By3`-<;G01 zv@Ye{eLKH>&0E0US1w97sv#3APkO7D+g2)92ESj2GiEaXD9)vMkMkI~h0F8Lw=LQi z&ZJyb%u4*VZ(aKqd>ob1!-%DMZ! zZ{2o23LEM*n;YvHSlD^Z6Sw@df^&NA?cf|vw$6>$Tyt&f-m>cz3l&S=ly^HUddy_s z*s&5`-z7LAt6l7E#5L z0BoRUeD*wQBp;F447M+(*-Au-d1ZmNL)frbbfT~Ob7be5@yj`5@Kt9lr-`;r*u{WI zYv0T;!Ykvrt9--^(@ZnGF`n1I>NY6&g3Vne_9&B4hqN_HM3M#F#0_==B#mGJtgptH zGG7)p&RHwGJ|DtB!otS%(C_38#xeFbKcffmCX2zGJex(wJNuwPG+*JR%)A!)eRf{B zJ-|mt@vwod$7QTCyzTTcYTG*Vw#)fm_khW1WdrAI+U{fgdv=XUk{J%RQf!@g%8_XY zgf(#LYcT5qD~9#Ly1>2rO*7cTVtKYvuf_^O4(|-40a}}OS4HG2j0Zxh8krPvnyM2b zW74ffgf?dM7rH96H8k#RYiMHXxMQ#&z~0<(oLi8(_(cN(ST4ZWURziCsZYy#!4 zRsFPSgo>NDP&b~T)rR(S6iRmT@N3-Hw7*_x+PD7@)ziH1V3Ve=Qsw(O^@Fk+PY6$r z_QNbfAA_bce1tTBfq{YGI63j6hv6Y;QI(MhU2Ljox@azB#UkZmf@kW#tQ!SjNdR&<#7OcfIpzZTZ@r?NDu4{A~C>Il^8>S!jx%wgbB zFl*3KBHbSvVo=HS(-`7Nlxfg0^p^cf&q$f5qfV=;)C*r3foLYu5Qg1B!_e53y_BFg zdnxnYuFmcY4U}qN7}qc^4$3G;tgNg+Dp%RwoU1nT*qKm-`2qp54|4iH(tAqJJn|%CyrIJy6vkQ26I4~b zz#4*gJ53XT0BjDRgNNc-o0#UA;!apfNfK1|Y?Tx|!l4bCGARxJOb2k0xA?-Ywj@Brcy!6&}$2Z|~Ubueqf!mumk+b!MpMe&oUk>+ozhj9`GTDwsB_@Y`)}@AIrNe3 z2*%ISXG|LyjKiu2*Aojhp&TL}XJCO<8@`~?Qdz#+eYjmXVSf6p}^CT#7&`#;R0Oig*s0X<=+d zgdQ1}QHvDZUyT6twD*BklZgLF8_~A(-;vU9>yZ_Cv~5Wg(XA$tE=2G|ZsPL&Z?q>$ z8h_CIgQ*XVspgK9|9HxC0^6V?e;y*Yvbpv<`Gs?xX=}+{fAzBQee*4I%HQw<7@Itz z@gctV3vU(TZk`_;P8J?X+K$M)NaXtD!sOxv+=SZSIeznavZ!_$Ov&D)ZLiFfbYH)? zaB(rP&~v-6ajE&812+#Wx4(b<*72K1leR{cLGis+c%yL1_>TFec`5SFHi{kC3dLD5E66Tr{K)VDCcC#-I=gKC|&r< zo>j-Tq+{FS)Joe=b|f6zQjW88?Q2#rx8J@p?|tc)SpMB9cYVTEzgD^L6G!8sKi(XV zzH&I>Xq;3%BeYj8{ z0v8<}3{`Ms<6{@%KiatvCgtP7+ZYEEW~Ic*Mk3plus z2Ex-Uiw?E5c8L&5x=s-TGU838|Ai=R#wIce+dmR|$kvSnn{cB2-;_m%Hw($s;1BCm zKvA|M4373Irlj&=QJ_MV6fttoK+}mw2AOgst7o>V@R@5M5@fjCZUWLc%Fc0jt51A5 zm8w3QG(qtaKfPGCX3cxU_tGqb#Fmu%V8V6~fV@!0UMRx1X46o12JNLefq*GR?Qe>*v~a zSbhj8Y(h74!|!b7g+)e@1m!fp2{Vy)>VbWS zdk4T{NH$E_VVW|k4O8ZBSf0Yn%ssL0tX{UR_*br^oWRJV4~{}p1JLgI^AYr1&Z?Qh zaYn=q1arEI-~nQ;DFuL)8V+h$L{PISU}Io9dle&co#R0CH9@v6xc{13*>s;q74DdwvgAY~j}gofVbS*z!li`m=(;WMHPb=@iJz|OyN zM3(w2RVExe9*(sdyc2QBw0YF`7u^y{hhNZTuqLp8fIMQ>WXC1NfCZ>Nbc`m8fNsvj z>Cl|HFTn}kh6Y)H6TFeUPu{B<6#5e@1E;yyEtcIqOc|9IG8XU{2BDy z`DNse@BP%3Pj2|$FC&EO|I~iK@CWub-uz>ZN1SCVN4q`2{{5ezLtjCmv4&YL`r3sA z?B)*z*HMQSM2(-2_Ul|mE}JH(H9kjXxmDUXYsS4N7Tv{O=UYU}b5GV~M>2_lwhX$Dh)Q6Xrc@?hb#*fBf^rEJW(b+~ z2+uZvX%UENfy!@y?tHG1-BB1RL;vW)bcee0sQLT)a&e0At9*E2#dA!k+2jN+yTFp` zx$FX7t11zHfq}}xs2n3zJ>GgDWKu*{r)5?h{l-B1`i{$^z314mUg@?=&H>iWRAv=A@wbVTg07AkyY*(a*WJ*!Z3tsCd zlb%jp3JqLhSrqGjI#?6Hq9C>&sOxoYuplUtOL;~EBvlh|_0I^j%t8>(%XATdJXn31 zFc-=@nt+iY)c*6aG<+)DuraX(1#St@(HCv zGOzp4hO&G?yO`{64+ZJhK#cFxHX+EoF$q3LOhEc00Z2k+CC(SURrxB1zC7`=ldfgx#$3jQoq*0OeNW_q_i0(-=o>*BK?S$Ey7+WAi1&ARt4uC%819R1LdsydytRm6Sq!TC#{I(=)U9DeC;b?*de-w^};RJUs!lyY5#KRO4CZ)a(Sxo;0JuNur+>S&Er-U(jNQy|xuatrrtoC^kk*B)7{yY1YucI4zI z1)VDsZya3p?M(W1E?vTfn3q5HH6;o<c%X4#NH zHmRjEgY3@AK#~~5v_mf=JGtiRFK~+k^E_p+oc3gVI2njsl89kW`!n9MHUp7xqeQwk z`N&v6DPnFUnBH;e;*9KP0?|tiUCdx8!eBjX0PHKavQZc*oMoFREe8Ebib;d=MUZMGH`jtb9R_^TFbs|WPSht;*CJ- literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/ECC.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/ECC.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fb3508c6a64a53dec302ac8071ac34e6bf5d5b3 GIT binary patch literal 52425 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 s7+B=q3)~8Prsg8%>k literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/ElGamal.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/ElGamal.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3fefca06d08f286a04db02db8f7c8519ac474039 GIT binary patch literal 10818 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 Quh~djuK9l${HBNeKU1gKxBvhE literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/RSA.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/RSA.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ec48e7cfeb51a0e22238798b131b5b861f97830 GIT binary patch literal 33294 zcmdUYc~o52nPaFG7?AvTWCS@qS%2FuRw*M3SJdjDn(2@ zo|D4%j8L46N}ZfBO47&Z*fWt&ayrU%rlX{LCh5~>da6`P3s;kg`m{4Wo|!)s;Xdj1 zneF%8x74emke4${&$V@V@4mZ!_q*Ty?)QE7t3Pu(Z90TM?;r7RoYv|7nqHJ(k{_1; zD;}=tMs$Mi+uRwQzzO;>?hMEN>d)x$*Dz)nH=Z$a^vyVC8aJOYk6X@I#;s?pEX_1l zFm5|z8@Hdavv>2DW88Vh$(}7^h2yR>F7|94D;js7agP_DDIPC5Q^L{;#!AP_&XkRp zpD7=&I8(vt^t!`3!S01$W03lIrc$U79ItX`s)RLy6Mw6P!dG=?)(S4fH9`^M zb%Go5dZ8FGFO(pz6-p7;36(+_N^J0LII~eGKeOqw-c#ied&UsU?3D0 zr-s65n}2*FD24~l`!1)=Cqv$+@z)Ua3m;N9`aB#Gy#XOO?lGh-;o#ZJVP7b1JR1~+ zv?&}!9Ugt!-sKbfeUnqZz>qI(!AsxN*ceJWS?+;wa9}JL7(s%iClL0H_(arIf_lOO z6JqeJ_w1Mt5B_mqx`Y_B@Gw`S(EP7FNl`4j$Ignz#{IdKEM@Zw-0a0{>BxekQ9^f|mOoHK6 z-8*u&GiJOSHSZR@n>6oMyqh)e1$eh;-feidYToU5FVMU@@D5~A+jHXGu6ZxSyF>Ht z0{ZCA6fyL1GxRBD=u^Vbr<9>j8AG3PhCUTQ9^IKWLOEg}A!48);%cE1@miq@aZQ1) zKqu4-Yk_9#gc_u*7uF%>h4qMQ1s-voP>XnjP=|P%o_^vf^XO#@CQbCZ-779-^pW2xA4G?3z$tlDDu)wx7c`ut{@)>hIu~_*&7J^ zDTm+}fe&Msr3|M-KE7jkDlpVBsNmJ$79~Yp0E1MooGr5y23fs6uh3#+jdh?4A|L2r zy&4Y+Q)5#h=>yWkmnVGm%`aiMwuDbAA@!RF-Ub7{KsdW3^5iKg$R*{$=P!y(d5TVS z@Q3_jD9jH7#WA|zFdshWTfOVZpQo0|4!++9FbSWw8WhM=jX!V!^&dRv5BM-2qHo;m z4+uVy9}0r*5HR@0j&X1JT*u(V7r)fpI?cZr#^U@EV9ZbRlY^dYSV^_zZwBpunr0?f zHZzf@nf#-f0#Ll;KHeMR2M4J$gM--}L=Iz^SQ*s6msiSJEREoo?C~)klp{!?6AWC)&fx?xzzBO0HKpw2hp( zL20{7_fnZo_aYYPv}xKLE>QACb%HT!ir_VBR(32-_eO|vD>eU$TnZick=PCTaG;XI^58PR8GV)8Lfg!0jm&(X%zW7;@)@)T%_Z+O^0 z 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72b6d83d701e2cffa91a377d6039f5c76795d5d6 GIT binary patch literal 2696 zcmcguO>7fK6rTO_+FmCCCv`%ActdE20~lILX$cL4B%&55kOo?aB3X`i;%>0lW_A-2 zWFw3AkTg}P#DQ=NQV&o#M5@XYShPfC&%*TXb zfk6uUH5#@l9L%D^!)%`xe6|(pz$cheA0|Wi!UWdB*mS}opcy!ViRpsxqpC4v5LJs< zY9~j>ao7kbrU;^eiD)#;l%k+79v%*!)$d^UIx;GaO^im>@NqmH(8l7jZjgzvF+s53>6Bpv44Gh9YdTl}01{CwUsR1R z4_Z>H(J7w{^vNAy2&(w;uzKpozOiWyFwF49CU)>Km$IJP=J{>1=9$KjY=pa zOkpw~uO03` zI1*BWlOvN@n;bczj*jT6fp;fD;q##g)<=5Dbi#-$@fhAyx#c~Aq#j zQ`zPh25*XsXDm?{i0Yc>Qu(^JY+c(z->r=|kLBuir9WMEdglCjr#I{LE?5RRXGh-Y z&pQ3--Y24S=7X=MzwfzndCAi}D;0R&v2EE^KNrZmwq#vf=1(uQ-uU8?>)oa1mYL%P zJ90H#?VjzP-?t!Tq@5Xl=ktQdIJSXw{=$tN-yC1lX<8oEwjAw354*%(o(oqK0KHJU zUi}fK>j2xdXTA81ie|D>a1o|lP$^D(gKm zJC>WaFAV3J_7*s{sd*K#uFdJbf(^MgT*5>E;uXgvL!@;oSDa<9R~Us)0qw5Ga}kwjSh{quf65@CupyU9zd{fe z4Uds{Ob*F?{h!Ha{rmTREQc{M)G;*-$ndYwTo4+LMSv^xC$7+TvqG_CaiEVe?LaL+ z?5g2oi`*!K@KRdajnFkgmx!WAR#S+O~>i!1nwsUY-xKZwN&Q( zoYJYa3;!QBOhKT*sz6PtdQoSL>MuwIRa5YkDV9!sxe#RFM(c)NTM4@%h7<7UzrqCM zXhZca*LLUK?OAtwX2*g1gBf>w&V4L>eA&}_EtdCmW<8y^x)v|o?p{7{=-%Lc_NQcl zLybFE5!2Yuq)$Q_)YPW?3#?smFWDRCnXJ8ee((=_%VT%_j992euFdoNvr=n@Z+-r( z2D#pOig>}j?B22vdgSiNyZ2<>dlu{NGugdIbMD@}JCJn;X2d1QJ>Q;{WYEiOrGkvB zcWJ}MS>dtNTy|He0Y_^(<%|cSv&VxTczW2QUhZKF1M`5-VK%Jy68{-Pjrv2n_Fj>F ztbACRr$Dg!n$%-@|1v+pki X(^GpJv+L;z#>s42ZFV!;EC>GpobO-{ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_curve.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_curve.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a0fc331097bae98672c8d1837db8a38d4ea5d80 GIT binary patch literal 904 zcmY+D&2G~`5P)ZG$8mn!hBl>Dg<4JoiS~&2y;LX%P=$oVA&OWz_EHRv9o9~$kq;bl z$N|oIhKe`f6_7Y_i1viU3sg$E^u$aY2QiXo=G&Rwot<5Ouhq(c^5ey+cdrQWn;@6M z(wXm~GX)LW;KCSOCg7`{#X2m}TDp_ZAge85-b7~#0y@lvj#dI!ceOF==m~2X%H+pG zIT9yMeVI;%rqaUmZ>Xk_vJ^OanWP#LTak{GZw0A=v@8iAEg%`IOcNAYjA`0yPCs&W2-0#{RA9Y6}78^i;?BT!-r1)j>K@Bv5QlEq7e~*BJ>PSlisXnpbeD&NL|L4BffsZBaV@*x!+c&4qV42YIe$O2{VXE4F!dZHJyy9%ik{IzQ6!=+ zj^Vs(n6vmGDHJq*ypji~b%I%Dke_BuP5 Ly!-=b7E}HL*pS0K literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_edwards.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_edwards.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..422354605e4c5652436e5ce280cf9c8ceb9e0ae7 GIT binary patch literal 5105 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 N#j`J}q{|439#54c^ literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_nist_ecc.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_nist_ecc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a637435dd91ecf1caaebeac34d8e41f00583b3ad GIT binary patch literal 9544 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_openssh.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/PublicKey/__pycache__/_openssh.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7304451190405f5b9cbe0e8651c5a1da9d78a87e GIT binary patch literal 4928 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/_curve448.pyd b/venv/Lib/site-packages/Cryptodome/PublicKey/_curve448.pyd new file mode 100644 index 0000000000000000000000000000000000000000..040d18886f20b9778a8c0a6e5847e57f00ae6be9 GIT binary patch literal 58880 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 y?zP321IBo$Q=hmVP=I0I_DB4I(hSlm7!NwRB(r literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/_ec_ws.pyd b/venv/Lib/site-packages/Cryptodome/PublicKey/_ec_ws.pyd new file mode 100644 index 0000000000000000000000000000000000000000..a47bb55073c55d8993858d43424650384b779f34 GIT binary patch literal 755200 zcmeFa34B!5**`uZ0U{wx5Jm$o1W7d*muR$xj>`-ra3{==RAgxtjaCsiK$rl16$mC# z(#t5d__|xPT5YS~P=QkOboTyO*2xc~3>Irq-oJ2P4A>)ZFOzdxVa zIXUN{-*GYpq&1wQ%DC;#8Y|7Eyb{f4aU=X&yx%|lmY z1UC;oZ`u{J3uexmarvx^uPOM+#nY$H2p3#(S;4H@=>=CzFDS1XUvSNgOD{VqH@8or z*>&F2Z_YmNi|EO=eR!2X2JZ|oZ~7%vEk|**O69Tn$P8EFOz|qjY~6JMfSgw zzH?IevUy?D&AZ+lGM}BGu>C7=xoS?Db?L?7i(RfIpB#cggXU9w-hfZrKOf+8k|J|y zoS>zc6U>!s4nA%Fd@fh>Ni!9pJR_df#p#}xLgzba*6dk7L6gi0=0^IvAsyXiSI+<; z=g5V*61s*Ix{+-D|Nmj3#!r~!pQzQpSElJb_b<$GX{Bqlrt-p~fc|+v-=*pA2KA4$ z#vSg42eHVZ#`W%oyHU_sSS*Fz?uLaZ1S455azaaYM3?RWUsLA4@S-W_uU`Fl$VwDhfshSz zki9#fV^cqRh$1Tzvac}o#3QV>k-fp0h|De#GNL#^c8`thSw&VRWWRTi)!N9GDKejs z-Q*w}7bgo}iyzcL5}ua$v6B5abEMJ7W*eSAs#2cec|?`+4bOe5RA6|PsZx>Q`I#z}7@j&+Dl)zFKxCBBo0Otf=$7~f*=G=zSeYJVV;IRv&T=EILSZ3 zKhZx)Tl8KXXH#z|jN-HO{h2sB-wP2H(qGi{>dEE$t3kbtUHL+d z@4FigK=Nyi5K$kZppVbeH#hDGUs?Y})~s{&Rqjda>-T)+p0s0Xf?q%JyJz&MZ^@eK zZf|3GWL}_tRRR85HPt<1o40M&YivQeWvYAju59@u;9juNyJ7YKeN}M_Bv8)aP~_Zf ztv;4f`$>quJsZCrY`U~?UWlAD20NmrZ!p*F%KJBmQng8mvrsvc&H?E(Tr)~dGYup+>U{#juqp}0~R!tvY z5}jI$LGr1-gsu>XWbNaKC+j)f9)@7c$0WEL-UAm(;Tcs3f4~0o40q#kXxB$&h4j{- zJ~l6)zs&EJ1oTasKB`D-x*C!m6$R0s4$g4Jz95fZmxZQ0O`naH>kBnDS8MggA>qOP z6-DSxi+Bc-MFoW&GRr{wzWF$8NGR)sk`A62mpuRuQ@{cV4GtgyR z!OYJvBu(EOh@7@A5IOT;blO3#ScNaBuhaC9rs*#Rv0qhVZ#hG2i5{Zmv}sNK&{7Q| zOje{D0ImaG zgYy9|ViioI;B{S*iL8TmWUVBaBDtS{Ee+4wx%i{rup{d()m|#?53yZ82yo5OTHe7R z)@Yeu15?4sX{{me+qJn0YtdY6O6>zf`exB`2tQ4KIeJDfe!IdK>I85Qs)0^X7idb0 zI#j1a9jeoz4%G!|P>1Sts6%xJs6z`-hpCUFE@IKj{wT#Q;+Ki0)86+#8f`CFfqiu%ioSVnHAVO|j^19Q>tW=t`^xp}^KqsG5=# zvh@tjGNbD#yqg+Cn8tQ~VHniEim={6h!}{tf`BeR@X*otMURFqx8b>i_-qy|Twgd1 z%xZXgQqJmI4bN9$7B(B6Pf!TzS970(-Zc;S6@6m{3bM^il>)ZFDJUq8DMm>c<$z)o zcf(o-$B?6BdPE>=`b#FqY$3-469PFp5FFEs#N?Rkih}x2@*rmI%n~8~Bf0D5ky-BG zn4QdWjcV^D?epYO8syQ1WAuXoa0K`!koh$^MvI)VKjdwVbIr@J0?9R79bA)h zT(cYP-xvbrGuPp&BwfzKNh3yPwExwAf`fTEIPub@U~L0u4M9 zStxopp4u*)J6^VnDROPXxns&Rh<}@K?wE3Z7E!pYunlMpLAAOps6SY^Oa6E(JQ+X? zkB1%>9;X0!mIc7xR$;pdz;b8=wYFabTbSV6kOaP~4&^UGnbH=mslyNXFY;gLpK{TK zFc(EXm<>3>%5Z802Z_K)?iq6k$3tcjjt;HhHPt>BTxNJ;uue4nbs%w}*77E0cOdgs z0y1*iY9R5;koTQ95<~k^k+?HD*JUAb3)Weq-jIaE>tXXY^vD3Oq{4h`! z>)lP_cR7r|eQm%J-v>LWad)^MC3)$NfW9UA`4w1O>Z^YNffxo)p`h9!U!$*}J@x>q zEE|RLI@vyrI9xSXwZ=$qwOPopjdtNl-$_y93g8^#bH5xt9_c2ga2kE@5 zkZv&{Q9sNLz|?d*TCy7GSLO!L1?Bg_L+wf&cR_hQY$MS?E&~*Vvo1hEG?4KGhp6g9 zQ4-93U}5fA2j*y-0dvrasH#H)HZf-^9&yagzz!Ds3SaFe=6cT%%=w_b8J4Ki=*yGU_h+hcL{Y0a^M{R+cF51L`%lq314Ev zqb=CwVtq`-gz83@lx@I}psh>FelV8^_-cXN#ej{bp9fWd{%OKZa92q*3GR+SNpRPm zjJs0tKopRY16-v{#4YM+Mca*o?hEcz`??RhTZyws?nZdB4bQ#YZ=AZuEY+SP?eo!2 z(9P=#bZ@=?9R*$Ic$3BE#{DE!{@GnF)_e-CV3%YQX?B0FOR`^nu7oW7wAe$}3&3De z{Q?EzZl>U_QL54Y8=^^Yr=cXc^H_y99P(}wDQ&n@0$a9s8d`DaErcE(JD$W&*97)f zhqW~X3IZTE84}F!9Dg|>=WtCJL}4WN4v-n1K4`b(+#LES#LhCbNMBf_OH4IpYsed| z%~K)}n{M>7c1+meA-yebaiNy3iY1>ZTw({*sEAMtl1&&)<=BTAf4j+c6jP3NaDKJw>%v5+5$(jIl5TLd^Z@)l5p?zS`hG@e1c~heVSiWm; z*5J{$>y~K{9Ub>cCrD0S%l;IiX_1^v`3~`!7Rkw!Cw}TgvS^=hxGRM)f#l5!$@gKo z=rp6pfuSMT-O3HtoM|FkNoRP-t_SEuJ(x}O38?)j38?#7h20KN2S`a%Xq{3IEHRy| zmhPg(c_fI-lTjUT%IUcR)Z8a7BWiEBI0e;{RQq0hAfATyfPQdn+=U!RwFzhj&8vgn zm?fv_sC@oy%-`WbeSKU`qn5ya>%(rzX_}t@ZgN`F;bpNIO(T7k$)Y-13!U9GlDb$- zFQu;Xl667ZpIB8!QWunyJ|Zk3aEAk50>T0m$`R`;H6S4KDoXbS%|)$>4BRSN7B>UZ z6{Wi?^jJk{Ga`iUA$6#6jf?bM%TN8~fZlg_sS(n%P6-yb1iXDu@wsnrEo}~Xx4Ca` z4i>MfYRVdsb0DCv_8aTQMh51iv$0JB`;XQ84%IR@ROsu*Hudd4*4uZe-+k+9&ATm7 zzta`+uAOx+U3hi)35%hEa5-{YN4kYyZwVM}fYkOVe1cO0?&-Uxy06|HJ~N*0An{X# zO!Gc*&p1S@Z^=Wbbmvs}>)Y_Tda8Rj!lv!pK5;KRR0EAxj|_&*{(UVO;X?y@b8uLO zwtrh-SdRe0#Z5iv1>c5oh^~J>1|SaZnFus;r>mCjMkYS)p0wlx6h*(E&M%ZX)Qoo!5w>huEQ7r7ZjwR|!+cWn!$_7hje_jz2i&I)LefzYncE1U*BWh+PL0}}`oF5seRrJ%O?n9PeXXa-S7pFCgA)NAt&IRX<@R= zDwqN3uveT6O{An2VLBO-qH1x~_*QH@@*)OAhf4y zzYiaVCy(u&B2>V69{7L{Ow9qSFfHi)I1bY(uPT^saKQAYcbqTvp)LapEJ*crOB;@hB<$T!-jb%*?Z3yEeBy9+$MVU4G~kA>gx+1wP6R%V1} zQZQd7LeuGVwFGlO-=Ox!A7F9SCpQA;# zqp%E2A$&y3Q}Gc)6rznEYZX4hK8zYu$X`rKnwSocG_0B=Ay7$c{4_<}9Ts|Hvarw* zKPHR3KOu#MR;l*$!90d%Guz`V1P@3$AwSs?^3z1fzaQtGA%9ccW`2 zEADv#lOXUiC4Co*d>h=MrljwJ@+#W-Mco0;AKoTP;r1A1>3=^!!KVLJApbB~O@9cy zE>23(0{!|&qN@8`R{pO|9fVrfeRVJp8CcdWb#UFRdlKrOQkWAKu~OV+UY(jCOzMR8 zezraT@t@QO)9CLKiaf!Z%VAy5ZN}- z_nq`~U`jX+Ln-yUDsp5iQs}K%8nN_ zyaeNF0E{b`&c_37TK!8ff7i{rFV(n8Mu!@4xxUqpV+F?gfZn=2hD--C)GJ~Rk8tJ_ zX9nt5(;h}naI?)G-n|jF@b-i)jC|qk{(a3EVdR0q^Rr&tzdbOlB`_>UD{X`8TsF`} z*wFNi3)? zK=n*i+ml#OU4-g+sJ17upt^&&8CuGmAPzKDBtmB@&o@dn_}b3b?#VYn6Y891DX`c+ zymOlW+6|g`XbcjkgH6udyh0e72-+L4b;%xfrG-qfKg8mv2T730R1_(!H<77QsLoKx zj9V&-mr^a24+XL9hI93dc+;?mz zHQ?O+LGPaUmh#ei#kq-e40?-QFIb$5weEs*`*pITNUA?_&eLrxBEiv?es4*eAPMU9 zdkb@qt-U2F3qD&?~ zyqw>Mf4vBh=UHxaS%M;Mt9L{C9t2BtWFt?@E{{w^Fj8eDYm&VTUq_vMS<7dtGQ7eX z($0DEP1g`NSyHH^j|MG!Ng>CF`Z5wsql+w$zXu(Bo~F0pxOjL0Q?Y+a<4@mGfkQHv z`0Ed3%^L03x8Ve4{Tn!kx!yg5@hF!%eu*gI3?JCPnWrz?yc=e{h0hJnlb4!%!3Mv# zZT4a1#Vs(#@O>>uowEkJ*M0(dP_Dn`cQ0Gro>`&)Er_#h`4|;cRM>1HBN{nsp3%G> zg~Zq{m$8kLv8|V}?J(o7iSf1B$EQw*ZkV-)V@*HC0cwn?1AGYsTvgGy)7`KRgTM|D zJ^>Nn@Nt~4WArT}W@pVgB2@g5vVQ}5hS4&%DXSk2m1ld$X3hG5bM4|&!B6$J|4FuK0eS;rpw!rmW!_zdzpmKEt~rN(Y_7j@G*y@}z)?>5T$MfgGB=o6aAj8fumqj z!?dUywU*P`-LMA|Hwf4gZgQY@D=L_5Mu>^b{|hVVXn2akS!8}aN+R>Ct-?{NV7imV z@oba%JC*NRm-8l)Xw8a(=$EfUyj;j`N5Lu{TZCh;Fg6rB5$iMMu(5y-aJyI ze=9tRhUd<6@CP1irUtvkb`-&fI$Xm-@Dc@eyl^XWo}w>8_0zCNXp-lI zRL1lX8#II2$KX(Fn%w!yY&1hCILr>MsWK1MHK=yx&R6E68iIjlhdqK=fNDGu%?^7t z=D7-z!(n!y?-EVr&ZEVdJ6~C*nK>YsX-#D@kHq6iXpy4NG!WH{i8z*>RW0(wEtn@| zQ=3thj^J=4v}058>w@y*?VwbOUl){RTZwD9{8j;GTwIZ*3^)D(6(Xk|VG9BNOCr%3 zcZ}!e<)ICb53A(nT2eCZDDfS*@yr?E;n#T3@hCVGVq+C$I&>or%RE;G9TVt&f>@2@ z#^BX6JkOq~(2dBX1KqkJDioss6r%L#UZOB;1Gof#fuIJNh@cJ^U8^0{yPDIW8m9rH z#sCO=_7V48^Om|LJ z2#iX`bmwH(Y@#?q1epQCGi@?Dd@^txJ{}kjGw<5$ML{y*YTlq61g%&{_JTBjFu@D( zQrpCT_#7LHgimFUC!$BJvNG)z=PJh{vR)C#RGrSUIt{|7jPYS_TLIt;S3OP+5UyhG zt85!QMIeR4Rl(dgm`^Ct+jj`6in2SwT#NB4BNo12q?$Wc!SeJ}Q&se7_ zqK)`4JZA|}_Zf>z!%44^J%iULI5&*>&!=H6ZWs@?e&<-r;w#7qY*jq=GBVAEk)FA} z*M@mgS0Z!)g!XNqRQZHmP_~d^xnaapMXXII8C<<#{z-}kl%Mb^*gC=|kPVKL?<%tb zYmCd5n9?tq-&EQq_xozBV}iAQnuU%=gbOF*_>AaM*kLMBV9*nqGrbN>dYcI^g33z# zlc*cWAqeVFJi$lEpDEY(Rp@`$^e9zBXS{BNz7E-MgV2>qfE&aFxOj$Q2pNhUX9N3?kjqo=Fye~3EQH5xR2lZ%hzy~4k8kPP=6GlVEFRddc3ht552jy@i zkHycklzrI(I9ZdC2#1Is)FPxX!XXh)UOb26PKoEKJh&N%(Y#JeM3Ur?zX;{t9<%8@ ze^DeDrgSId0EaM5l-0HTi+lNV6b~YGeuk0=8>aq9!SsHcQs-7u+GLz{KrUHX9S2i1 zc9|l!OC7O#V5BKUXqoJ|vZ)^vS6O!>GzZx;5CX;U{Npsr9+Td=um4HW1J=omg|91O3+ygh& z0li5gNG%z;7?UL$5maJR7!^bx!lc9&;alB7#WZZnPMx(Q{G1Kx;M7?=qHI`0zGE^` zLSGG^NGaq{dDYkBf{2k45kqgUA`d|2{Ssj11p+i)WVe3;6$xH>fPax!?nFWH3U7cB z7GaK$6f#u7Mqq@D(w%Uoeadzg1AW!;h`YUq+|sUhi(l>o}IO8D_03e=?lVDLf+84 zZIDxOci%ftVObn!Rp6D6_HX7)S=z3}7&I3DMG9}+X9vTq;M+6fI#77iFobfb-HCZ{ z8gCsf`9*Y_DzCk{7k5N?I^gYOgpMe$YvC%G2063hl6b&6yb|XDjg}aXVf`J~ZE=?> z5a{FB{tE!3SbG~$Nbtb({EIyBB*7~C#SJJ4^sB4_kDs8%}*t}XRZvGt& ztv)tI5!?3*aV22CP;*YtI(Z?nS^S>xj^w^`DtY0VlM+}@G6HW@bVG#h=R#+CZBkqu zzJ!aT!TepdX>_n(?EE8ED4lELi|3qdp;+)=$QE`t#<#{62&$&vC)85OK9SgDWvh@) zqagYpROubQjgHXZga6UV9vx902GBd%qa(@-{z6P6sC7&x3qbihfSZVZrr8OuZ$Uw6 zoX{z$aazDr4>T@vq*6Zb#(o#n4?^YCUqhCd+nx^u1yUb)ObE$62yP*Ig?ylL{R60* zYXjba$EyHW2m!A0oG30OrP8_@8mF6~O)5oZn5)02oji8I%pe52`Umv`!2t)E7<8NE zIZvpYig(!uL55#dXDuMQw?`dkEo|pw;;JN%#ZbN6y)7OPgRYrIzZ7*=^2G+(4qarb zLo)3>DQ}n_7C)wDo_?^DepPzYHu@Dw^6f2UjufKJ>|xE4Vz(A4+>nI?gH z;J8)ruq@2=RJuPfS0}waaEiXJN{7-f_5h}LL^^vw)`#W**9ga99OeLz!yseJW)4XF zv4lg7n*){^V6Bgs1J)v$2V%@clB_Lti0KU40SQ&#xjsGA*_d?eBTI9%ZE4K&OYMDV znZ@^m`1+W~2ovjL&ii&~z`_`R28YN#@OxnuNdAW?qDAsEx+#)B?)5WIm zF~ib|FS+M9{S$@Q3S(w!n9_c(g8RaBBE#f^JI`^@;JIRv_@5!4)9|!{WsnhOcV^$C z+E17EhtW>$hq6gLJ+VN`+faZ$qymJaFp|NCGMvzeSZ2N$$Xu&6nO215T1UEq_v^R@ z^!B3=IF3{W-0Kx}|Cy_v(10va4?XH%yVN1FY{l4}lm zW**8EdFDv#?o^&h0!I4%CM7l5+-kVCxCsLu*)i5co*kda&Nc?_*w~EWBns*u3G)Zx6MR&90&)a14IoRLe^$q9hl@UON?e~fC7nKj zbS8xt>p(?!@sdy|()t%oGlg7%+=B{+09ug_zCD&m1TR?%eS$d*a=zBW4V6BgiB8h> zI?DgcGq5?|TfW66x`v6o6yBCu@M?y9qeKF>`MP z$ER2Y%jc(J-Pe-RhGT^M#3FWp_!NlQ*ce6G9T2Z4E+e@;jvR)Ezu!F&TOJKd?Q;gdYfvSq2cO*Y6=Y_)k%!DC)U z+#TTNA#WJK4GbYLk2oR)xO<7!NNy9z49}N?6TlS{HQ8BhS!T*<9T&hM@27FWJLZ>| z7~IFaDV}CT|Ma!L`EFvi1OIeqaNUQg5W(B!T0cj(rV1CYQTYtkWfsX6{H;VI1#g#q z?)ohkLdjejRB@MtM9`qwr5aSG`gk_REii9^_l~j~m+(XX|0%F2Sm)gbN<#Zl5{UP= z3V%1Tt|T;1smWN)iy0DEEmDny>w&p;w_w+iipEg{ULl9p2N`|)W3$u;Tmi^E-iDd8ITE3orNZWoCq^v6~Y(+V(+>*wy(NJVLNd# z2eEzIuQ?wHrGkrZ`2mxi59%0NJcZ6mK1y8tjqph}!YBV!DqRO22zzzWH%_I)xug(Y2)n0V1j0@CVo;KkPy>7aX`Xnw~yoJi#yFn=;E+M58Gi09vtPhMYsh5^LQoy zqOL^^OL6kaC@Z7w6nR zAV=1@DKaV$o^U1(+yh((2f+OV`v_O-)6Q&I`Ri$HER70Mo( zPE;3wdL~BVJa$)=j%h(%l0N?xEj)H-W7$rlE>CzSwi0UYgd-eFfa6d27vcD06cikbQ4%tEgJ+Zox$`$b_7;|d!`aK`+OdB`W><}!n4r^zbaBNy%CG!FhscN%9Cs4wW^eF6L` zbDK*5V@;jMDU;&6IEaHc29yQ$nr!vffSDzDO@PL;6zX8k67x%Vvw);!>(z+yGE+t8 z2_0U9tyd$@PaV|(*DIBe=P;n&KpM(h$TS8FrUmh~8aX?FSK2H^OZ1*Y)CmpQ`_&u%44>S5xIcTS+-h{n|cs0DYzj1efVZnEGMejC}Aw)ahDX<@yAX^1HAy81Mvdf zMaD-32PrBhZ_P>^4`)YA9ngKFENuF0M2&zJx@?**{Pm?2=>uk3tvXFmj*(Vf#& zEeFjpozvWXugD8^>$liKOs>>-5)Tz{N6-Q;~mvKl?l<&M##$BrN)cCs&uvwji z&BA_y%_(kT^W>ZqY-XwUd+}j-+-OgaP0lO@hflC+p5}AH^O9RSfM?U4PI#gZ0l7T{ z`|k)(r$WW-@Kj_Tbr&W@=~U)1n~qlW%?CiKbgC{Wp8?`bovI5;1HaBdK#j=In+Qkz zrLLu?jZRCW4l65HY|z^zGV~%86k1DB64BYqD!k&5p{J9wQyKay46;~1kd>RSPsBngv}&LhF+lBKf{ONxg723aLTi9Hjwhsl4R)fOF97QThP7iGW5Fw zQcL9r%bD-)NC(q7w_{qm5SSyEgQg3CdGy_&=|W&$i9MV#JRGsv7xvpW_3&xLBP9*r zk&NT529CE*^TMNnkU`F-;xLOLUM#fjX29f zJ}p(@g_lhhPFqF7ay39#j4&J61|vKQ4ao2;=$XO@<5l~6 z_%J*dqCGt$z++`eYq+ZtF|g;FutJU(N>YRP$1lFy=N`9lk932To`x zLC)@&H(6obBK{T+>r}_nSg{_JD}Ea5{r5I1bjOkyjxf@l%hX3mvlOWi)_h^({5Y~O-*7&a71d@&ZKqG{hy8qo*m{UGjt zJEf7L$bO|YMbY_CBfpCqacV$5Ra^X!Dzu8fn_ljYmhUOb7D}Nm7g~pW5Gm9p<#z0u z6g+28Nvxq9N)80!5<}%Zv!qZQvZr&^n8rO3XcTb-gF|5#FO`E7x(ZUryrt+Z2%ryz zrd|Zl1%=ZfWz;2(OB3RU33R98OAtSU)rCY5Ke&(x;%BhR*DlZ5O9{jq98Kxtwuv6) zZy&7kfscp3J%H=+`2qvE9$yI`bv}^KJI$|e#_>W)(P>jDIx6e;Czp|Lq}Lu0~$(LLD`pWc@uoJ=@C^C4TP(a(cMkHklGNWqeRt;`cCiM29!j3(&} zYjuq!UM`J`m*hMkcf%$uUqZb6fRu4>s&$ti$LaK)ybX&y#?0enbtl<((qLftk=*AY zI1JA%Um@Ms={vbpwSSEd!!rZzHt|A4i)TL+DO^_-IpLt@{VXnBc4A_j&Qwa5uYZQ0 zgIhm@t0m=X3wZY_ne488I7$LdeGAcE4bpUXTbLIh1q-u5lpK~5mqY;aF1?>WSeV|? zA1o|L>*)`|Js-d7BJNLN{~h}JgN0?XA~y*(p!)=%I{2bL*W=Pf^pTENZxXd3C0)9p zJdqNMI!^prBP$%8jELE=ylgJLPNhso$lc1-qm+RsO$irh!5s;g1z-%(e0D*!*y4FA zyBxgE`_7bnNvJnUzL*!DrI#`)Mw>pwxj1Lt)TZqu*qZqueOF@{L)DloO-S#}_W z^{-IvJ)}L1c5IlJhV)OBX3=V~{s|IGso`;9>)l;1U$1ySas3&2KjS9OfZV7Fj?yHu zm(2T@lJ`R(>yY=+oQ>vWu19rxeh;N*_fUFn4;3YtJ$_CMeRs&~A+WlQ&nxJI`iFQ& zMGje*ppEl$Jin=3bg_h!pb41#-v#A~lqrh;yP%v6!(MndH`9dXW?)1%HDq}zFwTr~ zv%F8Iq7n zq+bt^^?1QNXNPqC0m#V+)V~1ztu&OcD>ou<5PAtbEUq93M@Q8Q%~eHO+As!7oead^YJK&WZsX3 zk-{2PFl|06ZHX-y=|^UWJ2@k)8m2(3Cy2X}%pZP+F+_5U_ER!{@o|b|-m2QC?PL4j z&*?2K(E%jIa+4RK*?I)^%1wGB{u?8;cj z>${u=wM`l8nDQU^b#ibGAQ!$!PE^nvJApn|byn1jESQ5zkuVilHjyxn2t@o0d;A`U zqqw{@T+RmU1m8%DQ22(Yza!NRn+iY?#_P#UyAYOO-znS)7TK$dh z$=HLTh#qH?^EN&12cWwFiA-vi5SQy{may6h1y|EQcAR%s`fa!6@BiHV z*e>(^?_1BD9}BH+UNJ&&g{KgAQOTt2N|-vqrV)sJ#ISh!r?C-}|IJFQ9aro_)XS@|I_2>$@_LccD~ zmf{KlbsHk24sS!0&GbJ}P@Cxllw=PbY!zO|s8JI>TV5M*H7VovtmX0I@;W^nnOFb| zA~D)dPESXJxVMvn@welxa@be5eaL}NQ%(J(TB<)G3F$e<24hLm7F#9H82+SV&J~8`2GzGJ(Rr>|+v3(2Lu@+Wx z6CM7U`$G|$=$0&W9A-M{nsnHm3{CMnk6nqzr@?MJ)#R>EE~INXsjbRv(T>V`FZpuGW0C}ov--r*~e~ES*AZ;FFg-IHTns;y9b9C>OmR1xP90K6;2}=>DC!i#_jUQ&P z;vGtyQrrrF#f}%pNjV+wj@*s|*g0aoL202^)751u3^FCD0LuVKpm*~-MCUKx#2?Ok zQo^b|SK1e%-G*KzP6HxNaVCio56K`;97cNWas^-eVWgL$*|RtcRX9nCgYNMo4H5xM zK-0{?gD%i9d?oIorFVb|T+o)z3ySJ=UQkpQU|cgXDEsLKR2L<@pz)9gsypz4q6J=1 zC}=l9D4O>qR`{a#3@y=H7N{UF8KHeGGC_vFnAMcE8$!yNGbzT8MbA>qgumv4> zMT_Y1`=G}gG`{CbHUji}=Z+_TUd^406vK(*9GB8J_mn zg(s~O9Z<^?r;DiNa7P&zIbomubu42pRcx8qRUq=B*G@;bU`yvoqZGCbGbGX3Nh32F znfADmoa~_=gTulppmf}c>U7+R>U7+R>U7+R>JGRQElJ$TqaM*rnk|kD2J8JP$(Gi7 zYD8+g=wi`-364)#-8g4J$CGS?;b*i1;RqpE${Xo_~UWqJNSWd9+YFXc*d}_f`P+n%=Yazxuee(luIB zqj)6r#sbv4Cp8E4dy7zFqSw7OQnjA`iFxHZPQEqr43ySXu^h!}DNfi+Cvn9ca(Q#G zsUivydLY;|rOw^Iq5%Ju;6ES!tHysd_;04WeSLSw*rPrO zId}gEBK!QvlaIy%^+8VoI`gTIYV}d0K4z+qI`y#>A6nD=#rSV2clT*1Jc0jK$PMlM zMR`9u-)_F8Wzud+*~I%vJ{jenk+s?%@%3P- z?<#+NbJkS%hwADT_^$e{qD0JEZPwvxmKm>n_(r^qdNqzs+ zrTE&)Y;vdgCK_EZ*`z5BKu(Yj~f|ZrqM8Un>X|ueQDKIPLctUDx!AI!%{fMVeG|xJZ3{ zD1Oy`J~!R>=P$=n1og}A2$DOm=Nl-lsnc33n)_i~;sV4*ayowm2@|KQ!3Iw+8iz{q zO(iOy0A-~fJiP>IqL6OY!6xK1Qibyc@n;zs1*d&*v@?ifUj@;9w;4wJiKLuNN|0Yq z@~b-_pS0dEWPZ4yc*ziSKE8fTBe*%|s@*vJ@mvGGU zqxxPv-rm1rkofbO1Hf$K-T0FF!fne@ZGA){GTd~ry$QxS{zwKe)F-pm5P(RhW# zq>ano28jRCS5{Vghz5j0NvZu9GBh6yzL^iIwZwX05&M$6+<6swO`)vT3Ktl|)mo9w z4|iS&GOuD61w|Wf^Dc1r54Dk<=i*7r^@?43?F;(+Z4enExhV{$E^XXboA(!X39e|W zeW9GS?x#a9c%k}-@NzEq$d@5!j^9xHF&1DZC`P-VJ}r9%dUW}BexPsIxyNWLAGWvn zi}0!F!LP4-hMh?_zT>w_&!gN=56s^AuD*5Wo^t(T1Z9i&n|_X_p*(&$%MBu$^c-2WFovZmMG;gq+;AhNHpCx;8msQD17 z*ouiryo&>GpuQA1`t?-92-JU&QM(Onwp7UZP7acX3#(=427sATiTUt>2HQh9vz{s* zVWC8NQ(funuz%L$M!XCJlxFJl>&hW7YTS*#!oFH+==}64Y z2I0t+i!8^Gw9-w{@>Td;w1#R#;w^FKPg(67Kf$JNEP79gww}2!n0khJ<0ll`N6=G< zjQw08;id6?X^$2*vxr0cOED3g^_jt@N6mwy){)YNLe3ITn^Kf%IBH7i#b?VS6X#Uu z72F~gY+>c@@M)|(IiSD$1joJ+Sy+J<`BR4 z^K$pdtrd8WUGeAUAZiO`WcBNe_^8yg;5}~!SVIkw@6sFQe!7Cm5Gye{*UmTm`g&u- zux&fv$oZSU_<;H4kbX|-juk!-Ag#l%SLIdca|iDKsB}kpBw*;#a%3D%Gur%_>-K+! z9_Qn2qkjEUWYy|b*?t}I!*zb|2N>eomOZ^jy8k?IxW2*t^bYsRSawS++x_^)%F&lMlp)PLwVa2EC7Zqa7kn;SLoQ0N*_89Gw=r(ol+14$ zzo_@TcUzp_xW#j@ZTK|#ZI@IDzwKf1Tj95U8`0CZ$#2hZ;J}|0=|FyafJy_fqY9)4UzzlY0x(?Rq`3;Sbyn!0NGP3{lee;Du3bI*zSI~t{d#fNBlO~FCYDN%6>a;>Wck5vfZ`! zTtPdPyPmKPxbU4nYdfv0fmf2>`PJVUL%%vBP568olxl!0j#?o0*^p=x2l?bF%~btCB9?PCp4FM{l4I zXgZ0v*w5+jD?7QiuV!r2j8?7w%Z#}n>Z7wY@9Noop5;u$o&~Kw&ho4L48j#}9!J6| z$C4eH+#`0EgWw7f;GiX2i%Qp{-SCW-s?CU3^2_=r_JTsA`{R%CsE_jp^aXiArue+f!R(#@anKyT z*7R?c>pM$#^Kg=v_ZSs_9nkypO~g>)^^KJy&T}6?5^!^6F$$%~@m{4Bw`krCfhPX} zy!g$Zvnx>lZbt1!ynC?`XCR>y&cO)+1Q-@T8HF_iQ}?y#mGXnN|5>^NP0(M41dHEJ z`134(OJDK#Of=tLT!+pK&mIw&n2eWE5GD7&_)A}90=AJUy~X#XwX|nyI&7`gpn;=0 zkJEV?7x6`q5%j9BWmaE03JO73wFRnUtXlg+RDq~)(t3p#x7C(#XFrzVAB zEUx4ojYanX{hY`Tdq*l^0hUYu0+PO=rpxm=g7F~vOFg=jk?JrVj|LSovp7cF5RWJO zdL4cc~E<`1!% zr`KRSnr<1gm&;$6+=(oRHVqqpGmJIEGYVC5L=aDL2FjtPx%p(tMrJq5AW=I}B zQkidf3P5H)eSD61JKgi4_#C0LFV=DhGDjZyrB_fPQ#$3Tn2Vju6#W8O4e=>@)m?wT znj(BdWDTashbiiVDH4Z9++S&WD(jnTWVSwZ&Q@h&whAy?%*cRxOe4-mBaW&pUxHDs)vu|!=)&_?KZ^;# zG*yA&RG=AeMR z#_(K&g1$O76Z5lzzh(Wf>0rQpVB88HK+{C*kOi9FpI3e<>3g;EUFXW?>=jd*j8N^|rw((2_DM=t{Pqos|$w1KLG z>F*<@qh-12P4_Y2Tt*p$)fidLZ&W3$UW=449V?^&CVN~8 z+zRX06kI4qJg?Qr9zTI0I_fktL;B|-?DYEIG(9G3`NaVI8r7PQP!P2y${IK_n)%?& z=6e|xykBhvDuVhMTwJ`#cs=zNe`f45wECf7;6U4)KB8*H&PA1Q6`fU&;9H{f4CUy= zo6%GuyM7;f_i#Zjs7v41n&1xIOK%(z6VTxVU6<`{I0B6t^%^5%&OofEudJA=%~lO> zAwk{T5BbxYx7E^Z_8!X7#Fd-Jn$>S2mn4elJ~keA!)ZMoBtIjGlDC6Q_2zP^!h~Lk zLX4?4eo<)fs(I`|TcWq0V;HQlX*A{L4^8IYHrP^UjPJ4 z)fj!F{%Tx-=}3LqM5W>&ex^d74)tXVe+|c*M16TR`nw>1t@d`xAvmSB=r01PM+S>O zu=q8@SXJ4SHJtj3-wOrieclB(+3*~La0=)R&mbwl@2$VeUmDjR^^tjb^rUNouQOQF zbh51Rq5iTH3TyiY47}BL4Qu9pz!k`=hMcsm?RNUEntF3(xvWz%9n1PBwyI^F zU@q%YslteELIKWr=s(iM$*~)-GUl+avWPB0K^|Ht&y#98@0+G&$4-NMBmnS|cE)Z1 ziH5UMAi?|jO|AM^3lOkn zdpZRiUsYP_Z3Eh2Ga zh5q*(Cmu`kDGEeKiJKK+%yZ;IXb5;dKQ zg=3&Oc^YGRjK_UK!P|HXeq7UgV>t3qzst3cLWB$K>HO6yx`?c|{*M6M-m*YlzMR6l$kFE7JNFX@>1E@>z4~Mo2-$w+v4) z|7topb~2b17l7j8Pv|qpaT}T@`wcA#Nv4`C1!RpgI$ELk!pyrHm@cLChISE_)F7TQ zOX1U%1~G&*SS)a!;t!RGLza=$B4z#!I3N7+DZdJ7i#G7l0&$e%rYQu}U>Dm{svaX3 zMsoiFuEc)25`Q>fh8t1s$4dJhY>#A}uj!xgl3f2YhhPN*nV(@mU{;N{&T@hqVlRO2=8 zw!W$mwhK)|b&a#S0M#>5?aW!MDnj)N`l^@s{MEPFg!=Gy=&;* zcxLyY2T)d2C!iNQ1on`Lga5P81LzablNq%`?}9Pk0D42<2;+3iHt9OUbvFV>siZZqO)p^i^%=Z(&F7GEc-(9yG z%3Aw&q)aXx5CD}Vh;LFC)@XW5U|1h*|2Az{rdHY#Xv$1Kd$?Dh)~vfB*P1>0w9?Ps zf|S|&F3%UlpozAN6xu}kC7})YBid+9>7OaI!56?pXc1nKGm%pRME*=>4(YT({cYe5 ziC@b8#GQ|=)*1V8xQGKc_!Vy`$7?seE&6A`+qz2czya#|wJN*?J7=%FJ<+7X~R`7-QzBfY?0p3O{WeE8~=2?LH_k5-A2lQ7YN8yX0>2ACYye`mN zA_Z`NJqiIGd2M*#x~7-uWBLZY&9gmpjm|^(6rKB2kQR^2-4+(c%xKS(XkAK>WN>73 z56%F#bM{~-*Q->JGuZTCVI3YC{%|1P^vU!Vd$xV5MPzvD(5M2P;WwcKKy`q{#!E>z z;TT4?nWHS}R@Ar-En)nb{vSk1VE0A0SE)d4EiV6orx4tR>a7w#(RXQjKipR@KR|bI zPgTO4e)&88=s3*jN2&zSzN1P2?W?L(Vt96{QkmgduSx*zUsVa9eM*(84bSgXX|mzD zUrJc_J5Z2V>Mc?Ozt@c@Fdo85fxG{C*yWv%I+!aDgh6K{~6v6O%7Ws%DJ>8_eat*(YXW2AClUx*P7l2PoEJu?GNJMjT7 zg6f)BiG9Ci*UHIrIa-2|+1V2BmiOqGt7>?*f-GQqb(#GPGNfoC8qSO06TLlRBjejO zK&HYEJhPP`TVx|+vIxiuq_?;6M}q9fHnNS1tVqcI;vg%vkv*u$N`&lo2U%Ym*?b|p zs!SBEnGUkIf5Rsgx4FAvg3$fMCvFtYLHE4SWfjWgo`@zba+M|*+7vkGZUY^X!Ik3D zQ~J9OK7E)g2e5jHhrLGn>n+{Ah8E1pWO<71_~WXoEER-?JPmNMD0cuN;-6ej#%HiG<|V|d;Z`N^E(H&h8MvP+e~B3o1mEV4$G zz#=PE2`usiN^oj`&3`SWzJ-wg(#pD9rOu7`mlVK`b{QWUIGF zc)*H0S(hiJ8}v|f(P}QmObz@A!3(`%bM*H`Tn4gc?Gcet5UXs*n9%O{o(`}37_2VO z@J&jr?$y-VaJqx5tHI95XTgU;9t&l(Jdzjwp4-iZ|K!&)VVL%qDq-4RS0zmQi>ica z->6EM_7+vbwEtO^Fzt`25~lrEs)T93QyQ$71VJ ztsc4S{Q|`}YlYN_k7CsI1A1`(fk5O;942a694wp!hfdjIT!n`}Q7l36hpJeF;<>6= zfZ}*n%t!G&Rm?+if+}XCI8lqB8>SNuLpq@x$oSa5BAcU(cpku%z|Zz2K7gkO@rSVm zL)?cqZqHq)6-TuQjgHJ$1H~`lDUg{R{Sh7{kolTc{~@w!_Jw~edhpX@dgHLffyG$R z^RwMgkLkB~)aN)5o{fPuCbzj)MFs+6~Q)Yqz%y?E3?d=(#va$;J3 z%j=S`xDtYY_g9=DIN1M=0^^NzUm|Jk)SqL>O7)uprV{=ys1_R?`P*`VmmGYX{+EVJ5TF31y_n?ZJot zLjM%V3VkD^xoxP3-URTN+85&gs`9VcOI>S4md)!CdmU;sR9ysl ziMt?_1$dj318hN-S>TZ>@qHcHi%&8=yA)|C3-YuTQ=fl()hP=We6Fpmp1S>)bC&&O zu{NT@9dp~wg#xvDxL6_$)-vGLmuRUTsa9qn#2elCs@)G?W`{{*u&ideX(B+%` z75(U)59eMu_I~u2AMfvksb?Q|`16k+4!Q!fzm;c&uBv&w=m7dFi1#P7` zP>Hs3b1WpLr0wV)er8u$$__5j8CTx zI(PLt&{=ph`u*xh4L6>5sRM7mN3IxgY>&EEL1*Eu__c8t58Hq8A`@@eipUVLwVofZ z`rW)@5Ehv$|I7f-eZyBh_Ja@+C+H9eP%c0pwXZ#dj#~RmQ`TPW+5bE14_yBf>wn~C zwf;H$_5zVL(;;il9Qd337fRmwsapR&6K~rxY5d2p2GXtn1#b;n`PPa`tZRiOZ!(^K z|DvyMTUi?zQI(K4-}_|ftBY@p?f{*&{(0ZKWNz{7FMk>sF-hc&ELY={#ox;}u5APz z)}MU(%(@9@JT&K`rTOTO@`h63fG{eIZ~I~`vli>}G>g@MMs>e$*8eiUHnxV(b}SX* z@Q7!0#i|)?vQ+vZ*qOxChks-_9!XS@V^Ir_KBe zsa`=T`M`I74__RWg-g#{vs(EL3V@)#03kzYIKRebBxcdQD5x7hc(<8^Y|5;Hd6|@X zyDhJsk{dr-QUZ)b%vKSbm( zpheV$$0%=>$IX0E(rA|z*5OYLN!g3>NmbDMVLYbu{Q|~x;MNeW5EBT37o#=D^K*<3 zemH3Rssp|>oOX*dvICtKMAaZhp!@Q4K^-(B&^;zOsDtVnR3`^@Pz_~iOma{M)iY78 zg40$+yRrz?2y~B04(bH-Tk7OV#-s*ykmGw38&#}vBpwl9k+qTNo0=r9mbs0*jj1rN zo$6xQe^&}hb&p6Fl#5ORWl?va)LP7im<|a2&%^fF5uLzRrpyW3@npY9?vi^6%M0(s zK%KBHRqdPbVR+6)`!|Ix(bfTM7ao-kw!eWr12|w!6>Jq;mlSgF|Bu1;q@wP^_S2H? z!gd3|*ge?h4VO(9euU|8D#7S0dmz~k5iwa?NZGzWBn6dLyq~Ou;A2q8o%n4r)jBg)DOV_iRfOV(LOey z_p<*&+%?M|k{^KMhfZbu9K5yk-iy72ljd=6ZEy6-Vb}KH1x}_h4_6qCc?onJi{GN} z*YF&vN^s^Ks!DL?Wvfzw;W>D#(7~DasVc#l_pU0znYTxke1_*GRf02blPbZPw@Q`Z z%v&KP1Ueo^L7d`CFc7?6gZ^Js!QWJfq5Rw|Vk|eBMGWRTvxw2mG>aI{Wo8lM`LS8V zfU3+QMpSMVF{BY@5o0>ZEMic@qzE_8U=$c@X~vj%9_~r;p~P2xpy(~CyZ)WP3 z1a$<>{x1GpCXS2K=C>^9Jyg^Wi#2&=0egkR1!;Ghj?q2`gALaQ6`Dt9dPYWNv|krM zb}7~o*uj0>^iM)8h9c9m5j)`>6gVNVFFY7w;K(FQ(|<@05*nzTATcuKQ$LsW5?a($ z36poWlrZzBqksc7O=seVDRZHp*U)hcAtY{X4zGSq3B#7>%+(J zQl$kQ+?P=<`MQA!tTHO(JeiV6@81F;7!PAqqX}I@3u(|WlUpNKs zI6vGqIFfjTU*A~)hq1VNZvq-5$%2U{Fmkf|`bK6nPn9grl@PEKL z@|?42+-bN@3J*OU;Yy(OSC&F^7Yd@{{9J0_L}yx{EEUrN%k>=bw2ejCFUBQryH=$) z!SgJI&wvjO2dJ1Xjg=Ku0~hrtzcDirpT^b~J4QOUzt>8c#({drtF3-d&_{CL0T<&u zSpkG zhiwAe*|Ngr00@moZgfs9oKfTwNed+9=xS}zRMUdA<*QPs83&yP&GwvVrUj0JBpRKn z(~QFkj!xBS#)0WZr=|st1EY>k)oE_7!*J1(s?)&Szfl@Zoo1}{o-6ZgcR}`X&wiGI;SH+&CpWYGMYMkt44)2(oQmO#2K^Hlt_ED7ms=RNCGh_nV)%W` zz&FG2?~ds%h8NL#r~ji%47b8yvSGM@7&hfF@La5 zV7QlR|0O;QPk*$36AWM5HywuWKJ5Q>3=cp2n_~E#A>GCB^EBnVh2hM62ZoDma#&%Q z7gCD8dMgT|OYmKp5|FQx0^;y;qmjITK!*@3kqt`U1V0ffz-;EFCQ=+{?40B^l(j^`{Bprr%Kp9fiXXz6BB6W%7 z^0~^U5!iHz@01+AY#`=^uRZ8eRu)sLc1wrI03y4G-7y}{|0LX+0)wO~AMaC=1bv!< zP>gY-0j)qB|3i4Og=@+jCGi#T^ugn(VX)b+uNEB``!jHhn~*O~N& zyss%G|F}ZmsY1=}Wvkk=rC1J|P@hx~Vv0spkv!aU7@$1dpQM0?`z;Fghl2vG9_~`d z!zIqE{x3ZrCLe)CBrf|KSIH$oFpPG?U%!Y8%j+i2QziILDpd*AzfYA4aQ~+&!Ethe zD!~(Rj4HuxlCMfW!_!Zd;55lnCHPFfsFUA-%Ve*V;8=S{3NXbuw={!IyUWVV5(`*e zNg?^ECC>cR63I`c0qvtf2S$gXkHz3|;j6~Ra~6LtzanPd0RD{6H1n8VCtZxrqhF;6 z?*oSK0XA$Od|#3uGf>cHBkvwZ;(75C5YCLQ$dUW$NtsPMumHh#+(Co)!ymcXg@5Hd z#hsN|`hJx@uryS>E#%#R(+O)!*H?M7O5L}&go?N4#6nF2y`}5r?eLqbB3VDcD-({u z0f*8+Cg@vnI_3!XtvEn9N)(PVrn`tM|e=du)5+{{jHFz{$GpqY^v|$LZ+em$NM%-4`6|n zkQjm+5R;1-W)usL)H-Ah?wXCrZ#kzc;?b}O*l~Y@59E{2=Ul?UFbmr?1u{7xfS0iW ztTo#H%dlKmBP<-5Xaq8P`yk zp!gnsIheU2=*2)*vprk-VDItjKt{O%uQ)nkwIb?#AbIHqQf}lqMgpX$r|DoM`RPXj zd<4JFH^)-nnicSV;lANjo_hBlbpL#x zAyGmq8qJZeavU;bp1IdNlgtgMhz2(*Ly_SmLxu)Z=l^;3K8KE*pL^f$_y4}{@ArM( z+u3`swf0(TKkHe~u!hfyrtvOj!KOg0`xW;f@k5-BConG-m{$svF~3o3RfYZcR1>hR zB26>sxRB}Ku zVAG=9r}DmUNTa;6<%wAgyh1$Kh!AKP%pkzeSmg<^xehWcr9=gTpAxGu;#o`pjz>a9 zZgam4ar5|qyJC3Q{GmYHpP{8t^rz7Li%_}NFP;``y%*RPhlJo{8KHP^4R$aiPn_eH zEHuBt$Oo5dV`TwQHTfU_JRu)Rk+WW;R-3FF3B48igYp$KOzfch!r0|d%>Lfaf( z^lgq+CQmt8U|Rs`?;^(jC|gK8d?{jhIK;rVn$9nvBQ0ZKenIHcqL44FXy`VV5e^mbUL|}zgiP1rm11HW3nk;}iAZw1nju$HDVwoP^Zop4T(Gpr+M;oirPOg+x zLxd{H9<>wYcf6z!-_Y4UlYK*lq5^?ck-(~euY8Z6lBOfDy2n>86e{0FPE7??HxQ;L zv?}7Iq!}Uw3X&(17nF){Ha#UwMOxXL^okIzzv%sIRFlb`>Xz{>gJeXf;bpdn0>#(r zREH@Eud(Tw`k=OWjj5oln0oVPYL=$(B?bRgdU<{7d^wXIT+XvXRqye!B~?bGMQ%=-eh;_Qpt`Ikfbt;Z^ddNN)#yUNUbt+*WOkn>- zIBe#kU$f$t4WhC@-+&F0`mN>@kVaB6@kj|~Tq7>FJSF%qj^b>>JmWDJ~;V;|q zmE?d5(}eLTZuJMNJkoX8IRZp5sd8HN`*ZLeVe?ivk^wDtDZ_jy$@n;++*HuK-^g>Y zPO#}0Q-|tI1a^iXxG(LZ*nt>WzkM+2Ci(i6V3ls2b3jBTbq|;VsgJJV-rn+Ax`BC3TGR(}@ezbrK7VaW617W{h<*nC??* zn#%!#E@>PGYFbB;6f;^W&l>{kQJ`$EeKgyNPVB|t1#;fQtd+BUAls`Wx~e@eO_VE= z5WOu~`Hx`iG%y~b6BvcJkT$^_&*UpZUyG?2aq zuM5SKjn!~QjicC2>Ie~^2vgEfKFH~aqG^zWK(neqJu;$byB^LK7y-BcHmW(zDc=i92o z467lhe03@zrioRWajkN=8p$|#Al>K_A-%%J$tBj(iT=#&jAG=J0Zyv}tW%1-&wbaY z5XZFnHHYODF2Nz)JuU1APNL0_;jDw|$p$rinDwGOp3)%fVHi}ySSBz&81oPU4BLH>B~=Dn8?nzB z_N<$d?hUJCY^T4$7v=G7uftm6OH%|O0}!bm3v6$O!#D}2`ib>&Lg=E^0sR(usx$FG zjw>~)+&W?H6S(03Wo9SM>m2@p4aVdl?LcOXXN0eL#!q>IT?;~TclO9)3dzFEokqM= zdl_jt{OISk;Zp?WIC}z50V1Gh~QcB;({xzs(5jc5?W~DT>|G-5a(YYgye_|&S4O99ce7^RcItJ z4o?u*-xy;h^8PSHr2AQPhh%M@z&6h<4o`O-v{zqqQy%`6LytnybvIkO7pZ)SzJn9w zm>!eKGrumhMW@lMA&?Pye}VjT64h#a6xe>9^*a>@Nk~gnLXFj;t1+?=V63BogNY^^ z8&nrlcQT|^+BAdSI*(UfgySYLgaTNRA_i8(iuwudcVM7GFn|InnoI*IIArY}AP$OI zERk>64sa@R9jdOv!G=x=#Y%$f%ib;mRbSJ6Kf2;uwe!(P}tLJc;a3_fk3B(e-Z{M4hU{EeYPYF{94{Z2(N?kX96M1 zvL#z#QIJwOhMWm;pj03#r#>W5elFj{MXQPU(NAl&Y0(sle~vO*%PkkEcnoV9V}TL! z7HA)3aV+`OkI;$GD^vKk8PLrblxEy6^ILrFqt0qPjMykULVzh_;6(sxYagXyD?Z_P zQ|GF|(kPtb1&Ed_IzrpZSz8$~BcEoJf4zK7RaKf&Xa}Cy6`t1(6gp)I6NA>rI;6!4+}f(-e<1{D79gGu zgDsNFK-qxxV0W?Hm&!A0LiTuE6Jn@+M2zSw?kvDUoo@b3s}R4Sw+9$wFE1_PLVKxw zKktzd0IVqjW`q>RCS*(psgMU+&Jx;#3>vZ4eOxe}Je|tBU>t=wX79pFHjxFJD4j`U zLy2TE2p+`b%Va`hL5yV;Xsta(En05jK_Lz{&W818HirNsdN@FDCDbfAzp?rhniyS2Zh~2TBd^cv}F~90$?iGk|N>$E9XFN3*tO< zP%Ww@Gz2Qj44DbyTn&D#o*_yy#CLqJUN82*CKxOARgp_tnyDj{5q&g14mt2esi-4{ zF6!1XPhQ7VSsk0o>xglYWU38ALs&AYOdX2^wnc(CFT)?}Xo`|d@m1gJXwN;{5Uu@v zKIHGzmaQq}g=(O-AZ!X#;h!}*$O-wRjJ?;qI9EfKp75*KCI#Ek5(jKVj&JN2~=zky~V*^39Wx3X#`bM4_b^ zxCugw-4dAJ6x!Z)!YO;}F&dkWGYF8BPVHo~wavvlI@ljhytW>LVXv9!3>T4OsR2$l z;F~)eAO-Zet2N)2Rz12}f&{6^%^5^-#L-$B*SXT`h@)H(ZK_}`ORvLT<{G71D^Nb6+Mu1@Iuup^>N8bHRm8j|df)JR3P$Pn{_4N#+N zjvDCT)em{ClhMvRDS@m87SNJ$Z_?CI$8_!~sbtJ+0NxAp8I+eLSpfb_8IYTlrnms{ zHxSQ*ykwTAVz2Y}!7)g|U&=p{ROE^YMP+>WwxUl!7HvrKZ>|zGv!2IPrnP&)0EPVX z!^1^HaOjU`bI3RfS4usPO>M%a?!=_FL~6N{Ns69;M8&#Spx>Z3m&^8PWns9Pb`DUt zk*s(DaR}Th_B?ea===u~iP(%UFxC-5NP2Tc(mMJ?AmUc=Md|QUpuO{9#S2A6=-mQ% zD(Jj4T>#M|!ni!THKoK5e>Q^Qx3O#wt5h_zhG$zLY@W`CYamKxt3r>}zB)|LQ4)xH z2y83(&F?}wV6-1Mz@p}xLyB@?=}yJqX(~pODcDw0H&TaZ!_`4fh^PESV0(JU0Kph| zFQ(j@7l-z*>%X8o(u}Nfx=^VNfO&NBhkD&+d!#^AK;yO;X_{GsI#JQEy?M+e6*UM* zfX`0HY!hF^%3(Z04uc9Hfmo#>ONJT*)+Gb{oD}(2-{p&YH3T_$aXpw+cUdaHi%R9& z!W6rW4-tranWAhcl?p-JOf~tZq1F-*fEPCvBA!Tvwt*mJX@yx3_=0GJCB{)y(>N}~ zGip(nHff*@_8fB|(TFzq4Fwtm+KK4FR~mZ-@?tps;3XMFFl0j%ffop>qLoB5sX?Id z*<$LD20qH)qK?v!#1Vd@8@?2u1s*}Yzte>X3nf7O1sTQ=mI%dGfXEE*+#F*9Q2Jnd zswUTvNJfM4mY2&N8mC7UJrv>=2x?v+#sqypFAr*RwBc6<(a?X*}fxBnFg(3c_QO9zAX%nY`jSZDxj)Br#RYm0zn`& z6he@?Ln2^K8Z$tQE_onVBsc*FtuWY72;34;I_ki;&2u6o@VoMA5G)Gm5+_rnGo?=- z#kUnQH}3Uo6QQ9KRas!nqik43LG~?4Y7nl@PzQM6R9y%N_J5tD1tY z)SYst&xMDIFCR?m38U7~R!E%1=tG%*36Q;oqez<#W;G*ABX^|FLW&Zovn*0)hCfkf z^6@b^zGTlEFe58J*z+v#5d3!L{41Q|_!c<)jYvrm`WE;*3M>u&&cu+jR8KSk4|Pp? zFE)`Eo9F{BQawLP1UHj75GMUX`6gsWG+|f;pxM39zl+1vu}oZ&QOX+i*)*VNDEWv@ zQbG|nFOSoqeazTd2Ym)DCXAcUiHDsEtpv6O=;7Q7esvKIx?z10qr!x?pD+mu)xs#9 zY-a9EK9ohu2Hgx2p%Hb9=64ypPf3Gkqrphk>v)r-OEm@uSo=>6_MaLnnVIA&&EN$< zMWM$v$8Kp>g~n21WM?I*u2Pq#6xkR z=43UKab8H0x;P0dkvTLhWt&0nEN#$1lf3e#i`HO<+BM_wKu3S2VQNy^NPF>J+Qt$+ zpQA*F;gYdJZ_+Wsc=IItW}AuBPM7eei@42KB*7d$&XtgcdcheMn3wWIuLYPfHizq~ zFun^<7;9KWnz}TC$%tYYs?hE5hl}`i{Nao`{xC)k@i^Hy5+ac+dIR_&9>&;3Qpo_A zFI){L4tc|wyy`-N*nIOH*R_u*JszAdU%%2s=KsRZy9Yau)~^(^>sJ(f;F~lC!vJhz z=?Vj|*^q&AZAksgoBEbN*_bq#OdEB6FaRBJ792Bg5{bE|yBOn@qZ6c&3J%Xp=4kXKW5}YVWmiLSgN{!4m{}5@Cpw$hxd!$u zGj+zZG5rn?^{&heX(7?;!b3S@9*^Lm9OTn;j>cT}mf)cVvbO{eHHf_>cqm8qmf)eB z*js{!8cgs|4i46)^}$0$gNW!s_i>TxC62*^93CnyT>YXt+N}&52+;Ei2q=ojSHAxp zD9VyP>N`-Be;xZ8Fi-zK;6;_IUL;Ne>LljBM$--0;5cqXSIep}WyV;vWgK*S=KNj^ z)Pi3NW&Vi_iSs%2e_E3H5H}3J<})E^u`JxkfgG3#1(GscQDa)Sxfr+14kg;F#N5!a zo45(3?Mb0clCax{7>&muRB=UIfLma625iL_aZLfn1I6xW>V zV}PQN51l$hIzuR$368{+oRera19uw?l~flT;}zR_oglxYdNrd!5ycHmH`#cg$5xVQ3x_g&MJ{VG@4k96@ z292tdJB1q{9Fl8L-7QQMZiw(;gxB4}MB%0gk3@LgT2eT=yC@3Zg{Vjd?t%r*peSo< zy6@=bkmtq@l27<{k}nQ4Ud%QRA=OeAj8Om9n!jlKT@?y#|BKY2<^LpgqC_FJeBCI^ zli$WR>4q_Y^cWobC6*~p-IYe4h2s5c(DP+_SQ2$A6{7}dZoF|8P+OeKQ z`JiVAMAfo`P0&Ta2Lk0vxVF~-+gB^;Ttw_oC!1hUme2@*le?U)!S^1(qakLYJJQvU zLO{r%LU6rPU9RWF(XpQOpb!iJyVrw4Fa+E#MTA>eg!6n)^2C<0<9QNovIIKM-#?oen!{&m+WHgAbtt)O9j9@tH z%t+##I1l11XgXz6faf@$C5{0%5&l+p7K|WfnYB@%WfEV=G$KV27i%x zmqacdLrM^o=tyX;yOQ^hSe~QxFW-4?2gTOqIhwZpFBy*?S1;osxIV^1aD9x2;QAO3 z!Syj7f`7tzi1~r>u&~bo#HuEy1NF)OiF=H8p`G0fd;Fpi1(1{FhGlV zCx5IlBiHUiz_DCsBxg2SL&V568rLK{pbxW6+588t%m0a7oBkGGSBqEwzFgxBCx+6p zfy9#PX$-}KqOvbx7*1<8l1cT--6=66&q&#`G7Z9vIc53gH<30x|36uzbt*v%vm#B# zUq5TEmn5jz?L)svnMz#4inL#(R72O6i!=t-ZYFq#VK;wbA`Q~DedO#$Dv)8f90hi> zrBhlYbR* zO<--3V*Sq(a(l?mR^Y&&8A8)YZYgl!&r&*ouM|1(XDNSsh#@9g*B1=VV0H{o!3|^E zjc0D)6nPTUFueG`D*7;xHwZHQn@Jb^@*j&nRX2tw?IF~FCoUkKR5-oqDZ_?Z3y=)^ zsazSJBvbCc5`Cj{{wIn)5IZJ{u@308u%BCV=J$SNJh|xmvAN!oKvQ76pQTI(J1H{W z&r)jLmr5DrWVtENaAA;~`TXR}H|`trkzQrwUkxk&w3l2}5QNOp2P6ouu-2aZaKsFrPmguf)WMP<*|5_X;e)Z+iFs z&H9*+DZH*(_utHwsE_$r!qV{CcUR&_0ewB|#L1-JFPbfYWE#tazeqU{tR-W@U!;sJ zL@lr&UCx8rG2s|PVmL7e_8ub-(;3eePzsmiF7D}Xrl5tKB|pnqGDCqSNp~~4Sym5u zXZX>@^~T6T867nHYu)^n;V!K{kZ`~gb7okzt^@LbjSqLBc*$VI!}%cf3Uc*E%;GGEg}K-xAg5u8ZoHX)%Y>bt$#w_sxsA*51n0L z2Cn4u8I07M3K_&0f8NXujK7g2l^EmC1b2-7r6Yovo68Eqt{bKN8~Qhdym}5LRvgb` zR38nr{-As@Ek>N^2w5i8YcUWHikw)^FrU^EB$Mh@aVc?qPOpOUop9~1oQTI6QkJMIG8#-_X2w(m=7lXkN}OmOT|UFH@(ww&8!rA-}rPvYsKob@*~cu9R!ZA6srL zi9Q9c{8`GLG~&Pt$se@&k9kIBll6z~*sM1UxA@=U4gX+;{)o`*gAsuGv@_G*^*bch z#9m@8OGrDZUIRPgMFs7AmyHj0p!moADe*65qHD@uW#V$y8>-86O}-&3%jY=i#@0K; z{C{$81H_JrqRw1rZi6MPqIPbZ^&{iSMc0qbRZ2omf$@Hp@+{a%k@0?(Qi{?qYfv>Y zu|?JMi)Z-o-=dEhwEdr>I+tQj>!0Z3xx{W_tyA{ITfg|Z_9Y~>Ek__^yzG?%Ou|~8q9~}8OwmbNNJ5R z1{nkXBISbXsD;cECjOJ_W5`0*6NW7Ow|K&`ddNG%j}mwU#s%v0gqbd@sE^+>tfkcz z(hci}fO7wXKEBPy2iQ{lLyE7fkFV7Agr9%&ga=;$#h{PBL$=ZsTrguU3VDn^ma%6& z)4no&{Bt(Ntd|tc`bp*A%((XDKBp z{U3V5ztFW+7}NNNx>jUOB24Rw4e`;s-o$4Lx^_AnufoKKQ+&PhPQm{uKKoaB_n)I{ zk6-!5RKIAh2ohj_OV-SG?Ix(J^CKV-TVeHf;5 zgV>Vlb+Gyi(^WBirnM5uqXIRgd4h4PRas zj}QGjjW>~Go!{R{*_VbF`v0Aj^OKRX*}pvT`-`p>0r$Q>Nys!Yx&&+HDJ*c+?19!7 zYdQ5K_S3f@_ES*5FNx#CS}{l_)vNAC5B0ga3X;(KM17KwDZH*T`#-?dWeKb3>h`>d zrdF`&ekQeQNWT3oNqCFchaF@21q4GJ@dc+yS-j-i~-c=^)kIz(d+%naFfOD-VA%Etf-XXcCz?DBsc?i6w z$dx}!`3|N3d%a!`{OEtEb`yxTF#l^te6*tz@tK0!4P)b*F!50oU$4kh@OsM*)F<-( zQ`GMH)8Clt7hdlo5@0M-{UYT^j3daH>K7@u;^ex^&`;mgE~9V%EmLg25Zux5_F3Vk zIN!^vg?iUp8FXftZz#kU@Dq*y!hAIhziF*PGO3<2#n;Px3N~NBzWSK&KSkf#pZuiPsfGygu4$Wjn)KTDYn?ot$PKTD|x$4^n^hA0bXXzaATSYaa%$M;zk9PJB^K3X5zyr{%@$< z2fu@2e^I%Oj-WSm_KVgZxVY7jQO*aeQ2CP!7uq)%6Z4-TDKFpf*D$Q zFCSw`Rv2TUwFeA~{X*m}BcEQ05-SQm#;U8|*=^sEVYN|4#A;^kiPaReu9Ub-thE8j zfFDco^$I=(tsAntKEd~&qII2))a9#Rw3r$!-oK}KAA(!{p5irzpLcme9mV^<+uv1& zyZ;aU-3<(9Y2_Lco9%A%7dDJ!b*0*ki~6!fO%TkHtM2>@D3-rZl()(3Jv$ zQrK%U3&T_$tZhR}FM)c%a5%)ACr;3e7mOVcbj|_6IKNOIw8elJmb=v8Bx=Gl=_Vcw zj2bpQVbxG-%!F7HfJslP$)YRNBHZ!7Fd3JYj%@I75w-;xqlTg3__YijieKx{F8Cd& z9Wx(sbR3A7u>Jw1c0)1^hBk_t!cA|)ps|eSp2gHPf%WeI5ICjau_>I80%dZ_`*Y7) zGAYoCvLq&Kl8#Ps-OJl@&l<|2-DS}Y*=S{MTwk$sBW~P6%@m39IW?pbWpLx%RKzM* zanIq#IRn7HaSMP-#5vO$Q(=v)GRt=2d$^*JDpYL|P$e@YofB#Sc;u$S~@* zPLv!9#1=~?nBsxo%tjfq#}|hl=SB}uMh;G*2o>!mJ3u<1`&3fVgzmcm&qC1@LS3`U zlN`~e=IF~6Rq;}u;k zc3z4=q=v%;M7qj!$_#{p&>Xl*8GQ2_LfZm>P6J*y74W-+{Z<6*sw01TrYGaAfG02MrzGx#EBd?EX_bP`zgJs<{$0RRb*Akf%)Cx{KjT4}g|e!BF~ zt2K`0;aRflG3~1pS1hA%k6nIlu&;QQ?NG@p~MW3lr3hl;Cn#dO2mo0h} zQ}jR-T@E1Ckp@G=Doh(m3Yt(uN0`=W;QJ7CU=~ZXz4nr9uo-a*17XEWd8~}{-w_W` zKVps1)cBMiPB6E05;?1cb`;X_=rjf`6geAG-vcb0GqxlW%+F$S#k5d1!QscZO0u3-%7DzZtW4I4`ahdxvx2beKCJ)ilBl7f>}# zzW|#Od+<(W9 z<=JYzZK_TZDj$y(JrbIXI!)slc6n4f$N(?*D~}Nl8M0WWgZRCpJe(@cK(1Nd*l&Nk)al>G9}ND z$r3bN240lRP~~uz6#$pW!QqTjv|UT+7%Vs=>ZhwV#shNWNN9=1lH^b~NqS>EeS$oa zv_ug2b`A&uzMYPXq*jB`nO!8FY;r@yyRh-L6kmY&bk$QW)M>*3$DyZm*$v6{Mz~ud z4I3cQfnXw@iMHm@As!hLeMF&9AWU9k&glT?EKj5?5NX}Pj1^a!D^<v6UD=m59e^H?ZqR84BVY3}g`YjH<^u0zgI*eL@pKT4~$p)o8187B<3h z8LvSs@jxj$Z3JMXR4wuK#Q*A0=a$qu<+{L4(LqTC)TgLNoI#2W1~o0_CcmS@fty7-IBaT8Hi_mJt8H^Rvu! ztD)m{-lCI)sY*732tZE)E*vokV^t9okU>?p5>?0h4s=QY)KQ^Trc`esWC|lY0&yeN zi)0=%&NWuyP`@(t;z>;cC=Ad;K(2dfeHMZd>AVq!uWxjgnD=HEFnvR`kYqoe2vpIU z7pM9P0fg>_!joZcs?Mipk?I|~#Hl(rp(ol?6Q}Bmpmfy^2%%!rRa@hZ+A>|$M0S@% zdYU&qnR-`SdNW;xhA%kZ!$n$KwJ2kOilICZHlS9NJPS!ahY>0I zhun?uVD-Hyp0*=k;#7U93g8qT0rADD4xvZ1{5WXFm!`y2z+tvaN7|EeZaaiwUFf%fpklf!|0`El4AgkdVDJCn`M$K5Ppy-Euudwg*9bF22TVpG97#Zx)D2#0$Q1S zeST2cIlRk!>p~`zP~cE%ZGcRsx|f|sm}JiKTC$&2C5M@$Agt^=f0sR%ZNUxO@3j+E zJxJ1Lo~JIR?U)v;I*0^(IK-bM49R2^(3SYJ4~;>uakwpiu?*QlBoH67c}3Z&;Z=^P zFl-6{W+J9Z9-tA>lBO~D!i-VNcj(v>Exe1$QLR7G^H(;F1*mKVh)7j26d^AXcR(Q}MB^NDBF!IuqjZNRXpK^jY= zWrdP-kk%>>bkSIHFRT%7sor%GVGJqdbi9lZ&a%Q#l_hy$nv&Oe0ebW~F7gj19uupU zAz50qNhYNRJTUxtPoDUYu>;I4c*e;fil|T~p)WyXqDU3djhkK0A|s9jvt3fuTP&>L zCehM)i5r6HQK~nZF*mkKkc=lzU?9`Two8`kIa3Vs=`WXl;u5^d6ETUtOTaXqSS+Ck zl7W;b-58RBX~JY3lR=S?lJ2~?7%GM;!US@YHc+XIj);k+deVVm*c-#V0VVDY)$R@- z$^qBm#Iul#$P*R-X&2;2N<{2bp}iIqf$K_z?uT_jr8!_-G;YCunjpQJ7;xT~82!D) zI0wXn?@Bbo>1^L@Aw!`XJvofoaOy`efsYEm&k zs%@9tP>B<2YUd4riO>#q!E|Y*dhFvD*iwcO#=Nsi(78ljp7!pP5M4)+YA7@TH#$Sf zF-~IxF|QNV6{S0h$XZd6m#uxSv~h^KlST^O?S@yz5WbQlxqbsiQO0(p3-RhIl+q^&sxJRcVHy*3lV;>8fk-h!#e~YTPApILbMW zMg@+x1!2GtLr%se{Y%2MqP0R0>k!v=DlXKr%-P9U%!vlpVGh1xR2~GMRkDrhSR{h# zATh}NlbUQo5mFP9u~L(5%x?+v`FV$R83$F0i&~YVlCpNF1_p(cl%q>31j-o#90V%L^eUV24syZd4f?0lU-jKz zla|PW6fSk*O@`qc96X_O&^#}e2_2|kj4S(sGk&t_1RF|TAS9lNO#2?eCU*TOPYk!^ z1&(kA+%m}$YIA{DO9DtTfygOXp&DZ8$aUH8eZS7g^B z*;W4OUu4g^i`o2p$*z&n?DJyTRi1u~EIv?nb(dWi$gc8q@v`SFvg-la^@8krM|Sm* zU3F#U)X1K@{!nh4IHf2Ok@9P@hy5YgIaY1wR{j0 zikJzA_vQHEUXh0Xp88NJQ$UF@v^Yz(sVJvE^ZlWy2?sTxmhO)DAfyZZM%x}p*9m_U zWt29>H<{sy4YkD6;9vab$r0ecE_j2bcMm3~P>vVc!;ER2afoB`M#^;Ox{YG-!@a)L(z&&wCH%<@EUvsXT?~iX#xpm8-ud`J6uZO~u zB}!nwPO-k&vZql0zIdMY?Hf(;R&Ug9DroYr|Ld>2-{4Qn=d+a(UrqRua4t;8#3#Z$ zxz|CJBHZy%eH&c^L*9sk1kET&Fj;>CdjD##@()Zm%6E}Zt{6w zOWS2$>O&*0Ms`jq9}+*{ko5DS`D!jTosVs}aAWC%h{JvhLZyiVrmg8zzBf9v{aC@V zR<#q=4m;bAT2W@vs)yR*$VOR9pLUs6k)I`AHCXHPvCxndqie7Ja3B0mT}N{0P?6?z z{bSrppOBG%9K7*F@NQi<=MQ&2&0ON6Z;|)l>BBw&(0lnNpk9Z#5t?$)poqB#qpAN%EyEba>`Xu7Eq0j9#r*)-= zJYdw`J-=sZhl=ywmzK=!-z>biVZ^&; zFGolWhjdyQm>I_1w|Dfb%g+vS$}=2Qwj_6*{^&|Yl%-dRuGNG+b0W^PD|H%o>($(& zBU*Jo9=k~?(0ucR=&v_N`>AELOWm4#&!DT#qHOJDzkS@m*D>={i4T<-n81&Y2Ul z!nZw$igYm7RJ%05dR1J%D|t^hNBDM|KjE~CZTav`Gb2@=IQgh|n*XAtcwt~dqbFNW zw>l)&+w;DCNc@(`Z{vgQV~4CYpBNL~Dr4fpr`y(Oo7hc0+%E2bmgb5ilSf9JHU9n) zQ}gz=I-_DWrq}h#hYt^qx9J47NPOcq5dge?JstmoHK9zndg~PmnMI9@ykBuwR_;M(njkSR`UXzd3TDw zHvF=_zD0VouRTMKe40LL+{QEAPIpf2+cA3Eh%T4zJ@+-UZ}~)WzV!i%`wctmd8v9| zI8$(8mg|DYBVHS2DF?4v^u##S>UHCy+vG`NQGa!Rq=04Wm9^)9}?0MNPM;9S~Nscoe@fy6e2|Z}N@KD6fj@e`omS0lS9X zY5n%yQeO?%mTAF#wlx`b+}7ucr{Uu_N++scP2M`TfBucOjn~iBS3i_!9R60?t+s2J z&D&!`M$QRPAGBi@42KSiXu}RVviRI-m)$`E?S__Sbbk9i(?b)eWe)*jJheu=# zwVz<`AX+J0_r+y)7Ypt|=XZY;l}81&zBpz|+cCWHvo7xP>#yOq^5|GI*K>21v|hNn zQzxNK1J%Oxpa97x-`~$Q+g}^F^O4E9etrB8al3{^bX=13C2hT_>Db}5)29mVKQHUk z?P|pS&o0IdN2RDGlx`mH7c+Nsvl%9@4Xb<1vC8YRYW=eN=D%sL{H?|4bJ2O@3O7cn z4EgL;oA^5S@i@+sNN$@qi;rM?jsD9&clnLqzihzOiK}u-YOg+0c{E<_MDLWB0*evz zKSVqGo_G{$X**y{fVJ)rro)kyqJa>)Ao$ADw9N{e^r^l?R|df-nDyb zjfB&>X-+=fyPsZ>e%aR0oU!8?iS1|myFcmX5nl5lu)W1L$=>w7QyoU_-Zf!y&cMr^ z_2<3ldUSt`^R~}>yp>(Hcj>%k&)26jyC0g_d__ZEkY7anT>qTtmZmv+C!(!q^xpKq z!97fC#`eMHZ9m?)J5jI47mMyjb3dlva6RFEcj)gUN_WQc`7fF(h22=wqhf0KvbiDG z$6p;cdi&D81&3Ph-g9iq^jF(Xr34*)|F);q#)MJ}vq8S)1E;Jr^;vhSHdE~CZu4PK zvq@R&UiUbYIXbpsGyjd%Bhtic=c+}uf7SEwlZn=0#|!3k%6#^@YGF+I)$~?6pWk`z zJK(y}Aj-JyBi-yJYFC%}h~jL2yp^pAW0 zXm>`l8&Bl#5;<&?!-T9;`+Gj}yD{z5xbab=R%`WJcj@ipv---NgI(70?7VrSKl(l1 z7;88-#P8mQ-3Fg`IU762Z=X0X!e;8aWvw6EnwjZt=sW1-hMvdU7@ykd>voDiWasXi zbJF|Wyz}8||1XKdPA@mjxuCAnru*`&e3#9a8@3x7mdM@HZ*$+GDR*YI_a1u7No#PN z)N{(z{?(74>03HKukQaq%e%V&R{zQsrUUNmfc4N=qhb*csD>U^k->|FA>TX|@ zH)wu+_41RG^IYL7$+GwVss&K6yYy=Im#YPri)T9s;=f*6uXMO})U+8F_Vo0e8WG&l zrgGq$do%1GH&)xI&YQg1ae;%yro*kated+hbydRZyFGlOMC(-FubXl2Y{+)C=8e^@ zmD*iPjn>#ZKizush_%t56S~*FifZQDf79ZlM^>JlK5J!->%hnzdvv0L`AeEO8cyjF zZ2ri~NNgUpx#xqHuIl_5!rm9AWsP{Rt5vikXJPTHrUkhR3rwR8+ch86;Ola??q7FZ z=rZrh@>9w)&086tj5HfycE@baq8nEy4VU^HI-B@z!Rf7sPwqL-@2meu{@||ddmNr& zD@|P*g*`*PBKy355p>G>_?@sBoetE*F5r_8#FTalyTyPUf%JaEjFfqwRpI+|LjAz76je7`SsfTPMs9l^ zE~?11vNn{!LO#&1hFb?VFDsZ&3#oWYy%`;D^&*FL-Jjd>q$ zKhSPL*L4q)6L#9o6OH@Y|Jc`%XTN{h8k>4XrO^RZqssQ9ZdG}V7p^MjZ?$nRe5P~$ zsNZb$^_L%C+4H2Y+4bRDJu`BQbT*aN`kLNpUZ!{PwsrqXy)2D=OJ0dwmDH*VE=LHa z=)Ac+AoI7gpM)NNuAbXxUZ!z!r%lGYW~S!Zxa7u}yOw*aMp+Cpe7K=$Vbtc?VJ{AD zdpd3LN^{M?gD)p?a$gPMTrY6jQfBjEe~)>~_@~1}f{<>4sxHe8XB~-X;nn5S@COP0 z{Hv#SG_bMWZ?&~NsPm1;sivMsciun3v1~C`Fj}|m4z2v^c@6c?)!tl_8aRWmZe2Mv zc*Wj}b|LDz{3NmU0_CcEgGV3h>H0d?zx4Y4uUC%0KXL5qvAs&}fmixjgs!QaG2+=t zn|EPVE`!xuC*PO0Z8EPuVntxDQ*)x9Wamj zvdcP5&)8(^&c6MdFFk!K&^`X-{K8zmVB}qgap$fm?b|rL+1oE&rd&OHWUo!k#eL6t zYk%)>O=qjhxT0%!KhJ4-b>EdeYbIK+G1=k~le<;O?|kmUTK@ja&jpX{l;8AO-M%O1 zSXsw)tJm7-EGl(8eY|a-xr--xRUQpAd}ZWeA3v~tYF@C>+MO|lB^F1oznihdW|r%< zt}SbtO*-PdQe&Q)lFzzT?XS(B@qU!WA*V(wxr3{{O&w~DW8aj#Y~5+TaLqNoUxTXU zw=}Oy`)s~;F-9Y5dz-E;)?fdyYoTPd%e$tg5A-jY zeewMIR#^w%PKs3ysmKX^QRXLoQz&##`$NyLWTf@$;U1qHf@jp;t+hS0`1;1IgsxMA zuYbC$7FjrQ0>y#e<&ZaMvv}I2ZA{M}z#T3kP;D8=~Em zzp1D1=Z}Ub?sTitkIo(QB5fG=RsRJpTSm^;oz_L`V0x%+>K|iDzKpUJKWmomx~lX- z-rATJ$vxkMA2_nqxc8S~p4H~BA8!g@9lz(@DyKHPI`0g%vdqSv~lCKHq6Y-ooY~St_5t4zNvsbIt6xckL>BRDK-bu&XlU!k3c#UYi47O*^>V zqHj!Lxl*NB<3Yzx8b3ULL$CW9q7}+G^j+c2nPacC%j5_-;T}=JB8r77dd=Oy$}ZUz{^-%H+~+yL#R8n)UX% z`@`wd-80)9T;1UHlb83`<=f@C-MCV4$$0ujyP4+UJqnG+47}uTJ1)&_z$!IE|6%VE z>@r_Wd}a6|;KUyRr>tKMJ=S^9iwpOCemh_`Zr0c?M`sk>AGV@7Ty!;j*C7c(1=A80gt?~xrhPTVgo`O+=MW&F{$muCs|51cu!GAO?B zM5*q$kk8L0cUPZTn7pl5=^8VRc4e|^d{t@MaFvmRHF`$0YWHlpU%{x^wf1{G*Zx)* zuu^*ZUmoXv&@apJ(V}3t?8TRs-q|V5pEdbGlK_plxJi+@_N@YU9X`;XH%YH^Q0K1^ z-rWlYtDp4`9IU>fcCTvtZt=&DtxbQM)MthJ;?N!j@5ju2|8&dUbd8Jo+Hrm_4W}Rddi(CvRg#4bdPc&R z)}QbCcH)ELEEH3Y)YuqpMRdMvku1C7GnzU5hYv!Puyo@fPP4!0}owa&~?vzov z24^;hPtCShjb40k_LUJybLo~_L}+p`5|ZQ%i2Su-@Z>6)~KO8y;A~}y5)DcoA0xM6Sa8fZLi%Utu*)C+%?B`-}}xnmNivFo-aE+ z{qPKnMXgquc?H;g80u~Mu;9wNkKC;Lu0tL_Qct$%@%(7>GH;u}0r6V8mp8l?oj#Ei z&+Bbc@n-9g)fVE0I-~Tw#%HcMH7@LQQj^C;6$1|qC@Dy6oRSf-MtaNn;9zt6J)`$z zfBJl4%5PN!_pbzQpJ@ZOc{ntOYyc41D3B#S3u)y+;fo>i$@ zQ|u-_H0)#Am^+(;Hmys)eQ3s#SAK2eevJ7DnUlC-5geKvMz>o=!7cnp7X zyTwbc&A-$3{Acx#aneJ#OASKXn+z*B(qdspk?)f7C)d0lEZDC8G2^UX#nOf9Q8VNF zq?-LUYmC-?JL}(PL@XOOnCE2>-EF*E)nYqSTc@S2I>SZ@do4X_y2!qf+Lw8Yo#1Qahc*?z5U%i>{b}sMj-$?nUu>08+qrmpn?(kHUTIg9ywzxKfX8-|Yq7msJxw`0 z?cJ932508P?>|`V)-HUgLvd=K_C0pBSn=e``YD^sDhuzu*f8{uVIxlDJ!$Ea8P_@? zZhf|Y!2T}#`$lo92VcBa+j2!KZ(kqL!DjczFZ9TcA3Z+d=K3cePyD`Vq4mw~l9gws zNOymFYB_#f7qLfn>z8|*@3ZMSvR}3Dy7Uc);sW|6iMEVPx4brR^h!H^V-NqFsMMiN zF1%b~+FRIQv)9NT(@RS>hz92b&W!eUwtC*V*<#bf+pd`up3$5+#dqnujP@?Ot&+R? z`i||Xd~Dj5)eGD#^{UtVG#?VWu*D}%jn@>ZagcR!;_xRPfuoLicJ|U4vtHmGHmaqG z`o`UnMfX?x2TJ@F>nuOE?%Ckeb9U7R=cK=m9WXDU<5H{L?F+qn1WvPVxw6^kS?@j^ z9iH%Y;hOB|PKgJC52))O&}?ixFL%0WW!Yw7r%7v^hji7Btqml&$7gKz ze^{5(@p;Cr_0RGz-8eGQziCUOfC`V?)HxpUrbz?4XI0}_?##G*UZt)x49qPC~IQU=DU4ed>;0mv01QPt;AwrSYOAQb!(Q+ zdV71@$CJJ1H&y$zOUFHZu%DGw|6Pc-O>w&w4LXj!7H+09YEuUb*7Ey;{G`i#iNS zT9o%;X0t9~YVCd8rfzCwm|kQ)<8@9<%#L#ruTJUj&l!5-u~mEd;LgHy*zGz`;Kp4eU#*0 z-M?e^t-({Lr|NDH?|4?wch0FB$D5w(y4h~dP=~974%(%^THDprKFlmB$IV0Hk}Ep6 ziCb`P*&kabB&-d&C@k(^Yva7U^T+je_G=DL&Y6DlL<`OH?uUCce?6e1Yr@R&4|ywl zS5z7nC0^wxyeyh)xx;y+Qes8)$jHujM|6ANH)-st$lq#pgH8Nf_q)2W1kU4Fp zCl5Qh=}h9to6e{141MGU%IDbBm0^Bjr`cmHMxubRsa9%$3C_` zwZ~>BZ-4aF$aZ+AH;b1f?3f(b++tM>k) zWXEr2DR!LMTazY~Zi^`W;;W>+Z5;pN)`d+<<_s}4-1TNp`<6b3oFAT>?6hJ<@D;Nj z&*FU4`?Pb2yj83f!spQe^Mb;MWWLf*F4 z?W<3^9_TaVTHpC%=hwye+{WyvUZZp&BkWvpi<={sw7almXzr)MYAcVmPvP#Ks2r!? zXW+!In%?(S`ULc_iYZU%*q~#VqmGB3T(q0|W+NTgBo@HCDG*e!U$uY0KLCX6DUf-kZ(2)K;|l;w+alZu_qfeYt+!(n+p!)||~> z+Ucd?)=l$tD=Guso`mRgrfQZo`*2}dyA}f%bDxmOH9zBlGtUX zD%_UaEXK5~j%XZl`P0hi^21XmW~}I@Re;!}&UD-%LucRqM@=;cFSvo(FR*Ew|Y+~04kwCTD&W7^F- zrnmU2@$Zi+Mr~gHXHs!|<@A__r+h{fZc!QUoxV8Re)sD>IaEcK z+UA=(hArz>+B$b}{MDW7JI`HOWpeLE<>p0mqWKLPKP<>~Gn>$4W9akwWJrI?bgOE(P_QVr93pLHoV1NZykd#6LXhMtJ;@4Ow!Isf3ojIbN%+m587UQK0~X< zxilj-=wVRWmcq@>VWZl(Pi@pIXUNmYbJ2mbd%dq%-@rQj;{It4uXfs5`tJBmH}#6e zv-Eadj!d+-+E~0=#muK<#hmk7H47HrJE9bD;kL#7m!X%`nvF^8-G0jU!L4pMuZUASDWl|3RqYuFY} z+p@bur)vGO{i&f_*E<|suwJY-c~$&L@6L%=KMeKA*Xp&>$T}~xN85X8elfkJmHzJA z?u_ZzaJsbUOK;ux6_+30@!B-}NRQ?vVP`6yj&_{97DZ@gbYhsIn8SNln0ycCH6eIr`6C?J7Pti zo>}?#hAoY3d~w*#f-SbET1=n1D|N?JjfJysjv9UYW`4eIkG^eB?~Ll*Y2=zus|10& zz3&>n5qd1&?X{$`yZV#Z;D!2;7cV-Te`>gKVa&e04c*37_?NlcXO*T3PcIB9ezb|- zXPrrF8~gT)+*NDM(kzTGX0BTD#{EyPxRdQRO!=~)PrkcqKhu^AUX6X;|KRipi#|qI zjoYi0#!I|{A}){V|Fo;>+}_?Z9cBg18E|=~e&5k2w!3ILwsFr}>fmu~>7!w)jy(lF z9Wv%!K6CHpr;fM&@Z`SfyCL?5>A*3o=eO|Q-!avA`P(jGHFrMx=pOe_PF`=s9TXMy z=6;;e>Q?k1vvZSP7Va?rIJR$D#;xSgOBt~PMW0s<8mH5J)txEl+U#97!fUk7nTOZE zp0MVxow?-Z7eUeDU5_sJ)q1b`a)XQIhK8+g&3v@E`eFx1-KpJD9(HIQYI`$h=7gOs zL^myF-u3kvyhywA#)`w$!pA{g#}}>)`FQ(;Rc(Uy-8*OddGhY9ZI_y1mfrRC`Q(e@ zv@x?+Iy+eKpR`u@d}yw^*6QM-2XAAAMSeL4UW~gv$M>zuwJFyl9Ss}ZU(oPYgL5UH zw01uE(C27)oAQ^ul>?5h?&!L4`5ze(bMJ1uyj2i7^o3((Xo=oDf&Orvik|a2_iONZ zv&V$&`yW?y+W73^Zs!KSuN%32>MT7s$<}Dm^p=)$o~D>&tQxcI{)Gb-fzK9-_yM=} zeF)q$X>Jm8OTI(wR2d-JU{Qo2EoEkIXnr0oF6Wg|JW8#T*$F^%+9v~U4Hp}r=8lIcjltN0j! zN*d-9Z&w8@DA>_YH;&RDh>qM(V_rL72pW|vytbKVu%w{XRL>-1o5ek8KN+n7JI4$u zs+6&+kMYC$n=l%1>SdJDsM4bZvI2ySX{07R7C74hb8=sjwVIb2kMTW9l$P8Nh#0361IaXM+@8 zp_k=Q-|o77(zG5HAMSXbIM!4OXYH#)$R>O z`;+37xfgVp%=ipUJP!MU_cHc99o)6mn%UuZQ&=njKEL(kV~v;j%1bb)!AV+%7qO3Cjed-WS1Kv(0``Ezs{mR*0r%MN`fZVieGIxi6jhK3A7HV(Dlu-WUX60 zh`PlGgbTRNCvRhgQ9Rj0l~Aiev*O;p7(c?r)IQ($hEWy!D#YlXUZ^$70ieE#B1mKT zT8fr4jk*u3drJ-ml*d&k^{l)pn-{XoV|C{wdiJ|^m^q%yP&(zYp=g4OFL=;XJ<>*Q zta64DbY3GuhQ{XBFGk12ezlob>#qE#Qm`Z{uSqchkN{S{B5FgI z(&t#1=Rn1m&JE$Kbh-nDB(Zi#vgpD;W)hH_IaLa)g-H0d<)Sjd!oSL&SZ6VEHQ6qE zkbdH=5b&7<;?pV6haP=W+UHq0|~}yXr9>@yEK;A6F};R#Q$@P z`8Dty-HiGdhoIN~4x!G(+ImKjQ+~Kxc=;IMdD#?Ye0sRTS zSYDERhY5N=!C!I_9Jm{3Y{wOKhN}qObU6SgNxwzI5#?jd)a!~7$|QO9x`%GD^a0kG zpw$0wWY$)7aLsR%*2z$(EOOKkX`jB6xxi?a;3Y>G(A70#{FW?o&trmkceB+y7B|c( zt&b}WJIhV+^M*q=XvdKfT4H!tA$LyJCeb!3@ti5_sTr1is@EyGnl>aaBhvQ#D}<0a zzcJ=$yM;aLYCaq2ys4N7D^Ei?GX_56V*U97GPo{H1RBu@i)K9|q$R-UE#Q<~Z(1h?FmLh37@d75i7bZeTqgF4}PZDe%w$d$WLIq1d^YJNpZCPJDxeBn4lCE0I;(9}U zKAZOsl8eVvnZaBPP@5n-F&ayY~*ry`n6V5N)IKHL#!m}ZPw=i8io!1F&pDm9iQ;}ssrG5&P#DcPv4Wc zQbT(s;ft`NI4aa5R>re04F1pobkV%3iV7RaJ7?)ySQ!9F+_WnRft1qO9*ZZgodwdp z+$mBPGq}oeoHCR)*ar=!m@y4}8A_G?_@}1X1MB^CM zW3`05D;XnEwT z3ZhczBzwJW0!pXzFnqINR{k!`)M9Feq|d(8vT8U?li zWAGF1qbGCSnHvh5%l=@FnY|HGbB8Eq>!PZ$s;KlecSh5<79@2Cg|twTJmn*Wi_M*< z(oOZKV6`wznO3Q|FsJAR)yG`>*lb{O`6I!~(Fp@+{+OxPe#AmJ$rf!#@I^!2eB)Z_ z1@LN3)%=2*5((ig6%`NQ$`M~z#`-F+V~2+LYr-pKxC58Oz+)*|N1uk z8ZdHX-@6|(<2XrpH_Q3^!@pVH)u1mS(0PP4U*Xp2IYMg@K#WvO2%&RF*%;f;Q`dk) zPGcJu9rS5~x8y}w{P%~oz?fzgMXa`K8GQvcM@4{uhs^#T*NqW3=}cQcZ2g(59C!S2 zRZmyxiumO0156Qe9i0KkOQfQ*B~OFi8X zjRo-Is$@&Apjskb?PMPv&jOtAMR1jRJKmt%yN;I8Y4s)C9PFkuOQ@!7)Dux@cC|F4 zV=q@onni)?Qld5s=wzZ^j&TFc<9HG!EvuwJMI)3CNcV*R5lLvFG$T|aLEc|YjjOmq zJ%WBHc&}1bj;Gid-`G6-!3Sz(h4eWHYgp)P{!q!9qk9=bG?d*hw(B z4qDMDu0h#E<68U_0ZM|}I6Fx4vXbaDW)vM_M7MOdy2G+oSzGDWY@{DZ!}p2tM!Q2w z#C3Mo|9GJgdD}sd^Wf%9*K$GqZ<~569s5aoiA9YtT%a4(72kG@u8?qgHP5|OYZrS^ z8G9#N)(Jy{@`5%-oDSn^4XNXZ0%8T=5-UO@uLYt-=1Z560>@BVna-!)X9jA_vIhH8 z(u)w~V2JZr4w?&21F}0bY2Ov;XyV!w2#No|gV|<&HM`U~&TYP3R-qtvJDWQqXO-SZ=ETbK*?*GG^ zCq?jhzzj&IjY34J!@e3IbG?sEIn#$tgGov(F50i3Iw!0{yGFZ$%`=)(S#=F?G!tUU znu}9xAsD3Flc!RyNy5dRb_nFL8^HEJ;s|b58?#(fPiUH-+UVLr-BqIst{GZ2t0bM% zkaJvWUi0yrN*)>$4ApCF$D`8Rt_kW%ZkK=4Z}jVY!u9{h7>-V%aH)Ab53i0pdZ^jq z`!oUBc}eAO?!L1)ZLq+yIp4#>G%CrV%j6c#zRz$6Nd6kFs+vkmA>2#BSUNs3x8LzA z>|^0)0WwW07XfukhCLX}ZzRwa6D#%20GSE<-AnBXI&>NLXXR1UsNT+Ii3Iu5Za?an z{?2!LZW+j|+a)8V#^Wu`QYvDiQjcd`7l^|~h=-!l7~lAYD$_E5rSQYA*J{~SB8pF+ zPdz#6j^X&5hbOtn1D0tx|xBeOl5R~^vd0=6mQ^Tv<%BZAt2|?`_Gkz z%j+{V>h!j%lCeDATr+Pa3hwRsjT6n}?6D_UTFQr5-z!j5fRatvlHOUTg&91-AQC3}f zWT$z{0DE7HX?_=nwwU`;UIrEYW)WY4BW=Z@4{UN_Od5Zd1q?OGxkC67V7oa3>A7xi5OmrMVqjoKcVu0;t$df zflz}|c;Ki{c={ZiOB?Bo%AKNO*i8WDyBxQ;ciV{XP7jNXws-8xs-No#u#i|r6PYQT zYh8%(!1fH-vxzEz)MUUJ5p2fQsTEx;QhMxR9PtH11MI`spaz4rmNW?O^pwyqf*{0gb#++(TVue z1KR9LU#Q-2h~X3TY;|8Om=Vo9l9!oCZ>7QR*!8On_E^%vT|hWjU?`BXM zuOqqRcuvHYH+)rqUAO1AkS4U&Q+wf{k>U608Y;^cQ$ot+Ompn?i>=u{&wNejrunw# z$f`Z}qw*&dKR}AXFQz)jA)OMBI&EHRr#EncDQm?c(29Qir>nZB6#(7N>=wFFT~X?BucwLaRVhZe(OjSqBnZ9f8MO4vd@l zz(B5wH5w{7?}WdrK9fN50E)``nmMg*@?pS&=hg>MV-v9ZfFZI>{$pfj_#S)0H_XP! zrLIF%n?i_c5#? z$ETA&1XR=q8U|(`%~(7bD+Gpbl3dbz1^HktjEgcG*5)Onu}oW{J521o7`Dx|&&1tw z&uV~TBN%n_XKxwthkG$@flnO*G>|xz>LsxD4YVSvz+d@V^x4ZZl&~d@ zs|FZ!Ii(S?Z&*#(vBcp7ED!VZT`|o0>~bygSF|HtXXMBTzcumOd$%S=Cd%>@ERC9> zqkCI5^R57-<`I`6qN6Cox$f&V#TrYoWCDzaPJ>Z$KxRaR($<9!ogU?>Xknm^t0=) z^YwPUIk+NHWo-SO*X?Xp8PhdyGPGd)rQVw&Q?=xESSU^|FMb2!`5t6!e*RZ!rytEX zP_yZDGKDWE;VWe7;%QO1)(oU*xIlGaEHi-EDoG0@kEb8vebg{{l&sEEjwx0}j{t5* zUMk%Am+-3PxCc9;*J^V=^wW*lF4p*(&7)dk=wWIOl(S+<64WchpR=*bZ)yg^CTDCk zGXSp#G}6*hyh4{}N%)nVC^)lt*91};T$nq!#OlKJ{cLs-#ez!P3POgyRlXP<3N^uy0}( zqiA!DTvMzP1+*IXMEtbzFN2zPqY+jrYo?XOnoDCjU64i5`~;` z)^n6rXSDYujCM7#y|^7gd`wku^2jI*-fCv|ac?ApxJ4W$eZu1nn&wz((m z))GX(E#t&qI)K`){|rVo-O^&I7j6(2aI$RKYLTYp9NCJ1-z^i*>YDrLbD^4?|0~;f zpvJUpJ`)r9Y7Dkt;zoYF;UZI-Hlfr!YV<(#XO_tRNPGYvZ(8YJOKk?QO88YFfm?_SuqWIi^D)XC zx9}UL-oxd5CrM!}L|-naiS{EWThT|I_J6w`yBf>)06RTKm#X?N76<&{QSL#9yiD=k zizg#+;^3U7IU0XNK;8R4=F7XxWTvM1H;a{xjqFT+v_8px$a zsE)}PrBDLyunIE+(hWMtp^k%wy4haor>IQ@xz&_dCMXJY&q7zr3of@RjP1R z@OtnX8_g`7>G4kfJD_e5WpmEGfB!r*8GpjPO)-O{OzHAY^}IfBhqk}5S(n!S5Y4*c zIV)yS2r1Bv+g_57N<682%8s>S%G}IimQ+T+)s5{XYXfD73+!@X&OcKAnN9Ns?^c;) zCJ0p<+6Tb~cb{Z-@g__Pt|CeT{m~--FNVp?M}r?ehX51W=m7Nzcy1h?En-@d<4hDx z-V=Xp8)2?|L@Xu=%A<9S5bl_ls?{FU)QL(>(_T=_p(gFL+(Nj;{{8B5+5ItXsiL!C z)z)&!oa?I_4JL<1%(s0u1e7=5nqaLOs?D$>CxYAo z9_}!4`(V@>q%OucrC)6&JdG6Lc)N~OjVi;Fow_}dUFj6K#K2WnV4+rC?^F|mKW zIbF=8pO5HVMxm1=vfLmW({;4|_5`rI+o-~Ek{t?;Zai|(>DL^Yp!Hn9qs~$<)|$@w zi_YS{?oWK(t!+G{G{bE}ExadIXE3fx%^|2)3iFZYjy6HQlGNh}L2n@F2LA4UM}e^3 z#l<<uH^VSS=ed6Hvsv zK%^BET`rw{M?Nm8=TswuR%pr*2TwrKx`QbGWmvD4WuvHZeb43HO=q*KHGLJHAZroY;0817g$M|ao`oW z3yostt7>1#WQarvA(2b7Ammy;>#*TS5>c&t%wnclF29Vidb-DYT#SqN2TOn18@Y>j1Um?RHoE+wm~ zvn_Fh{NlGX^O;heswCJ)8)K|n$S|TqOQa~RRzA0g4 zAJCdB0a#t#{j>Gbu%}9!!DFiPwn`n+BaYe-fVjO@2RbqddjHM}Cyte~iV3Ps|M-R> zRMrs|7U@dv(6`0G8%u$Ri+hfcy_0yafZSW?Gi z66aI<^K!*2C=z~tDMPhpAe7wn5T3Yx@}8)BSHO%H>{NfrUCtt4PG+)TUMB7M8QI43 zr&V9*UuuH@j9>;Px;Op=<>5sp|LW9Q;%TbP9Q;(9wL&KESh=h}=WLC~lJ<$1Obfio z7kSVH=32T+CM1vaKtBj_-6b|II4Y@Q9lQAjKa!^vhRd1FYQ`&KjPd}1SZZA( zm+Thi*R6tj&8vZ1*=u~2tu6NL~})gJajGbjhv;(!WBCdFLB_=Hj)B+Fxc*=@pP zsYUT92fQB{rY5lp9V-VMCrZNY!m3c7_LKx&5dI z;ahoHfe!t)aCilcXpATUvLpMKKOMJBM@E-+<0$x>#cy*nJR_bmoTfL&Uw^p>RfmWs zPMN6adsR_k&?1O=3=rIAF@^Cf`^u7kiTZ%jb_H4iLwciSVk>CeIqO(WR&+!l16A_k zKZmZ94HQTFc5^1r$VOa|Q?V=#`fwPJTLqcB0V4{CNO40yD8a{Wg!FptSK0scSMzb} zT#?2lINYP}27G}dyPfB2KKR8jcoL*OWM#(xPXAGvC$|ajV(pRJ1fIQzZzAE(^lq|0 zPx>!0MuX@*%LKJst=9+%8*aBoCxk4XB5)D5mA`W1iZxe@ud7zuScT_)5$b}4Nn#U|knM}{8w~4I))aw15{fM?+B07QUZ-3Y)MKd7 z$wCQCkEre{#5h@7jxj*g`Q2!m!Qh*3>s;0^RzO5*NgYpoC!Ivm zWAp>2PCa6LRJ|H|SHji(8_gq#S|M9@JEVv>P~6&81Q&0A>+Hz9xbMnx6P5TEEg)4xk9Kmk{@B+K5C9w8{L% z*p)!ZI6Cu*7OYw7k0-$&wcuU7#rtlb92@@W>{NpY!n%0#$!W&j>>2QhHpGkut#_3e##;;Im6M}8+YyxL22&pOAALx}pt3YtGKq4%OB z#tNO25fQ*>oVu95<{kd9-L!Y^=La~Q>R#p45J?P zGsdGvjQEDX)rS8b`2ruJs7r^SjuB7TwV4);-iOdT|_1+xsyyhWtB6;lx#6C ztflD}KnqT^#!D-jte?r5Mo=iSkBEpQapzw+_Dd}kD&5hBR_qdGY+crXxYH!WT$i|e*qz4%@#cv4O75m@XdGDP!!?21NbT6Z@ z*<~>xz|@DLh!Fm87g@xKx6wn#wZj`?p1o46MhYEY`Ym(p(qy7@l;od@N`^KN9V_x{ zbb(9MYBvU$!&-^Il2U?$*{R@tPRoxa3WtIg!ZeTr?^g%Ws{O@Za;#{@TD@as()WLn z{~gz)T3!u*|CQ!g!c-}vjUAA6b|V;Cq{x}HPXUvF1~Ki2M&n$#yeg9x&^sh=Agfeb$vWiYg8)|L8DA=?a$VCJe}cQd z;*rs(o@nY3GcW~k2PwX&+W1AL+G#R8`-yHLho%;KbbSCLP*(};zo&bX6rb66{SXj= z-vptMT`rE}Sf{?ob7|{?x+@@sTa63n=kNvH1+gcfvr0KVCQ`zDFjUYw+5w{j>;}#n z3Ojs7rot!&s|v46V*IDMAn9pxxP;FS3PkqMNu>6+p%)hM07^w^XO~P%I4|!P-4@Rs ze{YYNZH!(<$pbz)dvnYo3F8p`70fH4qzFr1h8#zL^hz7S@3C>ttLsTD5f|L^3 zf!0FVg|WhN<{*z$iUXzdu|(plxHgdDJ}L0XXExQ31Sc?gtWV9KRO3s2SbYn;hi9c1N;k-%fm`7LZ$OYLs-i zW^Q4cYPcWun35-aura%wrr~mf?@BRiR{x!s0+yGdh$O`AAHW~eV0GY@+kgZiT?@~9 z^1D=%a>(N#>e4qKqfNy2{Z>KV!T5Msbo#+)zU)J`|Cgjg$DWgo&B%%tqELP z04U+$qiXaBc8XeA^_AaxJGh|qCiHsnC3D#3sjSZMDA4NS3N;f?*)nizpmx)e57xJV z`W*O}AGeBFL(KUh+E9R|So^lIbVzN-9<{+WCK575BcyM> zB^#=E02F$YNkB&q(}4&&3zoI91U~`WlfRhL$@{ODbu8Yi7Vm2gjh6>H4d&iUb0PaN zTxHsZrb5}z{yRG2&2ZnnQ?{J&ixBMmBHRwp-yuvAw~J8nNvdAZ0n`BuLNS4p-&1_S zEIx@YeA!l&gxT!q26u;mYlpjCZ=Pf22}!w!)f0hINKH_V@n(%qbtHD>65?m!5>cZ}{!dtsi}3bG&&wp6K| z3!EcxeOlLE+XJx_fJ-z&?3FhTi!h}a`f8T+Q(HH+A#5T=+8NoO#x$@2(gvi=>f`3< z1$mFPxIu;qZt(dib622f*s`4wty`(Ai}~m3291!P3WNbLd!HKjUsW`Yi`yap;7Ms`0s5M_7(BsC>5%k8A%0A@V<775I-FVY4Juj7f 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%0A~{G&co60>pV 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

D9gU02rJJir+@tLyiiVE6Rd<>3
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�hX}$2?1-lDsMflxiQ`f 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/_edwards.py b/venv/Lib/site-packages/Cryptodome/PublicKey/_edwards.py new file mode 100644 index 0000000..55de7b7 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/PublicKey/_edwards.py @@ -0,0 +1,116 @@ +# This file is licensed under the BSD 2-Clause License. +# See https://opensource.org/licenses/BSD-2-Clause for details. + +from ._curve import _Curve +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + SmartPointer) + + +def ed25519_curve(): + p = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed # 2**255 - 19 + order = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed + Gx = 0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a + Gy = 0x6666666666666666666666666666666666666666666666666666666666666658 + + _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); +""") + + class EcLib(object): + new_point = _ed25519_lib.ed25519_new_point + clone = _ed25519_lib.ed25519_clone + free_point = _ed25519_lib.ed25519_free_point + cmp = _ed25519_lib.ed25519_cmp + neg = _ed25519_lib.ed25519_neg + get_xy = _ed25519_lib.ed25519_get_xy + double = _ed25519_lib.ed25519_double + add = _ed25519_lib.ed25519_add + scalar = _ed25519_lib.ed25519_scalar + + ed25519 = _Curve(Integer(p), + None, + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 255, + "1.3.101.112", # RFC8410 + None, + "Ed25519", + "ssh-ed25519", + EcLib) + return ed25519 + + +def ed448_curve(): + p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff # 2**448 - 2**224 - 1 + order = 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffff7cca23e9c44edb49aed63690216cc2728dc58f552378c292ab5844f3 + Gx = 0x4f1970c66bed0ded221d15a622bf36da9e146570470f1767ea6de324a3d3a46412ae1af72ab66511433b80e18b00938e2626a82bc70cc05e + Gy = 0x693f46716eb6bc248876203756c9c7624bea73736ca3984087789c1e05a0c2d73ad3ff1ce67c39c4fdbd132c4ed7c8ad9808795bf230fa14 + + _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); +""") + + class EcLib(object): + new_point = _ed448_lib.ed448_new_point + clone = _ed448_lib.ed448_clone + free_point = _ed448_lib.ed448_free_point + cmp = _ed448_lib.ed448_cmp + neg = _ed448_lib.ed448_neg + get_xy = _ed448_lib.ed448_get_xy + double = _ed448_lib.ed448_double + add = _ed448_lib.ed448_add + scalar = _ed448_lib.ed448_scalar + + 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", + None, + EcLib) + return ed448 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/_montgomery.py b/venv/Lib/site-packages/Cryptodome/PublicKey/_montgomery.py new file mode 100644 index 0000000..5e5fd51 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/PublicKey/_montgomery.py @@ -0,0 +1,152 @@ +# This file is licensed under the BSD 2-Clause License. +# See https://opensource.org/licenses/BSD-2-Clause for details. + +from ._curve import _Curve +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + SmartPointer) + + +def curve25519_curve(): + p = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed # 2**255 - 19 + order = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed + + _curve25519_lib = load_pycryptodome_raw_lib("Cryptodome.PublicKey._curve25519", """ +typedef void Point; + +int curve25519_new_point(Point **out, + const uint8_t x[32], + size_t modsize, + const void* context); +int curve25519_clone(Point **P, const Point *Q); +void curve25519_free_point(Point *p); +int curve25519_get_x(uint8_t *xb, size_t modsize, Point *p); +int curve25519_scalar(Point *P, const uint8_t *scalar, size_t scalar_len, uint64_t seed); +int curve25519_cmp(const Point *ecp1, const Point *ecp2); +""") + + class EcLib(object): + new_point = _curve25519_lib.curve25519_new_point + clone = _curve25519_lib.curve25519_clone + free_point = _curve25519_lib.curve25519_free_point + get_x = _curve25519_lib.curve25519_get_x + scalar = _curve25519_lib.curve25519_scalar + cmp = _curve25519_lib.curve25519_cmp + + def _validate_x25519_point(point): + + p2 = p * 2 + x1 = 325606250916557431795983626356110631294008115727848805560023387167927233504 + x2 = 39382357235489614581723060781553021112529911719440698176882885853963445705823 + + # http://cr.yp.to/ecdh.html#validate + deny_list = ( + 0, + 1, + x1, + x2, + p - 1, + p, + p + 1, + p + x1, + p + x2, + p2 - 1, + p2, + p2 + 1, + ) + + try: + valid = point.x not in deny_list + except ValueError: + valid = False + + if not valid: + raise ValueError("Invalid Curve25519 public key") + + curve25519 = _Curve(Integer(p), + None, + Integer(order), + Integer(9), + None, + None, + 255, + "1.3.101.110", # RFC8410 + None, + "Curve25519", + None, + EcLib, + _validate_x25519_point, + ) + + return curve25519 + + +def curve448_curve(): + p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff # 2**448 - 2**224 - 1 + order = 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffff7cca23e9c44edb49aed63690216cc2728dc58f552378c292ab5844f3 + + _curve448_lib = load_pycryptodome_raw_lib("Cryptodome.PublicKey._curve448", """ +typedef void Curve448Context; +typedef void Curve448Point; + +int curve448_new_context(Curve448Context **pec_ctx); +void curve448_free_context(Curve448Context *ec_ctx); +int curve448_new_point(Curve448Point **out, + const uint8_t *x, + size_t len, + const Curve448Context *ec_ctx); +void curve448_free_point(Curve448Point *p); +int curve448_clone(Curve448Point **P, const Curve448Point *Q); +int curve448_get_x(uint8_t *xb, size_t modsize, const Curve448Point *p); +int curve448_scalar(Curve448Point *P, const uint8_t *scalar, size_t scalar_len, uint64_t seed); +int curve448_cmp(const Curve448Point *ecp1, const Curve448Point *ecp2); +""") + + class EcLib(object): + new_context = _curve448_lib.curve448_new_context + free_context = _curve448_lib.curve448_free_context + new_point = _curve448_lib.curve448_new_point + clone = _curve448_lib.curve448_clone + free_point = _curve448_lib.curve448_free_point + get_x = _curve448_lib.curve448_get_x + scalar = _curve448_lib.curve448_scalar + cmp = _curve448_lib.curve448_cmp + + curve448_context = VoidPointer() + result = EcLib.new_context(curve448_context.address_of()) + if result: + raise ImportError("Error %d initializing Curve448 context" % result) + + def _validate_x448_point(point): + deny_list = ( + 0, + 1, + p - 1, + p, + p + 1, + ) + + try: + valid = point.x not in deny_list + except ValueError: + valid = False + + if not valid: + raise ValueError("Invalid Curve448 public key") + + curve448 = _Curve(Integer(p), + None, + Integer(order), + Integer(5), + None, + None, + 448, + "1.3.101.111", # RFC8410 + SmartPointer(curve448_context.get(), EcLib.free_context), + "Curve448", + None, + EcLib, + _validate_x448_point, + ) + + return curve448 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/_nist_ecc.py b/venv/Lib/site-packages/Cryptodome/PublicKey/_nist_ecc.py new file mode 100644 index 0000000..3065c65 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/PublicKey/_nist_ecc.py @@ -0,0 +1,246 @@ +# This file is licensed under the BSD 2-Clause License. +# See https://opensource.org/licenses/BSD-2-Clause for details. + +from ._curve import _Curve +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + SmartPointer, c_size_t, c_uint8_ptr, + c_ulonglong) +from Cryptodome.Util.number import long_to_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_ws_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); +""") + + +class EcLib(object): + new_context = _ec_lib.ec_ws_new_context + free_context = _ec_lib.ec_ws_free_context + new_point = _ec_lib.ec_ws_new_point + free_point = _ec_lib.ec_ws_free_point + get_xy = _ec_lib.ec_ws_get_xy + double = _ec_lib.ec_ws_double + add = _ec_lib.ec_ws_add + scalar = _ec_lib.ec_ws_scalar + clone = _ec_lib.ec_ws_clone + cmp = _ec_lib.ec_ws_cmp + neg = _ec_lib.ec_ws_neg + + +def p192_curve(): + 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_ws_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", + EcLib) + return p192 + + +def p224_curve(): + 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_ws_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", + EcLib) + return p224 + + +def p256_curve(): + 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_ws_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", + EcLib) + return p256 + + +def p384_curve(): + 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_ws_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", + EcLib) + return p384 + + +def p521_curve(): + 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_ws_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", + EcLib) + return p521 diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/_openssh.py b/venv/Lib/site-packages/Cryptodome/PublicKey/_openssh.py new file mode 100644 index 0000000..53b16df --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/PublicKey/_openssh.py @@ -0,0 +1,135 @@ +# =================================================================== +# +# Copyright (c) 2019, 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 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/venv/Lib/site-packages/Cryptodome/PublicKey/_openssh.pyi b/venv/Lib/site-packages/Cryptodome/PublicKey/_openssh.pyi new file mode 100644 index 0000000..15f3677 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/PublicKey/_point.py b/venv/Lib/site-packages/Cryptodome/PublicKey/_point.py new file mode 100644 index 0000000..2afce9b --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/PublicKey/_point.py @@ -0,0 +1,493 @@ +# This file is licensed under the BSD 2-Clause License. +# See https://opensource.org/licenses/BSD-2-Clause for details. + +import threading + +from Cryptodome.Util.number import bytes_to_long, long_to_bytes +from Cryptodome.Util._raw_api import (VoidPointer, null_pointer, + SmartPointer, c_size_t, c_uint8_ptr, + c_ulonglong) +from Cryptodome.Math.Numbers import Integer +from Cryptodome.Random.random import getrandbits + + +class CurveID(object): + P192 = 1 + P224 = 2 + P256 = 3 + P384 = 4 + P521 = 5 + ED25519 = 6 + ED448 = 7 + CURVE25519 = 8 + CURVE448 = 9 + + +class _Curves(object): + + curves = {} + curves_lock = threading.RLock() + + p192_names = ["p192", "NIST P-192", "P-192", "prime192v1", "secp192r1", + "nistp192"] + p224_names = ["p224", "NIST P-224", "P-224", "prime224v1", "secp224r1", + "nistp224"] + p256_names = ["p256", "NIST P-256", "P-256", "prime256v1", "secp256r1", + "nistp256"] + p384_names = ["p384", "NIST P-384", "P-384", "prime384v1", "secp384r1", + "nistp384"] + p521_names = ["p521", "NIST P-521", "P-521", "prime521v1", "secp521r1", + "nistp521"] + ed25519_names = ["ed25519", "Ed25519"] + ed448_names = ["ed448", "Ed448"] + curve25519_names = ["curve25519", "Curve25519", "X25519"] + curve448_names = ["curve448", "Curve448", "X448"] + + all_names = p192_names + p224_names + p256_names + p384_names + p521_names + \ + ed25519_names + ed448_names + curve25519_names + curve448_names + + def __contains__(self, item): + return item in self.all_names + + def __dir__(self): + return self.all_names + + def load(self, name): + if name in self.p192_names: + from . import _nist_ecc + p192 = _nist_ecc.p192_curve() + p192.id = CurveID.P192 + self.curves.update(dict.fromkeys(self.p192_names, p192)) + elif name in self.p224_names: + from . import _nist_ecc + p224 = _nist_ecc.p224_curve() + p224.id = CurveID.P224 + self.curves.update(dict.fromkeys(self.p224_names, p224)) + elif name in self.p256_names: + from . import _nist_ecc + p256 = _nist_ecc.p256_curve() + p256.id = CurveID.P256 + self.curves.update(dict.fromkeys(self.p256_names, p256)) + elif name in self.p384_names: + from . import _nist_ecc + p384 = _nist_ecc.p384_curve() + p384.id = CurveID.P384 + self.curves.update(dict.fromkeys(self.p384_names, p384)) + elif name in self.p521_names: + from . import _nist_ecc + p521 = _nist_ecc.p521_curve() + p521.id = CurveID.P521 + self.curves.update(dict.fromkeys(self.p521_names, p521)) + elif name in self.ed25519_names: + from . import _edwards + ed25519 = _edwards.ed25519_curve() + ed25519.id = CurveID.ED25519 + self.curves.update(dict.fromkeys(self.ed25519_names, ed25519)) + elif name in self.ed448_names: + from . import _edwards + ed448 = _edwards.ed448_curve() + ed448.id = CurveID.ED448 + self.curves.update(dict.fromkeys(self.ed448_names, ed448)) + elif name in self.curve25519_names: + from . import _montgomery + curve25519 = _montgomery.curve25519_curve() + curve25519.id = CurveID.CURVE25519 + self.curves.update(dict.fromkeys(self.curve25519_names, curve25519)) + elif name in self.curve448_names: + from . import _montgomery + curve448 = _montgomery.curve448_curve() + curve448.id = CurveID.CURVE448 + self.curves.update(dict.fromkeys(self.curve448_names, curve448)) + else: + raise ValueError("Unsupported curve '%s'" % name) + return self.curves[name] + + def __getitem__(self, name): + with self.curves_lock: + curve = self.curves.get(name) + if curve is None: + curve = self.load(name) + if name in self.curve25519_names or name in self.curve448_names: + curve.G = EccXPoint(curve.Gx, name) + else: + curve.G = EccPoint(curve.Gx, curve.Gy, name) + curve.is_edwards = curve.id in (CurveID.ED25519, CurveID.ED448) + curve.is_montgomery = curve.id in (CurveID.CURVE25519, + CurveID.CURVE448) + curve.is_weierstrass = not (curve.is_edwards or + curve.is_montgomery) + return curve + + def items(self): + # Load all curves + for name in self.all_names: + _ = self[name] + return self.curves.items() + + +_curves = _Curves() + + +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 curve: The **canonical** name of the curve as defined in the `ECC table`_. + :vartype curve: string + + :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 = self._curve.canonical + + if self._curve.id == CurveID.CURVE25519: + raise ValueError("EccPoint cannot be created for Curve25519") + + 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 = self._curve.rawlib.new_point + free_func = self._curve.rawlib.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 = self._curve.rawlib.clone + free_func = self._curve.rawlib.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 = self._curve.rawlib.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 = self._curve.rawlib.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) + return np + + def is_point_at_infinity(self): + """``True`` if this is the *point-at-infinity*.""" + + if self._curve.is_edwards: + 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._curve.is_edwards: + return EccPoint(0, 1, self.curve) + else: + return EccPoint(0, 0, self.curve) + + @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 = self._curve.rawlib.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 = self._curve.rawlib.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 = self._curve.rawlib.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 = self._curve.rawlib.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) + + +class EccXPoint(object): + """A class to model a point on an Elliptic Curve, + where only the X-coordinate is exposed. + + The class supports operators for: + + * Multiplying a point by a scalar: ``R = S*k`` + * In-place multiplication by a scalar: ``T *= k`` + + :ivar curve: The **canonical** name of the curve as defined in the `ECC table`_. + :vartype curve: string + + :ivar x: The affine X-coordinate of the ECC point + :vartype x: integer + """ + + def __init__(self, x, curve): + # Once encoded, x must not exceed the length of the modulus, + # but its value may match or exceed the modulus itself + # (i.e., non-canonical value) + + try: + self._curve = _curves[curve] + except KeyError: + raise ValueError("Unknown curve name %s" % str(curve)) + self.curve = self._curve.canonical + + if self._curve.id not in (CurveID.CURVE25519, CurveID.CURVE448): + raise ValueError("EccXPoint can only be created for Curve25519/Curve448") + + new_point = self._curve.rawlib.new_point + free_func = self._curve.rawlib.free_point + + self._point = VoidPointer() + try: + context = self._curve.context.get() + except AttributeError: + context = null_pointer + + modulus_bytes = self.size_in_bytes() + + if x is None: + xb = null_pointer + else: + xb = c_uint8_ptr(long_to_bytes(x, modulus_bytes)) + if len(xb) != modulus_bytes: + raise ValueError("Incorrect coordinate length") + + self._point = VoidPointer() + result = new_point(self._point.address_of(), + xb, + c_size_t(modulus_bytes), + context) + + if result == 15: + raise ValueError("The EC point does not belong to the curve") + if result: + 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 = self._curve.rawlib.clone + free_func = self._curve.rawlib.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, EccXPoint): + return False + + cmp_func = self._curve.rawlib.cmp + p1 = self._point.get() + p2 = point._point.get() + res = cmp_func(p1, p2) + return 0 == res + + def copy(self): + """Return a copy of this point.""" + + try: + x = self.x + except ValueError: + return self.point_at_infinity() + return EccXPoint(x, self.curve) + + def is_point_at_infinity(self): + """``True`` if this is the *point-at-infinity*.""" + + try: + _ = self.x + except ValueError: + return True + return False + + def point_at_infinity(self): + """Return the *point-at-infinity* for the curve.""" + + return EccXPoint(None, self.curve) + + @property + def x(self): + modulus_bytes = self.size_in_bytes() + xb = bytearray(modulus_bytes) + get_x = self._curve.rawlib.get_x + result = get_x(c_uint8_ptr(xb), + c_size_t(modulus_bytes), + self._point.get()) + if result == 19: # ERR_ECC_PAI + raise ValueError("No X coordinate for the point at infinity") + if result: + raise ValueError("Error %d while getting X of an EC point" % result) + return Integer(bytes_to_long(xb)) + + 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 __imul__(self, scalar): + """Multiply this point by a scalar""" + + scalar_func = self._curve.rawlib.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) diff --git a/venv/Lib/site-packages/Cryptodome/PublicKey/_point.pyi b/venv/Lib/site-packages/Cryptodome/PublicKey/_point.pyi new file mode 100644 index 0000000..2518e2e --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/PublicKey/_point.pyi @@ -0,0 +1,49 @@ +from typing import Union, Optional, Tuple + +from Cryptodome.Math.Numbers import Integer + +class EccPoint(object): + curve: str + 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 EccXPoint(object): + curve: str + def __init__(self, + x: Union[int, Integer], + curve: Optional[str] = ...) -> None: ... + def set(self, point: EccXPoint) -> EccXPoint: ... + def __eq__(self, point: object) -> bool: ... + def copy(self) -> EccXPoint: ... + def is_point_at_infinity(self) -> bool: ... + def point_at_infinity(self) -> EccXPoint: ... + @property + def x(self) -> int: ... + def size_in_bytes(self) -> int: ... + def size_in_bits(self) -> int: ... + def __imul__(self, scalar: int) -> EccXPoint: ... + def __mul__(self, scalar: int) -> EccXPoint: ... + def __rmul__(self, left_hand: int) -> EccXPoint: ... diff --git a/venv/Lib/site-packages/Cryptodome/Random/__init__.py b/venv/Lib/site-packages/Cryptodome/Random/__init__.py new file mode 100644 index 0000000..fd18d86 --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Random/__init__.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# +# Random/__init__.py : PyCryptodome random number generation +# +# =================================================================== +# 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', 'get_random_bytes'] + +from os import urandom + +class _UrandomRNG(object): + + def read(self, n): + """Return a random byte string of the desired size.""" + return urandom(n) + + def flush(self): + """Method provided for backward compatibility only.""" + pass + + def reinit(self): + """Method provided for backward compatibility only.""" + pass + + def close(self): + """Method provided for backward compatibility only.""" + pass + + +def new(*args, **kwargs): + """Return a file-like object that outputs cryptographically random bytes.""" + return _UrandomRNG() + + +def atfork(): + pass + + +#: Function that returns a random byte string of the desired size. +get_random_bytes = urandom + diff --git a/venv/Lib/site-packages/Cryptodome/Random/__init__.pyi b/venv/Lib/site-packages/Cryptodome/Random/__init__.pyi new file mode 100644 index 0000000..ddc5b9b --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/Random/__init__.pyi @@ -0,0 +1,19 @@ +from typing import Any + +__all__ = ['new', 'get_random_bytes'] + +from os import urandom + +class _UrandomRNG(object): + + def read(self, n: int) -> 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/venv/Lib/site-packages/Cryptodome/Random/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/Random/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87a1a081ba514659575ffeae0bfea1046545808b GIT binary patch literal 1346 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/Random/random.py b/venv/Lib/site-packages/Cryptodome/Random/random.py new file mode 100644 index 0000000..da30795 --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/Random/random.pyi b/venv/Lib/site-packages/Cryptodome/Random/random.pyi new file mode 100644 index 0000000..9b7cf7e --- /dev/null +++ b/venv/Lib/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/venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__init__.py b/venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__init__.py new file mode 100644 index 0000000..40f865d --- /dev/null +++ b/venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__init__.py @@ -0,0 +1,64 @@ +# -*- 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""" + +import sys + + +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) + + if sys.version_info >= (3, 9): + from Cryptodome.SelfTest.Cipher import test_KW + tests += test_KW.get_tests(config=config) + + return tests + +if __name__ == '__main__': + import unittest + suite = lambda: unittest.TestSuite(get_tests()) + unittest.main(defaultTest='suite') diff --git a/venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/__init__.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cd33e05079ffa231a75747bb24140f4bec2f8b0 GIT binary patch literal 3276 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_AES.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_AES.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d171b6f5a931274b065351254cdf96906b3c6a17 GIT binary patch literal 53050 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 literal 0 HcmV?d00001 diff --git a/venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_ARC2.cpython-312.pyc b/venv/Lib/site-packages/Cryptodome/SelfTest/Cipher/__pycache__/test_ARC2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..885e559fcfe87b80ee9e5bea1c1071199d795b1e GIT binary patch literal 6303 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/{>@0pqv@N+xLVlc+|$ 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