From d11476ad5c144ec7c2048cbc74de4bcdc1c50c07 Mon Sep 17 00:00:00 2001 From: Apex Liu Date: Mon, 11 Oct 2021 16:28:44 +0800 Subject: [PATCH] add api-v2. --- .gitignore | 1 + .idea/encodings.xml | 12 + CMakeCfg.txt | 3 + CMakeLists.txt | 7 +- build/build.py | 4 + build/builder/build-assist.py | 24 +- build/builder/core/utils.py | 22 +- dist/server/setup.sh | 8 +- server/tp_core/core/main.cpp | 28 +- server/tp_web/src/main.cpp | 16 +- .../packages-linux/x64/Crypto/Cipher/AES.py | 250 +++ .../packages-linux/x64/Crypto/Cipher/ARC2.py | 175 ++ .../packages-linux/x64/Crypto/Cipher/ARC4.py | 137 ++ .../x64/Crypto/Cipher/Blowfish.py | 159 ++ .../packages-linux/x64/Crypto/Cipher/CAST.py | 159 ++ .../x64/Crypto/Cipher/ChaCha20.py | 287 ++++ .../x64/Crypto/Cipher/ChaCha20_Poly1305.py | 336 ++++ .../packages-linux/x64/Crypto/Cipher/DES.py | 158 ++ .../packages-linux/x64/Crypto/Cipher/DES3.py | 187 +++ .../x64/Crypto/Cipher/PKCS1_OAEP.py | 239 +++ .../x64/Crypto/Cipher/PKCS1_v1_5.py | 217 +++ .../x64/Crypto/Cipher/Salsa20.py | 167 ++ .../x64/Crypto/Cipher/_ARC4.abi3.so | Bin 0 -> 13768 bytes .../x64/Crypto/Cipher/_EKSBlowfish.py | 131 ++ .../x64/Crypto/Cipher/_Salsa20.abi3.so | Bin 0 -> 26784 bytes .../x64/Crypto/Cipher/__init__.py | 79 + .../x64/Crypto/Cipher/_chacha20.abi3.so | Bin 0 -> 28224 bytes .../x64/Crypto/Cipher/_mode_cbc.py | 293 ++++ .../x64/Crypto/Cipher/_mode_ccm.py | 650 +++++++ .../x64/Crypto/Cipher/_mode_cfb.py | 293 ++++ .../x64/Crypto/Cipher/_mode_ctr.py | 393 +++++ .../x64/Crypto/Cipher/_mode_eax.py | 408 +++++ .../x64/Crypto/Cipher/_mode_ecb.py | 220 +++ .../x64/Crypto/Cipher/_mode_gcm.py | 620 +++++++ .../x64/Crypto/Cipher/_mode_ocb.py | 525 ++++++ .../x64/Crypto/Cipher/_mode_ofb.py | 282 ++++ .../x64/Crypto/Cipher/_mode_openpgp.py | 206 +++ .../x64/Crypto/Cipher/_mode_siv.py | 392 +++++ .../x64/Crypto/Cipher/_pkcs1_decode.abi3.so | Bin 0 -> 28184 bytes .../x64/Crypto/Cipher/_raw_aes.abi3.so | Bin 0 -> 66256 bytes .../x64/Crypto/Cipher/_raw_aesni.abi3.so | Bin 0 -> 101136 bytes .../x64/Crypto/Cipher/_raw_arc2.abi3.so | Bin 0 -> 43776 bytes .../x64/Crypto/Cipher/_raw_blowfish.abi3.so | Bin 0 -> 70472 bytes .../x64/Crypto/Cipher/_raw_cast.abi3.so | Bin 0 -> 42976 bytes .../x64/Crypto/Cipher/_raw_cbc.abi3.so | Bin 0 -> 20712 bytes .../x64/Crypto/Cipher/_raw_cfb.abi3.so | Bin 0 -> 25440 bytes .../x64/Crypto/Cipher/_raw_ctr.abi3.so | Bin 0 -> 28600 bytes .../x64/Crypto/Cipher/_raw_des.abi3.so | Bin 0 -> 75672 bytes .../x64/Crypto/Cipher/_raw_des3.abi3.so | Bin 0 -> 76480 bytes .../x64/Crypto/Cipher/_raw_ecb.abi3.so | Bin 0 -> 12440 bytes .../Crypto/Cipher/_raw_eksblowfish.abi3.so | Bin 0 -> 167568 bytes .../x64/Crypto/Cipher/_raw_ocb.abi3.so | Bin 0 -> 37344 bytes .../x64/Crypto/Cipher/_raw_ofb.abi3.so | Bin 0 -> 15368 bytes .../packages-linux/x64/Crypto/Hash/BLAKE2b.py | 247 +++ .../packages-linux/x64/Crypto/Hash/BLAKE2s.py | 247 +++ .../packages-linux/x64/Crypto/Hash/CMAC.py | 302 ++++ .../packages-linux/x64/Crypto/Hash/HMAC.py | 213 +++ .../packages-linux/x64/Crypto/Hash/MD2.py | 166 ++ .../packages-linux/x64/Crypto/Hash/MD4.py | 185 ++ .../packages-linux/x64/Crypto/Hash/MD5.py | 184 ++ .../x64/Crypto/Hash/Poly1305.py | 217 +++ .../packages-linux/x64/Crypto/Hash/RIPEMD.py | 26 + .../x64/Crypto/Hash/RIPEMD160.py | 169 ++ .../packages-linux/x64/Crypto/Hash/SHA.py | 24 + .../packages-linux/x64/Crypto/Hash/SHA1.py | 185 ++ .../packages-linux/x64/Crypto/Hash/SHA224.py | 186 ++ .../packages-linux/x64/Crypto/Hash/SHA256.py | 185 ++ .../packages-linux/x64/Crypto/Hash/SHA384.py | 186 ++ .../x64/Crypto/Hash/SHA3_224.py | 171 ++ .../x64/Crypto/Hash/SHA3_256.py | 171 ++ .../x64/Crypto/Hash/SHA3_384.py | 177 ++ .../x64/Crypto/Hash/SHA3_512.py | 172 ++ .../packages-linux/x64/Crypto/Hash/SHA512.py | 204 +++ .../x64/Crypto/Hash/SHAKE128.py | 127 ++ .../x64/Crypto/Hash/SHAKE256.py | 127 ++ .../x64/Crypto/Hash/_BLAKE2b.abi3.so | Bin 0 -> 21888 bytes .../x64/Crypto/Hash/_BLAKE2s.abi3.so | Bin 0 -> 21712 bytes .../x64/Crypto/Hash/_MD2.abi3.so | Bin 0 -> 20128 bytes .../x64/Crypto/Hash/_MD4.abi3.so | Bin 0 -> 25576 bytes .../x64/Crypto/Hash/_MD5.abi3.so | Bin 0 -> 31704 bytes .../x64/Crypto/Hash/_RIPEMD160.abi3.so | Bin 0 -> 55608 bytes .../x64/Crypto/Hash/_SHA1.abi3.so | Bin 0 -> 74416 bytes .../x64/Crypto/Hash/_SHA224.abi3.so | Bin 0 -> 43792 bytes .../x64/Crypto/Hash/_SHA256.abi3.so | Bin 0 -> 43872 bytes .../x64/Crypto/Hash/_SHA384.abi3.so | Bin 0 -> 50520 bytes .../x64/Crypto/Hash/_SHA512.abi3.so | Bin 0 -> 50624 bytes .../x64/Crypto/Hash/__init__.py | 22 + .../x64/Crypto/Hash/_ghash_clmul.abi3.so | Bin 0 -> 50160 bytes .../x64/Crypto/Hash/_ghash_portable.abi3.so | Bin 0 -> 17432 bytes .../x64/Crypto/Hash/_keccak.abi3.so | Bin 0 -> 34208 bytes .../x64/Crypto/Hash/_poly1305.abi3.so | Bin 0 -> 33360 bytes .../packages-linux/x64/Crypto/Hash/keccak.py | 174 ++ .../packages-linux/x64/Crypto/IO/PEM.py | 189 +++ .../packages-linux/x64/Crypto/IO/PKCS8.py | 231 +++ .../packages-linux/x64/Crypto/IO/_PBES.py | 435 +++++ .../packages-linux/x64/Crypto/IO/__init__.py | 31 + .../packages-linux/x64/Crypto/Math/Numbers.py | 42 + .../x64/Crypto/Math/Primality.py | 369 ++++ .../x64/Crypto/Math/_IntegerBase.py | 392 +++++ .../x64/Crypto/Math/_IntegerCustom.py | 111 ++ .../x64/Crypto/Math/_IntegerGMP.py | 727 ++++++++ .../x64/Crypto/Math/_IntegerNative.py | 380 +++++ .../x64/Crypto/Math/__init__.py | 0 .../x64/Crypto/Math/_modexp.abi3.so | Bin 0 -> 241288 bytes .../packages-linux/x64/Crypto/Protocol/KDF.py | 574 +++++++ .../x64/Crypto/Protocol/SecretSharing.py | 278 +++ .../x64/Crypto/Protocol/__init__.py | 31 + .../x64/Crypto/Protocol/_scrypt.abi3.so | Bin 0 -> 25024 bytes .../x64/Crypto/PublicKey/DSA.py | 682 ++++++++ .../x64/Crypto/PublicKey/ECC.py | 1182 +++++++++++++ .../x64/Crypto/PublicKey/ElGamal.py | 286 ++++ .../x64/Crypto/PublicKey/RSA.py | 799 +++++++++ .../x64/Crypto/PublicKey/__init__.py | 95 ++ .../x64/Crypto/PublicKey/_ec_ws.abi3.so | Bin 0 -> 1019608 bytes .../x64/Crypto/PublicKey/_openssh.py | 135 ++ .../x64/Crypto/Random/__init__.py | 57 + .../x64/Crypto/Random/random.py | 138 ++ .../x64/Crypto/Signature/DSS.py | 416 +++++ .../x64/Crypto/Signature/PKCS1_PSS.py | 55 + .../x64/Crypto/Signature/PKCS1_v1_5.py | 53 + .../x64/Crypto/Signature/__init__.py | 36 + .../x64/Crypto/Signature/pkcs1_15.py | 222 +++ .../x64/Crypto/Signature/pss.py | 386 +++++ .../packages-linux/x64/Crypto/Util/Counter.py | 77 + .../packages-linux/x64/Crypto/Util/Padding.py | 108 ++ .../packages-linux/x64/Crypto/Util/RFC1751.py | 386 +++++ .../x64/Crypto/Util/__init__.py | 41 + .../x64/Crypto/Util/_cpu_features.py | 46 + .../x64/Crypto/Util/_cpuid_c.abi3.so | Bin 0 -> 12776 bytes .../x64/Crypto/Util/_file_system.py | 54 + .../x64/Crypto/Util/_raw_api.py | 319 ++++ .../x64/Crypto/Util/_strxor.abi3.so | Bin 0 -> 14960 bytes .../packages-linux/x64/Crypto/Util/asn1.py | 940 +++++++++++ .../packages-linux/x64/Crypto/Util/number.py | 1495 +++++++++++++++++ .../x64/Crypto/Util/py3compat.py | 174 ++ .../packages-linux/x64/Crypto/Util/strxor.py | 137 ++ .../packages-linux/x64/Crypto/__init__.py | 6 + .../packages-linux/x64/Crypto/py.typed | 0 .../teleport/webroot/app/base/controller.py | 15 +- server/www/teleport/webroot/app/base/db.py | 2 +- .../www/teleport/webroot/app/base/webapp.py | 2 +- .../webroot/app/controller/__init__.py | 4 + .../teleport/webroot/app/controller/api_v2.py | 130 ++ .../teleport/webroot/app/controller/ops.py | 80 + 144 files changed, 23459 insertions(+), 44 deletions(-) create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/AES.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/ARC2.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/ARC4.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/Blowfish.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/CAST.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/ChaCha20.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/ChaCha20_Poly1305.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/DES.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/DES3.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/PKCS1_OAEP.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/PKCS1_v1_5.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/Salsa20.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_ARC4.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_EKSBlowfish.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_Salsa20.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/__init__.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_chacha20.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_cbc.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ccm.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_cfb.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ctr.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_eax.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ecb.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_gcm.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ocb.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ofb.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_openpgp.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_siv.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_pkcs1_decode.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_aes.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_aesni.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_arc2.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_blowfish.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_cast.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_cbc.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_cfb.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_ctr.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_des.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_des3.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_ecb.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_eksblowfish.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_ocb.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_ofb.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/BLAKE2b.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/BLAKE2s.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/CMAC.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/HMAC.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/MD2.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/MD4.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/MD5.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/Poly1305.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/RIPEMD.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/RIPEMD160.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHA.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHA1.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHA224.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHA256.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHA384.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_224.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_256.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_384.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_512.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHA512.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHAKE128.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/SHAKE256.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_BLAKE2b.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_BLAKE2s.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_MD2.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_MD4.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_MD5.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_RIPEMD160.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_SHA1.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_SHA224.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_SHA256.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_SHA384.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_SHA512.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/__init__.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_ghash_clmul.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_ghash_portable.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_keccak.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/_poly1305.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Hash/keccak.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/IO/PEM.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/IO/PKCS8.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/IO/_PBES.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/IO/__init__.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Math/Numbers.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Math/Primality.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Math/_IntegerBase.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Math/_IntegerCustom.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Math/_IntegerGMP.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Math/_IntegerNative.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Math/__init__.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Math/_modexp.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Protocol/KDF.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Protocol/SecretSharing.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Protocol/__init__.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Protocol/_scrypt.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/PublicKey/DSA.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/PublicKey/ECC.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/PublicKey/ElGamal.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/PublicKey/RSA.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/PublicKey/__init__.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/PublicKey/_ec_ws.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/PublicKey/_openssh.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Random/__init__.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Random/random.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Signature/DSS.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Signature/PKCS1_PSS.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Signature/PKCS1_v1_5.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Signature/__init__.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Signature/pkcs1_15.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Signature/pss.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/Counter.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/Padding.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/RFC1751.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/__init__.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/_cpu_features.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/_cpuid_c.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/_file_system.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/_raw_api.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/_strxor.abi3.so create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/asn1.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/number.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/py3compat.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/Util/strxor.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/__init__.py create mode 100644 server/www/packages/packages-linux/x64/Crypto/py.typed create mode 100644 server/www/teleport/webroot/app/controller/api_v2.py diff --git a/.gitignore b/.gitignore index be436b7..90863ba 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ client/tp_assist_macos/build # for Python __pycache__ *.pyc +*.pyi # for JetBrains IDEs. diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 3c48610..822fd6c 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -1,6 +1,8 @@ + + @@ -13,6 +15,15 @@ + + + + + + + + + @@ -34,6 +45,7 @@ + diff --git a/CMakeCfg.txt b/CMakeCfg.txt index e0febbf..a3aa816 100644 --- a/CMakeCfg.txt +++ b/CMakeCfg.txt @@ -29,3 +29,6 @@ else () MESSAGE(FATAL_ERROR "unsupported platform: ${CMAKE_SYSTEM_NAME}") endif () +IF (CMAKE_BUILD_TYPE STREQUAL Debug) + ADD_DEFINITIONS(-D_DEBUG) +ENDIF() \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index d439ad3..3a5c20f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,7 @@ include(CMakeCfg.txt) if (OS_LINUX) add_subdirectory(server/tp_web/src) endif() +#add_subdirectory(client/tp_assist_linux) add_subdirectory(server/tp_core/core) add_subdirectory(server/tp_core/protocol/ssh) @@ -16,6 +17,6 @@ if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/server/tp_core/protocol/rdp") add_subdirectory(server/tp_core/protocol/rdp) endif () -if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/server/tools/tpr2mp4") - add_subdirectory(server/tools/tpr2mp4) -endif () +#if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/server/tools/tpr2mp4") +# add_subdirectory(server/tools/tpr2mp4) +#endif () diff --git a/build/build.py b/build/build.py index 2792f9e..3d1d104 100644 --- a/build/build.py +++ b/build/build.py @@ -246,6 +246,10 @@ def make_options(): else: add_split('prepare for server [build once]') add_option('x64', 'pysrt', 'Make Python-Runtime for python%s-x64' % env.py_ver_str) + add_split('client side') + # add_option('x64', 'ext-client', 'build external libraries for client') + add_option('x64', 'client', 'build client applications [%s]' % ctx.target_path) + # add_option('x64', 'client-installer', 'make client installer') add_split('server side') add_option('x64', 'ext-server', 'build external libraries for server') add_option('x64', 'server', 'build server applications [%s]' % ctx.target_path) diff --git a/build/builder/build-assist.py b/build/builder/build-assist.py index 5ffd484..50bea5c 100644 --- a/build/builder/build-assist.py +++ b/build/builder/build-assist.py @@ -245,10 +245,28 @@ class BuilderLinux(BuilderBase): super().__init__() def build_assist(self): - cc.e('not support linux.') + # cc.e('not support linux.') + cc.n('build tp_assist...') - # def build_rdp(self): - # cc.e('not support linux.') + out_path = os.path.join(env.root_path, 'out', 'client', 'linux', 'bin') + out_files = list() + out_files.append(os.path.join(out_path, 'tp_assist')) + + for f in out_files: + if os.path.exists(f): + utils.remove(f) + + utils.makedirs(out_path) + + projects = ['tp_assist'] + utils.cmake(os.path.join(env.root_path, 'cmake-build-linux'), ctx.target_path, False, projects=projects) + + for f in out_files: + if os.path.exists(f): + utils.ensure_file_exists(f) + + def build_player(self): + cc.e("this is no player for Linux platform yet.") def build_installer(self): cc.e('not support linux.') diff --git a/build/builder/core/utils.py b/build/builder/core/utils.py index b85d6ac..5b9143e 100644 --- a/build/builder/core/utils.py +++ b/build/builder/core/utils.py @@ -388,7 +388,7 @@ def nsis_build(nsi_file, _define=''): raise RuntimeError('make installer with nsis failed. [{}]'.format(nsi_file)) -def cmake(work_path, target, force_rebuild, cmake_define='', cmake_pre_define=''): +def cmake(work_path, target, force_rebuild, projects=None, cmake_define='', cmake_pre_define=''): # I use cmake v3.5 which shipped with CLion. if env.cmake is None: raise RuntimeError('where is `cmake`?') @@ -413,13 +413,23 @@ def cmake(work_path, target, force_rebuild, cmake_define='', cmake_pre_define='' if ret != 0: raise RuntimeError('build with cmake failed, ret={}. [{}]'.format(ret, target)) - cmd = 'make' - # cc.o(cmd) - ret, _ = sys_exec(cmd) + if projects is None: + cmd = 'make' + # cc.o(cmd) + ret, _ = sys_exec(cmd) + if ret != 0: + os.chdir(old_p) + raise RuntimeError('build with cmake failed, ret={}. [{}]'.format(ret, target)) + else: + for p in projects: + cmd = 'make {}'.format(p) + # cc.o(cmd) + ret, _ = sys_exec(cmd) + if ret != 0: + os.chdir(old_p) + raise RuntimeError('build with cmake {} failed, ret={}. [{}]'.format(ret, p, target)) os.chdir(old_p) - if ret != 0: - raise RuntimeError('build with cmake failed, ret={}. [{}]'.format(ret, target)) def strip(filename): diff --git a/dist/server/setup.sh b/dist/server/setup.sh index de317c5..8c7df72 100755 --- a/dist/server/setup.sh +++ b/dist/server/setup.sh @@ -5,14 +5,10 @@ if [ `id -u` -ne 0 ];then echo -e "\e[31mPlease run setup as root.\033[0m" echo "" exit 1 -fi +fi PATH_ROOT=$(cd "$(dirname "$0")"; pwd) -PATH_TARGET=/usr/local/eom +# PATH_TARGET=/usr/local/teleport "${PATH_ROOT}/data/bin/tp_web" --py "${PATH_ROOT}/script/main.py" - -# echo "" -# echo -e "\e[32mInstallation done.\033[0m" -# echo "" diff --git a/server/tp_core/core/main.cpp b/server/tp_core/core/main.cpp index a4adfd8..9cb8870 100644 --- a/server/tp_core/core/main.cpp +++ b/server/tp_core/core/main.cpp @@ -28,7 +28,7 @@ static ex_u8 g_run_type = RUN_UNKNOWN; #define EOM_CORE_SERVICE_NAME L"Teleport Core Service" -static bool _run_daemon(); +static bool run_daemon_(); #ifdef EX_OS_WIN32 static int service_install() @@ -54,7 +54,7 @@ static int service_uninstall() } #endif -static bool _process_cmd_line(int argc, wchar_t** argv) +static bool process_cmd_line_(int argc, wchar_t** argv) { if (argc <= 1) { @@ -112,7 +112,7 @@ static bool _process_cmd_line(int argc, wchar_t** argv) } -static int _main_loop() +static int main_loop_() { if (g_run_type == RUN_CORE) return ts_main(); @@ -120,11 +120,11 @@ static int _main_loop() return 1; } -int _app_main(int argc, wchar_t** argv) +int app_main_(int argc, wchar_t** argv) { EXLOG_USE_LOGGER(&g_ex_logger); - if (!_process_cmd_line(argc, argv)) + if (!process_cmd_line_(argc, argv)) return 1; #ifdef EX_DEBUG @@ -171,7 +171,7 @@ int _app_main(int argc, wchar_t** argv) if (!g_is_debug) { - if (!_run_daemon()) + if (!run_daemon_()) { EXLOGE("[core] can not run in daemon mode.\n"); return 1; @@ -182,7 +182,7 @@ int _app_main(int argc, wchar_t** argv) #endif } - return _main_loop(); + return main_loop_(); } @@ -334,27 +334,27 @@ VOID WINAPI service_main(DWORD argc, wchar_t** argv) #else // not EX_OS_WIN32 #include -#include +#include -static void _sig_handler(int signum, siginfo_t* info, void* ptr); +static void sig_handler_(int signum, siginfo_t* info, void* ptr); int main(int argc, char** argv) { - struct sigaction act; + struct sigaction act{}; memset(&act, 0, sizeof(act)); - act.sa_sigaction = _sig_handler; + act.sa_sigaction = sig_handler_; act.sa_flags = SA_SIGINFO; sigaction(SIGINT, &act, nullptr); wchar_t** wargv = ex_make_wargv(argc, argv); - int ret = _app_main(argc, wargv); + int ret = app_main_(argc, wargv); ex_free_wargv(argc, wargv); return ret; } -void _sig_handler(int signum, siginfo_t* info, void* ptr) +void sig_handler_(int signum, siginfo_t* info, void* ptr) { if (signum == SIGINT || signum == SIGTERM) { @@ -363,7 +363,7 @@ void _sig_handler(int signum, siginfo_t* info, void* ptr) } } -static bool _run_daemon() +static bool run_daemon_() { pid_t pid = fork(); if (pid < 0) diff --git a/server/tp_web/src/main.cpp b/server/tp_web/src/main.cpp index a9710c1..2e8a784 100644 --- a/server/tp_web/src/main.cpp +++ b/server/tp_web/src/main.cpp @@ -13,7 +13,7 @@ // start 以服务方式运行 // ... 剩余的所有参数均传递给python脚本 // -// +// // 执行指定的Python脚本: // tp_web --py [-f FuncName] script_file.py ... // --py 必须为第一个参数,表示本次执行为执行指定脚本 @@ -36,7 +36,7 @@ static ex_wstr g_py_main_func; #define RUN_UNINST_SRV 4 static ex_u8 g_run_type = RUN_UNKNOWN; -#define EOM_WEB_SERVICE_NAME L"Teleport Web Service" +#define TP_WEB_SERVICE_NAME L"Teleport Web Service" static bool _run_daemon(void); @@ -50,7 +50,7 @@ static int service_install() ex_wstr exec_file(g_env.m_exec_file); exec_file += L" start"; - if (EXRV_OK == ex_winsrv_install(EOM_WEB_SERVICE_NAME, EOM_WEB_SERVICE_NAME, exec_file)) + if (EXRV_OK == ex_winsrv_install(TP_WEB_SERVICE_NAME, TP_WEB_SERVICE_NAME, exec_file)) return 0; else return 1; @@ -58,10 +58,10 @@ static int service_install() static int service_uninstall() { - if (EXRV_OK != ex_winsrv_stop(EOM_WEB_SERVICE_NAME)) + if (EXRV_OK != ex_winsrv_stop(TP_WEB_SERVICE_NAME)) return 1; - if (EXRV_OK != ex_winsrv_uninstall(EOM_WEB_SERVICE_NAME)) + if (EXRV_OK != ex_winsrv_uninstall(TP_WEB_SERVICE_NAME)) return 2; return 0; @@ -350,7 +350,7 @@ int main() wchar_t** _argv = ::CommandLineToArgvW(szCmdLine, &_argc); //拆分命令行参数字符串; ret = _app_main(_argc, _argv); - + LocalFree(_argv); _argv = NULL; @@ -360,7 +360,7 @@ int main() static bool _run_daemon(void) { SERVICE_TABLE_ENTRY DispatchTable[2]; - DispatchTable[0].lpServiceName = EOM_WEB_SERVICE_NAME; + DispatchTable[0].lpServiceName = TP_WEB_SERVICE_NAME; DispatchTable[0].lpServiceProc = service_main; DispatchTable[1].lpServiceName = NULL; DispatchTable[1].lpServiceProc = NULL; @@ -430,7 +430,7 @@ VOID WINAPI service_main(DWORD argc, wchar_t** argv) g_ServiceStatus.dwServiceSpecificExitCode = 0; g_ServiceStatus.dwCheckPoint = 0; g_ServiceStatus.dwWaitHint = 0; - g_hServiceStatusHandle = RegisterServiceCtrlHandler(EOM_WEB_SERVICE_NAME, service_handler); + g_hServiceStatusHandle = RegisterServiceCtrlHandler(TP_WEB_SERVICE_NAME, service_handler); if (g_hServiceStatusHandle == 0) { EXLOGE_WIN("RegisterServiceCtrlHandler()"); diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/AES.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/AES.py new file mode 100644 index 0000000..13bd7ea --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Cipher/AES.py @@ -0,0 +1,250 @@ +# -*- 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. +# =================================================================== +""" +Module's constants for the modes of operation supported with AES: + +:var MODE_ECB: :ref:`Electronic Code Book (ECB) ` +:var MODE_CBC: :ref:`Cipher-Block Chaining (CBC) ` +:var MODE_CFB: :ref:`Cipher FeedBack (CFB) ` +:var MODE_OFB: :ref:`Output FeedBack (OFB) ` +:var MODE_CTR: :ref:`CounTer Mode (CTR) ` +:var MODE_OPENPGP: :ref:`OpenPGP Mode ` +:var MODE_CCM: :ref:`Counter with CBC-MAC (CCM) Mode ` +:var MODE_EAX: :ref:`EAX Mode ` +:var MODE_GCM: :ref:`Galois Counter Mode (GCM) ` +:var MODE_SIV: :ref:`Syntethic Initialization Vector (SIV) ` +:var MODE_OCB: :ref:`Offset Code Book (OCB) ` +""" + +import sys + +from Crypto.Cipher import _create_cipher +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +from Crypto.Util import _cpu_features +from Crypto.Random import get_random_bytes + + +_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("Crypto.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("Crypto.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. + + :param key: + The secret key to use in the symmetric cipher. + + It must be 16, 24 or 32 bytes long (respectively for *AES-128*, + *AES-192* or *AES-256*). + + For ``MODE_SIV`` only, it doubles to 32, 48, or 64 bytes. + :type key: bytes/bytearray/memoryview + + :param mode: + The chaining mode to use for encryption or decryption. + If in doubt, use ``MODE_EAX``. + :type mode: One of the supported ``MODE_*`` constants + + :Keyword Arguments: + * **iv** (*bytes*, *bytearray*, *memoryview*) -- + (Only applicable for ``MODE_CBC``, ``MODE_CFB``, ``MODE_OFB``, + and ``MODE_OPENPGP`` modes). + + 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*) -- + Instance of ``Crypto.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). + + :Return: an AES object, of the applicable mode. + """ + + kwargs["add_aes_modes"] = True + return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs) + + +MODE_ECB = 1 +MODE_CBC = 2 +MODE_CFB = 3 +MODE_OFB = 5 +MODE_CTR = 6 +MODE_OPENPGP = 7 +MODE_CCM = 8 +MODE_EAX = 9 +MODE_SIV = 10 +MODE_GCM = 11 +MODE_OCB = 12 + +# Size of a data block (in bytes) +block_size = 16 +# Size of a key (in bytes) +key_size = (16, 24, 32) diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/ARC2.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/ARC2.py new file mode 100644 index 0000000..0ba7e33 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Cipher import _create_cipher +from Crypto.Util.py3compat import byte_string +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +_raw_arc2_lib = load_pycryptodome_raw_lib( + "Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/ARC4.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/ARC4.py new file mode 100644 index 0000000..7150ea6 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Cipher/ARC4.py @@ -0,0 +1,137 @@ +# -*- 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 Crypto.Util.py3compat import b + +from Crypto.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("Crypto.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:`Crypto.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 ``[5..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(5, 256+1) diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/Blowfish.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/Blowfish.py new file mode 100644 index 0000000..6005ffe --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Cipher import _create_cipher +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, c_size_t, + c_uint8_ptr) + +_raw_blowfish_lib = load_pycryptodome_raw_lib( + "Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/CAST.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/CAST.py new file mode 100644 index 0000000..c7e82c1 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Cipher import _create_cipher +from Crypto.Util.py3compat import byte_string +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +_raw_cast_lib = load_pycryptodome_raw_lib( + "Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/ChaCha20.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/ChaCha20.py new file mode 100644 index 0000000..9bd2252 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Cipher/ChaCha20.py @@ -0,0 +1,287 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Crypto.Random import get_random_bytes + +from Crypto.Util.py3compat import _copy_bytes +from Crypto.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("Crypto.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 = ( self.encrypt, self.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 self.encrypt not in self._next: + raise TypeError("Cipher object can only be used for decryption") + self._next = ( self.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 self.decrypt not in self._next: + raise TypeError("Cipher object can only be used for encryption") + self._next = ( self.decrypt, ) + + try: + return self._encrypt(ciphertext, output) + except ValueError as e: + raise ValueError(str(e).replace("enc", "dec")) + + def seek(self, position): + """Seek to a certain position in the key stream. + + Args: + position (integer): + The absolute position within the key stream, in bytes. + """ + + position, offset = divmod(position, 64) + block_low = position & 0xFFFFFFFF + block_high = position >> 32 + + result = _raw_chacha20_lib.chacha20_seek( + self._state.get(), + c_ulong(block_high), + c_ulong(block_low), + offset + ) + if result: + raise ValueError("Error %d while seeking with %s" % (result, self._name)) + + +def _derive_Poly1305_key_pair(key, nonce): + """Derive a tuple (r, s, nonce) for a Poly1305 MAC. + + If nonce is ``None``, a new 12-byte nonce is generated. + """ + + if len(key) != 32: + raise ValueError("Poly1305 with ChaCha20 requires a 32-byte key") + + if nonce is None: + padded_nonce = nonce = get_random_bytes(12) + elif len(nonce) == 8: + # See RFC7538, 2.6: [...] ChaCha20 as specified here requires a 96-bit + # nonce. So if the provided nonce is only 64-bit, then the first 32 + # bits of the nonce will be set to a constant number. + # This will usually be zero, but for protocols with multiple senders it may be + # different for each sender, but should be the same for all + # invocations of the function with the same key by a particular + # sender. + padded_nonce = b'\x00\x00\x00\x00' + nonce + elif len(nonce) == 12: + padded_nonce = nonce + else: + raise ValueError("Poly1305 with ChaCha20 requires an 8- or 12-byte nonce") + + rs = new(key=key, nonce=padded_nonce).encrypt(b'\x00' * 32) + return rs[:16], rs[16:], nonce + + +def new(**kwargs): + """Create a new ChaCha20 or XChaCha20 cipher + + Keyword Args: + key (bytes/bytearray/memoryview): The secret key to use. + It must be 32 bytes long. + nonce (bytes/bytearray/memoryview): A mandatory value that + must never be reused for any other encryption + done with this key. + + For ChaCha20, it must be 8 or 12 bytes long. + + For XChaCha20, it must be 24 bytes long. + + If not provided, 8 bytes will be randomly generated + (you can find them back in the ``nonce`` attribute). + + :Return: a :class:`Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/ChaCha20_Poly1305.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/ChaCha20_Poly1305.py new file mode 100644 index 0000000..21ddca3 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Cipher/ChaCha20_Poly1305.py @@ -0,0 +1,336 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from binascii import unhexlify + +from Crypto.Cipher import ChaCha20 +from Crypto.Cipher.ChaCha20 import _HChaCha20 +from Crypto.Hash import Poly1305, BLAKE2s + +from Crypto.Random import get_random_bytes + +from Crypto.Util.number import long_to_bytes +from Crypto.Util.py3compat import _copy_bytes, bord +from Crypto.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.nonce = _copy_bytes(None, None, nonce) + + self._next = (self.update, self.encrypt, self.decrypt, self.digest, + self.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 self.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 self.encrypt not in self._next: + raise TypeError("encrypt() method cannot be called") + + if self._status == _CipherStatus.PROCESSING_AUTH_DATA: + self._pad_aad() + + self._next = (self.encrypt, self.digest) + + 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 self.decrypt not in self._next: + raise TypeError("decrypt() method cannot be called") + + if self._status == _CipherStatus.PROCESSING_AUTH_DATA: + self._pad_aad() + + self._next = (self.decrypt, self.verify) + + self._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 self.digest not in self._next: + raise TypeError("digest() method cannot be called") + self._next = (self.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 self.verify not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = (self.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:`Crypto.Cipher.ChaCha20.ChaCha20Poly1305Cipher` object + """ + + try: + key = kwargs.pop("key") + except KeyError as e: + raise TypeError("Missing parameter %s" % e) + + self._len_ct += len(plaintext) + + if len(key) != 32: + raise ValueError("Key must be 32 bytes long") + + nonce = kwargs.pop("nonce", None) + if nonce is None: + nonce = get_random_bytes(12) + + if len(nonce) in (8, 12): + pass + elif len(nonce) == 24: + key = _HChaCha20(key, nonce[:16]) + 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)) + + return ChaCha20Poly1305Cipher(key, nonce) + + +# Size of a key (in bytes) +key_size = 32 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/DES.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/DES.py new file mode 100644 index 0000000..5cc286a --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Cipher import _create_cipher +from Crypto.Util.py3compat import byte_string +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t, c_uint8_ptr) + +_raw_des_lib = load_pycryptodome_raw_lib( + "Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/DES3.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/DES3.py new file mode 100644 index 0000000..c0d9367 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Cipher import _create_cipher +from Crypto.Util.py3compat import byte_string, bchr, bord, bstr +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + c_size_t) + +_raw_des3_lib = load_pycryptodome_raw_lib( + "Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/PKCS1_OAEP.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/PKCS1_OAEP.py new file mode 100644 index 0000000..57a982b --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Cipher/PKCS1_OAEP.py @@ -0,0 +1,239 @@ +# -*- coding: utf-8 -*- +# +# Cipher/PKCS1_OAEP.py : PKCS#1 OAEP +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from Crypto.Signature.pss import MGF1 +import Crypto.Hash.SHA1 + +from Crypto.Util.py3compat import bord, _copy_bytes +import Crypto.Util.number +from Crypto.Util.number import ceil_div, bytes_to_long, long_to_bytes +from Crypto.Util.strxor import strxor +from Crypto import Random + +class PKCS1OAEP_Cipher: + """Cipher object for PKCS#1 v1.5 OAEP. + Do not create directly: use :func:`new` instead.""" + + def __init__(self, key, hashAlgo, mgfunc, label, randfunc): + """Initialize this PKCS#1 OAEP cipher object. + + :Parameters: + key : an RSA key object + If a private half is given, both encryption and decryption are possible. + If a public half is given, only encryption is possible. + hashAlgo : hash object + The hash function to use. This can be a module under `Crypto.Hash` + or an existing hash object created from any of such modules. If not specified, + `Crypto.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 = Crypto.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 = Crypto.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 = Crypto.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`_. + + :param message: + The message to encrypt, also known as plaintext. It can be of + variable length, but not longer than the RSA modulus (in bytes) minus 11. + :type message: bytes/bytearray/memoryview + + :Returns: A byte string, the ciphertext in which the message is encrypted. + It is as long as the RSA modulus (in bytes). + + :Raises ValueError: + If the RSA key length is not sufficiently long to deal with the given + message. + """ + + # See 7.2.1 in RFC8017 + k = self._key.size_in_bytes() + mLen = len(message) + + # Step 1 + if mLen > k - 11: + raise ValueError("Plaintext is too long.") + # Step 2a + ps = [] + while len(ps) != k - mLen - 3: + new_byte = self._randfunc(1) + if bord(new_byte[0]) == 0x00: + continue + ps.append(new_byte) + ps = b"".join(ps) + assert(len(ps) == k - mLen - 3) + # Step 2b + em = b'\x00\x02' + ps + b'\x00' + _copy_bytes(None, None, message) + # Step 3a (OS2IP) + em_int = bytes_to_long(em) + # Step 3b (RSAEP) + m_int = self._key._encrypt(em_int) + # Step 3c (I2OSP) + c = long_to_bytes(m_int, k) + return c + + def decrypt(self, ciphertext, sentinel, expected_pt_len=0): + r"""Decrypt a PKCS#1 v1.5 ciphertext. + + This is the function ``RSAES-PKCS1-V1_5-DECRYPT`` specified in + `section 7.2.2 of RFC8017 + `_. + + Args: + ciphertext (bytes/bytearray/memoryview): + The ciphertext that contains the message to recover. + sentinel (any type): + The object to return whenever an error is detected. + expected_pt_len (integer): + The length the plaintext is known to have, or 0 if unknown. + + Returns (byte string): + It is either the original message or the ``sentinel`` (in case of an error). + + .. warning:: + PKCS#1 v1.5 decryption is intrinsically vulnerable to timing + attacks (see `Bleichenbacher's`__ attack). + **Use PKCS#1 OAEP instead**. + + This implementation attempts to mitigate the risk + with some constant-time constructs. + However, they are not sufficient by themselves: the type of protocol you + implement and the way you handle errors make a big difference. + + Specifically, you should make it very hard for the (malicious) + party that submitted the ciphertext to quickly understand if decryption + succeeded or not. + + To this end, it is recommended that your protocol only encrypts + plaintexts of fixed length (``expected_pt_len``), + that ``sentinel`` is a random byte string of the same length, + and that processing continues for as long + as possible even if ``sentinel`` is returned (i.e. in case of + incorrect decryption). + + .. __: http://www.bell-labs.com/user/bleichen/papers/pkcs.ps + """ + + # See 7.2.2 in RFC8017 + k = self._key.size_in_bytes() + + # Step 1 + if len(ciphertext) != k: + raise ValueError("Ciphertext with incorrect length (not %d bytes)" % k) + + # Step 2a (O2SIP) + ct_int = bytes_to_long(ciphertext) + + # Step 2b (RSADP) + m_int = self._key._decrypt(ct_int) + + # Complete step 2c (I2OSP) + em = long_to_bytes(m_int, k) + + # Step 3 (not constant time when the sentinel is not a byte string) + output = 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 `Crypto.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:`Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/Salsa20.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/Salsa20.py new file mode 100644 index 0000000..62d0b29 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import _copy_bytes +from Crypto.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 Crypto.Random import get_random_bytes + +_raw_salsa20_lib = load_pycryptodome_raw_lib("Crypto.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:`Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_ARC4.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_ARC4.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..e14c862687319deeb69cbdd8868a4b5ebd36cfb3 GIT binary patch literal 13768 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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. +# =================================================================== + +import sys + +from Crypto.Cipher import _create_cipher +from Crypto.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( + "Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_Salsa20.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_Salsa20.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..9711ace1e7765207732e45b79a5e6b9719b1d9d9 GIT binary patch literal 26784 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 literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/__init__.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/__init__.py new file mode 100644 index 0000000..ba2d485 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Cipher/__init__.py @@ -0,0 +1,79 @@ +# +# A block cipher is instantiated as a combination of: +# 1. A base cipher (such as AES) +# 2. A mode of operation (such as CBC) +# +# Both items are implemented as C modules. +# +# The API of #1 is (replace "AES" with the name of the actual cipher): +# - AES_start_operaion(key) --> base_cipher_state +# - AES_encrypt(base_cipher_state, in, out, length) +# - AES_decrypt(base_cipher_state, in, out, length) +# - AES_stop_operation(base_cipher_state) +# +# Where base_cipher_state is AES_State, a struct with BlockBase (set of +# pointers to encrypt/decrypt/stop) followed by cipher-specific data. +# +# The API of #2 is (replace "CBC" with the name of the actual mode): +# - CBC_start_operation(base_cipher_state) --> mode_state +# - CBC_encrypt(mode_state, in, out, length) +# - CBC_decrypt(mode_state, in, out, length) +# - CBC_stop_operation(mode_state) +# +# where mode_state is a a pointer to base_cipher_state plus mode-specific data. + +import os + +from Crypto.Cipher._mode_ecb import _create_ecb_cipher +from Crypto.Cipher._mode_cbc import _create_cbc_cipher +from Crypto.Cipher._mode_cfb import _create_cfb_cipher +from Crypto.Cipher._mode_ofb import _create_ofb_cipher +from Crypto.Cipher._mode_ctr import _create_ctr_cipher +from Crypto.Cipher._mode_openpgp import _create_openpgp_cipher +from Crypto.Cipher._mode_ccm import _create_ccm_cipher +from Crypto.Cipher._mode_eax import _create_eax_cipher +from Crypto.Cipher._mode_siv import _create_siv_cipher +from Crypto.Cipher._mode_gcm import _create_gcm_cipher +from Crypto.Cipher._mode_ocb import _create_ocb_cipher + +_modes = { 1:_create_ecb_cipher, + 2:_create_cbc_cipher, + 3:_create_cfb_cipher, + 5:_create_ofb_cipher, + 6:_create_ctr_cipher, + 7:_create_openpgp_cipher, + 9:_create_eax_cipher + } + +_extra_modes = { 8:_create_ccm_cipher, + 10:_create_siv_cipher, + 11:_create_gcm_cipher, + 12:_create_ocb_cipher + } + +def _create_cipher(factory, key, mode, *args, **kwargs): + + kwargs["key"] = key + + modes = dict(_modes) + if kwargs.pop("add_aes_modes", False): + modes.update(_extra_modes) + if not mode in modes: + raise ValueError("Mode not supported") + + if args: + if mode in (8, 9, 10, 11, 12): + if len(args) > 1: + raise TypeError("Too many arguments for this mode") + kwargs["nonce"] = args[0] + elif mode in (2, 3, 5, 7): + if len(args) > 1: + raise TypeError("Too many arguments for this mode") + kwargs["IV"] = args[0] + elif mode == 6: + if len(args) > 0: + raise TypeError("Too many arguments for this mode") + elif mode == 1: + raise TypeError("IV is not meaningful for the ECB mode") + + return modes[mode](factory, **kwargs) diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_chacha20.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_chacha20.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..9c8e4b51edd9045950c2068f841c38ff7329e732 GIT binary patch literal 28224 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 JX$oni_}}B99k&1g literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_cbc.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_cbc.py new file mode 100644 index 0000000..79c871a --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_cbc.py @@ -0,0 +1,293 @@ +# =================================================================== +# +# 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. +# =================================================================== + +""" +Ciphertext Block Chaining (CBC) mode. +""" + +__all__ = ['CbcMode'] + +from Crypto.Util.py3compat import _copy_bytes +from Crypto.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 Crypto.Random import get_random_bytes + +raw_cbc_lib = load_pycryptodome_raw_lib("Crypto.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 = [ self.encrypt, self.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 self.encrypt not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = [ self.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 self.decrypt not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = [ self.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 ``Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ccm.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ccm.py new file mode 100644 index 0000000..64077de --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ccm.py @@ -0,0 +1,650 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +Counter with CBC-MAC (CCM) mode. +""" + +__all__ = ['CcmMode'] + +import struct +from binascii import unhexlify + +from Crypto.Util.py3compat import (byte_string, bord, + _copy_bytes) +from Crypto.Util._raw_api import is_writeable_buffer + +from Crypto.Util.strxor import strxor +from Crypto.Util.number import long_to_bytes + +from Crypto.Hash import BLAKE2s +from Crypto.Random import get_random_bytes + + +def enum(**enums): + return type('Enum', (), enums) + +MacStatus = enum(NOT_STARTED=0, PROCESSING_AUTH_DATA=1, PROCESSING_PLAINTEXT=2) + + +class CcmMode(object): + """Counter with CBC-MAC (CCM). + + This is an Authenticated Encryption with Associated Data (`AEAD`_) mode. + It provides both confidentiality and authenticity. + + The header of the message may be left in the clear, if needed, and it will + still be subject to authentication. The decryption step tells the receiver + if the message comes from a source that really knowns the secret key. + Additionally, decryption detects if any part of the message - including the + header - has been modified or corrupted. + + This mode requires a nonce. The nonce shall never repeat for two + different messages encrypted with the same key, but it does not need + to be random. + Note that there is a trade-off between the size of the nonce and the + maximum size of a single message you can encrypt. + + It is important to use a large nonce if the key is reused across several + messages and the nonce is chosen randomly. + + It is acceptable to us a short nonce if the key is only used a few times or + if the nonce is taken from a counter. + + The following table shows the trade-off when the nonce is chosen at + random. The column on the left shows how many messages it takes + for the keystream to repeat **on average**. In practice, you will want to + stop using the key way before that. + + +--------------------+---------------+-------------------+ + | Avg. # of messages | nonce | Max. message | + | before keystream | size | size | + | repeats | (bytes) | (bytes) | + +====================+===============+===================+ + | 2^52 | 13 | 64K | + +--------------------+---------------+-------------------+ + | 2^48 | 12 | 16M | + +--------------------+---------------+-------------------+ + | 2^44 | 11 | 4G | + +--------------------+---------------+-------------------+ + | 2^40 | 10 | 1T | + +--------------------+---------------+-------------------+ + | 2^36 | 9 | 64P | + +--------------------+---------------+-------------------+ + | 2^32 | 8 | 16E | + +--------------------+---------------+-------------------+ + + This mode is only available for ciphers that operate on 128 bits blocks + (e.g. AES but not TDES). + + See `NIST SP800-38C`_ or RFC3610_. + + .. _`NIST SP800-38C`: http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C.pdf + .. _RFC3610: https://tools.ietf.org/html/rfc3610 + .. _AEAD: http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html + + :undocumented: __init__ + """ + + def __init__(self, factory, key, nonce, mac_len, msg_len, assoc_len, + cipher_params): + + self.block_size = factory.block_size + """The block size of the underlying cipher, in bytes.""" + + self.nonce = _copy_bytes(None, None, nonce) + """The nonce used for this cipher instance""" + + self._factory = factory + self._key = _copy_bytes(None, None, key) + self._mac_len = mac_len + self._msg_len = msg_len + self._assoc_len = assoc_len + self._cipher_params = cipher_params + + self._mac_tag = None # Cache for MAC tag + + if self.block_size != 16: + raise ValueError("CCM mode is only available for ciphers" + " that operate on 128 bits blocks") + + # MAC tag length (Tlen) + if mac_len not in (4, 6, 8, 10, 12, 14, 16): + raise ValueError("Parameter 'mac_len' must be even" + " and in the range 4..16 (not %d)" % mac_len) + + # Nonce value + if not (nonce and 7 <= len(nonce) <= 13): + raise ValueError("Length of parameter 'nonce' must be" + " in the range 7..13 bytes") + + # Create MAC object (the tag will be the last block + # bytes worth of ciphertext) + self._mac = self._factory.new(key, + factory.MODE_CBC, + iv=b'\x00' * 16, + **cipher_params) + self._mac_status = MacStatus.NOT_STARTED + self._t = None + + # Allowed transitions after initialization + self._next = [self.update, self.encrypt, self.decrypt, + self.digest, self.verify] + + # Cumulative lengths + self._cumul_assoc_len = 0 + self._cumul_msg_len = 0 + + # Cache for unaligned associated data/plaintext. + # This is a list with byte strings, but when the MAC starts, + # it will become a binary string no longer than the block size. + self._cache = [] + + # Start CTR cipher, by formatting the counter (A.3) + q = 15 - len(nonce) # length of Q, the encoded message length + self._cipher = self._factory.new(key, + self._factory.MODE_CTR, + nonce=struct.pack("B", q - 1) + self.nonce, + **cipher_params) + + # S_0, step 6 in 6.1 for j=0 + self._s_0 = self._cipher.encrypt(b'\x00' * 16) + + # Try to start the MAC + if None not in (assoc_len, msg_len): + self._start_mac() + + def _start_mac(self): + + assert(self._mac_status == MacStatus.NOT_STARTED) + assert(None not in (self._assoc_len, self._msg_len)) + assert(isinstance(self._cache, list)) + + # Formatting control information and nonce (A.2.1) + q = 15 - len(self.nonce) # length of Q, the encoded message length + flags = (64 * (self._assoc_len > 0) + 8 * ((self._mac_len - 2) // 2) + + (q - 1)) + b_0 = struct.pack("B", flags) + self.nonce + long_to_bytes(self._msg_len, q) + + # Formatting associated data (A.2.2) + # Encoded 'a' is concatenated with the associated data 'A' + assoc_len_encoded = b'' + if self._assoc_len > 0: + if self._assoc_len < (2 ** 16 - 2 ** 8): + enc_size = 2 + elif self._assoc_len < (2 ** 32): + assoc_len_encoded = b'\xFF\xFE' + enc_size = 4 + else: + assoc_len_encoded = b'\xFF\xFF' + enc_size = 8 + assoc_len_encoded += long_to_bytes(self._assoc_len, enc_size) + + # b_0 and assoc_len_encoded must be processed first + self._cache.insert(0, b_0) + self._cache.insert(1, assoc_len_encoded) + + # Process all the data cached so far + first_data_to_mac = b"".join(self._cache) + self._cache = b"" + self._mac_status = MacStatus.PROCESSING_AUTH_DATA + self._update(first_data_to_mac) + + def _pad_cache_and_update(self): + + assert(self._mac_status != MacStatus.NOT_STARTED) + assert(len(self._cache) < self.block_size) + + # Associated data is concatenated with the least number + # of zero bytes (possibly none) to reach alignment to + # the 16 byte boundary (A.2.3) + len_cache = len(self._cache) + if len_cache > 0: + self._update(b'\x00' * (self.block_size - len_cache)) + + def update(self, assoc_data): + """Protect associated data + + If there is any associated data, the caller has to invoke + this function one or more times, before using + ``decrypt`` or ``encrypt``. + + By *associated data* it is meant any data (e.g. packet headers) that + will not be encrypted and will be transmitted in the clear. + However, the receiver is still able to detect any modification to it. + In CCM, the *associated data* is also called + *additional authenticated data* (AAD). + + If there is no associated data, this method must not be called. + + The caller may split associated data in segments of any size, and + invoke this method multiple times, each time with the next segment. + + :Parameters: + assoc_data : bytes/bytearray/memoryview + A piece of associated data. There are no restrictions on its size. + """ + + if self.update not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = [self.update, self.encrypt, self.decrypt, + self.digest, self.verify] + + self._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 self.encrypt not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + self._next = [self.encrypt, self.digest] + + # No more associated data allowed from now + if self._assoc_len is None: + assert(isinstance(self._cache, list)) + self._assoc_len = sum([len(x) for x in self._cache]) + if self._msg_len is not None: + self._start_mac() + else: + if self._cumul_assoc_len < self._assoc_len: + raise ValueError("Associated data is too short") + + # Only once piece of plaintext accepted if message length was + # not declared in advance + if self._msg_len is None: + self._msg_len = len(plaintext) + self._start_mac() + self._next = [self.digest] + + self._cumul_msg_len += len(plaintext) + if self._cumul_msg_len > self._msg_len: + raise ValueError("Message is too long") + + if self._mac_status == MacStatus.PROCESSING_AUTH_DATA: + # Associated data is concatenated with the least number + # of zero bytes (possibly none) to reach alignment to + # the 16 byte boundary (A.2.3) + self._pad_cache_and_update() + self._mac_status = MacStatus.PROCESSING_PLAINTEXT + + self._update(plaintext) + return self._cipher.encrypt(plaintext, output=output) + + def decrypt(self, ciphertext, output=None): + """Decrypt data with the key set at initialization. + + A cipher object is stateful: once you have decrypted a message + you cannot decrypt (or encrypt) another message with the same + object. + + This method can be called only **once** if ``msg_len`` was + not passed at initialization. + + If ``msg_len`` was given, the data to decrypt can be + broken up in two or more pieces and `decrypt` can be + called multiple times. + + That is, the statement: + + >>> c.decrypt(a) + c.decrypt(b) + + is equivalent to: + + >>> c.decrypt(a+b) + + This function does not remove any padding from the plaintext. + + :Parameters: + ciphertext : bytes/bytearray/memoryview + The piece of data to decrypt. + It can be of any length. + :Keywords: + output : bytearray/memoryview + The location where the plaintext must be written to. + If ``None``, the plaintext is returned. + :Return: + If ``output`` is ``None``, the plaintext as ``bytes``. + Otherwise, ``None``. + """ + + if self.decrypt not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = [self.decrypt, self.verify] + + # No more associated data allowed from now + if self._assoc_len is None: + assert(isinstance(self._cache, list)) + self._assoc_len = sum([len(x) for x in self._cache]) + if self._msg_len is not None: + self._start_mac() + else: + if self._cumul_assoc_len < self._assoc_len: + raise ValueError("Associated data is too short") + + # Only once piece of ciphertext accepted if message length was + # not declared in advance + if self._msg_len is None: + self._msg_len = len(ciphertext) + self._start_mac() + self._next = [self.verify] + + self._cumul_msg_len += len(ciphertext) + if self._cumul_msg_len > self._msg_len: + raise ValueError("Message is too long") + + if self._mac_status == MacStatus.PROCESSING_AUTH_DATA: + # Associated data is concatenated with the least number + # of zero bytes (possibly none) to reach alignment to + # the 16 byte boundary (A.2.3) + self._pad_cache_and_update() + self._mac_status = MacStatus.PROCESSING_PLAINTEXT + + # Encrypt is equivalent to decrypt with the CTR mode + plaintext = self._cipher.encrypt(ciphertext, output=output) + if output is None: + self._update(plaintext) + else: + self._update(output) + return plaintext + + def digest(self): + """Compute the *binary* MAC tag. + + The caller invokes this function at the very end. + + This method returns the MAC that shall be sent to the receiver, + together with the ciphertext. + + :Return: the MAC, as a byte string. + """ + + if self.digest not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = [self.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 self.verify not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = [self.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 `Crypto.Cipher` (like + `Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_cfb.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_cfb.py new file mode 100644 index 0000000..b3ee1c7 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import _copy_bytes +from Crypto.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 Crypto.Random import get_random_bytes + +raw_cfb_lib = load_pycryptodome_raw_lib("Crypto.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 = [ self.encrypt, self.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 self.encrypt not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = [ self.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 self.decrypt not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = [ self.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 ``Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ctr.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ctr.py new file mode 100644 index 0000000..15c7e83 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.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 Crypto.Random import get_random_bytes +from Crypto.Util.py3compat import _copy_bytes, is_native_int +from Crypto.Util.number import long_to_bytes + +raw_ctr_lib = load_pycryptodome_raw_lib("Crypto.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 = [self.encrypt, self.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 self.encrypt not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = [self.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 self.decrypt not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = [self.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 ``Crypto.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 ``Crypto.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: + # Crypto.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 + + # Crypto.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 Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_eax.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_eax.py new file mode 100644 index 0000000..d5fb135 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import byte_string, bord, _copy_bytes + +from Crypto.Util._raw_api import is_buffer + +from Crypto.Util.strxor import strxor +from Crypto.Util.number import long_to_bytes, bytes_to_long + +from Crypto.Hash import CMAC, BLAKE2s +from Crypto.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 = [self.update, self.encrypt, self.decrypt, + self.digest, self.verify] + + # MAC tag length + if not (4 <= self._mac_len <= self.block_size): + raise ValueError("Parameter 'mac_len' must not be 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 self.update not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = [self.update, self.encrypt, self.decrypt, + self.digest, self.verify] + + self._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 self.encrypt not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + self._next = [self.encrypt, self.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 self.decrypt not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = [self.decrypt, self.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 self.digest not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = [self.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 self.verify not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = [self.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 `Crypto.Cipher` (like + `Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ecb.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ecb.py new file mode 100644 index 0000000..3783357 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.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("Crypto.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 ``Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_gcm.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_gcm.py new file mode 100644 index 0000000..da8e337 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import bord, _copy_bytes + +from Crypto.Util._raw_api import is_buffer + +from Crypto.Util.number import long_to_bytes, bytes_to_long +from Crypto.Hash import BLAKE2s +from Crypto.Random import get_random_bytes + +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + create_string_buffer, get_raw_buffer, + SmartPointer, c_size_t, c_uint8_ptr) + +from Crypto.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("Crypto.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("Crypto.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 = [self.update, self.encrypt, self.decrypt, + self.digest, self.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(nonce) % 16)) % 16 + 8 + ghash_in = (self.nonce + + b'\x00' * fill + + long_to_bytes(8 * len(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 self.update not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = [self.update, self.encrypt, self.decrypt, + self.digest, self.verify] + + self._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 self.encrypt not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + self._next = [self.encrypt, self.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 self.decrypt not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = [self.decrypt, self.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 self.digest not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = [self.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 self.verify not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = [self.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 `Crypto.Cipher`. + The cipher must have block length of 16 bytes. + GCM has been only defined for `Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ocb.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ocb.py new file mode 100644 index 0000000..27758b1 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ocb.py @@ -0,0 +1,525 @@ +# =================================================================== +# +# 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 Crypto.Cipher import AES + >>> from Crypto.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 Crypto.Util.py3compat import bord, _copy_bytes +from Crypto.Util.number import long_to_bytes, bytes_to_long +from Crypto.Util.strxor import strxor + +from Crypto.Hash import BLAKE2s +from Crypto.Random import get_random_bytes + +from Crypto.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("Crypto.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 = [self.update, self.encrypt, self.decrypt, + self.digest, self.verify] + + # Compute Offset_0 + params_without_key = dict(cipher_params) + key = params_without_key.pop("key") + nonce = (struct.pack('B', self._mac_len << 4 & 0xFF) + + b'\x00' * (14 - len(nonce)) + + b'\x01' + self.nonce) + + 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 self.update not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = [self.encrypt, self.decrypt, self.digest, + self.verify, self.update] + + 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 self.encrypt not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + + if plaintext is None: + self._next = [self.digest] + else: + self._next = [self.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 self.decrypt not in self._next: + raise TypeError("decrypt() can only be called after" + " initialization or an update()") + + if ciphertext is None: + self._next = [self.verify] + else: + self._next = [self.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 self.digest not in self._next: + raise TypeError("digest() cannot be called now for this cipher") + + assert(len(self._cache_P) == 0) + + self._next = [self.digest] + + 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 self.verify not in self._next: + raise TypeError("verify() cannot be called now for this cipher") + + assert(len(self._cache_P) == 0) + + self._next = [self.verify] + + 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 `Crypto.Cipher` + (like `Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ofb.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_ofb.py new file mode 100644 index 0000000..958f6d0 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import _copy_bytes +from Crypto.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 Crypto.Random import get_random_bytes + +raw_ofb_lib = load_pycryptodome_raw_lib("Crypto.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 = [ self.encrypt, self.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 self.encrypt not in self._next: + raise TypeError("encrypt() cannot be called after decrypt()") + self._next = [ self.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 self.decrypt not in self._next: + raise TypeError("decrypt() cannot be called after encrypt()") + self._next = [ self.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 ``Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_openpgp.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_openpgp.py new file mode 100644 index 0000000..d079d59 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import _copy_bytes +from Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_siv.py b/server/www/packages/packages-linux/x64/Crypto/Cipher/_mode_siv.py new file mode 100644 index 0000000..d1eca2a --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import bord, _copy_bytes + +from Crypto.Util._raw_api import is_buffer + +from Crypto.Util.number import long_to_bytes, bytes_to_long +from Crypto.Protocol.KDF import _S2V +from Crypto.Hash import BLAKE2s +from Crypto.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 = [self.update, self.encrypt, self.decrypt, + self.digest, self.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 self.update not in self._next: + raise TypeError("update() can only be called" + " immediately after initialization") + + self._next = [self.update, self.encrypt, self.decrypt, + self.digest, self.verify] + + 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 self.digest not in self._next: + raise TypeError("digest() cannot be called when decrypting" + " or validating a message") + self._next = [self.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 self.verify not in self._next: + raise TypeError("verify() cannot be called" + " when encrypting a message") + self._next = [self.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 self.encrypt not in self._next: + raise TypeError("encrypt() can only be called after" + " initialization or an update()") + + self._next = [ self.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 self.decrypt not in self._next: + raise TypeError("decrypt() can only be called" + " after initialization or an update()") + self._next = [ self.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 `Crypto.Cipher` + (like `Crypto.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/server/www/packages/packages-linux/x64/Crypto/Cipher/_pkcs1_decode.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_pkcs1_decode.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..9b7d3864edbad1473f1d18b362040d73f35cca57 GIT binary patch literal 28184 zcmeHw33wdUmF_K-s?}{t-EC{J@TQh6+rpsLn+!5Y-e?&aY-5AW)@W%hAgSf#c*H3Zar1ANW=FdR5+7adE47 zFjUo%bt{Ao9mjbWY!p|Q{^y%pmcRCD_Jq%d3y2x(y z5Ra-zVO_TJh2Q@4*LPj_Ha0z#;7dZ;}I_;u3J+4}j++ zKQsoP{0-o+r|ZCQvQrO!z%C4WJ&u_U{O^P37e%7c9~hPU&yrs(f;N5|_>&MZe~u}> zS2g_KD|x#eYTrqS{6X7bDVF>^v0wEs(;Cj9P&lEH^Ca{ z6z8=xFIyg}tE#J7h-y%G%~EH=w6uRzSEBaBtsjqShr15F&ajHn; z^PE9>HEI0x`J+CKpI&Zo*Kgg&yP+7|^_crnAx0L~O$dmQ*$Z&?l{Nw+x`#}kczpzE z_B^7=#S_Dlo=G%?{)t(^7a^S5?Jzaya?i3l(=W)bzkXDl6zD^$Ui9M7yg96>7NDW#r&OXm<8OuQA(gV}jG0dagOTt41| z(_v#BGPNtXT!tsUhRm)icK?pxu1|A)-#!>z@^q8$u18jQhJ(AGZSvhs*qYrxlbCzh zx4Rnw3GN>8-E<|8H3&q0aL=kgv@AL3yRikFrc0U=rFQrz0cHiN_F0-%S&s*OK_SCGlP`@lNpc@Y$zhjlKiNf{9~PcT_rf=xuk4=T%Ta&oMAcOafS-+4CXf zAW*^BoAsb-AQAL@5KMdujo_(ggQt!K%MLe#v+JN1^t>2c^0;qzFDe~OJVO;LIey)r z&03W_0PaZhp7j$Dquk)GPez7LZ%O<{_JUT(+=lLekyL-#6-}2nUD0%9QwTkDg%A(X z!rYShW3U#Db|jd1I(X^!AK1w^`4WSBZ))k6i3E8dFnU37*LCG?;oJQnYJeWGBJs}fLC+)O9K*f? z!@&gpQ};t9;RI|+3Jxd?4k!!`C=3oL3=SL#dWLJCO&m@tG^+Ma` z*QVy>xbMJND+iDEY6l^I6`=6?S9wcT`*OFscZzeToIP)T`AlMOz=3WlUixHYMDBUA zf?oeOvsQXbZr4|P1ADSpdMp0QX!6$F>{{Wi-<5NocTg|Mn&7PmtI1oj%o|wdEm`LE zFY~%rMoC@HS^HRZ`DX23 zPcy}=ecMz;yA_T{Gh{|}#zM2J4A9N|6LUbT7RJyDGs1`|ja>97gpH4LHD z|0yXoY%l|o=FziFQmOI4d%VetA5;Z1e;-y_O6=!;la$v|gmQTpy3+rhN**Ip(j3>5 zil%)7B@8#2Z~1AmzqB)7H`@z*Th;#~1zjre#R|?*@Vw>A&k9uFiu3fqf~o~oivx8v zwRJV~Yv%_l)`vR-!M3=`udJJYx=0hQubN*~OTtSaT$>V>{7T5436IRiGDB{^(6T%H zx9Evx5Z&63k(u`cP&;w3V)_+U)-1CA(&Qxox;v+ffad<6C{NGI`6b#)&(66<_192!AKOl7+Lf>=R)r9AuApQ2Kgd1*``%cQzTn|7dhj91Jz+TGsY3^k} zJg1|CY`>P%fh^&n`ehesp4&*!GmY|!P0H_?2)o&nO{&CmfT$9a3V8OD?tNy=sz#f19;lt3XGyYF^KArm zqvtHLS*N*g19z9FnDQ2BzV86u;^`y3b2T5`x46S|CV3XrJPA;HJ@bibHmQA{vxr)4 zQu{qkM4fL^_j!UuwP+J6q4$8NoJzRB^z)$SLdsjKxxWYQV`9SBDD!@AZUP0DWIyDl zYUgPr^HUiDk@q;c^stP8JMWt$eo!`|U%1?>LAu=EMKSr*`S%jl%r|>H;BB8~)&XcASlT_>YnYA;!~GCBlTiGZspx$2^4Z1I1~=ol4o6Xls{fpn z%L4i_@y;Q+=a!P(4dBIb6#bm!o-ZffCqQXoC|XZ)FU)xh1zZbs5J&M~Bqp>M^GNRZ zpnr>Fay?GkOZnvcIWQfkey{Kt8WQg`p6yp0hWQZQXoyLE_Aw$HvIiiMYu0j+pfR8w2n)NO^7*`=% z43peQ?jPXabPv4tVKbhOV|oFIg+S&L@fXqoaw(1(q*7Xn>?c7zhNJWh5L1fK-*J>K z2GIuO3L=(+*au`U5oes{YbGcL*OWBd75z)hUUGE z%z3ZS>1mwG>~f_afV&(U)LI;+e+DrfOI!{PIlkUeW;e3g3w<&~VulbOO@}?ZfDF-9 zr9xbQLxyNx0MW!DLv(eS5Un_5h*(z>_oapCm6>R095S7e2amc{;n^t+4NFNY(u{iK zPG1eNn`U7##WC+3szn`6e-G;Ka7>>A;%OkiAYuxL4}rXoqs+3cES6r3+>&y1EgYp+ zfoKA9HW7UwZU=HJ4%wSn*KPTAjKg$w{wIi>4Aqkme+-9J6bs2v{d~3%58{xa`qmsF zzKKJI>J*T-aL7<`Q9ePx1#xd`s6c1Mfi#OItUsyZF+1vz8k{%mj|4M!}i4r1fzc8MIuw+_ZkV+_ZdE zK2BBmu1~8(hEB6^RqsG8IP+-Ht?B@_nB=PZ!UMpYNNloP-jZ^8oV^4wY8+U3T9}wHqES> zC4G}-R@J1;tU8B%3wkd=RjXm9*)&s0dnT<~MUO^C6*8;mP{pX+TB$JkRtivETJYza zk*lO%0<^iRt!a8D^|{k!%hYKaRulY4hU=6UHSc^)^Fi9c;StE&4L%+2<61t*_ra&b z{j%nzz0YiKL9Xtd>Yb=f()=#$E{lckJuCO@+$FiqSTOZ+k(+xCBrqBk>V|P2xaju; zNGfNJAmA?0bZ>4hw2dXX8W^5@(-_F+f_i97NLj}Zo0d2VBk?>XF3TqId`)XEpd4=* z3aAFhR{)C*Xi@)yG}Gti5o@AiNp+JosSGtQsM5~O<4VoVYc8O=Hct5KWqD+}(7?u; zE1c!}mt_b-5qMS*6t5W8?Q)aTOT;XlPAaw2CYWjn!9?_dDY=OGB#jE5s-$Ibl=QUe zT5Z94?SW;+MptX@CgT!RdAcEL3snA$Tx}!#D_xLc1xST#LOz$|%giD$!;Us4GiPP+ z$dz)7n{H^f1DB-dByPmD4N4_q?yWa!B5T5(%P?FkkRd1o^Ec@#W2gm5&ZBw=afaQh z%082=Vy>w|KQfzynkyjHtJ2#Eqb9vMFf!9y410%k3#NWum7qTHjYhAuji_U1H<|~I z_z7nDEO8Q;rv1sAkF$IXgNAP`+99eVgYoKUPjzQ_OFRta3P+=T_!Zg|gEnrESaQ%Z@rL%H z-oAKc@4z{zEe5qFJXw78sK20ThEaf2SXfkqn&8kKBPgz4%^ZCNees>Q-Z>UhIyyg1b~I7_M&_mB=$1jLI%!8qTW? zqt$hp;n(llp;3nZuF#A;{hl2ShR5Z8*vJRd=hDBo1Eve%RDt0sfb<|l3ymTdiuJg3 zpJq&ioX1s}o>ldg&XWGZ^J3IO@7Jn~iByfkIyl{+8MBe?cTX~AHyD1ZB7jtAFmvLP zC56(^A4{%L1X&-2Pk&Bm6ePdlztJc-$0+V1#AtW@(51QbcMxcwe(w&7WI>^9o?QLk z1zK4D!H(6d4I(s2v>GM%qn%uUaKdoyQf>LNkw-ltcd22_Lj#kChO4Kbz{r)po^MnG zqVfK81GJqQua%s1ZanG#S2j!5FV%PrX^pp9HQq7Vc2o`3W@a>Fm`Dx{Tb01`6!IA&@jB8m>o-e0}%^U^J?H`bvpq zPF&Pw8jK=+bHi7Ao zW5uUU{I5idxw>e~rJ6CtrL}g^3Z`jt4%>1JYgWGgxatuF@YJv0kKTgNJ$1uFto(Tg z;iaumw^l#3YM>WYjnPKqG~ZVwi+j=Nh0x=|H47ySN7+9DS_4)6W=(5t#onU66?dsM zEfk7$b%pRGUh{<^dMYk77?1J;bD@r&w%!2|!{c?3h_!WvL$PpQxFa6w?c63pv7SgY z-agbNb?ZX4cxVm}@kQ}$A8dgiYHy3-fxE~+cR-$o24cP41Nae*esoITstNgIUNjsV z>WkN>my@PUI`~yCu)KD0;In>f3sm;UV&OV~_|QOjX?J)a9PRA@*%s~SS&A)Y<)Q_F z%I-krh4TZIU0b7VgIfUCHZK>r?GWmqrxJ02A4$c8Zkva?`r5i<0{hlbZ&zp_66$Y@ zcl20wl_DKO(NIUEZ>WDj47Oq8*@<`!#Cr$AeIgX;>!eUaUkpYggKgby@o)%_ImQGY zdF-!~hTz~e;V5ld5q65=s^*rJp~1ePn54Ewd!a)OL@Ko+hW#q47DZD~GlaJdqHR#< zU_3-OC}jHtMn!!fycvGSu94t`pNJO|l1ffC5k^8Dsz^;f!`s&jvA;Sd;Do6D`s;damuO3t{wGT&Ej9pU; z4`gIw!m16rCIUr0PbU6WiS%|L@X?Oy^x=Xl8*en1%J%)If=^usA7 zO>AKFR;%m~qg)!5y}_aEP-fX1OuOTqxj;>6c-3VMpN}( zH(se`9v7&I^^9)DRVgJ+T+Aq!MrE&eDEs2fve%nN#yfL?nrLM-redy(JNNEjB0cJ@ z8Bv#_ndP^RSF)MMg=%6GqhGh${31rvOW%}Hx+X5lEPK;fWw$HyeO58+*!+J}tSqr4 z$@nF>5kLtYBS*D9Kg9x;ndfvKQp~R_sEM_V-ei@0IhV|htBK1Q-D8cWwTyBtA!RQT zcdcxR>!%CPNRpdzt5x(`Mz2#W*@o;-mMUB-bG^A!OQx+f+&W<~4o{BQECM^k%%ojZ zw?w(Fvh1{lyaKUa*Q{q{oCdoL%EK%#gt8?JZ zci=5>;4O6EEwXr*TfQt#GS0Ee67?Ao&G|yL!kFg@GIWb=qJH)^QD(WqIr%E5adw$g z_N4UeptDR#hKxJlEIDHgNq5C)d5%r_xbp5AQ;VfJl9*ga^$nBIG2q=S+O8S`qKsZ= zvDPtqgJKn-$JZ7Xmb*u$OfJT$xOA3#c3G0MccwJ$<>Cjt(M{-P+pI+0l5vLAEg5H+ zCF&e_^Bs5#9C!;Ic#9l(iye5G-4eAlP&2{Nl<$;*Ml>1aYGQh1l*3ix7|lWSO_ty~ ze_L#Eh=1JFdJt zFs5S7=Tmf7jA>!X|DgqU&6uW^nWlnf^enHf!Yx&Iy|Td(WID5b(_ixfu5-WVsUxl5 zcctcn9)(_=V)ZF>AjKL~Xf(x&E0mt9qJ;ejJ!D1c+7ye26+?$z3w8kXD~z_+R2ID5 z#cyl>L_gXfC7H)CUtF8YooQt+QyW*AO;0RQnwezw`t)qJow-ARLs{gMgG2P-6D6xe zdaRU^ERl0(CYjA8%j|z0-=UPYX)<+&Gqf%^IrPN14sq@n4jmcap_F#Y6%)&{T;Y&r ziL){$9BNcL>~X{u8n+`um$(5fn%R(UlRrz#XhYV>a8172NL;o}YnNS0Xxu_v0q2g1 zmnZGslQ}lcMzDSaRYyqKTbog+*^KC2hg8<%3ZigEU$a>28GS>sibT|5p-FP~uTz?g z&QVV7GsAc{o+U+;@7CsinQPJKDJ!FaY*!StkjtNHxsI9@!zUDr+J*6-TfEvNj zmm3IDj536j<)cD!un?#H)4B0@et}~=N`9tPV3-HVQz;gYk)tUV50MvAEFK{*r&v5d z{yoLwh%rQoD$@el8qb^?u-s8{nzwbqQtc|LxOl&BhpCV{W3i-UnY_XhzF|U=iR%>; zH~bjAP!$cM`*$$G{^$bArs33C+R%QiO#P#RnL|(QQ_3-Oreruq`Qy2@S{ZP-H>#pHuKL-Q`dUWWC0z{eNHW1y#tJF@ z9d)Aj4JdtAK}R9E^+8+SuY?}7gx4|pvc=lK=&uy3NW`7iOwN8arO7DAelMo9L0T+7 z&-(Rc%49UP%ZwtQ?Q3OP?0%}MOZ}7agBGtg$vC}pLy6WR#-Fr!^OKA}WAPRw8K*Zh zOx=Y^#<^8!En=J@twoH#Y3bG^8D~gqCF6gz}VU}i;TSya^G0F`CDMlHh6tiQb&h|Bu8|^{Wt)RlA#xwsfbpxjx{a>snV5o5;GL(~PIn6xGVJIh4I!cCa zgF8ve$<#rT?v^{r%gJ<1dAhakq%{vya1dIi7p84fmhQo;s!A+#PD{Js#+0S$++TS* zOPi?QOwCX9PC2EwQ>^0(eJ91Dm#Qhfmtvh%=m#m*?-lw{ip3*@p~FSDCinpZ{vBEq zA+xyD*-7Z4RJMsZ31vJc;3RaV-4b4%RBPEE6?E9ak&-Tcp#)d~VP^EWrMvN6g{G?L z@H9}4RqC6T=7vno%q^L`F;DLaQrd3mu4VLVidBS*$;^2@$=QdM*tf*>4q};#Unb|X zmKrS6JC*wkX{lkHAuTnGGo+=4afY_w1i5R_O9v4Th;pBjzy7S2q?h8PkOsvl&iG z&&FizBtyS;)4fS)LdwuI=p;E~3`v?W)8#qR<>SiJ1WQ^h%@89wJ%)sjnqzf)LqUPt zrdzcUSiK6pCdKMkXe7njtk77BHKfq3DHacCh7K;y6u(#UBPl(5J^1$|hTl;Fd}Grt ze@HR-2Cn_?t^L-m{l2aJrmg*st^IcGYpOgue8cXTqS^0_>QZ)-f_$5`UD15g({9Fo z@om5IwqJJJuet3P-1e(&`=vHtU)v$ye6jmyU(5N5ix+bHDsErG?d!LF@wTtryjT*{o$ZL{)q}YdveT>)#h<$X}hX#)aJLHwk?(b{LKVD~fk!5I?e@n^p ziq3Kj?ec#0@BzbVist98?DG7W#Fa|!Dh2tm34T_HpP8^fFkydM!v3g){W%HyLlXRC zgdOr@Ms|P4r*+Jed^ajxQpc?!`ize~=|UGZYR{OSr;BXC-+vp;Hv~s&G~XrofvC~^ z9I;PDbTr>B_vR0w^z=MkIDFq30y>`5;3q#u%X_Ww zjF0B~#L3)rj*08|dNO|}IXzbw6Y)ZOAe|*~9Up(Y@PORd7A~ z(&-Z~wnW`ETf9GFV@pr69NL{eV&Npe5PXtfYx|*OvEuKv@mDK8f2R?oOjqHoiBz0< zI7K8sv)#W9K9y^IKN~cq@8i%M`p+Too%|oGUc=IkPuzmfBiNIZomZuNWXJ>$Kd}B_)h-pA4C3O@crly_V3gmQv62$XlwM7z-W$H)~n zC_tYhsH&o`5-eI!-4TuVRz>8CLuucz7huQYLtR~X9Vhke`cS+-)Indb#~WLr&Pb@c zFVf!D7wW_-K(SEU&^FN#=^yM1<1MYK#kKYH5|M)t-ai}Y4Yft1ZQJn$`gn9ZUXW|+ z4~II3`un#-C5@7w(H|vhe^V&5YJJn1m7$dvte~&%hdN`CP*2-HCw*Ff#ik3I)-*2% z7jM>uRtA-5aK(DC@D+YmIWy;hr`+%vzIB8K4Fd*G&>+kJ= z3lSK`sY;fHVBrf(k^X*kGzf*;hq|HOHqeb8tjOMhF48x%+S{YyEllD29AU;08%F6* zFDQ9sY1GjBLIkaZIXHMb#rrUZ%cb+7Mgc#bvYgKxnJN z`n<1W*n@e75|v9RzV#zhiGq!QWSjMQ|HtsKl4GFEF)4z;=-a!j&-+A%yu!2pEXR;; z%h9)dnck@a#4w;rviq;tq7w+^vHm`#&v3sI0Ayecrb-yvL@`?a%Cg z077lV{e$=S{C9!u@=P;409{|2zI7d-8lL4KA`{aL9|4!zkIU!l1@~v@o7RMQ1_<>% z*5~UA{<}@XWE_d(#^rK9cnNvw<@5E&>r^SEfIO#8tj~}h_)FKf_JOK^#+0hWSdZb` z;1bUM^Zuz(>9ZW0;d(G_?ql(}C}t?g`u3MHRXC*2Bue{T<|$PP{zjE=w`-Tx!Lakl zz|WNaz4)|Sda}#<#?bFp6K4SjMj5f|Pai}7+A>q&fNcQV^=Y3@JbOKB&M@^~8l!x+ zvq0%9_blM9HqnnNES5xAkGbcLq5tV6rbMHy!R`7)^W4KW2{!T%QEFlifLDiu`xCE! j6dqd@!GV6e1o(iK3HfX*EwWXP*3_q(|s;RtY)_WOB-M!w^h`2v3mT;9I zZFq5A?60DHhN~O*XKN25J;nTVmy@WJvp;M+w?7=NZrq=T&7rtI?M60>C!ccdHlIKE z8DZvge@b2noqov~BKIr1tLVRc#v92N_ousDXUa)G|Es~@%-F?j@1N}AZ`#BCX%0t? zEr>d7T*)1~TiW;9ICjKqzP)B8FFo>`_qh*xO`iCUG$GH+aJlV2yKtq|;+f(tY2IAr zxY{HgIseJeizXj?yjSR?Bbgsxexv@GkMl42o%`|+KOX;W$RV}--#iH=E&OlN^GW-= z{L-(#%iruD(z}peo$JByJ_-JoU`xz^@cSMWsq_k#W)GyVH`5=?KauqE79WeHu2D^M zF(6?emr6G$?je;bZA!YgW!VFpqJm2IwZu0tGrB)AGlxDlYGmfvoPlF%X*a7fhHQBg4x zA1rrGESXtD2IdU3WM&Q;JJ#qjNh60?lG9V$w9RZ7)iA0t)obdKf=;YEyY=?eA{a{dwj|9%e_myT8EIt$WwRJTI4H zccNYW{` zw^rTv$6$JLV(d5cI>i`7y1Q3~N&c4u=%i!!ZuC3WoYinWqnEq)dS<`>!3>xK7@!8w zI!R|y4ROUDV+6xojsliI@(5$T7(nd7M7_vt!@PfBc6rW>l$v0f+tE{ZGAUCGtLM;r zmwrsooUCU|kgltxA(da!e<-@Z3Tm|0xb<)CD7co_Xsxj(V=p-huA4Dd&LtN{*saf> zLd{bz@uNx-(OJR_x_vQGpFf-1M19s=K8#|jjYNHCNh9k1!B$*4dyhf<$y}B+ml%7L zfoxbnUCK^PVz;paW-TVJ&tJw*V<7s9mn6rJvReO3!wFhD^(Wb1v3p|=>q}QsI5Bpw zzH}8gvB&%BvtH+>|HiWX)R(U2C%c<{J+X;2c+uR~j)L{b#Y5@Qd8q}nX%LYKacHuYq+KV3!VWIKkwU~bYR z?_)eC)lCX^=C|$g>+lnD(bTWs?XxUlk)%InKdUC&iH%$9~8fKEdFEMtT zIoR0aF4#GKfNC*w*gd1t=;(Vb=BO6+j3K6N^~@2bc@@$9#mfJw-IBRw(E9iZ*mSac zZq?pVV^`Zob!MsBHTNc2Z69}!{+$8B|5Ha?`nSgDK@6j3wvGLi6nmUqDtkzEK+bk(|AI;0& zQXQGU#@&&n8|6+}VyixDGZDiKXG0S873(DGCJezF2fNge*p161{(7e%mqPTT5Hqn6!-(^aLj0lSlTFO zxHGQn#l@l@Q)U$B1S+w)_Rr$t*g~ZS9aSwGML}-MUXZGPnKI*=tEXe}R#%S>Gro0o zcPuV+b+d2n-Ze$fi8!62r$-!f%yIz4MULDoNy$$R zPtR{$-^DEtZlvc&hI3d*M{g#`(+1_^ESBsAuDo2)>*QFIl9w29I?tZh$v3Z;XWj(6 zV~@+37Vg;Va(1b&A9U<j8s1#O*;rn~eT0&tgeOe2<4AxX1Ha^@_t zI0}vk=}}lzRGduh$xhF?N%|QCmy6USXPage*+c65L}%g>-iBvg`Xv^CixuE<25qL} z@qEtLi=5q-TX?Z23fgbE@_gsHoW7g&>x{2;(I2XQ5b;i$i>7Se3Y3mG{ zt~$+nqg&~8YnFady6-5siak@vK3}Zp?6#hYE;uLWTd$%;yfVqZm)ENN1N3%#?mp&65}$W19vR z89r{dWuZ1tlB*XKPoP zd6T?0-5pm;SwH4Bw5%nUbJ1MMp%%56`)YEY?@Xp(+do=cQGglD713GB=B!Rx&WK!A z_JJg)?>hZ%l5>u{62XdOBuyd3nGR6yiV5z+$zj=XiYRO4t!wt0eHye`Ht`~nutFJU zjxssBRfZ^Q0jkJQg60b?90hw_d7+;s>W5gQa}mof=L;*P6GnbExSFQW`8vY=fU{pd zC3d^m^ZF&1bCU>L=_^&MZ1MADo3bn!*B(Jx5-3w}NOI=Nds_NnP-~qO$XmObL^4rs zKXA*p#2%HEd|dbEc9vD|uYbIr7$5S$&u4m#NB`E==7jYg}xqAD}G}zVwqd0Nfb)w*ob> zzjKiY3fYPG$d1w1in5@uEA-o9UCJ?{VrRE}OCH1oociR5b^6zkB2ga^aX9u0>@(*1 zkPB5rUfy?`_0MHH(>Ho9`8K-r??tqxM{LJFWK;`-=>EL)h{JT^cd9Lf;n-~2U-!0XTKTp zXd@$=$tUlXMqF!^jA0r`DwGM}b2~L3g#MCkKRaY~Vjj)0AVld9|G+s}0WiDmDWZs-g}YgoWxz&Y`sw+1 zsz+C`_(uI}`oF?auv5+Fwj}+uvmdWBN5LOl%wI7wW1aM5Gx9-(uOF0IX2Om6QoY=6 zOfIu0vzEss$plL;WMWzD^!l328J&>H^(~oF`a=WzWnLWx-}7`uDF1S<){Y{_EY&zfrG{5!R(vPtLoy}SV93taLBYfyqPOb2eJA^GRX!~o8*ve5;>`3 zk0Y#m%CNbWa$&_7GkjGQU~{u$Z@Fg`Mtpm3Qm2;)tVK7-jS10ML9>`WW`~!)&KofP zQ>EDAU!n>zuHs*qNnS&H={F+0(z#+hk1=Ob|N zoojYmhpd^|ef_A{SKlgUfr}}15+ja@osY?Ko87fss&!k6l|w>G+%d<@tyjdmJvri- zwQr?D9JALCyZXBxo_5ma%G`F(LEKjzY;@ z{sZaLdBadfD9+(X-h{j>a+#JQm%hijK0>OIWx>HmC@H(%{Tkn^_N;=`9GCu$aDeB| z8MUPhuUrI^5IH%ozPx$ix_*OZ5!OMQICwah)F+>8FL=V{=3@nq4<wo9V?PW|DFwt zOf}Jx%lMp2;#F@>(2eQ(MZs2Er!T`oFh^t)<+`OTySY(|F+`;wI*-c(HT zUE#L2*cfxSCN~;EzkSczVwrmeH;iH!-MK!I?3ms(xL8~4ZwRNoVt?bcFo$EM3`|)( zMfH7;bjWyPc&y=mn8%z45vVlRrr^<1OV*w5*^0vqbLolE*j&GI$K3Fb+1 z(@!SlzL^lC$sCldZ;X$z2T)YmUB7V8+@)-dJ?|~xtj;APNGxS|B{XCu8Aeu%8AG$6nG&(_X!6rqDcc$oAog_|zGOY;l*)X+oz3-J zVrsEg>4mE-O-Boz`4gzbuyjzaTCG@HOg))&w{@|0>7}k8#=g8*S#c#$C=`LTeu@<0 zrE1u1hn$?`oy}4eY*2y&Pi~?!e>(Zp;+Br-yGa#>@WGPim8=)?R^BRBHr6Hq`2sWnCzy)~`F4%q1C1Pe%>O62E6@_NZ(|un{C15ELAO9?lsHC_paNiaG)D zP!Ph0v6@-+mz-M`OSV!o!q$ivVw?%lQGo{OLSHuKWDgmg%a`5jAjuq}7%3i(ptX7H zU*ZvD66mNykP@)!L;^+G$!h%=LP`3C-6*?Dj$uK$&Lu0|T`AIUl7h*0snrpLb+^g< zvQyL=cILk>ec&5A_1u>&g205Ra>&8R1~U%IESk(5*Agz%Y(*aM)M z5-~Q1&0OdD)oK)oox}9-CBYY9X5QF%B9EMn@FLyOudwfA))Fm+%3>n_q}Vx5OT4OA$w7$k6pvFIxvuGQ zvz<5Ycj)OGj(N-F3`EnsA&=>M%#+X@=khf&KxgPWE;;S2F%Lq-8*Or~U#Ffnn$DAr zVtzh1!$CRUZ0F4Lj>w!s=a!9RlOqvpL9*;-eW_y-YiAKlYcr4KB;+|=786F;$?BDZ zF3VP?5>xILYcDAzqj(-=f~V^@m@RqjshJE?Q!iTcxJ;`ve>-{6E}|bf5BsuQWZ|gS zr0*=zu3yXSmdxiRV?K9NO6F2QNbO8dggcX99)MoJba~77lZ$Q^I|{y%3CDtW_zDCQ zaX#Yb2KEV>KtIicV@xZPxh7Hn11BXFQSKTCYPIcUrm#6l*Qt$me7UsOIw+uT=Jxn#_J2fD)O|beT};BO>vROsY(%Auq7}Qs<1rJY(ap6AjIm z=1d9w+bPB%b(3?(SH^QW!EBTgMjpicR?a@=KN=nT*tx6rh)ND@A>EhF%DZaQ-0Q}Z;keae-t#iwHqwDNi zhQ|SVFC`BsH#d`ZS3k-MW2RQi24=@H$+G)o`k8Y4&H7eugw8fRr}#tPy{ zKgWF`YYe9byH-u-HJL_Pxw1u>W}-KkB=l>)h>J|hF`3lThaZ=A@9^^vC!bXPnEOaU z>2>!Xe%1*1N*#VSmOlI}a36j)mO8MkF%Cbo-F5z(!_RhMb6${CqYgi-6ctLJaoD)})C%U+EEF47m?K%kCY1 z_Os-s{1*;Cr{(Z-SZs|$vGn2Rq&ob(XC8hI|IOh?{l3kE=N|Vj%%~I12F_wBGrn+4 zm*1Lm^>B4h)&Kg8MP}i*X;SnfeA9E~Q#;?v@I6uZ=@-5&E>6|Ar|3!Y8$^!jXXQb@ z_R(dIU-{+s|H9K`J0Gi)Eu-DxJ1HTz>IJ4shER2*vrHs^k}d z)VEtMeR_n2^7-|@mtv{;lOw{@5$R`B^IwYar^M+a)T&Za^b@Cd6UlEhL$c1e_Vn0T zz8JHl3_g@H_~^7eeVOU!S5m+!*7 z_|?eNX@%wa?StFFa&!#4s*zH3(vvgg8Gc7IJ-^&f{N7v#tNZt{Ql@S5&ufu4mfv+6 zYtL)%>(cMAjsHNn6`hyg7^we_d`(>+YArW@4K|Q~!!jdy@@)mh(zUI=eil8hyPx(e`6IBJLAfB1g6CE1=DrEgI zQNIRcf<&hPC#gaThoO7rL)>XdD=~W4%(aT7*XU1 zu%+TMn6c}wxD2+3#}<|>DD~SPXFmChUn*1kMtx^|=G}X7mX+nq1c@(Dze_jmzF*Ii zHS}PR6)L4Xxnu#$&Ispf%{7Iq3Kzd(^7o+&!JF_1;Rqpy(1h>?p&8*bLTkcngqI0Z z30DYT6K)eG6MiPd5poGH5~2xw5nMcr(1Mi535QV5+0e-VBsd`vh_c$g4O zXh-Ntc#DuvSWcKuSU@;Nc$XkEG?%cM@Fk%v;X2_Ip%+0TY$SX{NFsO<4ioAV9wN*q z>?O1!I0znuBEkoREd(3EN(dy(Av{WGPFP3?Ah-w_grS7*2xkdP36}|n2nPul3F`>I z62=mqBdjLm5ULY?BfLjwOqfCViExw9lyI65N*G5tK^RF$CR`#^COl3EBh(@6An1fq zgbjp21V6$%gb>1~gertPgdT*Jg!Y7;gf9pa3E_kn2;UM433mw-2nPs#2v-SJ3EvY| z5uAkCgffI(gjm9dgz^M`LT^GX!W6=JLMCAVp)=tb!rO#Og!P0pLODVM!Y_nLgcXEm z33~`H5&j^oB%CC)Aao$SPpC`yldy)cn{bZs2_c>^jnI|wJYgWABB36^lkhZQ6Jb2z zD4{0dN5XJI5MeN(JE0oEm+%y!bEmhiKHW9TRe9U%6`MczaIF^m9(}j!rKIJn-|cm) z{j;{8!@J*#dGFd|Pt0EU#Qr}c(>*foeErLgulLohIVG|2`uVR7`XRN?hmk|8Y)V?@ zceekJg?G1kjEkOH9@pe+OWQrV^X8Yf-!kV1FL`OvXXhq8w&Zy4E?+g6_Gzy#tL3ED z8GdqJ;_f};9?`d6oiK6U^N+UdRqOl5KmN2JzW@N9Flh8m)zLO zO9wbR4@!Eb>xU=D5BX&J`;XoYT{-pU;(GScy@sXCuk=^a;#nhp=(6F)lke8}a_pF& zJlg-dNj{w1z*-eqbx-Xu)Q03)?FHXtWQ8@6`@bCHzZ$Cb?Lgn&5mEH7g;V*Sp#-5kX~log-^bJ{4i+e~wAq(IUHV zqo;4@JyECazVCL{C>VC<_l<)uo%(w3cd>2!XABN(U47~F@PM5&o{C8O;zq(J?*}xz zx$Ci4>V&nAe)+pAF>A}6?=o}z;h&4@ji~U^+s}VII^b5y;^gW>&aB!#_s+`7tuFRB zR{yE$e=Km$+SM`jo1)K~&At2T-epaEzIyY})IZ;-{llc=HRo+;_4;S;)jzeod8cxV zCOq=u{>*NJ+C6=3YheC@(;JUPJ$yYb_s5+q9`u53BS{(46P;=zfklyF58(x^U>V=G7vqmm?=jmUItJx22{^Qrv!JEE$ z@wc>tO-7yl%6mnfqm$Rfez5lSy0JA{?TlIcM&rWlS96+f?s(_Ty}2jX9A4lIKK9n7 zv}K;I>&MSO2mXf9&tp;hj?_JfC~{=k=ebSDF1t(Z;Iv+db1c zYq{syhpqh^&%HG^XV&c~m(NFi!iFyD^2N7joIU&>3rs%x!rXyhH=X4BO7D3=H_qwt zfd?5@gF9?)ceF2-CK>l95V4>(AdwK?&^B>!1c_&@BDQlXjH<4 zncpVvoqFYik6UgZ)~tS`h^?8eU#l=?Ti9mb$e(KGrN$S#mXwQo+`7vC!$-cyUOKgI z$bzCCPY#^E@5tzahABDyMjUR_bK_M2-~s>@0YEJP@GbyY4ghWefS&*SI1pqz<06zkN*#ICM02~AWCjdZY0MHo#bOiuI0KlUFU@8Ex1Ar6& zkOTmJ002({fUy9eJpiZ*0J;N!a{ypH0N4QlngW2@0N^tKU;_XZ0Kg#tFcAQh0RY1R zz;OVe0f0sT;7tG!1pux9fH?r*8UUCE00sbn#{s}d08kA8d=CIx0)SruKsNxe9RPR% zfKC8l835P<09pfpZven)0H6baN&sLt0GJE_+5mv*06_Nt6aY{U00aPlJ^;WE0L%aY z?*o7a0KfqN`T>Bx0H6r~C<_330)Ptu;6(sX2mrnV0OJ8bc>wS%09XkCssn&30Kgjn z?*QNw0Eh(ug8{%&0I(AP zqyd0W0KiQEPzM0K3;@;wfSCZG2mpKp07e6V#Q@+80JsAHE&_n30Duz!qym6u0AMcw z_zD302>>PmfDHiPJpj-g089V?nE>Ev0FVy=jsbu;0I&@J^alWk0l*Oe5D5TQ1Aq_! z@Dc!M0RU>i|Fx0I&}LGz0)60Ki57@D>2b z0syZAfQJFVqW~ZY0Q3R?HUMx706Yc&o&W&p0N`r?unzzv0)W>5Kpy~51pxQ~fIMzHvqsR03a6tgaUwd0N^qJ_z3`91puD{fI$G@E&%8X0J;N!9|6EQ0B{}v z`~d(~004ggFb4p50RRmEYyklI0H8kr_zD071AyBA;0yq03jkgQ0Brz39suYI04@N4 zvH-vV03HGWvj1lSfZqYYXaFz<02Bj&W&q#_0Ehzs-vEF&0YEnZ5Cs5+0)XEDz;gg# zApqC`0Kx%4djL=w0BiyPbpgOh08kMClmh^}0Kh5$@HPOb1OUnafbRjo002-E0Q?C6 zS^$8j0YDu9uoD2>0RWc(z;^&(1^}oI00IC&1OP|?01W}aD*zxG0K@=*E&$+X08jw{ zd<+0m0KgCcFc$!{0s!>^zybi!5deG+0A2+EJ^)}U0Qdm_%mV_S?073x31_1B^02m1Xegy!B z0KjPg@FD|0N?}w7z+Rn0)VCf-~a%42LOx$0N(03Z?oqym5? z0Kf_WJ^}!z06-A{m<|9606;$g&=UY4|2rf9pGN*yM*cTP{S4IA>M*g=){)Z#~ z-$VY-M*jba{LeuC??C?7MEC!cCi4GFj{F~r{9l9oFN6I54f#J2 z`Tq*?e=_o4eqYIg{P#xwH$?tFg!~_Y{QnF2??C=1Ape^n|H~r(havx8ME*x0|9z4F z&m#ZVA^)o&|ED1T2O|IbApb*=|34xB3z7fv$p7-le?R2^W#oSYk?+sOX_JApg4||F0qc7a;$mkpH>J{}ssp;mH3{$p1sg|J}%cf8_sZ z8(BLC|k|6`H=b&>x&k^ha6 z|2fG2JIMc&$bTpD{}S@wh5Ua8`Ck$F{{-^CE%JXq^8Xa_|7GNVI`Y2=`QHxtza05* zMgHGH{@+Iae}w#Bg#15){C^Dj{{r&ADe}KJ^8Xz2{~+>z1M>ez9CSBz^|*p@{EK{8i#x6MvKV z{lups{si&OiJwILI^ru5Uy%6F#Q!FKDDiuUKTZ5@;*$~Ij`+;PFCzX5@jZ(FO8j2p zZxjEa_#(xJB7P$A5sAM{d^6%#6TgS}YQ$eCK0)yfiBC#=W#ao0Uyk^1#AhSEDDkC; z4@Z21;)fF7r}$LFhbBHK@hOR4O8i6On-Tx0_-4ePB7QgVO^Lr#e4OIH6JLz@5@qj- z-%or_;*%1;k@y|OuPS~{@mGnDRQy8X&lG>2_|(LICw?IDYl%Nq{G{Rs5?_?~&&1Cs z{xk9AiH}KqjN%6pUy}H&#P=k=S@F?||4)39;#(Bot@x0{mngnU@kNT?NBmggn-w3f z_{qcNe7T>V=!ecfK)r@Qvw{ zCtrAe{P=76Pd-^(?(*fMTONJ%hYv@MTG(yJjscxwVm$B~AAEc0&>m0KtM^-_yLZ>->A~ zeKho|uQLC7_0^=aAAC^bvzK1#dj0j+Pdztg%!_>s3&(BUu;Ithzy3;i|Ji5LAE{Y$ zM4u*2o_4ir^{2=6>(es!?;qB$QKQaR-+1HmM!)=W(|+mFPtQL7_`73|9UIg&Hnwi7 z;9$G2r{|I`yLPq9s!?P4!`rsS)D8)0`pR?9m33%Z^!gWG@bfNHCZb9C@>O1(GUY_V zPd^=~dG1`t;k9Z#b71Y-vn$4pD__OiJM86Y(|YC9uiq%Da^)rss#N)I?Z}bqF7)Zs z_x8$_uV3rZ<%te0T5K42^ypIuKl-T4lXdER-}2|5AAUSKI&kUq>2Lnowd=>jjQw9! z|M%Zp4+szcx$2!e6L)|3VZrZx`+oK5Bah^_+qZA%H=lkwrhQ!8;vdq|mVK3;zUFkV zUNh1T9s1nLoePdy5uT+q``F z=#*y7E_wd>=in2YH;*qWDEMI9@#AdKPM{H|R2?6EJtn3{gzKuD0U zZ_UPmf!m_bpa1m7%*@8GE?qi%e_~=(T*Zpd_T0X``{lRZx|93#)02`D5_Yd1GGx?%sCo zcGbCX;n6QQZmb<26!g}_AAZ>U)58x}2=noI?+F0V;^fI8JsLL5>Dat^&_iX*F8Ve# z)wisdSIUTph>fTE^;^+@>((tJzx=Z8AFEeye{;~FxK#@m#=gE}$(Kz}ow}SiapIAN zzx|ficK7a)y_+^YzTvUQtaJ18KOA!8$V*>z?3jA;?YEDu8!=+_tsXtDl(~BKP~_RO zdq2p^x;k&tq~tU2zwaMnw~soqY175o6DFjMij3?xCMv2~L}+NwOK-k8cGtRfOFQq} zxv$3Q)2~ea{`=D}<>a)iR<-JL-?wi+@VhNr%FWEnbIh1C=j4LXqbIj%+4Ax2>(}pp zCp&w=v6K`q&1So9y>>0Myr19J*9H!JB(rhj_iy&>IsEX)A6HyBbLR8Cii(=o3Ja_C z@yjoN)9l9|&jsGNQSYN=%c?sA0>1cU`0%$!fAdWlecn9hTZi}Rs0B8gN z-T(l<0DwyX;Bf$O3;@IefM5XN2>^BhfEoZ`8vqCa0M7vc4FJ3V0LlP>@&I580Qd<2 zoC5&00Ki%RFb)8C1Au7&pgsVo3;?PCfRO;84**yR0J;Ex769NV0Qd+1)BylL1Au4% zFdYDN1puD|0QLR{0O0`O4gmNN0Q3a_j{tyu0N_&q5C;I#06;nb=mh`{0f55*;12-s z4gk0f0NMh84gkOj0A>JyBmi&|0C)g^X8=Ga01yuVRseui0H8Afcntuw1_1K`z#;&! z8~`)}0Dl62%>bYP02~JZ)c}A$04N3kR{+2l0N?-s@C5*Y0N^|T$OHgO0YD-Es0aYI z1Aw;xz|#OA0RRjE0Q~_#B>*rM01N;CQvpB*0Qe37R0jZc0l)$PFdG200{|BQz(xQN z1OR>j01pEI9{}(z05}N%8Uldk0H7=YNCg0103ZSY^aB7}0l=34U^M_31OOHSfF%In z6abhA0Dc1iy8%E`0Pq+9$OiyN06<3o@HPM#0RVacfU5xDEC9#?0FwZ~`vAZW05$=D z2>>7x07LBi2LJ{FfW`ozCjj^u0L%mcMF1cS0K5zUegptF0KhT;5C8y%1AuP;z&rr3 z7y!Ho03HGWvjD&u0B{fhbO!*n0l*0WFc$#40swRXP!0fm1^|8q0Br!kFaY2J0M7$} z1^~bT0M-D2ZUEpD08jw{3wA}0B{rld;|dM0DzwXKr{fD4gk6WfX@Mdq5q5OhXa5+0N_Ia&=&wa z0s!^_fKLHH8~{iI0O09*h78v#HN0Qdm_JPZJQ0Km5Z;3NQO2mqP`fU*D} z6##evfCvE44*+Zh0AB)t)c{}+09XhBmH>cL0AL~j_zeK;1^`U~z+(U)9{?Ny0389q z+W=q$0O$b#t^$Cw03ZthOacJ!0{}Y!*aQG30DwpU5Cs520l=F8U>yM12>?z5fbRi7 z4gjbM0NMk9EdU@70L%dZqX9rm0I(haWCMT{0AK?E*8qSY02l}W8Uuiy0N`T)FcSb2 z0e~<7@G=1S5dho(0LuVC000;c0KNeL^8mnN0PrFJcnAQ@0sv_c{{M#jUyuCnfc!s?{GX5fuZsNFk^i@l z|9>F=*CPMtA^&e9|6R!ckC6YF$p0kde+}e+SLFXG|HF{~oss{aBmZwA|9?XMzl;1Ig#53I{I?_jmmvS!A^(>n|6`E}D=@;?CiKL`1L2Kn!a z{J)F*Uy1ymfc%d{{!`R{}LpNst8h5UaM`Cl9P{}%FpGxEOz z^8Y>L|F_8hA;|w65bIAXJ$p3Q4e+TmaB=UbU^8az< z|9<5E0_49J^8Y&WKNR`D75V=N^8bD0|8V4gMdbhU$p7ZZ|60iZZ;=1zkpK0N|J9NI zUm*YAM*f#U{yUNX4Uqrw$p2vE{~qN3Ead+?$p22r|2L5THspVAB3mxOfVm z12z>G@8@$0pYrd62ka^?j_0=x2YgjrEdS(10{{L{1?!|P7V89mYZc!zcKKH`5v1~u z5-n>!C@yX-IsE+F`Gur8e8$_SSXxzXQP&w!U6NC{61i56#9=X$vOLT1`r ze&N$RJsv6R7vl2sZ{ufA_OWfV5li;-@8D;5`PjZSV<~?2jy@EXzAWIH`*Crx`Z7J$ z&%eE&-O`P;Ra}cnKgmC(w50g?&-Y033z=t2@(a)RO!BKeS8MARGteB-}R?}oprx82{=D`KJ- z^=|*7xLEx?&~ASI^E_xa-@${|6Ru|2^dg|9-M5 z7c7g-Hr(;o&A7ZiCAj~twfvoM3GTmVUCD@+{2h1sM-39}#)qY{`FW#%xVjVVA;JCp z&%4E=B!1Csn1Ak~!W8}qs07hJ5@O_EQV`^ibV~Tb_>jNQtpa~xK?SoIVklh2&0|{U2@S=PNuFciZuz8Si2~ zziGxx`e{`6|NBq(-_3up;hm-(j+&ppnxDyS+cpoc&0m3LhB2`XW1O+h z@Y-FnhJ>dK%rVj%G<4Rnl*-&J${7_and8VDdoQy}Z$RGq^uU-T!_n_;5)L&ZnXhsgtV-@)mgBF{;%#-qAwO^t=n@5>j6tsDk znW7TCuBb%Ko4P$cwc#UkD4@w-hgY4`@+& zd&ybJh}HHUO2uB4jaZELaH+G35o_k%Q*wqHvDV(@BHaGjrz{DbijuT6Ftw(oe!^NBKn#rLXoX|u9`-FJ^Fy9HKI-e+Mbn#~LP2tXBVq(p=w?Xm2Ur&mHx$FC$*& z6j=l0-(!|}qmoR9)f&)_k1}t%V+X0E%vM&H*pSxTm+8vAM>k1mRI#HZ43UIX?#kL7Q@QuD%VG_* z4kqbM?t;{hD{^;JeyHu|Wxv3^Pc0e^FI(1MBED6Ll=TT7$GycjgU*)qRS~;yf0D|U z^9g3z`};mAPyBqPnh;Bw)jaaDXR4plHKSbzIfLW}&x{P~jKlZVjU)RN?cl4RQ3R+4P2Q%mJ;LugR* za97f}BsVRllqAQNB-7-al4Lc(taBOm^SmCE8N4lJbndHsN*U{ZkMi=s+cv<=8*2Bk z)%8A3n(qv3X{+Zi)5AW){I>cb9f*WmJc^k0$oINVDK{AAu6@D{B)hsm<_jg`6EL(y$A0zWg4 zS-t*?i&mrX|c6yB+IA4sBygT+qr~b^`mLh)~8lqn$ z+1f*TEZbA{xJRiT_b_`bz3gH3SbE>XcCW`hOZB*CsUG(%)#IL}dfd}?ug5)Y_j=sZ zcCW`hZAOn9J|z~7vY8VjyHNEp$`&D3jfs>=in6)Hlrd=xh)7R)f2(4(FX_ zD<`IRJ|egNa@*(wDH~&S-qLuXG<3|vXvi(9?>NXvU zHjn0H%rxt2UR(B)6lvZ<(#SZPg!rj+Gu$MKC5&_eWB-NMOpRxG_Bl8EB(g#>Vw}oc zHQphT!_5eZ6cG7_n=iQ%wi0P6mG*R_OjQX+RK5nJMsled=5v!T5vjX?o3#>=RxfjN zfh$4^M@pSh(6lyJOCOB5fJYKMEo=B`YwlgcN$O-CPvWXki^wb7tdK}$BD=ZS$FB4ujv2NyU5M*ct~ zt`6AeiabjsxgM_&uGaC)*do*8V6_xVzdy2RE}55ZJj#UN{kdwS5z)Ds#buQGsic(r z57n%jY}$BtsrSjW+Fj}xH%CiKH8Z^zR!b)-Rb-MzB9iW1E(}S8UVT}A$4I`y^Gi}-Kar4zNOrCog+y9$lOU0GL>}P=P0P-paO5dcP7~Y9 z6?u_JXZ!%MT#-qVMuRE}zrZau#cVHPSE8$L3eXFTh&f>d%~c zRIu3mn)|fyiStPfWbz{{K0YnU!EBnhOt|JCm9;7#lB-Nji+tDvtu{X&A4+R+K2{RE z%NdmsO$}^DiL&=-XBwhN-DaTFKOS z7-`|9$84rmyRUCXzUpDt*uXBuc29D1IC751Z7pA;e2iIMSsNsn<;`fr(goa2I!&vXc^a8*n9;`f7rAdPnv|~H zv{uv79Wc|Hm2SaIi!0rXnbzFQXKt|;r43{ZFFp#J-q(i&nHKO|G9&J3gbnwnF-NfJ zU(#eMTu~O;7PDIWsTpDD?2bWf5f4jQdFNVh`@sYP$r2wsX0RoC)aab(F~g#VWId5H zYSf6aSvd`wMUNRZDkpl}*fG)kpCzM*4jvpmp;?p6CXE`5$r>_jU`~S(!$*#r5Zx?# z_{hN{#tq4`sH|ordeHEkvG=9WucWR~gQZ3OSCqpCj?5Z6Hfoqe2k}3%d^B_LsK@vp zY#JHH<_sB zg!X|CR2?@?je#LC4AuM47FuwcRxeG9`#{DJ_x|5>K3WT`ud1)YBn2{v77{C6H)fLF z{imMC{$s~W?9v{SW0wqR;la+o_uuP$Nu6SLYl0S6S0+McL7FhS8`$uHhC;n6@aW%I z|38dDOjBwM?H?S&LM=2(tCy|CrD>t{wBT$tsmAP*$n3^EFt@`?TR%YyjQ?lz#~GEg zHjT}N7l?ZEs$B}^FR08sJw?(AYI^vM}A%H!xQF zP?-Uer5$B@weW{N*aRycyQ1)zmlvc&oCR`c_)T~~%c&ip-YZtCn z>7m*rr3DTvFIz{pWT{OZJVvX>vcPKW>ykZ@bKh9dzGZ=;C7~+f^22o12d~+lnktoR2`_*W97UJ7{>%)7=Rr5 z_=7MD8#c6bbFv0ybj+hn-Z*Z}$z!>fOz$`u>VuOvwDiz`^uJ8rcgFZyDTAs3j-bkr zrjxXwrdseQDG}5}rY*-bm>O!fF>OQtZrXq~!(!SVcTZb$g^NX6*sy!kCatJxlhH73 zP0fLE3)}B+?ul&G4Ykkjvtd0ibGDex7Fs=4?Q+^|-%|@a5F_9WX{3d9PhhLnhEld} zvekykPOEFhygk&;lV}|)E1{XSCAGQouK(=XrZ==ymS&E zaSuk6kfp`-)DX}0+jh_Oz!46ojrFJ-LJxqv5^{6Rc$XyL6iYn&DyD?jTz@Uvc&R_7H;*{f(; zWz9ip&1;dDbvNwts1Zmz*yli(Snv%`SmS?xFwuejN%n735 z!o6%$RYmQMthe1+<;fDSC@r8vnxXJ+PBio9md=06$ZrdXqOt%l+bkZ2H=|=_eUuWl zXbUh4PgjLoG5$a;AXUqV(wf9;88MnYMXR2x*?VbWX&P&yNm_ztZz0uCsa0zd)lv&+ zuG!;NrW`X)Tukkk8%cj072= zQLWTN{ZqA!j#}SjtqI+0pf#bw7FxzEt#3OmfC}QIXpp;00a0QcbHx8-mYDyFRp=Id zF|0yI9<+)KBcPR5-LT9IEi74?Xu8`(Vq5Hkd5y93Rh=>H(>FnxCB-z+zZxg3g=xuu zHVpmgn+A2U71P&2tf6^LV}VqVTdHi*QVXjujf;Kx1EuD)Ww2a~_3;1PI;uDJ_ETwV zp_*pHJ}e7aJn8?=GCBW#<&34u|L)3B27=zoKmiy?w%0V)Nw8W=t7GbGb~Y5NNi1iq z=@R2Ki8W_7EXUYaEj4>{vSDgjzG??yV>|1fZN&i9x@VXgfRe435iQHuu(W&isLt5g znqmqW(lo+wSd-ISTp%)m+nkg?J#+4R#v-OAzHvVS%oYf8PmOaHTpz?&d(p^ZY%S?Fi;o>15Upy&;#4%1pJPjQU~jE2*{VY?wRZRkWsDt~(OPTLPFgK7 z6}wE;ch3f@JqBxUKrVwo!WCn+Wou$el?7ZeEMuc9S|w<*TOb0l5(XKVl0xmZCKRz} znRb`DIoPJrh&|ft=;ip;t2MiQ!2)}Eh;Fa0HK(r3G`SzDrh@xwX_C_Xl#y<9t!svs znWQyWPvm(oO8jzvf#7s4v%VJmgqGQyhl^Cr!BJY*D9txbtC_3$_R^~5Xuk1M3uji} z23l}$t!uobsHbBol|ZRLty&AsH&?RxW|JmI8LQScS_@8f=gmGHg0NIGIFRFcMob zOM}z3mTB7H6w-|j^vuu(C#f__@uU||e$jfG)sT>;ReE0=ET`0Tm0T%J^N-i+=4$@E zw8$K}r$T;KYOl47(fs4cn4ndne9w5zKkZ*KO8xDP=h0fF7Vf%oR9&>yo>DEemi&y? z>Z*!crfQK$o7}POKbE?AX`iyMPK&pf&(29(E%QHI^P@QyVmX_4FU?QXJ4;1FcU1EV zUeRNy7Cls}hVY6W#)lToiKB@YokWHh-p)a`Sre_AR#A1yH#U`5aW&hYUhzDtWYf`7 zzAaP8s)nRw!gXHk)l${tITN$vRsQQD05o5fpOwim&l4?knO;>B^+)^VXt;w`El!Jm zIku$bDfhLkRcdZFrtG5{yXzIDTFRZ6X0&wIY>5P_akq5SXh|#AL#x)?Y_1vuPN&88 zSq%AJn>SHW?$O4mCJi>ojQRFajZQBkvc=bSYl3P+(r{9t!X)vIk!Xx?N*Qy6B`RCnTBz)*P`d&YxHvIMlogbeFL>=zIC)ZJ$lJVGi5KB1GBNpZ4<45G*919G(EhY z)BM>;*5R6em}ZTY)h0iaHEXNgn!jyKIC9aim)EQR8%cPXRy}GPl2CU`!i%LPAq&Rv z;(6H?*sU)cl5nb95?-UTn%7X7CxoIqt4P8*Wq|5%QxZ;hOG4Jpz5FxWlFyWccX$Xs zl`1r=q+p3Ew8``8SVWjFs8D%nsZ?6QE4n!TBlp3y4GiwymirP&c}>OO;?$y(nIN^sU=a0x-iI|ckJ zC1i98MJNrcSn}`$;+>SG>f*( zpkRvhsCqq>ZMYVOOrulesi#%%$V=2zjp86h{_;YV(T$VBNL-_na)0lgkMU%1yjhjf z7W=i3jHJs@l<{(;F2i{4cfJ-jR9Q}5_DXKI((G|&IWgG~En}tBDz8;}`7&BlE+Z|n zWnfq*EXDo4HyTrRGv4?7{5y;FRq_MnAox;JR7r9%4<$sW4^=8ccDbmKU>SMex>8va zB}A&XQYr}z+(&F#^45>l0+i4-mz)~Ex#E;Lk-NPA0?9XE+W-BEZ~+GuCPtGsA8(CKbV5S8MWe!)E5X zbK6RElrlC;>tFXBTSjbn&sNL|88bLNvvk!m`p>J2NlasT8J4R5-?G%-h{=ChT=&~k zi9chdm+K{`EauuUP2X%|H7Rw6@|9E0aziY#oMnp{l9J7=wzLck(TlE&(~N~CHj@Qo zE~}S?7P6H7kz%r4*@8;DR*#W&fz!dbTgeImL^FVua zfy0ZJNAvPWd31^*N>WxMy?I&(EtB7X^RgQX|DLQoT3S|$&b&`ke*J)^d|x!BHwwQi zmGUh?O(pKSPSQi#YQ?a4# znj=$Dq%D*XMO(|~#2}|^0 z&kow)ddSP(+Tc`anV+Kf2GgOI_Ha>)!Q<{rR0`59EWdV3QAtQMRcED@Zh84HsxkXM zdD#;cD8lugye!e7B^i5(4)yP;a)}o18Lj!JiU@6)pw&ff(rC68X(&@N8ZPHbUhyjJ zWqVG}QT|sM_NeR}d-=5NQ>=pyrNw0`>Jt4^T3sfTR+sf#{HwfNR7(4p^71UdbT0C8 zF?BsCFV7f~ zsTz*b=oMPEzm=7L;WRJNvVSKlajm(9rS0)vrCLzZ((!MkWw_>FuS8pN)+y1JHb0iR ze4VQ}VYP>1rzcUR;;Ee2OY?uj{Ort0#9*nxlV|zrppsWWj(ky8DPIe{s#V%Z(Up8J z%wD$bX1rQZke7Xdr_IZ@9y@vmPE*cT>;7KhoP%tSrBQRBd^=m7+;Z^gtG-X-{o|E` zgVe|No|2%N?aMN~w1;|Y+EnqA+J1V9n(={aW$B~lwbv-bP8Y28R!!82*CJYI_2aej z30j>rt$dpN^h@K5pm?ngrPwbGxh;?EitkA&a*^uS>u)mj*5Z5oYmUI4?mFTrC>6+w z?Sbm$k=Cp;S_%Ok6{uXiLb4E=_4aCLezrD0JF3r6+v9wR(JED3-2NT9YtBAe=zJ|m zx!V2lF!R+;lx%t@PVgC;vz`{(m+YjFHC+pxdVkjVPS|-;{KJ|vNo9}ILOU4Qlik?? z4Yjp**JeD9>!3Mgew?=Qn^dLI;_CNLAa!IKC(Hm<%3&L&vZP7!CQZA`R5PX9CRs~n zH!56B@6Iy0S1$9=-}cS~E5G|=wPt3H%FfRG|H``>AgQV=eY<-=Fen6ssL^B;R5UOQ z!>>_RehsKV|BcR|F|zo#j>NUFl8t-ryXQOa^?PrYN2m%*`3m}e_w+gEo^$WH=iS%uy*m|U zty*i9vY8%huu@W1cYlT+4X4K+ta7C|XcY&urA#GPEU2DLC1d5Y1y#;nlhtD7{$i=p zRqa*Fa)bTZ(purv3R|q%q@ahMb+GIPh|khbHmH2D(AQ{xR14)?Ux8lm(=WuCXCHd9 z-K7om7<4IjRiP)7&95k!dT%M~mec~JZnBBq8EjlOdqLyD-UMu%IZ!TVTd1g13)w|| z*+RCI>!xa^)ZM>`o)nome{SQROt*S-CuVQ+P3>OP^4%2cwdRICXH@KV7^+m8Luwo zDp`9}%k zLDsJixW+tJuvB$UOQpEb>dN)GEYUqOn9P=|d1r*FXH(fqb#QsMTSgr;8hu;Ze&oh9 zp&b-HlCh)38Z4HTc9EZ~A{$ z3oFGrE#e9XHu-Gnp|Z!&HqeglDrq6+it5RhE2V08rC4GkdUJ(Lo@S1sfmly1={Dxi zbx%KAfsBJ4KGtBSXEyOtLH(_ZIi{Fvih0Va7OLeeeQPG0>dxfJ8l~-6$jZAi-CwK@ znt{#a`-&WHX2zM&n^hSYoHdvmq^G66G_$Lk%lFJI_2m}yXRoSoD#(;7u3Vt4G|^=n zP5rP`KSEW1G*314HC#qiE8yEg>HvI~NeznLuBoB+fiSiLzBkRNji?U5#b+9lkwpz} z`4VHjVcr@H?U2UOfd46^6d+8~jimz&O~cSL#n2QWOf#~mIfkaZrq$PBXjZIB0PYjg zrGRcj69I-MVCV^A=%s)#O&gl1q2?HRX}w|gvw1dYi0$~Y*b@i*osh0T%NW3jx&m#i z9h_<6@wy&d1(-*K%T7=Vp&>K^g25AHuBlc!jUWZg4tGQd$tpkKj5!L1svkA@g zDuX^2aY?Bga0Qd}L}{&|w#H#JlCIBaRBw*1H?!ABf9jqdJvtI;XwYRtgJ!n--bn3b zVQLj{89ffG59;L!HB|KbgiLI#p`stdWgTXp-?NpxG#QUnM zp?1AP9ac5e_B+%~ks4}o+adj~Np*9ihT2O^C9eQGcp{QlC)QBeMNP+LlGPB8CXks4|POeIqRA7B!h+F3)z-n@;( ziO;Ax_~!t#P|yOFm}F8fYTtGk0nw9&5w&&FuW3N|VHi>C5UCn&6Yh+4I)pJqT zVtTJno(i_Xa7t%BxPpnOX~39=I;8<)8b(!%Z%Rhh9N&zLs=2=T7*+FpvoWgX`{rU) zE%41my&}Lo)bBCtBdX4=0i(yG>hm%)pAx?28Zc&~_6_(xo|)P=U`$2r8}QvcEwyjJ zn1o&rP|L{)VhFv5V?0J}I#M^qB9S4eGuPTW*y03&;oGQg=E zr=$!}?*pO_I++0?!Bet&PN6a=d`Up0d};vjQ=HLB8z4>rr0s2m3eEr|3W%^HQNZ&! zvWN>10Z7`m(VOzd_Fcjk2gEsodiMn2B^-eCjwm2vlh|ee|D(eOi1P@wx>KR@Sq!v_ z10sZpZ;wLdUWX45=NjUBU!gLSPcdX3AVQt^Zi%4spu-1<@F%`IBdGkB!w0xuNb3MG zBS`d-2&M(fh`JOICoLL_hj@}9brP2u2k&Q`mo-0imN$S?rWodkS_jxHq!CVsesyWD zI&&uSYfO7hLmfIV7ZVeJ&>c~i146MmtDxo>emT_EmuLiPX!-#{ht`;^q2_2z)@yQV zH~9KibpCd-VT-9-w{INg%AdKU@dHF_HlL#z2rYn(`T<|LOR&KsTABdhUI_ONNA127?^B;dWr2^Zk~LP`Q2 zJ6^Z|_X{btkKPW~$A|R3w?1fsJu}h3XC|4FrUc+_Atips1Mmu$v>pcBC!`VQztJ50 z`7U?#Jn5GdpngeSA7m1se(zf!O?KZ;Z3xl(({%4c?i(ymjstEMQW~(6d;jH_9^uff ztUP0!{@ZIOw@kZEoxY{v5Tb)3r)Ao;TIj56=F*4V?3fVFO(*8XI`CSiZM4O0$#Eeh zXOQIB1Jhcj4cT&kx$OaxQ^OkI_PZH=haFVE-(h>q<+s~{oeCy|RTSiVSo7U2FGRy( zJI?2Oh!NLm$mO|DMd(or@;YpfxxGH0y$)%+-{7!a?ef|MYnbNyB-y3_-x5;#DNeHI z(Iyo7pwt2QH$qC!;v_qdGc5g10=P&>sZVg;9m`3VG8^C&A;pIoc1!+^1LlO3oXDrY z8FCs-0L~K9A*JL4oQnG;@3sP7UY~cvj&==lk4utm1>9PnWW%Zq3cj#$;10ecG35@& z_5j(C^TzGl>aUCMby4`D z_w9(j7TD(cf-h(9a*@oHYV8S5&wC_I#{u6EQgG(>rfaFsnGC6jDz5)z@nI*ym+a@tJ; zb_ppCcz<0eeJnCm4L;u|p_B%ER7mmTII2D+IVcVIIU&WbWB64GxOTv=2`TDLGSt`4a88#SbMz_IMUITd{@ey^*+ z=k+r53BYTG)ZWQM{)!BJ0`N5RfIFX&D1Iwk!0RJYwTm~-EZh~S(8oy%$N3bZlW=qTJI?)j zz)@2T6Fm_CIEhL626t->wdumx3bpm6zmYT=fev%8A2ml~x?Yo0gU<8B@B|=q(?|nC zvANfen$wK${;+8XjX(|ENl73bP zL~Ax*y>?wg3t$U~csHA4h>Xg9$B?@=`WpzAZiOO5%ZPy!tZ|S#W|NF)91xoIGXTKw zjyfUezCGC9l`yHdkf8mer>uh4USx9lfXPGopcXWtH z1IQD)?yW)Wn z7}}<}`Ii`TVQ-6uShWsq)uQRo+OusjG74sC?n{X60Q!GA+DL+N)u#8toPH<$Bn z6L!Fa@FNi5epvh6E#E6GhweMS`ysA6Ow_sD_iG7lK!EGv`_1kAUE+Lb4}4~a?R1yx zE?C3V-^D3_vI5}qLP~GrKaE=Yv`G}ibu9m-kkd~EsSR+JkmBz#eDX8kO6~rvf!iBF zN&`MDq~v3qi1%!WWCXc}dG6qS&O#K*yo{%*NJ|<(31iXVg+??CO+|xCu ziKBgzAC~kCKrsi|Xd`D7e>m*Kw|0+o_mF3L$Rmp$}z^@6(mlWyU zhrnC=NQr0E_hcC$W(Ea9i{Ro{A+-VV0{~Sq+i8DAYZkP3aVhg9k zKS)|kU&iV1_mURd7H~S;Eore8u$7nT33cmc*Zp<-sr9Sru@T&^=N|#~#Pp8rlKjrlLYe}TAtV7_!Tm6iS;}>J7ts-_>;&BWRw#4pvd*yqqK47sq-EH?_#Zi-Ilmat7WP$4kumFCXgz<;z@0iPv9WWBOa35^rt3 z$8@|pgtCEuNgT!HFaP578pJUj|B_2a?EHP*# zJN{bj?kRD%;WtdjPdq3i{LDubPlRxJ z43}fMJdVo=TzdV3eclpwqC8xCf5rLcH7=1Z4rb3^yM5&Er#XK=$K{J${*FuBNP2_o z$oF1SE;n+CUk#DZz4A!9Vf+6_94FYRkp9xVePA=j zlej+nOhd=sd!1bOw*PpW=LNct&Pzcbo!5gtIxpc}bRDh@>b;L#BpYf=qRKz+=ZwHVkNGF?K1a3^ z`dGm9#UA=aOyA_8cM?6KoPNf1D%y1axZlQl9{1?^uFda{pC^bOp4zsUqV11JkMSs7;(kiE-UodJD`5Ho&{x;f z{{;G~dO8_nx2t&Q4{*EVh_3D2zNnsm0_d~r=_i1GZaw`((Dgv;gY7&8bj)|Aj}#}3 zHvf3F{W7D*{TVbaO*X%OUY}>v{quS`(UtP&nagbc$-ep9&2;a4-#~O~)py)X^hO_5 zsUHx1g7WMCp{>WCCx2|y{fhK?B}o4ZM4v$OVqs_fw|kiG%}e`;K9S;3>4Bi*^L(E9 z6X+bD$Oz-<{M2Z3)_w3jS@~SotfnSi%%3}}yHv?F742QM zt-gU`LGPViswg6tE7jiKrf%BkyOizAl`GkjRT;3lX=nQ^?Y?gH6s^8|u`83edT0;u zvX!Z>SKY;d!F;xo?P*#td!gRXJAjFHnJ?t5OsSOFKs&HkN*h#fDKn6@da45hvFATw5z|>Q!ZNlnLvLT+DGDTNN_LWlV zgO5HcLLTd6l#7`Y%VFMKP~;a9((mm+9_wk8ams7@(Cumnd91(|6HV)eJl5SPe@WlD z4^}6nm4s*uDzP8ybCg(#!G5%ZQZH}+?2^Yi9%Uo9v_sHYA1ttI726ilOq<$02qyKSzgL3h7VYNYHeO3KE)wTbS z$8`|O^F93D{@d=6$Mq7*ot}Wj_(SbI1oRjoK5$(%++jGp{HUXRkl6H_T#(20*MX4o zKOo zLLTMI9(h?Wb{dgpku(5uDEAUsW7v=NT61STzp2Uc8ddccA#K069mux}rvcm@wv48j z>kJPQRd4JxG_PLBLn1~5FHL{TEbsO62e%tJ z%Ii9E2XyLk)4Qg&P@kOXXr%v(=|AEQ=Rcj_5PJmWc<2KIFZL++wy%dbNIv$Vkzef* I@Kn|R0_ol#Pyhe` literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_aesni.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_aesni.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..62bc8a1db0e4800622ab5bdf20d37cfa1bb9f9f5 GIT binary patch literal 101136 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 literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_arc2.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_arc2.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..dbb84cf341c1dab86aad08a009491c74a22df02d GIT binary patch literal 43776 zcmeHw3w#vS+4s!OPS{OCHX(>y0@+|hLLdn@1-WHm7ZQweG1z!r0@*+`B$#XzwN)-E zY&8{)R@>Kht?k>3)!O!LExo*LBG4kQwxD8Tk$zFZ1_8xt#nzU5|L2_Z%+Ag(mA=2P z-{tpp@|!*9{GZEt&U2n~nc2zg9if_qE?w97FtoWEl`1nNQmF_VA6FS9mD&t#5I)Ch zMS|B%kWzBv$4Q7&P4f$Y>Yyr4P7+0=ev#p{$|dooDrGq;lANbZ(miEPZoY6_rH(z!>`ooTV+2P(aHi7)m!@&ba?2p6T&Otyev+%m%T;}6@=LDr z2dAnzqHRN=!@#-dvK89#=SBn${MYSy-zmQQn;EXFZhOWv>Tgs9(a9(5|9kuVy5bc3V#xHufT_Cl@9z?;6t=5ZTlF> z{s+~;KUe%tJ=BjwG_Tg{7!<<;-PwL^%dVyzY{y`E^)o5Bcyk=c%OSnB+-xdvr zwQy5QQ&bB#BGJOtwU>q)B5jd1P3_T0TkWL_np;~Uwe_o-Ba)V$5?;Nbo)pwKH{BZ1 z0?QXnf%ew*;nww$w)$vOYm3&{7O@CaZGy78zPY(|wYDy@ZuR!WMiBJ~Yr z?X6`MR9;QF3$<{hp*~s<<5#t}OWOgpG-!)zs^>2VPbr&HHl5l@LF^KrlF7RDc2SvJbF^EO|5Ac7nRfKM zC{sOE_m~d>th%c^>KfQ5Ds1!>-U${|-#KSL(K^k&l+64ndJfpHQ|#V>K40NR;@hcG z@P9?{PyZq%C8w);P8(IRlT|(a^Q!b;R_#9>9SQ~0l>*N|AF2u_0IIu)ULQZQ9;o6OpES&CIjh06Cc;P0T_XvBOVkQGXnbVKu@0sL{~`fmFRVY^xgMt zEr0=mo;N+QW5J@GA^lCgHxzp<7~2Uft1-}X+&uMCu;^IG_oKu5&XD)bV5~n-aI-=LgQZ)CLNFLR0hVB_ zFIdzcj2#S=bVKo}eZit$WE=ON00p-Dd_Ot?2!;i{CrY2rg<#2UkchEcqn3SES%L# z@_jOk_T|6{F7%pk0($UR>DCXx9V&V=SVBd#FGTI@g>OT#H8!bk2WnOx?pFG?h z@OH;2EDnupWFWx1Xua}ol5_jOP0o!S3Q!>QQn;c5?`!byYoImuoG=h1=oISR zlHD=#?lBi2YKU+;{CsMk_fYB6y`pCL6|P2@_LIVHv?zxZ?nH}UrpjPsQ6G^g6~Rkp zQlujY`UBJwG8BP}7JK_kx9%ggCEbLmrgziG*wQy|QEBm}5Nt*^6g#q@bmAuRPtTDo zLSn}jl@@^9Cqs#N&`ub;pwtb%{*dexY0shXnh zpv;gN=nVl<7r-Hb*zq9s7(%4y@L(}`yV2rZPymmDT?9OJ9-1Zdjc9F8AI2ue8?~r( zYqu~4n$cJq^(RcL#jt%hMQ`jNx|nu-6fwQAV`MVI2VK+a`_Z8wy3zYu48H!x4)6qv z&_kGnFoZGok;N1egPUP*&zm&TFo+SKJ4>Jb0l3A$Jrn@L{(kC(Q!k;@Vtu9Y?+UZt zM4yY$-boWqH?;JdXbrUv+-Q{O;wOnW)<@G8#WHuX=md;O>H>J%+lN+slj;OxuNaDn zX)D$*e0su#e!xT*J5;*$YhW!pRMH^0*m^B-kqi4sE8U!&@4c4b=Zel44x)c7_FG{uqrKDkHLYW7)O`{F;K+t zmt$XKF%oIuiyk^GW`YHxNTb`NiGhZ9>=4ZYBx#=J=x)Og&)Vu!BA-e6b2ixCB9USoGA`U#tc!?bBY}469^3^ zj3YP>+ZnmBI!GahL4~mcKhGd{KvIox8YH`EjI>TGIwYEKEI+zKCbk%~Dq;o3UJ%nJLLE)@qMQ3m!xKfAV*tug1h5x8Vj`+3*QDuRm4!{+a>kMv@ks`%i60{l)5;dwq8w`hYGm{;Xep?TGHcHGykS z?c364V6UFoe}gyz16{(E*m*nm<6q?c`2Dm6zoI(!>%a=ygIC=X9$q!`Ro~`oX`kL1 z_KWKX?7A;AXuFM!*pOe55$Ji{6VQ85b|V;&?M8MGdK!hGz7LGUg2t!(!Po(0uh0WU zy8=CLfbH#&{&FDpY~a+3p`yJ(V@YvHe`7)C#32ZRw`nnaG3Y%Ih`k*sdN!o*rwlPZ z8#ES;59xasc4j|>*-;~A3e*=vUgCkKkp65awnxqy#-fQKec!^)p}Q4tzgkR)B~-L8 z6ni&Iy}4;H-uOQ!|(Bf-w#B-)M9UY_Ri-3a4= zeiYG4TnEtN8A1JpU}rX6r4yqZ=EMLcXnipD0<9y)qS-&P@%cm~UA&&sm8 zv$X7*v$bsHCs_u68A}>I*=KA2j%6?=6x)mVM64Q%n$funJ0~7cA@??g9Kw@WLPc+5 zM1(k&1NyVU*ggtj6>KjCyoAu+*l=$_Ac|Zza(hH>B68^U6QVG53p~G`VlB4MSoCSc zfr=Fh(Wr2DgDpgl(*P_wf@XwbuLn-;4;38^8m${d%)Wpz>{2lr^a_Teqapn$u8#tz z4unv}Jr8e0dqO096!V*bu?oA7Qrn&jd5?x-F9eECEbMfTryPkK3Bj{sE=0`sW4nT- zq#xUDER8&T01j28^6tzyHbzYvHWg}Iik0WU@%k1Py82nCI;vNK%8eACA z57TxMZpF&2pRf!StKM#^8a7yV(k>NIaW;0+{uiBcR(3uH-cPoZcIRhlC++#q(oVXP zI9ogE3gwgSq>G$0+9}4AwK&{ImrugQ2e5b~LX|v>MF9%}{D+_p6!jS5atuob4auI@ zsq1+N?hVDjaWts!p$rXy9&~=UP~C$u26pcMpmz_pG>CkJaUiCy6OE^Lfj6Z0FY3&u zm4`#MClq_0mNgw?OvDsL%O0?bb;6yz0$`LP{&rjKqd8;i^TLKROdHQ8PaAvx?zEAZ zEO-J58u#rZvkm9$A!ZISA0(XdvM}T*)?qIic$CKCb7Dr=k13#+h((wcj)(Lf41L;4;p$ajG(+#+_4A#aZy>xrpxE8W4sSjRl!oEUhi!wwBT) ziq$3P-Df=A2Q|{)i4k`gm~eNkZO(g}7TW_nE6B0lFBsFV%$N;m#EVX(Ddf0d#e(Wi zUYu1I5+|?r51#~Y>RKZwhJ=+L2#r|oKgr6E&fdzu{sUIhy}M7cl6E7?JcJJ2ACxH0yBw!4>GmZC`&s#tZis%8mBxMIeyhz`o0Y-X{_2w7SLwe`?s~el`*+NR zd5N8)xPiRwdOa9>4k5AadSia)#KbN#xNQinQo(JDT|uvqD(a6N#TMR;4J7vI*W)5R zShNqDOH3ZL{$XcqiZ!r%+x(1es|Ho+zpI(~zVGfQv4OANa@w|m4_qhr>a;FuypOkT zxQjdIzj4zo^yhqc{t_A5vY-A1T88`Q)v*JC+UnTz*uBTz|G6Jv)u!XLxb+ABfD47# z?&_Gk7~ezq?tG9`beh-p1MZyj*850)6&mgVYgO#i#h&+lw+D+oRh^fATot3tJ?6n& zKS-h69rW#uZx}#dUI^cw{N*;^)(KEn-MON-YSUkO@y&;C>j(ffowdceRk7dI#6GNv z{kH$5w+03-?FdT<-VwD^($3deu*y!x&yvv-1@fQ(A-U@NwVXO9hBg*sp^rj zHSS#BGtYrzsCQefJ9oz&lCtHafoKJ;lRB5`^D&uMtv

U$0vIV%6&Be9zPl&7D%4 z4Y?OdE^k}yv|R9aywvDx9eodMLE2E9+vt1u#mU{s2aEmqtf9|?Z{pn9=(};hr_r~j zPY}V_dc4uM_6@-M0Iz%-q#l5SmyoWYuk{5KKEintDxq-YUkC(8Q$I2Xe%0tZ{AbAj z5rz6ajUiv_KIEEy)fn)dCWiXoLiEqRymb{w-)Zz6IF0lJ2pxq6m{5NbGN<&_(?g-)gQEJ))zP}<cbqu;!SDgNVYRe)r7!O(3U@Fy7enkc)T2ve z3w}sJ0m^$Qs|G-dTKG?Cg)i@i-xU?sf211p)ML_s)V5GFWP4h_R=iPgoj!%O?2`iM z+#hz!Y_u3&Ay@kjzK`?K;*A1dgF@>yg7y+ot(pOcOP%I%h&{+uJrjJ1d-+^U*}ZNYm!e*D}oUiqi3|FI;$ zKD4gWyXiAi{`0=dV|V}Pwycv66^*^-hRZhBz7pyB^~&!Tv|rIZ^c(lS_u7z-y@j)W zet7@Xw@cEH1-gwnH)zM4h`>t~j|Jw0q`vNV#W&ibj@%>LP{mKXH zXMW++7vFW>jvw6mSJ#DCpTFYa$&;@A%Oh`o_JQx1|Dz;#P4iEldr5oiH?M#Bn-f@{n48_MLGpcMlzz}bs0!%3Hxle;iy_+nqy&7O_gypgjeOf4QuFv+7^wLa7-p4q6*$-N}U zBc21g26#X4dvRk)Ysty&bV0?vMj*$3w>ywCev4^L$;$Bua)t+Ua_8rGs(1eK`4=j| z`XJ8A69WU!kX(IE?&n;goZ+3u{2c$iBzLzN$f?+pVYFuDjEAmZ&hYs;xxpMy4axr+ zBDFYa3;VN=1_s1)Dz&6zG3f}Aj-aJuNlv$Jbh&dXpcbm;3so>>p-@!?>XwYV&3oOQ z#^>x0ML_qzj(>UJUmp0E2ma-Oe|g|v9{7LH1N@w%^SMa1Ez-WEn#5&sZx2|u!uh$@ z!K%#9vyM<@etvtDD$^A=9V2C;@$;Fq$D)Jje>y$TO68NPV%pEq@d!O>h=ZT0tWf(A zdRCc^gEGMry7CyVQYD5>pLe!>HFWE@N@IddNY*6hpBX&N-tFDq6G^s_K(Mt z<|Y1VWz)(o@=vLlJf&jl_ho{Tu~$&cSCE))v#BKtDU%*i7Z$oZM^GQSR-iWb=SERJ!!yW3 zbVJYB4<0w=J#EPKnm*mL2pR7%RAc7qgVutiiRbRkb966Vr+Bp=094Si`-m9R?93@LLyrYS;K$a@KFH&iYELC}bO*ItC z(o*j_D*0up&iiH3IaVKbC(@PPb4X{gKJ>FFt@YABjF{tO8`gVW#5qBhqTabgo2U=I z2@)H;B~+@=hb%&AqxT)+oUHrE!p+_a(m6%AjCim&nq0y`QI2jh;CPayz`4RQqMp&Tj9Q zh_+Psd>!a6EprVKe~^=P6Dl5V{=`Gg&R#-1KNT*}vY#ZAekMHN$?hcfZqbRk+91yo z6bE@8M>T_~%c%`H6l8=_uM6}UM)PqC5z6%3bAgyw>7$9F>$!iU;?-7hF~rSlxH!l| zbF=#>c=9$uI^*9*P-p0R9{n#!#@D&@b=aKo4K95ZoP$PXQ?Tj!;CI1!5$HoS_e3Ol z51>4#U<^UJj?lgzY#0}7khp#c&@*{>CGze%adeU_Y#CuL zRR0lSmk8`e(sMhoD9({%sm|wf{|B%SP^RT`)H=+Zg@us7VQ77rv0VqVcYvedE1*n- zmI*iu9!6mqG8DT7_n>eSGEpkrfx^Eb^97uvNq)>zK%PaZ8|RoEC{P$4p~6lSX26IF zoP{r-VBEj&cK@ZS`X3M0v?6^4VMTha>vj~Dx!TDv|MTi!U4AK9^vPf_GW}@4AkV8X zc94ghKgdIFKUcpTb?H}2-}1~pS1k?j?KBuU;!4QsS5GEid=b_>h|^!Dcn&B--q%;) zAA^1jk{-$yJ*97k?0G_V;TXynH??T`!fDh+#jPDt_JrT6bcRjI;%)g*bb3K_u%op6Cxt=pP;t3$91b zM@^Fhfv9327^n{()5d)R9pJhj_4Qcw-JhuMep`L_TlIBW^*w0S_mEZJL$bbc<4ALC zsBRpF=37J{a) zC|Hi}0htIDs6Lu~et>f{$&MkNe?;jWoD)x>uuYkRGQlJ6syw_;>9vpCS#f zg0dStJ8>5L28H9uye)*NTIvKkT-rtw`tgW&xmrKmGZd$&_IYHwsW1vMjhHO2q6t$} zTj3K5prMjtn06xbAU9s!1pnD{*1HWBe0Dv z$J&NdR{IT0h`tALJvJgR7<^Ri72sKnQ&j81hWkS*P_>Vuu$^|`qS|kb((Nn{?!DUV6I z{wE#Zh2hN7%5?qva6Fxvuj)A{-U}`|GyCY;co1i=e32_MxLBMPI z=jaz?OFctP(S~zG&8BQ7=^vJ_XW5G9mg)1d*$pI1-l@!dcz!l94>z%yXBW9Lel#C$ z8v)F6o5Dug?NQjM(fZ{4<@%2K=8BBEtShrVB^q8}YLoL7$LK751r&~%mVgRH9@6sSL)-QCPXSWD*x7}#0h<4jB;o3Dw`3t~dwGs=4 zUBHD(OUhtJl3yl>R)ADW_9B>5+KPFzOrxIJTA3p)*0i!@1fha1`y&<>mzIeb*7c8b z5U4l+Q@OouwN~D`K3d+kw!9&7Q?#|Uxjhn{G^4z&wKZDa(cV^$f155}vwC&;h8Y)z zFPt{1Ez+>IK02wnsik8>`Hb?WmetK24G~SSszUjyrf7Q-qG_w}kJ&ebSGTUizl)cx zrmE>*yJfCD+RzYbEL#g3wdgJDBkjmyh@s-9R%9{5fWyk((jJbqwKe0P$|W1oS||@b zS<9;W_6W+T12kxnwArgVnwq1Nnp)CHEbz%iuGESfDo>&!8W%^{1;;dPLhZH^%#N{h`gvx!B(WxAP} zf#-eAF~+P$v(N~E!I)KNj>xDqhZ;YJjnEDj-OQe3PMBk6&oU?6Z&s91Ci4;k3+I`c z7n_B1&CId}G;&Tptj_aPn3>?5ZDyC76FxNew0-S>$va}6_?_fj4d^3|$RFpYw zb{bRj%?X>}j!LuQBH@o}%M-$*bId}^5{E~=WoFO&q{i62HdT0SyKHbeQ}Vin*E-Az zUly(nPFT^akh-cfH{=3M^V!yBAad8fQ~ZGp}HBlem1y=Ek?td;SXadsb^Z#>^cz7 z)rs1q!xa!+Oz}}lRs2kiGtpQKEL#|;w#+dr&}0mtax)tNoftr($wb>cQEpYz=(YeY-3ZKPhMN%AP2E_D` zWVG;Uxmj4Pd_WGBGm;9CHd%)Vjm6Za3iMuLF4}GuUMZRkQ_= zv1O@tzXv$Cnj~{bTtb=LiQe9zCg^dBD^uon+2VJO-7XQos#=5uSDWl^3>Nr1$$eH=M6Kxt zvLae2d=p)z!WX(}_TiB~c&uVj+{$Wd(*4_DyQeqdgbGSM(ka$pba+^-m06vX7JOl+neDj65H+H@^%}0bZ@?H zZMe}6?6&J@b4^=qvKo7DRia&ap|KSEZUYPJaO$Ud81R>f*uIP1fnP6tTZ{NmXUPvN(uy;UxG*!w$fz=o@fD)Bd<5oz`X9fhwd}i_Z zX+D}r<6fF4bjhU%10kuVBeEiNzMOQEh@K+58JLn0Gd434RJrJgkP$X!8n(@WoQtiA`39{>uODCWt)>uFY_zLzfZ%Kz~rsB=v_gXryX50Re#_BNnJt ziPf(Wpj_4vXKAv9MuhglqiDi0BAEBlXDEpoY9s|$wa}HBF`QT9fvSRB>=w^N z#jcg@FfnCVCdeR1TWV>I<^aE}AkkCqhyTvT_Q^m7g@ojK)S|Wa2v1 zKGHDGj0mkIYNQpA!bNJNiOmEJgd~eqbFkTI6IWXpikWlG2^Y&NKzlH&8A6WM^i4}% zR_v|AfWsnZHzsjEhNg3SN2W|;cA{-e{kNjsW`&4{^ds*7j0u**%*^}E>~=VRjSSj< z&cOdiTrtd;StoXhU3Xwdiftl-Y)WF{K64LIpkQA&y^*#v)v|@dGK>qc*)$eopJYtm zgWM$|N4G{Up&gnGHIg!iOoCjE*fXMxeK_&*9+L+zwu)2r{5<+o`^7o5O`HvjL3-#D zHip<9mYVuJ+8%Dl?bVz*w=2WgravimhIHdr_l$;7*J0C0w_k6qGjrcoDe^hgrc2Zf z-md(7tSxy_bJWe|h&#+Ynj?%DuJQ`5LIod+;x-+-&Ws1JgVc=!w_|vogWI>b z6g)?1`HFcSYVwdL{>vPnfm^AQU`$oU+apF(WNY7?-2J(5c zO-v1WxP@GuahF*PWXNW-q|6+J?J3#$fSCo%+zg2=BD6|pn|X`PQMki7$3*^o$Zsbt z=6ztfM%;zY_KY?C6U}k18AD9}W^)|u^4FQ;@VUnvS7(m&L`4A+*^%>WHGkNhKZx#mL~tR_Y%!RKOgB&5OT`H4Al4@9Cugmi$k-5iH97+ec1 zL6V9x2~y)w7j3^`5Y+`$$hj6tvn}I1djyU$>V-n6h3IBB016jJ(J_D3^v$zz7Y9+% zh++*SFf$dqbKzK*Kl*BMZ@gYi>~nUzomV(C}8b6_fN98+f6P(0=r&9e3CSTH|9noT6?6qQBlNOf7|iC zUgd3=c0;61d~4GpYFb!b6AG_y?vVA~+}0G0h~8+&mpNz-x}}}`E;_)UVIrxvPSL{aTJaSXdXFBIvUMi-wWgMv z!t3hW*M{3#JK!Gl`MM6Yj<}?qj zM4W}!x3+84T=m@*Y!XgtS1#lxCQFJh(ky=>S@bFDhdbKilnXQ#* zbeJtqeqVCp>oTn&(jIN=SRHL`QwCYDV2*59Pp#09vg*#e0+9ROKF{Q1dD%AU%MW6G?p@5vBs#{gR`i746viIwo z*R-lgl+BP)Ssq=tzI=VtdVEiL<0J}-hDmK}nl4%!xnA|&yr!o{hnwYu9mhfr8u`p4f|X=`xFP1!wuWaL7s}={~vc$E><*IZF@p(4lLW zbCzqPx@*(aU7K3>DQRc}ia)`W(zJ9;DZWp~loA}N zOa>l#iaV{+wR!l8pN@o8brMMayj-z;O{KcFoU<%BM4P-pE1X*V8Ex!&9?!tY;>iVR z>XT|&-Hn#I%Q?H*f@(SYISX30LuF4`(9&c>oh3ZzBMyv5&eFsFbjZQSCH2r3MhZO; zn&$8;jJsCXYB~E5JuHDk4k<1@sZcOVvh&lg09K=G%Q(wANaM0Nml7J6Id#c$s>bE% zG%io0ad~=;^Avm%50ub>j=xp4i>(6mWd$V+OskHSB_x-nN~UQVp3u-(_I=Bc+M81h zsZCXv*7vL|VaSS9$+U5>KzKpZ5|US?N?xUytVDNlH?Ym4YF*jabh)`$pB7=WSAwmU% ze^SI8%e&GOjDMu)cJDKWhY`iW4n||U+zbwL5HBYpgLnc_9PIse<$cCSDSE>DjLdbY z?Q)|r3|1*3dmr%!Dx+)cq9Qm!WN@8Dgman5;BAVSqur(qm6{pfr05j(lETR6EVUf- zsFOi@q?QgE6LLTxP#JtMg$TnK{GuXKuSv=E!Z60arRdaalHTQJ>_08V=n^I}_zMRS z26ed^+-=n=C1ssmZpL3!bdM(KT^>f>bf^_k%HVND%vNIX5Sq&9AUsPdog^Yi5*f@^ zL?H@WC6!U1MMX0$Dx;;AVjGdcscA(S<$rd~)-1&^j?p?xu|lIHB7+Y&6iZP?ziSs2{)Ju!e`pt#E(DcP@!~V|fEZL3mC=_h#q52EGWe>c z*z!K8jJ}pig~J&A*ivlCcDWfe@TfZ-$u=>X;h;h*s%3PXqKa7y?GZ!6h>~b)Y=@(;2oA)Cdx6%_-7TJ<^kDt zU2eu6wG_)K3)ObH8T_guW@{D^tzvYSLsZNo4E{Q;D5J;iqQXni%iz0;n4|I30;51@ z{5?fiUIK-YTs+NB2Ti5uYbnMc{nrW|B3djeqa|snjLt|)WprLzDx(WhspteoFI7|# zhtjGpH-k5%BQkh%s$TRGqhEB0ip7k<$LvJWt zti+p0ikZk@Lt0Tr*H~2P2dS9R zjh15JeMw|+TUt>@?@6V?*^EA6DYmNZax?hDw4#jecZiB{%iyaHQMeGbGWwdGDjNeT zqaWK93-5!-psucglNVSh7^78|Vyjy0S`~PC zswiw?H0lr)eq!(zI}!B>B7=7-VvdGNc~OF9#y_j*9-?=7Kw;!TyIOWIgP*sEa1j$3 z{E}6tZGMMl#=l|J$*UkEKeN<|3o0284E89ZSgdeWB&m$PVToeak<>0XgD298GCEw{ zCdr~z5Te3?434xDMPtzt2FEI54oPxjL1+AYMfVV0c$bl>cD39V2B%v@n|B$ce>kHf zY4t>%j9+Zk$=+pz|MOH`h)Dl2*rLRE`j%8iw^{}M!)Hvtq#Se72 zppWxK_*W{4O^$Q^`xZ7O&iRe_KP$;MHO~1A)p(aSEzWtq#o^MX$GIz-l|QLo&fjQZ zljEG{TV>P^&U5P0rpBcOwolh59o+JXs^x~}nHT56Zxi6GI2X35wuAGcI2Wd?#si!h z=fZ0VusqHMzAFOG(l{6Rsv6)0aW3$+Ai(qDT;NL^m$oF%dEQaGv`gZg=l!EgTNLL! z?^|5jf;i`S6?SR!;+*F-#ih-PbDrlbmv&K{^E}GP^PK12Ff{K#N_XJ@BGn(eor5ex z`=eM=xXgjZIF~ut80WGTa7vF=RsqQTw$KpSGg~C?p*qbGpwkusIt>w^(+UBey$LXy z{-0BGTEV!}5XPOhFzz&mai>KtjmIj_WoZphWjnJ%?stTv>Jh%z1{u-wT;{tujB}Z9 zU@*>Qz9eUy%X~G+IG6d_iSg9NpV?O72B)C{bXqAur-=e|+9yD#aRU5DEJJHVs5p&d z+-V=Ll}43!no5M#+??)@^{tJ zeN3hJx|6eY>ML*gy(pI&6?(?+MN>5{OQ&&JJXK@LmuhFSad|q8%hPB~`$eXvy`0i& zOXH)%WTkj!W0q=at<~g|Z|W1OxHW0M8l+7c*BH0d*UnIC6Ow7Z?PR$GQ<^U}f3KQT zZ5f*K+<~sK%edM!h9;P7W;)|0!Ni)<2E0@3pIyGjCu?X_sVS}*v$?ol!QxW#O1j=* zWRs#~kpL*-8jHcLibz)vOk?b`mLSt`LB!w}QixY|xf%SnBGNrXR0j$pJ(d_loQ-iP`#&!Cp&@TgS*db}?=pgT@f{CB#JQ7#XQ3 z!k3_k)-gCi5$&yGtkM#+wT{7Bt3GZWBh8kWt#u4;w8Xe|j67l&6C)3i!r*u8Vq)Ym z@+*g!@C$K#Y+~ z>|(+%ATqehE++iKNX#K7rc?&I6fv7jftZ}*82yqZY9liE9jiv3HyQbTG_=Q*W1IL|5FHR3#PGt%8P8bmKO`g@1f zTRUvt<@}YFcc;ZU|GtIIh;zQv^6u<7=SwZ`R>nEc>#9o&#yQVxkxQ$JbDn2#msS(! zJkNW$h2)QOfu{?A#c?k1C<8b?&V_2#i2x_Yx$t2EtcY{rQPqv$oEGQ8eASNtXT-T+ zs*VIWJI)2}4S+f>sx&c?>a??aT`K z0^6nW6vO*S$cUcjGVie%=Q8h380Rvt>x^@mS476S%PWr2w5K z3eahv0G-AO@E@@Ztq~#NG>&nneT+LzWZY>b<4!{vPqmf({0SlCWIMA$?iS~|1PKv9 z&b5hg=laCBbB$u$xlS>j+Qc(iBzn(jjsTsu2+(PW0G(C{@a#>1(IOt4Rxs`~gmI@W zj62O?+-VU%dtIXlD^-(EOx&^vF;J8#H4Z^SFLR>HU6hpRoOco93OV^w*aN++n4-j7YkRF%$9 zDL-kvK$ZF4yW~!M{o${`cEo-Ur-xFzA?z# zKqvnQwaqS2Det;C9jEX~DxIRz=_;M6Qr?(x%3C2$c?-lTZ+$rB4UW@3#@p5Q{U()u zMx}SEly@;s`LmVdb(&LNpE>1qnNwbmIpuYjQ(i`$_AvfcbussZO24PlAE=Zskbkbq zyvREB{de{7I>afjKb-Qq!zr&foPORBU%yx7!z%rQO5axLDV6?3rKeTuQgNK6(ma(8 zQ|Snm^2MdI{f89&b(OxS(hpVY{69da{3n$S{14V1^{j%O*T5}(Ke`u;*<4w@q0mbMCJ|rWXQ?1c$QYF9;3EP8F&(Q z!+Cau^$gam-xIKr4LnlRU2FqX*3f*~M``g~jeqaUE@fzW*6(~J~lwd0mkXAEwPni>ttL)NJ4fWzrpnhF=Isa~RgIm?aYp4ZjYM<}k!B z$)*wv`7;P91ViJ0u}qLCT;1Ax0|`Xt=+)~kJk{##_X%gc+MB~r;e|2z;*4M zl(?OuaA%xX0av%DldQZ7xIYPz1^PLw+%)<>BlM)s4_gGDs_5Y};NKQ_md3w#^anN1 zbpual&u@U|B7Q0zT)1QOK(Z;5lFMjc8h?Ztvwcf;D zRz@#mzi?Xl>b7W8S*v(uLU;{cs!s1hXp3rq+oK(gjd-&<-c=G=gV&@-+QQLw;njHi zNCfZS2sgBb*EF}Ts&5WA;B61>;rfmZ8s5vkzBv+&G?ZO5c?P|)Aq^AWCeqRru5W9r zza<=LiMHK>mzvbCi-a3G)~&P;Iz2FduIq5wBsXtXx!6J%2%XO4*b$yoaK?_R?^|Q&2#Ds-;(HXyFLG zCWc<4($b{fO_3}tUpA7AiB^fe2)8C)AYU2;#AMB;%mR;V+M+}6tO(-BRO4*d5R9Im$EF+JC90Wq?_d*Q5A7| z5H$Ot)LBp!a`aoHEYJH=PI)yL!Pe_IIVEh&;8G8pFoECh~tB=Cr(b198P{NbNUR}=yn3j^Y06P zbe8hZLY7QqdF%RwCI%c_k1VB@e**%=9?SD}j7Q1uQ|)KJu|AH2UdY<(=j)x`a#`be znOL7J&*>qDytQAfkRmic*$cQ zjB;#`j7bjpdB2i(>UHuO0Gt?U=uv`4)K|@{+sW%YgZ$U$N(uT2O#9)Kr(f4~ zV#Gf$Af-O!iC!sj^3w0)66S2@boGXmQisD?p3`YcUa7Z|mDkDaw5b*(GAzgFyfer@ zc)#S}eK+$v<*Dp&kzn2Nh?J;O6SE&hx(4NVVzb%#{}bEEbpZeX literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_blowfish.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_blowfish.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..e750d8c5378e3fd71257c708883679bb7d6e564f GIT binary patch literal 70472 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 P|4nDlADlQTd#ry0bUn-m literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_cbc.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_cbc.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..22578f4cc30fe5dc102ccf69f9d5b543131a7ca7 GIT binary patch literal 20712 zcmeHPdvsLQx!*f8XEKw=%s>K!_kck`%#(njf+Qip1QVX&RlqTi2^mc?ab^<0tHlx! zr;!TRK4{fOyH;EKwzbPzZEvx5X&-tQt+i@<+j4EyU>{;ztCdRb@7sHS^UBcnuDg2w zVrQMRzxTKIx4*s5nR9l|fmO|`bEFhpY~pG`SieJ4>I~xnzX4FyiCU41^Bmz*vR0Bc z4m#!0B(4Q?sE`kG@%Bu@sP?7RbvX(Zep9m^p`_=XrTN}jJ_T@niVUN0?bN8Sqo(6~ zhM!rN8ab{>mdb{gW1R#SyA?XFuF+({HS2AJo(Z9m`1_UDus0ch7mAD1#DistRP)uI2lt#hc`^_)hxP8XlSN1i1YPhFS zd&MMCmm&WXL(jBxH|S*NbRhtgOLYYsM0W{qMsiG6^a9~Dd1l1LkfP^{v!*?7nDM`p z>1HH;W9T9f*wY*C3q)gWkys!g0-?T8Oa!`6i9l0pOQ16t3GN9+W5Gyk%gUZ`U$C{U zy(g%7**SrZeQji*ttWI-P^@fNX^e;agORpaDBLGH+Io7z9ilhb+tI&YNd)^kBK!Me z3hoRh;b<(}A4n>8MS?-m6Kd~|bw`42o#oMRc_rZ;1T7JPU}syb4P9!FMzvFr`Z~p$ z<|eeFy1cr4F~y0xo}DFX{t|*&HD|`p4oMP2=68nXHJiy%=;PP)RZ%)6#iqv zsq1G>D*Ok8Qh<6M_r!ThadvCN0;AEyrb5~sapDWY!bwm z7;)FwY0vCiN$v?#L;gl3zxaBp7M%A#e%|JfpY=aJy23A?^#AC5tQZC?W579f8m=0X z`nN8x0!s{3Z1E2*f29PVKmKy80A^pC>=UEQ(d5x?oSw8?kdwRFFV|=O4a}}`ZvHX< z;lI>-K6KK5`1?55J5LVu`45l9LiJl7DL||1Teobc2s96eOPYq>_3mBq2qk9I(&q*i zH^u+#kDvRG5{P}9!s(AcGx~}1h**4;3e{qNyu^QWpR+msT66rB(YwH^I!VFXxx0Q> z{q84pzhDoYOE%~c8j0V&kce;nw)(C0TU0yZ&!Q>Y(O}PqzT-dqbF|m_9naw*C^W_2 zMXNoB_5yAmo}!xGGJI1>bG)_G*EBTd^&D9Xmj7sDX5S(1 zOYz6+JrB1|64k8*b+@+`R36XZ#raqkj!SV4WZ~q2GZ@PBkx$gknbZQJF3+SE z67@1o9XjdeP&F-mYH$Lmtrp^HM_lcdp4p-~{#SqeXa3=u()zJy51$-Z?jOFn6uJ41 zKmNol&vwmyKlMa$22 zmCGsQs*_beK2t(dVmO8zgTwi7I2wmH|IoW~D$R!NZ=Kq?d+4-{ri8JD*`Ayal>bff zpPDI<$p03a1uFkPPl;{ve*`d^ZSw!$kpH_%y*mGIATgc)Z~Egu%%1=6P#AvYIWh;r ziTsBNf4qlIjip!wko+_Yn&ZExyf3AhaOP2Dm|5StJYjHk&ewY;I8@5-1s^GoDf4Rl zNsLTQWp!&!UH$FFS98X1Aqx-3iYx1?W5wXqOy-QgDho$v{G2Qto$3KL*3wBF|$Gn}?AlfAtR+VlD&CV}hi#C(AtPI+ntR zzv-L(!@0P&V09kbfV}(F=n`13I=S9(sX5pcRsDS%`%>SgF_ z4E2AZ{wCFb8yl-dT0D)*-#w`5w+9t@(fZR+|D&mJo)r98{Cyc)@}AXY)5nU!Ok5xO3+SquMDv}a~j+wAG9^NeMjvL z?)i6E_3p~s9QE$nq1-j@W6~DS$#d6&1|N`ttTx@4-w68ZarFB9pu2XZBCkpj7vehj zb)wJrU_ny%<4NBT9Ot`{e19&x?`!fKv$;mU;G+jV<|AX&Z;I7!?@-P*w{s?MulHQzM)a|4wFFoolM233E}f8+^C7`6qbB$!S6t(82W?8G1Hv}=XO3|zYhL6V-il1nwvG@N~@q6=3e@jfDSDSjPsk=dHk`i+uAp1v`EIwwR`uRWDi~QiN;E7nN6$@KOj@C508e z46;|CC3=u_sQE?g!^UxDLt_xr!E?%^U>0-&tHHsFj+8g5IrGT+3saV&vN?0Rsglli z__O8YejHNte$=+x^8ewd^_IGte2>2Mw=mUPg= z;aq~9)qq~Gd!(}gfGZCk>|UAM0hUm&-0hR3YnTLGZ{cj8tTC_aB*g7gG*;q@pgZ;w zjrm;Hla;9&oA1ga$!Qv^bZsRo(=}G>nn02>G*;*OB4M*M=6B5`o3k~x!S$bH#iz0D zt{sHUm6H#kzRop?Y?jL6!@#;-uM>8u?nA%p7i9Btjm2E_HpPC0EW8mi`&=^#tCSPh z0K3(76WOeio-M!*x@eT`)zUc(>X7Ssl3XG^cLTfKwUn?G(sK)Bj=6qLdVcAO13Te* ziLfS(-RC+(*jkM};5tj#H5z-+^%h~xGOrAJkGNhYo9lEtPrA+%Z-aE+kNUeJ&qwIj z-1*l)sKoxLle%5-AQ2x^ArJ*0BK2>o2sjI9ON#xZ8bq&fIO$E8!+9^<6w;7WAKa8* zM5R$z)UPnLNO*R^nDm|_lkb%?i6f;qj>^6>fv$$SeHWt+=Lz7s^h|NWR_Ixuno5Hq z<%Hi7_G!j)F{ajM7#jx9F};A2P0GU8pim9|M3H+LstGN?9W!PTNlK(Py;H)JAnBY* zAm&z;)B(=j3^->AAg9yQ57^-x#JNazfb?NN#p?7DL8Ek{cthwHfb$e1u@`}P0fSpjyLtRK#*8@;v<`Fqpp)s<| zHW{QTavv3*bC9peFtVz6!sbP!2`1>;&Q)=_-7&g860@gFU0q7 z$@7JTJT!3~Fv_2&am;!@1@v%X2WVHIee-e5sWa{0iT-{LYUs25_}lMuOp~oSgTOZC zAid^x8mR=;wpT!86EVe{>uCEC3fVZDZo_{3!~qB@D^u@D@umDIUaRq^WDw;A)G5D- zvbl)=w~02Qd^bos%6=8)2zt?uLq)ksMY#%XxCDoe@>&(;7lHo}hmP_!D$2KGzy@)s zD7U0Xd0j@7*Q+S+fb%UlW>a_90iY+>i~xnON(m*0fu!^>95hmyCM4eZ%()J#RLI0&x{0(=cq+x!g-2ln4?3aeBw3ajCyL`~3&3Ywrh(aViEW>AJ!R#UD&5A+!vB@2;zvT7ma^+xz^!ckH} zwCY7<=3BrY!ZGKQ#(X!33vr-vvI+&d-OowKQLX;40L{fHoD?LL)C}9ZPFM9L`9* zz=$i~Bwi?GQxS38bKsx?6i*Q>F2fDHw@<$|Jfq|U9nh`|wJUOEjFaX*qNN1OvBM#628h-|A_4A? z27-}D4>k#EG2-rt{k5AwrXiv zMb;$_X+zJhxfSwV;J8ucOFvZUgvbfO7kG%Y6{YHMq5gwquu7 zqUz{5(Bx$ zl2w*>p(R%wbiDn49g&=c6VYy)3t3X^kbk5BDb@o*2~k}B6psP87DwSY$tK3*U&q;z z;zz-W7G&XUvx+eacdAjKCSer1Q=*QjMh}8$b9WW-=s1gX^j(K750cRY+m#6Rmw)<& zJ2zy?tpLngijUPKq1WY_k?pl&I5a!41KPT1YivbyM@IK!4AG zHoP|yiUn1O^$zN^eb7-Xx#$SOAEg+pVEfWSMjoPVgFzkFKm#qq4OoR~b2P2Gp}v6G zejOl|=~A@_^oDVkcOe4T`Gyx_#93{!PK?K#$G~wc5u-Xiy~sHG+C2 zRBzl0PLS!g~)c6MmW3=g<<49&r3Za#Ov`yok!DuWp z&=CtGHhsZ;XccKKsY%USx*DlIr~s+a3-q^jRzVgOVnEd*UDfDnu?P(G4Mccr(e z>;p)~T4TJut>cD)ejV`+mG+_{*4tmvAL_?d`NlE|d}mo?Pw2|-;Pra1yWV!6+~AI@ zeMRz0OdZv6R!xrRIID{#PRDRBL}kR(Qfy)HiwV+Z2ESxTcJU{Pm>T+vl6wlH{Ag0z*v_ZU|;as1W;jBGQ+TtPq1YG;fvfu9iShB0<1(Sz&_%fX!q z3O7vsxCbspD}zmmhV5pMekM|pVk?7h8j?c{iUVTqh|T!rW2HB|;*D{#&|Go?Ozn1;KKM|5^8RRHY>^6?1wZ|ZI8<`A~ClQlP403Fw*gU>X zQM74BA|}2>12%J;xB*iAEHY}Uy zmm~KWI4I6H-j4zqzw!%Nz8?78C+#ZdfGF#DTjk+q){>|K|O-T}i+&H~*FvbCfo3utI z5gvC??lV+RB8Hn7oSz_VWsp;W9Bvw6j635%7Y5M@#<_D?ez{*9Y!>Ctaoe#3G05Fu zQN|A^;y~{`#+8>0r7V{ma&E_Y^YItVw@uXZ~B9D2zDOx-XJdhV!?%p(poQdJu zKrbw)usH-;6aLT@11}^4&VZ7(2uY$6(U;t`sL(!Ho&e8yRH7dYNF1ZDR--WH(wctNAn{JHV`E zkh_LC&mcP_tDCa)a#N;z=%%>=!n2N-7J89Mg%ct(w=_3--e4}Be0P+2hnST7XCWJM z<9lYFrs~+RGMvpyw+Y_AkS=c*yw4$>ZVBEmkWP09-e-_b&lS91A)W3N4_c`d4coH( zKQeJ_cR4p6++uWb>cAj}Q;YsWtVH(vo z`tRLYzEqNeZDNAp{VSX8~V)8gy zO`mcBI`0xmXWIntn#rV3OD7o2CU{p(I@_lH(25i&AM9=@XJ_)H8UI}Zx1nd|XDR5} zzMrrJbf5B(e%b_jw(lP7P2dr(q!9eFgZ|{Dn zq+sfE5NV<*Pp1N_H`TYS3anb!NFR;}bVkF0?zX;8`Z`48j&=1d^bj?G2epA!ek1B{ z+yoLnB*98+n%6hfHwV_QUcGr$YoN8h0gph{j&-7is?k3OhRR$TaN6X^!^ zv(I!|=9e(&!64bo_HByPPfTQaKC9aMPkbFCqXFvM8=^eAzZcItQO6>>?q;Yj91E83 z=^H55j}k+jLSfx)(QZ-RxxWvZy2g`v#Tg7nqV&a$R3rdiB-qnN3I^)O$ z*gmia>TP{{kkSSX^>vZHX0^9Rf`g3VrDl*}#DqaSb!O05$}%JWcO<%E(%XMbV^#Qm zjq6fF=gQn9GAhae{RMk9S)cFgxb_=Kb2FOQ3d9C#0nnRa*5~^_u1{b+qC$QN#7+TK z_>Q3t7};ihzE9-(4JDmC8FL8&wU73qvOeEWay{2ba{F11YkF!+ds`Xj`%bQXMnALt zhAcV(5Rdiw{*>znj3E2Z?0=upZ!mIvAItT1Df;xk$eH^4K%-JAP4&;eKTglq z9(=k=oLQgi=fFwTPuvF@MOt4{3+r+HOE3xM_VayGtxs#QoW{nF|F6Ly|CKCYYS!P8 zK{w%0I>h=N4yL7w9`|W1({84$+DntFXyC_v8rYZ7flU2e5He|`xpaZnpUD$LqvK>J zT|j^9Lao5>Cye?y{W(TIv!CZGw8rf`Fd6>2%~xE&|Ii|>KpVVL3+plM$_wa!^=d8A z&w{4T)F(V6L`ri03a!8|Fesg?aPV;O^^4Z0j4mq0I`d3yZiewp{}V2t-@Znf5vwv3 HGEnh9Ha?W{ literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_cfb.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_cfb.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..b6eb0de073e1a0482c50d935dada47bb9acc5e04 GIT binary patch literal 25440 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 QPW_{*c0(c0)p8x;= literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_ctr.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_ctr.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..d6c362ebc2bf0982aa3e295cf992594f2454d9db GIT binary patch literal 28600 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 RoL2s&kSX7gB9MZL{{~r!cWwXx literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_des.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_des.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..a4dcf1962c3f4471871393f41671e09ab7828a5f GIT binary patch literal 75672 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 literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_ecb.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_ecb.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..f5cce04a86726ba5bee7a3d5bbe4fd12ac1cbbff GIT binary patch literal 12440 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 C=#D}F literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_eksblowfish.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_eksblowfish.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..6b47a2d36a49f7a3b56eaf6957c6c1deada74252 GIT binary patch literal 167568 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 hG_jaQ3M9$K{|C$|jg$ZY literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_ocb.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Cipher/_raw_ocb.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..b5dd10558847d6f5a267cc1c1eeb9f60c48835b0 GIT binary patch literal 37344 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 xs`UG8Ht>2}9F9&eRv5Bl4``-r*9n +# 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 Crypto.Util.py3compat import bord, tobytes + +from Crypto.Random import get_random_bytes +from Crypto.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("Crypto.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_bytes' not in range 8..512, " + "with steps of 8") + digest_bytes = digest_bits // 8 + + key = kwargs.pop("key", b"") + if len(key) > 64: + raise ValueError("BLAKE2s key cannot exceed 64 bytes") + + if kwargs: + raise TypeError("Unknown parameters: " + str(kwargs)) + + return BLAKE2b_Hash(data, key, digest_bytes, update_after_digest) diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/BLAKE2s.py b/server/www/packages/packages-linux/x64/Crypto/Hash/BLAKE2s.py new file mode 100644 index 0000000..9b25c4a --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import bord, tobytes + +from Crypto.Random import get_random_bytes +from Crypto.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("Crypto.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_bytes' 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/server/www/packages/packages-linux/x64/Crypto/Hash/CMAC.py b/server/www/packages/packages-linux/x64/Crypto/Hash/CMAC.py new file mode 100644 index 0000000..7585617 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Hash/CMAC.py @@ -0,0 +1,302 @@ +# -*- coding: utf-8 -*- +# +# Hash/CMAC.py - Implements the CMAC algorithm +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from binascii import unhexlify + +from Crypto.Hash import BLAKE2s +from Crypto.Util.strxor import strxor +from Crypto.Util.number import long_to_bytes, bytes_to_long +from Crypto.Util.py3compat import bord, tobytes, _copy_bytes +from Crypto.Random import get_random_bytes + + +# The size of the authentication tag produced by the MAC. +digest_size = None + + +def _shift_bytes(bs, xor_lsb=0): + num = (bytes_to_long(bs) << 1) ^ xor_lsb + return long_to_bytes(num, len(bs))[-len(bs):] + + +class CMAC(object): + """A CMAC hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting MAC tag + :vartype digest_size: integer + """ + + digest_size = None + + def __init__(self, key, msg, ciphermod, cipher_params, mac_len, + update_after_digest): + + self.digest_size = mac_len + + self._key = _copy_bytes(None, None, key) + self._factory = ciphermod + self._cipher_params = cipher_params + self._block_size = bs = ciphermod.block_size + self._mac_tag = None + self._update_after_digest = update_after_digest + + # Section 5.3 of NIST SP 800 38B and Appendix B + if bs == 8: + const_Rb = 0x1B + self._max_size = 8 * (2 ** 21) + elif bs == 16: + const_Rb = 0x87 + self._max_size = 16 * (2 ** 48) + else: + raise TypeError("CMAC requires a cipher with a block size" + " of 8 or 16 bytes, not %d" % bs) + + # Compute sub-keys + zero_block = b'\x00' * bs + self._ecb = ciphermod.new(key, + ciphermod.MODE_ECB, + **self._cipher_params) + L = self._ecb.encrypt(zero_block) + if bord(L[0]) & 0x80: + self._k1 = _shift_bytes(L, const_Rb) + else: + self._k1 = _shift_bytes(L) + if bord(self._k1[0]) & 0x80: + self._k2 = _shift_bytes(self._k1, const_Rb) + else: + self._k2 = _shift_bytes(self._k1) + + # Initialize CBC cipher with zero IV + self._cbc = ciphermod.new(key, + ciphermod.MODE_CBC, + zero_block, + **self._cipher_params) + + # Cache for outstanding data to authenticate + self._cache = bytearray(bs) + self._cache_n = 0 + + # Last piece of ciphertext produced + self._last_ct = zero_block + + # Last block that was encrypted with AES + self._last_pt = None + + # Counter for total message size + self._data_size = 0 + + if msg: + self.update(msg) + + def update(self, msg): + """Authenticate the next chunk of message. + + Args: + data (byte string/byte array/memoryview): The next chunk of data + """ + + if self._mac_tag is not None and not self._update_after_digest: + raise TypeError("update() cannot be called after digest() or verify()") + + self._data_size += len(msg) + bs = self._block_size + + if self._cache_n > 0: + filler = min(bs - self._cache_n, len(msg)) + self._cache[self._cache_n:self._cache_n+filler] = msg[:filler] + self._cache_n += filler + + if self._cache_n < bs: + return self + + msg = memoryview(msg)[filler:] + self._update(self._cache) + self._cache_n = 0 + + remain = len(msg) % bs + if remain > 0: + self._update(msg[:-remain]) + self._cache[:remain] = msg[-remain:] + else: + self._update(msg) + self._cache_n = remain + return self + + def _update(self, data_block): + """Update a block aligned to the block boundary""" + + bs = self._block_size + assert len(data_block) % bs == 0 + + if len(data_block) == 0: + return + + ct = self._cbc.encrypt(data_block) + if len(data_block) == bs: + second_last = self._last_ct + else: + second_last = ct[-bs*2:-bs] + self._last_ct = ct[-bs:] + self._last_pt = strxor(second_last, data_block[-bs:]) + + def copy(self): + """Return a copy ("clone") of the CMAC object. + + The copy will have the same internal state as the original CMAC + object. + This can be used to efficiently compute the MAC tag of byte + strings that share a common initial substring. + + :return: An :class:`CMAC` + """ + + obj = self.__new__(CMAC) + obj.__dict__ = self.__dict__.copy() + obj._cbc = self._factory.new(self._key, + self._factory.MODE_CBC, + self._last_ct, + **self._cipher_params) + obj._cache = self._cache[:] + obj._last_ct = self._last_ct[:] + return obj + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message + that has been authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + bs = self._block_size + + if self._mac_tag is not None and not self._update_after_digest: + return self._mac_tag + + if self._data_size > self._max_size: + raise ValueError("MAC is unsafe for this message") + + if self._cache_n == 0 and self._data_size > 0: + # Last block was full + pt = strxor(self._last_pt, self._k1) + else: + # Last block is partial (or message length is zero) + partial = self._cache[:] + partial[self._cache_n:] = b'\x80' + b'\x00' * (bs - self._cache_n - 1) + pt = strxor(strxor(self._last_ct, partial), self._k2) + + self._mac_tag = self._ecb.encrypt(pt)[:self.digest_size] + + return self._mac_tag + + def hexdigest(self): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) + for x in tuple(self.digest())]) + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte array/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexverify(self, hex_mac_tag): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + +def new(key, msg=None, ciphermod=None, cipher_params=None, mac_len=None, + update_after_digest=False): + """Create a new MAC object. + + Args: + key (byte string/byte array/memoryview): + key for the CMAC object. + The key must be valid for the underlying cipher algorithm. + For instance, it must be 16 bytes long for AES-128. + ciphermod (module): + A cipher module from :mod:`Crypto.Cipher`. + The cipher's block size has to be 128 bits, + like :mod:`Crypto.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/server/www/packages/packages-linux/x64/Crypto/Hash/HMAC.py b/server/www/packages/packages-linux/x64/Crypto/Hash/HMAC.py new file mode 100644 index 0000000..e82bb9d --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Hash/HMAC.py @@ -0,0 +1,213 @@ +# +# HMAC.py - Implements the HMAC algorithm as described by RFC 2104. +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Crypto.Util.py3compat import bord, tobytes + +from binascii import unhexlify + +from Crypto.Hash import MD5 +from Crypto.Hash import BLAKE2s +from Crypto.Util.strxor import strxor +from Crypto.Random import get_random_bytes + +__all__ = ['new', 'HMAC'] + + +class HMAC(object): + """An HMAC hash object. + Do not instantiate directly. Use the :func:`new` function. + + :ivar digest_size: the size in bytes of the resulting MAC tag + :vartype digest_size: integer + """ + + def __init__(self, key, msg=b"", digestmod=None): + + if digestmod is None: + digestmod = MD5 + + if msg is None: + msg = b"" + + # Size of the MAC tag + self.digest_size = digestmod.digest_size + + self._digestmod = digestmod + + if isinstance(key, memoryview): + key = key.tobytes() + + try: + if len(key) <= digestmod.block_size: + # Step 1 or 2 + key_0 = key + b"\x00" * (digestmod.block_size - len(key)) + else: + # Step 3 + hash_k = digestmod.new(key).digest() + key_0 = hash_k + b"\x00" * (digestmod.block_size - len(hash_k)) + except AttributeError: + # Not all hash types have "block_size" + raise ValueError("Hash type incompatible to HMAC") + + # Step 4 + key_0_ipad = strxor(key_0, b"\x36" * len(key_0)) + + # Start step 5 and 6 + self._inner = digestmod.new(key_0_ipad) + self._inner.update(msg) + + # Step 7 + key_0_opad = strxor(key_0, b"\x5c" * len(key_0)) + + # Start step 8 and 9 + self._outer = digestmod.new(key_0_opad) + + def update(self, msg): + """Authenticate the next chunk of message. + + Args: + data (byte string/byte array/memoryview): The next chunk of data + """ + + self._inner.update(msg) + return self + + def _pbkdf2_hmac_assist(self, first_digest, iterations): + """Carry out the expensive inner loop for PBKDF2-HMAC""" + + result = self._digestmod._pbkdf2_hmac_assist( + self._inner, + self._outer, + first_digest, + iterations) + return result + + def copy(self): + """Return a copy ("clone") of the HMAC object. + + The copy will have the same internal state as the original HMAC + object. + This can be used to efficiently compute the MAC tag of byte + strings that share a common initial substring. + + :return: An :class:`HMAC` + """ + + new_hmac = HMAC(b"fake key", digestmod=self._digestmod) + + # Syncronize the state + new_hmac._inner = self._inner.copy() + new_hmac._outer = self._outer.copy() + + return new_hmac + + def digest(self): + """Return the **binary** (non-printable) MAC tag of the message + authenticated so far. + + :return: The MAC tag digest, computed over the data processed so far. + Binary form. + :rtype: byte string + """ + + frozen_outer_hash = self._outer.copy() + frozen_outer_hash.update(self._inner.digest()) + return frozen_outer_hash.digest() + + def verify(self, mac_tag): + """Verify that a given **binary** MAC (computed by another party) + is valid. + + Args: + mac_tag (byte string/byte string/memoryview): the expected MAC of the message. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + secret = get_random_bytes(16) + + mac1 = BLAKE2s.new(digest_bits=160, key=secret, data=mac_tag) + mac2 = BLAKE2s.new(digest_bits=160, key=secret, data=self.digest()) + + if mac1.digest() != mac2.digest(): + raise ValueError("MAC check failed") + + def hexdigest(self): + """Return the **printable** MAC tag of the message authenticated so far. + + :return: The MAC tag, computed over the data processed so far. + Hexadecimal encoded. + :rtype: string + """ + + return "".join(["%02x" % bord(x) + for x in tuple(self.digest())]) + + def hexverify(self, hex_mac_tag): + """Verify that a given **printable** MAC (computed by another party) + is valid. + + Args: + hex_mac_tag (string): the expected MAC of the message, + as a hexadecimal string. + + Raises: + ValueError: if the MAC does not match. It means that the message + has been tampered with or that the MAC key is incorrect. + """ + + self.verify(unhexlify(tobytes(hex_mac_tag))) + + +def new(key, msg=b"", digestmod=None): + """Create a new MAC object. + + Args: + key (bytes/bytearray/memoryview): + key for the MAC object. + It must be long enough to match the expected security level of the + MAC. + msg (bytes/bytearray/memoryview): + Optional. The very first chunk of the message to authenticate. + It is equivalent to an early call to :meth:`HMAC.update`. + digestmod (module): + The hash to use to implement the HMAC. + Default is :mod:`Crypto.Hash.MD5`. + + Returns: + An :class:`HMAC` object + """ + + return HMAC(key, msg, digestmod) diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/MD2.py b/server/www/packages/packages-linux/x64/Crypto/Hash/MD2.py new file mode 100644 index 0000000..41decbb --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import bord + +from Crypto.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( + "Crypto.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/server/www/packages/packages-linux/x64/Crypto/Hash/MD4.py b/server/www/packages/packages-linux/x64/Crypto/Hash/MD4.py new file mode 100644 index 0000000..be12b19 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.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 Crypto.Util.py3compat import bord + +from Crypto.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( + "Crypto.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/server/www/packages/packages-linux/x64/Crypto/Hash/MD5.py b/server/www/packages/packages-linux/x64/Crypto/Hash/MD5.py new file mode 100644 index 0000000..554b777 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import * + +from Crypto.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("Crypto.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/server/www/packages/packages-linux/x64/Crypto/Hash/Poly1305.py b/server/www/packages/packages-linux/x64/Crypto/Hash/Poly1305.py new file mode 100644 index 0000000..eb5e0da --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import bord, tobytes, _copy_bytes + +from Crypto.Hash import BLAKE2s +from Crypto.Random import get_random_bytes +from Crypto.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("Crypto.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 ``Crypto.Cipher``): + The cipher algorithm to use for deriving the Poly1305 + key pair *(r, s)*. + It can only be ``Crypto.Cipher.AES`` or ``Crypto.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/server/www/packages/packages-linux/x64/Crypto/Hash/RIPEMD.py b/server/www/packages/packages-linux/x64/Crypto/Hash/RIPEMD.py new file mode 100644 index 0000000..4e80235 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 +# Crypto.Hash.RIPEMD + +"""Deprecated alias for `Crypto.Hash.RIPEMD160`""" + +from Crypto.Hash.RIPEMD160 import new, block_size, digest_size diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/RIPEMD160.py b/server/www/packages/packages-linux/x64/Crypto/Hash/RIPEMD160.py new file mode 100644 index 0000000..820b57d --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import bord + +from Crypto.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( + "Crypto.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/server/www/packages/packages-linux/x64/Crypto/Hash/SHA.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA.py new file mode 100644 index 0000000..0cc141c --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 +# Crypto.Hash.SHA + +from Crypto.Hash.SHA1 import __doc__, new, block_size, digest_size diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/SHA1.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA1.py new file mode 100644 index 0000000..f79d825 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import * + +from Crypto.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("Crypto.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/server/www/packages/packages-linux/x64/Crypto/Hash/SHA224.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA224.py new file mode 100644 index 0000000..f788b06 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import bord + +from Crypto.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("Crypto.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/server/www/packages/packages-linux/x64/Crypto/Hash/SHA256.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA256.py new file mode 100644 index 0000000..957aa37 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import bord + +from Crypto.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("Crypto.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/server/www/packages/packages-linux/x64/Crypto/Hash/SHA384.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA384.py new file mode 100644 index 0000000..a98fa9a --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import bord + +from Crypto.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("Crypto.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/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_224.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_224.py new file mode 100644 index 0000000..87e0d88 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_224.py @@ -0,0 +1,171 @@ +# -*- 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 Crypto.Util.py3compat import bord + +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +from Crypto.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 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + 0x06) + 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)) + 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/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_256.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_256.py new file mode 100644 index 0000000..74f4667 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_256.py @@ -0,0 +1,171 @@ +# -*- 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 Crypto.Util.py3compat import bord + +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +from Crypto.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 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + 0x06) + 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)) + 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/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_384.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_384.py new file mode 100644 index 0000000..d2d6c19 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_384.py @@ -0,0 +1,177 @@ +# -*- 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 Crypto.Util.py3compat import bord + +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +from Crypto.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 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + 0x06) + 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)) + 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/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_512.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_512.py new file mode 100644 index 0000000..792adf4 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA3_512.py @@ -0,0 +1,172 @@ +# -*- 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 Crypto.Util.py3compat import bord + +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +from Crypto.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 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + 0x06) + 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)) + 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/server/www/packages/packages-linux/x64/Crypto/Hash/SHA512.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHA512.py new file mode 100644 index 0000000..403fe45 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto.Util.py3compat import bord + +from Crypto.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("Crypto.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/server/www/packages/packages-linux/x64/Crypto/Hash/SHAKE128.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHAKE128.py new file mode 100644 index 0000000..011268b --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Hash/SHAKE128.py @@ -0,0 +1,127 @@ +# =================================================================== +# +# 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 Crypto.Util.py3compat import bord + +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +from Crypto.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), + 0x1F) + if result: + raise ValueError("Error %d while instantiating SHAKE128" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + self._is_squeezing = False + 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)) + if result: + raise ValueError("Error %d while extracting from SHAKE128" + % result) + + return get_raw_buffer(bfr) + + def new(self, data=None): + return type(self)(data=data) + + +def new(data=None): + """Return a fresh instance of a SHAKE128 object. + + Args: + data (bytes/bytearray/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + Optional. + + :Return: A :class:`SHAKE128_XOF` object + """ + + return SHAKE128_XOF(data=data) diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/SHAKE256.py b/server/www/packages/packages-linux/x64/Crypto/Hash/SHAKE256.py new file mode 100644 index 0000000..4b1b141 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Hash/SHAKE256.py @@ -0,0 +1,127 @@ +# =================================================================== +# +# 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 Crypto.Util.py3compat import bord + +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +from Crypto.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), + 0x1F) + if result: + raise ValueError("Error %d while instantiating SHAKE256" + % result) + self._state = SmartPointer(state.get(), + _raw_keccak_lib.keccak_destroy) + self._is_squeezing = False + 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)) + if result: + raise ValueError("Error %d while extracting from SHAKE256" + % result) + + return get_raw_buffer(bfr) + + def new(self, data=None): + return type(self)(data=data) + + +def new(data=None): + """Return a fresh instance of a SHAKE256 object. + + Args: + data (bytes/bytearray/memoryview): + The very first chunk of the message to hash. + It is equivalent to an early call to :meth:`update`. + Optional. + + :Return: A :class:`SHAKE256_XOF` object + """ + + return SHAKE256_XOF(data=data) diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/_BLAKE2b.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Hash/_BLAKE2b.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..363cb56c47ddce2a4299c267ba87fcb5397301b3 GIT binary patch literal 21888 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 literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/_MD4.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Hash/_MD4.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..7191868a530a200c675b4da6de2363399095b8f8 GIT binary patch literal 25576 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 literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/_MD5.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Hash/_MD5.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..e59c4b574d3da0dd95c75264e58f17006d537bf3 GIT binary patch literal 31704 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 literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/_SHA1.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Hash/_SHA1.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..b24f0aee7fee405fe3efb0f37a69bab24c8dd3b5 GIT binary patch literal 74416 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 H32OfzsW{dW literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/_SHA224.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Hash/_SHA224.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..d4696a56d997d25926252672e1c2608b4d042ad9 GIT binary patch literal 43792 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 literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/_SHA256.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Hash/_SHA256.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..6ba6c6a875761d226a0054b727ec36fa3e775981 GIT binary patch literal 43872 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 literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/_SHA512.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Hash/_SHA512.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..70bce369b63eb3c54bf058ba452d7c79a3b35c45 GIT binary patch literal 50624 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 f=kFp>9t>h0tUsAIRQhz?j9vCdCR}&SA9;M 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 bTQyOo0pr2?aVHq5Kk6Q%e`Y`-kX8Q=>mmNs literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/_ghash_portable.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Hash/_ghash_portable.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..4df50f76ec889800c8b3f462224113c3e3d9075d GIT binary patch literal 17432 zcmch8dwf*aedjrI=gvcqnb89fFKaMkTNoHU0bwK~$r9WV;$bXo*_aN)X!Hn@MxGgA za2uf z=rBoU1*GGQlxISp)Kidjscd>D(MkAAd4ikW-$Ce|!JMw?F@|{g$0W6U}clzxhDNycb4)=6dh@AG!*Lzwu3|T(|rcB!yX| z^T6|F;Xe*uHhrpJHvQV`@Hc~hBaY1S3K$+%%ql$IDWY?NKZDg~@CU&!WV!56uBq;( zilBsW5dX65)FZN^zXQI9&6wt&`m>NZ*{O`lF;npK*ai)2cxlsurtZX?!nMN=Oi~A>g$V!rEX^=o`^;FOiH_AkqGPS-7%Qx ziA6%4{&>`1L3Eg~iBQ-hI1U-?)S96>M zm(%#^U41o;uc|`&C33u}IY>Mz-ZVbVQB}&)`00L(;rAUA8=++kzv`etF3YuLRXJXE z?WP)>-K7n{i0&cjrSsQNZn~9d8r7H13i?K(si~L7K$BnNp#HB;FEb8|B`nv@iU3{i z(*5Lv8KdA=F5|lgNYHR=bx?)T7E1Jvg1# zLlE+9Dz1W;{t&`0zpDPB#(Ns?Zrsw?zU3|>`LOS-kxcl;jAXm-P2<2d_x>()t#ROr zd;d0pyzbuL4rKj-G57v;Ku%H5TzT2;KF|az5Z>p-aQw&}b*>++W9~(5z7cnU+c@w& z_x@b6Pk!P)S>EhE8RTt!4C0qyodP7wm z;Wpr7rkTBA z9*Gd5xoQcK`7piMAj~P`J+3xXd<@JFzuI9hyPVEm%h z7=PPpj26cN;}?LxYenNvt>?cn#(!*G&wt&7mdF3&ZuLY8?1d=ZYlHpppoq{jl|ACzE{y#&!I5df86g=NM4 zSnSu=u5GOx+tzr0{>XbfUyYQ|DREAZBI=6*0}^}#aqnn17&eGAAI)cV_`jTP&o zZ~3s|h_%1^6C@z1VUc$4|1PA-m%rr&c!923fm6V!{CN06>7sMV6SPhl;VW2hF}#z% zG)C|C7>}O5?8fS4eAPgYp~^<`aqneHYKz09%0L}5hF|s?2U{nMgH7kJjPs$@l)yJG zVKA&V-k30)9~()Fk!*DsE6)vmAI@<#+PdwP$pu%mGmXwPZ=(vq9A4nz@K0Zo*Nszj zMf&Lp#K(1R#mCpKnZ92U*C%<&<8!rDWl+Of%Zj0bw6Yqcr4R6bV0^p^coED0Rg&YN z!XMhq_-+rMn`d_%LRNj?(cbjT)oa%p0GZ3P##Pel&VA6akFB1w>eg!Cjl^!pLH@@O zN9_HYT%ONanp`D+qBXg^qt+%@*&pkTu8PNPjjq~ZyVh^baaG*mDuWP8P;PQL*5s~n zRWwfJRlw)dI2@?2*lXV9@;q({xJrh#Hka4(XReY)m#5L?Sog~5O)l@S_BirFZ8?kM zB5csHsF=&M&gCHN_bzIGl(`?Gfkx#y6JXb67TSAJQQKCvua$q_Qv2E2rdn!0HdoTB zc5@`nr2Ze$e-P<0hM%BS9xVM?Y|@D@l1Jlq)Bd1%D}Ym!Jk_=a?y0f3(Kb2*{}6Uqj7Inu9+DS>9n# zZ8(%+`adkoEzr>3oVAjG!%i93xZ_d8(=7I9(Knjao)Apiuwd$+1F%~4-hl)R^h1z| z%2`Kee}?dXBJrQhC0uvd9EVNYC&0B6?x+FwrtapBCLqq4h@gA8Jq!_ZQv387+nN*2$2+h$;Ov>v#K$^2ns?2F6%{eAj;iSL6`dpK$bTqr&>P9|uFW`3P4D#vY#Row3IO!gdezVzzLFem4 z-D*+^=Q^U6@caj0vD>+bs0v=V7SulHQ{=OfySIRP%vno5tGMGJxWmp@NOL)N{~4$e z=SHGdbN6SVbIAD#*%{oK1a-v8sn!9LI_7i`)oN15oo=GmnbZmAOrqL&&QjQ&a=t-6 zH<1{`_yBpDN( z=wUWTD@dE;&k-h{x}4hJqVYvs>UF{WJH;(x?g!zFdwxMK@8k1H!nx--fW9?FHo;uK zUy(M)5zzLF&?$HTcDBEsO`XAc!4HV~vZ8KAyKG-k)RU0e=jMfB%6a~KFsOpOklAkm zD4?p@=iNXo&M~xU6ky^|PzV2(c&49ka9m9oN7 z@bgLd91f9zz2eNxGb{3WxZn9*2=nNo&dc)&XT_UPOazF@u7YdYI)= zKwhblS33!2@*k1KDGv`rqVAKZS3SSyn6Io|4&E!EU%)YU7$^Rmhe9{P zDLJ0^_qcvsR@bCK3iS{A3>eM-4g_aG(|ySKV<46zH&r-pAg$7K;Oqj`hr@dT#De#w zLForTJ^=d?j?!O(Sc)bu!hurqk22O%W>b0PY~HTr(5BJm2tvo^pz6)!8(_?b%~q=g zb41#r)j4oG>sQpC{RM>g!ZeIy7S)L#m_@mG5%f23%;}2^F#foQCLI0k)p5)UQB(g& z=-m(cZsHA-zmYi}`1@PXbcMXJm+^zH4G=JR`~;l2UW)L?vt~kT19)vXZXo%MpJDt+ zA*ntI)&n>e?q>X{f_YHX4xiZTTLPp3V*ZTtrp>@_T0^JXaJqrmrS}8-6|Q2x#8KJ> z;vO8Uag@ez>O#Wq$8qz+AO_`C{p)gf@hq8q76J`|kD*mM0^%=09LBNW^B_)8h$n&U zflartn-_xSY3YKWhXRl5=iqAo9tc9nb`Zz>D2RhVl9c{i$i_t&inW5Wn9zm(--CGq zhtU6bAU~8^=u?_IHplzoET$tdC?8@9x>?yhk9-;w}yk#TdWMlS?>atP-_Yx;V^u zOCc>XOUB5_nqpF*Mn4Lk%|Vs&cR^zLS_vmLt(HOzf?gpS^dPf*-9-Xcwv*JpSj@Gp zqyoVg7YPi?UtC4X@JE_uv^BLHfZ~4X>p&T$j7$!!A|4b6p;*p2EwXetCwM+cnvrxk z|0j1bUchg173FHKxvm0U$UPVUmYGa*-Ilv5cV%v%2$l7*+}zutfi9OQyz6do5rY6} z*>7e997SAn<>ta#Uzy9naORuNKn99xVUaWG9Wyeej$ovoC)Gu4Qb&ITib&#GfB@y- zxQpPi4r`#NCe8KgJYp3{mM}M2g$t01q9UHFn@u8L#Z#gnsWXIgAT#}Zb)IVdEqQ?= zN=ie{pEl)@-7GyVGZx!_YeKe4l8@nv$15S8{lsIOS#l0HVOGt7szW7Fs?JTXo#f4% z57W*3R8#I2TSxA_x%Y@P%-30Ek<_>$mv2Fw(wa$@mvBt&T-cKAMmWw4wr~m$HS$p; z6$EP!g}{nJKB$q@zFVeM1_RBH9yJ?sOP*KMZc%#MFhkO_f{BqH7*is>(HMBSnC$*^ zpMfINYq_6MkNr`DOT@!~LC2lLqHAFv0pt8vu6&$nr$_($csv$n<Ir#yo2W3DrX2L!#Lfk-^=$2!4SJki-1=>m>Pme?~GAvPu$;`c^@ zq7BeUp?l)NNG#Tery`~r$p#2F^-j~+Xnc{jhZpNJAYIn2&j{$tj_Nb+ z(U;ZJIp5YT6k1J%eA~LIWW6+>>gL`$eMTI%nNrfym)Ts7x{G?DrL|CB=BU$WKdTq6 z(U+m(iDAplg}Sco;#P~Er2r&Cqi~dLE+O2hKV$$mKLxL|$!Lm;x7T1tL-&R409} zG=1JnK9!4t)p}m5KAXnGIz7);tk3=%LW_#1hPDz>!G~JW7kd(|)D$hB>s-ryUe7Dl zdAaV<`Y(bm>aaO#Fba$Dw-R#4eE8U;mlCc$)S;JdO2MKIi0XwJjmd>jS>T7;gL^yl zg_@^Bdxt%vFF@|Wv~`%~RIHoxw?UDyA{c6%`zY_Vzo!FaLO%e9gO z>gTp;pW91q8#09-WC#xl;V#{|ps0Agj+E((*Xfl3jHG*YKd90=-Cw7duG1H;(o5^< z?6j>zAk=V(cc4Rm#?Yqn4li21>v^;)r-Mf4m-arNX#KY3S#vnbH3=Sq@EEw(y^$xJ1c|Dpz=a*F6#M(*AfnQU#D08i>?)M+PFX-Z02e zEZkF%HFxRq8t>9>@6wIc-lbg+#zKR;05=8hV0(hJ$HPNj?9HQ-381I0!LGhgcRbY; z!NR617>@Q0^$*CkIP>{$FxuBi*~IeCy2Jg!{-M4^6`~-MloM2FXCx+;V3V;X(AE+h z>>D!UJQ(XuL`3%ESeelXbVHo-D-!LUk~4A_5ABMWIS%5f^G;diDi-XI;%b7h6j5%b7MwJ*B!Chk9sD!3f84U|EWTp$*M51=14@pbZ znbgEE7Nd_Sktb@GcmSVBYfx}7)L98z0HlpTwFzoWu#5$V28QAhNX@a$<4h;k=t7^q?FcU7S zY4(zwCfHAuPrKG*ufa~xt{X+&ROW1pLe=d*E5pBb@dk^jnt48kOFNZsN(dJUjY#jD z-L23r$uhkvYFA2ei$cGiV%=@}&vsU^UrohsS7>L-{w{^8XcW8ssG?Lr&e|0^8T+nm zQ5ElBWmHQl)Fy?hkQNqa3ReL&3a>)_g|sC_g@0|*pF&lQNbR~snt4*@?FubQv9>5Q zC|OpPIJEs}W_3(%)=1J$*`seWjls&a#75GB4J0N_Q%>L$WmX!1kkxn2d9$ zit}I6^%S9!$Jw2k!HI5^Hrph$u!?Dowy}+lT3>0_v99Wvr8>VO@?>rPS)!OB3LTb1 zNMnbO>{Wz%!wGtm#@R5sM@a=kSE0%W9FAmhNDtF~OBs+dBvGMh4v%GVm^Imx5%#7W zZdRyrNV9PBQAJI*nQo~6mhzgEan_+w<%2wSWbxRM=?MXpPEWBk|c+0c!R%GGTX5p>O!n-XCZ&emvT^3$_7T)bC-a}Yd zs94zQqY76&Wnm3jXS329)=XOmdxSm6<}EBasyK9KjEa)Xp6%yi_i!&e`9(sB4Q zPAV@7+L;unRw!sUjh=KU##6GU>E0CY+ftVDCK`}_vf-bLm~Seuf}Cwq==WuIbvDQ< zeMePb1#>WBzQ7&V=B${MsWFq1)%uPq-p8p5KeAWYL6%-6!uhljr7EK!tp^HMBgn!k zk1AXZAq%TIs&F-2EUfyd!WFczniNm9%)*vUYpsPXPw~{qv9J}XfumMP3#*;hD%o)L z7~5vcQ!O}|O7Uk|<(#7`<8P(dabhb{)mdi`5nGW8>TD>TP4|SU=qyHTMgB~(?da9& zn;=jO)p|R7z!WHkf;t4ySEPcN0{ixU!3v2PZ}QA7=Va4wkkiG+e%^{Zn$ya3P0ZdS zdo%T{OgU2NmJaEL_>?kT6BFpjUfV*)v|3I`!?$Ez)rF6q9Z}gXp$choC(mA)(1jA- zDxrEyq(##7*o(?O3IAW?(ZgOU&q=7plA83Ubn^T!vR$e#6wHk8l4U4F45UPi?1_z1lWUTK+zm zhOMUhej{C9!`1h)xvNTNrB0$GnH=>Pc74VglqVs;*82< znoz@adoW9ev@G8Rn0|8D*{u4xsqb;p+#~Mv?+8pk`Kj+zrs})cgnYC;mG4fyuQipA z=f*B?I!oXhD`4t<`E;R%mkhGKPo%LTrrxWcs*g9>Jl=Gcz_l#jQ;{M6fNQ{);`Z?R2bqdw~GwM_o}sSHpwEUoNk*D?hZ(So2c!nn(}Zg z(d&WaO0XaceS(!+Z&s3J6+u6ZD>gUYHDh1+12u24HDIJn0dVU6EM4H##td2tpQ%^o7VkVuO7N<`;GHC+M!bU!=(&>5+Zk z(+L|znVRMxFf|oUcm2t=KNc0$2=(`d5jqNoIQc~sd<4h*7?u4PX;6yn80v<3XrLQI zSdzU1U1V>HcI=2nb}0%^)*}i>P85nq4hof?vdql?I~HB>=+1)N;HLIlYTxC{aF@CL z@k4$E?=~xYwJ%e!S=y`ZSLVNmTFB}31ZA)GZwk`-NrmDPs_fMjzX3e*t?ZAZk&=ylhjlDPz9-dRLGvbC&;wl4Ibr0Z70<87zOF3N_vsiOR?wyLAt%# z*DBbM(lin5I7CtK5m4#&YJa3)=6*)mNjGeNhP`@ER6+TMpHdgON)bSwkoGG7ncsge zNmmA*+5RIL_G;gqf*JNI|BC%A5X!OYU-f;f`Yt?EU(pKwEo|vtuCh<<=VZqzJ*bGH zXa!#cm-4Ud)qdacJM2wwjL}_j8av8f{V!18?Vly*C@OC%uIk6Lkfq00{~yj%qfor! zJb6;~3jP~J>Gr98oD5JgX(}*fr{IskC0x~C?UyQ~z0y-|R67*?HV}%R8AsXQs}v<9 zT`CH`pN0#8JSDGFe`Tk1#ml>jNP{m(`{yzmkZErRBa=sNcF4a@N7clTzB6^r{c~Di zr6>O~{V*e8nf420{LK8lVS?eMkYsq7C}6_NGceHr2?Pa(kW3&oBq5pbunLiY zGDd2s-b!1m(cW5mwJp8v^-^tn6F{VD74e1kA-A{M;1i$3YR&zvz4tmZnVHynzyJMz z|L_0x*wEl=Fbb8M2}MbP@LTUZ}jBo?YYJK z2usB|9Ot}+FTCYAoxS;y|N8n3*RNan;?B+Y*PY&6Ir_w}|M}vd?|Uz$bN_#Kyz$(- zDOIE9y$JER2ZamiiatgFa7TmSe~2@l`~!pF8wSBU2f?YnZk*A_Gyv{s5IptgxH$N` zz|yo#t<3EnkozdO;aZ}0GE>4URIUw%)3gy>c3hq?$yA+;Aoq^*=s=q%5 zO?sm3-UXcOb`K+Ij13ilRiKA!F0D5z2pa^RC_5W8#~r1^wIr>QIw<1!HE7abpzsNt z=l5^e)Y#x}305@+{eI0~Th~yh`Mu?({+d8@U_)I?Fwk6HI={ZLAy8hmzCIxH;^+9Q zw^fmXs`|R?1KM?g>guZN{LmNFs;lbj8><hfSYJE#%^LlMlU{iI| zb{1^e+!_c#70{MIQ1kn%T3Q0|v$m?Po@Hw4Hb5P7)r}}!U$?#~xUo44!m{&l2 zHBqxPf1su+SOrDvTUunD0X5WUSNgp3=KH7RP0O1}4MUw}Q-6}zG16lHX#DBgYY^e~ zZ@r+-MP-K|Ug+R?kms*5Ce(b#Y?>mRQ8@Ew#=3<*3Ii2Ng71yM)l@I=a}hY(pp3o< z9FAH?mWpfAp zI|;NOa~>s0dGyb;WxKWh@d>!5jx7d7{6@+=d!`@9_`hU<*NHzV`1gsYraap%_&12B zDxN(g_&*X)RXf`y_*aOhDxK{V{3+t8DreiklV4_seGNc!Pj}GPe^NMDn>uzkMBwhe zIX|GhefIk)De4PmLVSV}clDo19ot57M^y^>?LvNLGbNKhH+w!e%+NWrr}qj|KW;wz zc`ySCJ{pNk*mL%ufvE-I@@;d9P)=*juQ1!^ya*}H480aig4$Oy-CFM)xZJxDm*e(f zkki+&T~5z_6`8ep?0#p-N;A|~vZAD-q`YD|D%)gsTxxchm1gLM+;wKhPNy02<(>hu zj*tUp$F?*=dWq`-mqo-u5N;w4ftWwVKx-H1<@_GK#>v_+dz5q4DrPl|S+(g0juS-22_&nX-XM4P! zPfch(Os29*L%*S-hrFKOlHh5&^p$#^Gp8ry67BSQ9xL^{;q$y(>UqcKdBfXtWVqS$ zxZ(4>>FcP^J>UzK=N6hhPmDHuo*Y>kdd~;VqWz)1Ja-ZqI^zqyWQJDf7MO6f+kEzM zpXXKc*>11rucqfOUe9Mf&q?pIkC{D3hMJyFy`Fwws6IE#+jGojdVoHeL3YrS<+;V) zo@dg1p_*K?H1v-5+2cMB%ms71yq>4MJx|+wpg+RS2jT=GK2HzTqm0U(^Y%QIY4-fuFg=fZdyc32&^mq4fr6vSLKm&JBadtyDE0gXZC@IC4f)=j zx4oXUqr@dft2fd4ju2Lobx(Jmo$AtjK)X>v_vW`=Jk>^dWu@Q}Z1x z4IMM#(fQ}8TMqd`zctT4XNF$!cMOJx1Mk zt~7MiJpTf9Selvhk$L{bQqQNQp=ZpTr+p#Bz-sj4`Io$*56ttYN^>5kUaItZj+!|~ zXap2^J(>bKduQ z&Y7X7y*bBV)ayA_ia5)85oS!!acb0djA_i+xSF0P%zeq<#?F~^InAP;)IFJ>^&{rb zQG2ENLZ^J89x(}gkh+5kpwv2QvCh;H3vv&n4$}nQMcl#EVZ~{JJw)tbux`P26MF(| zfnZM(dm3!9U^}TJgt{}p$^_O+BIm%a6Ko%`ojzf9SaFjqMlC3cK|wvJVQp=gzgT5C zDo0Vt4r3DtS#|loxo}n zULX$B%4+WE57w5HmxP|LFhd{xstee1GxX_yP+sr1`mjn;I~ufLU3r*Rb@QgbK8|GT zMTbuy3H{(sNFKlGZjzteyI}8q-vJf6=>V>tZnAyUT2FbMI!r70oB!1*_60*=!qY7l zUbvFF`(9+0tn`M?M=V@UbI-@Ay93B+`ww9V4jy(xN$Q@<0D40&ntM*A?w$hL-1lR0 ztK&a9;lP_IqQ<3EIu)4S);v2Z|@(Hdh_pqeURFih_hX^ z%ZX=uYg6CtNgZai_vxv-%Vhp?#93qeX?TdtBdNpYr?vOlQg=_2x!1ZWw^!yKMXtNO z&q&>!A#ouJgQTIfXkna}rSJO)lHIuUeXBFWTDPsUL*^lESa$B3)`$J?nF>7XFk^XXqB zH%Kz<28@q35~W}~OvNIyJl&pCZ{8#KYa;JxZKsG=KenGGD@#^j=VEQNWV}vAPU^$A zP{1NyF>&wimi;kXPu;T@nH|EpJwPue?xzPJS#&P-mJV>{z6U9cO830oI`ZsZP^d4M z)ZI6LmZBx0VJM(#fy&zVTsyzqGPoa$iW9YyEd> zpI1MkEHa6aJ=Svy`pu4nbThO&oeaw?v;By(=;YSdWl?fwH#LqN*lJP<&nF$XP-A!8 zCF*f9wS5nU+~gzXzF!O>jh>HtFSp!DefSOIZ7cHeruv7&Xb=*#?qHkZqaIs8zF+16gcA7W6 zbr3M_2!B3;DfwNvNH4{z!kHn``^aeEZF1)mMo_}6a_23p*6 z-34*b*=||9xhfdY;^og7AfTL5A2!jaS1lWXDV{$-vOd$;)g}wvD$_QN{xC&!NS@>b zb(6wf5^uW|LUinvi3YrlNbDL#it;ig5Ll>9riMywDwT=WHdGO+d>h+qQ*!KwQ|fKg zM;VvXXPHi%?sxn9sg7;u`ul15>%#K%JHoNsp!K}~=@g`AKI!kLv2+eARR-p}vd@7d zr6WTontuH#l0_KUdp7~>?J7$H#Ptzx&9)#V>t@57;%-l{El$ZQ5weSq9)HRt=w{}?Z+9ip`0$V(L3#F|^DaGwWZg$*e z-c6`-{ZDTj>e6eqRC8Q`Na7fvAjAICph;2$mU|78pC{}ZDB ze}LgHju%wQJZ(tmNRo;5eQMTgw{}-bakLg+*>fgbdrv6_+YX%*h|Iz3D zjl`c*hV8`QC`^zkEg5tatMv%$pg7W%JpQvKjx3epHbx$9w@6hn?Vy5rJsYBU^>1FS zSQ%pcfO3TWh_VmDZ|si%PGYKmRiKB>V?@vU^6}jJ!+T(+WJ(3Z{FeyC*FR)VR&6pv0$6 zn?6~K5H8G{p64OqA_#lJ!UCTP*(vZ)cAo5lb*d*m<_L_c!4L5dQQ4?Y{S)LRHGq2v z8o1z!5#bWHdi0NRdSnqG!#U(hN^C>EhY|@1_PU0kW_PXw=D3P7bjNOFI93VT`Bl(H z!jO|P=SJde_7kvUIPJ+uY~LX*`?7C>fb9ZAal+R|5k16dcajR{O5~rmr|Qm9NV{ln zWKYwFT!~b3{X5*UXX>u|Nzg?fOW8+AF3r_Kc_Ss4<@zmgS(0$GTu+g` zTs@-`+(uUo`7%M)p~>|evmr30BnY$K}Lq;W0gz0*6 zIg)8GH(YZ}L^AC6;D?MJLy)c`hUtqY7!t<;+nz&7rza}_+OZr0wxPH<3rA6195tZR zyL3I*bp}+@d~#$$3ej4|`qo-aza-@xm=l>HAo{cv+HH60nX~}tGX;02o_QZE=(7ZO zK+oJpIto+B)ZKdK4C0CehtF-2$sQ>bEt#bylaz)w5&YwtZ8nKtX0!r!5T4uwDu)F| zYK~!`M;s%Ax;~OJT!vds|07?f!lQME&a=hl6llkx->oMgG_yqYM(a7m@S2oer|Dz# z#Ooop9OqJ;*;NIao};IbvviBHRbU>%h7!mh-5InL~=S%gg>>{Xo43G7nBE+%X%s(T&I?5aY-@(4@C zl4Rh_t|}sI8es>)-z_kYsK_h=i%{X2IJ2ufq9&IUxE(;F1VvSf3G4^(fdo;Pak3o_ zV5ztbCyJvoG5GfdhBnKUA>hFxnU6DjJ(?_6 zhQJE&E+!qAufQJ6sQ7n*>pr@iGMN1MnRQqBi4Y2>c$v%MwI&#>)`MO2x><2}7vQcv=tyf$=f~eg@!>1W}{$vYPJzcuRt)(RdjGnYd3* z$CE_x3}zv4gQqC zU}T~UfjQXI6yeOShK-3b1h#{3C9H-ZF$p{m_Bc+gE)<9t=E8T~=&l3s?Pn&W{+{lPqP zU|eG>s`TI-GMsaYoPW?u1}{2{vg;tMyNooo2;`0rqDg)}ydL?Oa@OHO5@LNx(Hx|D z!hTY5SF*0(X&JifVlpHY{o)tU0LE1$qFQ^{vul{@&lOsQ(DRTYm?W z$Y@cAty4+$eQ20}!a1rA?X@kBvS(n0pMZ0;sM7WcRHYZd{~G5+QZtFFvP)ED4VrKz z&dE8{2kioT2>b&$FCKz1T|j2PmfQ`!mt=yUNWhdFP&z8|SBOoyB!Zbb6HHz)E@v=O z=+L!wbiFe9l4U?A5;Ju*32lfFN)SS}AJ{M12{gYIm*r4j#BEjZEv4-%Xo=JCWvsr` zb_4Dkt5nO(K}=8xv_L&NpZ*7Sf&K<{{$|;f;`^+~<0eH@&d0nc<8iZS%6oC!_HCSF zT*}y1D2Gx+R0XN?QunTq>iC2bB7or6;ScG5;DjHM?o#Yo zsIO#fmrkOb@z{P`Ew)bMzXEEQh}#Ljg+09l5lTHI#Y?8M_SW1Yuem z5!No_evDo^5L7Os&0?0?oc}gfUlyMGv@zWNR9qB2ZAnKLeRyC|v{C>~cG9XJeU_vD z#FaW|JYz9=;G9SqViLLz+yachpUvk?brGa^)9 zkwnli1&QJk8cyAso~|d_WtB)*2CO)_hGYdXAFgsC?z~1s>b7C@jLbvDWVI$HQA-sM zy=z_)Da*1)xM6er`#ieyLUA%6YOSyf^7Jc`*viBtZ~6c&qoBodNtGC_G>h6O>_Vkk zVsLCsXcsE?5(?Wd^)h7=23UFHMeNroJf^e3?i*!`$V<&rq4*C8s{b=n#M<( z!=j>E0oErbNsSW|^$OH@Qly~rbuy{rW>(n67sAyFM`hxw#FfIMOY9o?K4k_HB{P+1 zY+OimnSOYlo#inBkhBsj;F?n}cp^RXrc2+Z#C8CM-NrZr8c&3}GlQ!u}I zV}4CwOR%xA9?wloEzECjYz*eNwlwGCQHcBv)z$gi3TOFe&6wI8sM%N*oLXPk(7G+Z zFu$&$y1un0fNdN^6_dZdF4!^v;s37VKm9O@$0zEl8UigXc^ips3D(pEYC&T{4sLG> z5R8cdcIz5JVy=UPMQ(5L2b!Df@sx=aqr3*9r5s90T0Zw7>DlXB>*|A3>l)^w)|fYR z&1K_{cZ|Djy4{|hnVylJkzv;zMo_oAj3no9yWKIz?s6DIb-QlVEe4oeX$)Pw%4l7T ztX0U;!5UjCnX};k838p*($h(;uXMYyC1|O=Vykie3F0U-Ggt(&RS0JMF!Kox>xKzHey>dXoBB`xhswo~|sa(}-4rxdaUt|%7E-j+B zD9drJJz1paQjyM)mK~xkE|Zy;No)frgd42!(0Em;%Mb?lGoo zNM0-rRmw7##nWS4kF^a=JzV&21TAAxc9y6r>$0&#om9}zm7*NRKGp83dsU@YD&rik znPgRT>19MIDU~a_M?oS$1#pdY!7B%k3gSY^T_t^>ff&)lQBj;}A4RsJyYwZg0Oe&hgibNx>keq7pd6EI#DSh~RwzIlkX>6p8ijnmQwp{6p-R?Xb4&$L4-^X4o z!=C0yw>wwb^$Pn%cVYL1{ej)F)P9jeuf*UudouyhnS=s*zT5qXJ;J8LK zcY=dfl7z3*MGmk8#|C0(7EXY(lt8uJ`1#IV_AKX*VC=mFn?1|;g9a2k)eOT2BGZ9t zOv8UG6UZIoo}IcqOKkoexBuPJPVAQcAs(+Czii9ggN9uB_qY51uK0;B6*8UnWQXxM z{wrV~>(KM;iN@x8>`6wtGY?~?vU3;4%!b7niP@FN`pM3R?8$i;7RD^PH_FDaA1Ovs zc-+{NY2=(xqx5EoZrz1o9;(0Oc+sA?g?xK0gF+R92lPw!sWhJQ?4vMNitM9`?XE%^ zDFixRQ-e3zv7{a5LWpr105tOK*nm3rqs23fbTJwp!8ph^>OkLvjjqG^5TgYZs)g4r zI>x*)99hOKJE<<8XnAfo${QO{%VeV#IT`7WM;v=_uCk9K^$zD8OeMPg!dlQTL+D;% zJUs(gmUANt|6@?bPCs9E*!&OXpZ{k@*_Rx{Uv5x7f~YfotLb|j#)AmFOydQO0nukwK zT=zgZ?g$-N9BJVe>+la@YWoRNGL%+)u?AzT*&X-Whmv4YyM5?XOFXU6uCKxSRCL|n zvazu_NM9=Qd$0E61tHh@gY@wbJ`&QZtD35+>w?=w7DU8rI_Sv|0c>rq3kC$_udT1z z(4zS_RW)B1Xa?aI9}m?v_y@j9M7>|6TE2*cwaX__w1}rtG=EcL3pqjmVJ5d)sds?xW%Qlp`~s^1HK+fUo~tAf3_v-P*r_hYm0?BkyA zxzzo)zAfpVx(P2lnT90T+7OttAIV1JtEaoC)^2UC zYTAOd%sXFLhj25!&;|dHZ`4}wN*1&()rek|E5NK zBuE8i8;5l?1)H_z#@2?K>c$4VK&Ano6Sku2h02cXBvE12cKqTOQZ~)+!5dicai2e; z1*zd8GSLTkB@K6i(9~2_gEAYe2YiC`n2=I0UNz(QL&SqPKr&4x(`7P4CNnkb$t2Cc zB}gx|@i*4i(hFvk9`zIv85V6tZ-~jqR~Yh}>YDJ8>E@{vVl`8nH`HCaG4K_1HHES0 zbTsvb;6_VNYeRLguCW0XM2oi;1{-J1@YmM`gLsV&w}^au4K*9`WaSrmeGC0f^{p*h zeV{g|wa%ImY%Jt*1L9k}6o)?x%cX;=*2-$gfBA4;W&+}Cr4d)tf*RxxAgd{ zTbupWjrFaYP%In}2wG?(RQ&541(&E4elf|uz^^o>*$?Gc8uN3)e)ZkROmWyRCL{dn`$E4KDSsA+{bG`R zfnQlnvmeT@Eat1iezomjhQ2>Rhpw$=GQzL69Wpom^=bt#S1H-N8(=<=1j1BmCO?g??2ke^!V6Vv>D->lj=AhUyA9G(^>p%K}o~T8R<{&*dY$KRuZDmF#^T{ufFItvoy4 zQ09`XC14Gc?17MzMZ#C5LjY|G-mOwyTgGIBV`m0)Y#lo`O8EkV-8-21u>vvCF&W`l zcid)GerVrT1h1TMjL8VcdIxiCBRj^AiNUcGJDB-~<=8b$MmToj3mtn@Id&x6VoXLj zc5X1on%J>x!Yy`k2Q%v|$F5~E!m*Pvj*&85W0%4^hUIMK`&M)=XB$JTaN(7M+gzki zDX!lt>EEurqHo~Pp=*9ggs&XeT$=6c+OMWtzdOd%fl5iZ{U>*ysDtrRf@o3vQs%@!&4co(V;XF#&m>-r(-;nEx}gUS6y4m z%p6Vsn$?-$C#B5R#k#iUO` z3EFne9jATi4Nr8ew2H z{n8SvVDh+v613Jh71AvWPg+HEsGYC z-Sc0nml9L~bo;p-%q&tMh8U9^+atC8eK$JxckOUY#NvfZFD~1(*wLbE^avRp1J+>) zMP9$J#FDL8iy7C3)sPokLNVisaya&SRP9g!CL`jub7!P|ra2nCmWgsEmnkR#FP(^u zTir7Iq%w=fY>Tm>YaHI$;Wj@IM~nk}z#70_hSOgvEn6&q%fgvqihH3%iR0dv$%rQD ziy6wg#&I7Zb}+_Wo7FWDVuxbH46BV!hudgxjF@gk`M7W!b;XEj+HR%g=T@y^29|CK zU1ABv3<%FdeU}6caj=d_$V0?cck@ zvHuW_$&TGAfP9?WlW1pptg!Q?>;DrfRh1<49Bcia+;x!GcyY=$18paZ)PCjZrf%9v!uvNp_x%?wf-Ho|JK zzhIJekjAC=G8fkPg>i9+_jh+|+JXc3(@c64B-@BNpCwqq|U$GYf`bun%)sF4=O!KLgVzpesn z275Ek@@8$UH%nu^SsUxkAU()NhgnUqX0jqjSVq^xT8KMg;`u&RmS4evd5uX{i(73b zrzmNc)^fnOGoe)*eXs1_f!A^+)}~VWv^v_Oc%NV=I0pM;O`JNk_rFG8H}6yyIA#1t z3g?vZrxea9<8LUOQ^uWm_Ja;i8K0nVP8naIa84OtuW(Ko-=%O)8NXlQoHBky;hZvl zPT`y~F1;Uk?NX!vAkP9?1(Q4qjM}-^&~u#H`I^*mle)02(PpF| zYmQF6%EAiEQW=wM2{+WN^E+WFCd0Lf*~<;IwNA|$2dufHg2~l*Duxa$1x&6{P=dDQ z@Q!<#tF=(tB{2689#B%nnS9!UDwwRb7RxW_a;ZqeJ76Tm9-{l0{Eg-RS|-^M+4anI zTD2-?lHJ4n%_O@A3rynCE^$DL$6&SbbgYuW4gX>47V#@1y`yt*v4n)n8*E=!r@ z3ef&kwKi7(y9Xx2UdCA#Xi4r;&B^wmjvh*-?<@thzzkFw#Q~ z%`X|HvF4Y@nvWZj+$67B5$8Xr$O@}J{IadWS6$0dnTsu<81)I3&{QQ9ca;=cSzV+g z)3YrTOPO4xAVb^ij9IgFExIHYcx|&b?xGWV9AW&cK;z-WL5Ak%;NqqQ#IZ8T8YnS! zroQ~8a&EO1T2@IOYETw#Oi9t_eq8cT5$(lBxoF%r9CW9_nmENuO7G#&K2#PsWqdeo zLvV1)c!9z>W&A3IbIN$V!Z~I9R)urQIKBCW4o(?AqHs_hu2m_|7n+(RqUYggeLV5fyHV(f z)+f>Mm1jzxc>k7slhS)gMNss-#(wgo7PcfQo|AYsV|kvBqUCv};gn|>PI+eGlxGx9 zc_!hMXAn+#=HQfP3{H8b;FM_c|M9Y6MZ(u)4 z?-h7}9o)-n9{YQFlyA`6y479iK>0-LcQOa!vA?4y^(1Tj&W(ZcDc0{w4#ZQn0=!Np`Y`aT zar}PO$UH+EhNtk|k&vJbyby(d4=ys((9-ccn(^c_H2&SVf%2J}=8h*H`@4ix&WL!y z#6Uf9DkbFcPMkQ0q2Zk`aSlTp6$d4|qX)q+90VT|gHyOBXz%q$XOJg0ysm;*1kS&B z5c!!(zAGwzE>-x+D15QP)6`53Rvhba)wOUt^Kfbucx=Ca1339v7NzHYAs-t*J;3AD z_X(wkACw=aZfIW-dXhDMV`4XWI?m$6%NaF(i56ZwBM$lb53gGxUWz4u+Cgfv(-*c_PqvJma9Pd?#Ic^5-jzRHm7vS-J zKlBGe4>p3T!DwGg2mPKxyx-;gmB6J;0*{LnR5ZQmE8g#=$`@GB+b{C+=p`7lX5?2l2kY`0@t{F{eZ+5|YJgjUt+lmy zyG8gHQ2oJ8{%ZOSRC>UmrqRElzHxn3y}u^d*xcf;YTc$)H*RXG4+H}>d6#+$>1*e4 zgz#1ThB|*$b92>pJh~8UrXN79+7$5Dv~Jpj=N$YIocPt$0iyDo({PHvqt4$gkNN_> zKlZ!XdDCa&Wt{Od3W|`iXjw_=LjS_67SQ*&{WUF({*6@)HTaUcf5ED&N=orKf!~iu z7W@lMC2B5M1_(b3%Z0A=T|KYF=f8TSDv5np5_ALD2gkoIsgf+CGmWPqE38Mi*f%UB$P`s)E zKj_PBT|+IEms#uAHwU&bhj-Qlm`2+$iKii$RGQ+<5?>yo9SSY+m|n!e`(sXX70!wJ zDg?7y9w_`wNh6o%eKe>1jS2N_87*qL$1k;umup$}i-z1L3WAc^1MSU21dHs zKJUvpO;_b1B916lGl9}O@VPwi-#MlApAPn)pn#78{0@I;^2J)r}V9u$nv~z<@9uv16+<(?v5(Yzw^Lp^am}}R*}c8V8}kV zKi~gwx{fj<4tE4i4MNnAh}!%|mzVcdvF-P7rYwIM2aaT|y0V@b zgV=vp4cupPRKck7jM9A?>tc-3U(v*jgWek(c|^++&vQ?tTtTzs&Z&9W4R#hzjyqoe lXnu<_0YuZ>+eM=BeTC#=eWmV=SN`d*$`Ykf4o9)te*;7H(5L_a literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Hash/_poly1305.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Hash/_poly1305.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..77d81b998b9f995aa6ef35bc4addf2e256a45237 GIT binary patch literal 33360 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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 Crypto.Util.py3compat import bord + +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + VoidPointer, SmartPointer, + create_string_buffer, + get_raw_buffer, c_size_t, + c_uint8_ptr) + +_raw_keccak_lib = load_pycryptodome_raw_lib("Crypto.Hash._keccak", + """ + int keccak_init(void **state, + size_t capacity_bytes, + uint8_t padding_byte); + 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); + int keccak_digest(void *state, uint8_t *digest, size_t len); + int keccak_copy(const void *src, void *dst); + """) + +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 + + state = VoidPointer() + result = _raw_keccak_lib.keccak_init(state.address_of(), + c_size_t(self.digest_size * 2), + 0x01) + 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)) + 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/server/www/packages/packages-linux/x64/Crypto/IO/PEM.py b/server/www/packages/packages-linux/x64/Crypto/IO/PEM.py new file mode 100644 index 0000000..4c07b25 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/IO/PEM.py @@ -0,0 +1,189 @@ +# +# Util/PEM.py : Privacy Enhanced Mail utilities +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +__all__ = ['encode', 'decode'] + +import re +from binascii import a2b_base64, b2a_base64, hexlify, unhexlify + +from Crypto.Hash import MD5 +from Crypto.Util.Padding import pad, unpad +from Crypto.Cipher import DES, DES3, AES +from Crypto.Protocol.KDF import PBKDF1 +from Crypto.Random import get_random_bytes +from Crypto.Util.py3compat import tobytes, tostr + + +def encode(data, marker, passphrase=None, randfunc=None): + """Encode a piece of binary data into PEM format. + + Args: + data (byte string): + The piece of binary data to encode. + marker (string): + The marker for the PEM block (e.g. "PUBLIC KEY"). + Note that there is no official master list for all allowed markers. + Still, you can refer to the OpenSSL_ source code. + passphrase (byte string): + If given, the PEM block will be encrypted. The key is derived from + the passphrase. + randfunc (callable): + Random number generation function; it accepts an integer N and returns + a byte string of random data, N bytes long. If not given, a new one is + instantiated. + + Returns: + The PEM block, as a string. + + .. _OpenSSL: https://github.com/openssl/openssl/blob/master/include/openssl/pem.h + """ + + if randfunc is None: + randfunc = get_random_bytes + + out = "-----BEGIN %s-----\n" % marker + if passphrase: + # We only support 3DES for encryption + salt = randfunc(8) + key = PBKDF1(passphrase, salt, 16, 1, MD5) + key += PBKDF1(key + passphrase, salt, 8, 1, MD5) + objenc = DES3.new(key, DES3.MODE_CBC, salt) + out += "Proc-Type: 4,ENCRYPTED\nDEK-Info: DES-EDE3-CBC,%s\n\n" %\ + tostr(hexlify(salt).upper()) + # Encrypt with PKCS#7 padding + data = objenc.encrypt(pad(data, objenc.block_size)) + elif passphrase is not None: + raise ValueError("Empty password") + + # Each BASE64 line can take up to 64 characters (=48 bytes of data) + # b2a_base64 adds a new line character! + chunks = [tostr(b2a_base64(data[i:i + 48])) + for i in range(0, len(data), 48)] + out += "".join(chunks) + out += "-----END %s-----" % marker + return out + + +def _EVP_BytesToKey(data, salt, key_len): + d = [ b'' ] + m = (key_len + 15 ) // 16 + for _ in range(m): + nd = MD5.new(d[-1] + data + salt).digest() + d.append(nd) + return b"".join(d)[:key_len] + + +def decode(pem_data, passphrase=None): + """Decode a PEM block into binary. + + Args: + pem_data (string): + The PEM block. + passphrase (byte string): + If given and the PEM block is encrypted, + the key will be derived from the passphrase. + + Returns: + A tuple with the binary data, the marker string, and a boolean to + indicate if decryption was performed. + + Raises: + ValueError: if decoding fails, if the PEM file is encrypted and no passphrase has + been provided or if the passphrase is incorrect. + """ + + # Verify Pre-Encapsulation Boundary + r = re.compile(r"\s*-----BEGIN (.*)-----\s+") + m = r.match(pem_data) + if not m: + raise ValueError("Not a valid PEM pre boundary") + marker = m.group(1) + + # Verify Post-Encapsulation Boundary + r = re.compile(r"-----END (.*)-----\s*$") + m = r.search(pem_data) + if not m or m.group(1) != marker: + raise ValueError("Not a valid PEM post boundary") + + # Removes spaces and slit on lines + lines = pem_data.replace(" ", '').split() + + # Decrypts, if necessary + if lines[1].startswith('Proc-Type:4,ENCRYPTED'): + if not passphrase: + raise ValueError("PEM is encrypted, but no passphrase available") + DEK = lines[2].split(':') + if len(DEK) != 2 or DEK[0] != 'DEK-Info': + raise ValueError("PEM encryption format not supported.") + algo, salt = DEK[1].split(',') + salt = unhexlify(tobytes(salt)) + + padding = True + + if algo == "DES-CBC": + key = _EVP_BytesToKey(passphrase, salt, 8) + objdec = DES.new(key, DES.MODE_CBC, salt) + elif algo == "DES-EDE3-CBC": + key = _EVP_BytesToKey(passphrase, salt, 24) + objdec = DES3.new(key, DES3.MODE_CBC, salt) + elif algo == "AES-128-CBC": + key = _EVP_BytesToKey(passphrase, salt[:8], 16) + objdec = AES.new(key, AES.MODE_CBC, salt) + elif algo == "AES-192-CBC": + key = _EVP_BytesToKey(passphrase, salt[:8], 24) + objdec = AES.new(key, AES.MODE_CBC, salt) + elif algo == "AES-256-CBC": + key = _EVP_BytesToKey(passphrase, salt[:8], 32) + objdec = AES.new(key, AES.MODE_CBC, salt) + elif algo.lower() == "id-aes256-gcm": + key = _EVP_BytesToKey(passphrase, salt[:8], 32) + objdec = AES.new(key, AES.MODE_GCM, nonce=salt) + padding = False + else: + raise ValueError("Unsupport PEM encryption algorithm (%s)." % algo) + lines = lines[2:] + else: + objdec = None + + # Decode body + data = a2b_base64(''.join(lines[1:-1])) + enc_flag = False + if objdec: + if padding: + data = unpad(objdec.decrypt(data), objdec.block_size) + else: + # There is no tag, so we don't use decrypt_and_verify + data = objdec.decrypt(data) + enc_flag = True + + return (data, marker, enc_flag) diff --git a/server/www/packages/packages-linux/x64/Crypto/IO/PKCS8.py b/server/www/packages/packages-linux/x64/Crypto/IO/PKCS8.py new file mode 100644 index 0000000..3bda834 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/IO/PKCS8.py @@ -0,0 +1,231 @@ +# +# 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 Crypto.Util.py3compat import * + +from Crypto.Util.asn1 import ( + DerNull, + DerSequence, + DerObjectId, + DerOctetString, + ) + +from Crypto.IO._PBES import PBES1, PBES2, PbesError + + +__all__ = ['wrap', 'unwrap'] + + +def wrap(private_key, key_oid, passphrase=None, protection=None, + prot_params=None, key_params=None, randfunc=None): + """Wrap a private key into a PKCS#8 blob (clear or encrypted). + + Args: + + private_key (byte string): + The private key encoded in binary form. The actual encoding is + algorithm specific. In most cases, it is DER. + + key_oid (string): + The object identifier (OID) of the private key to wrap. + It is a dotted string, like ``1.2.840.113549.1.1.1`` (for RSA keys). + + passphrase (bytes string or string): + The secret passphrase from which the wrapping key is derived. + Set it only if encryption is required. + + protection (string): + The identifier of the algorithm to use for securely wrapping the key. + The default value is ``PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC``. + + prot_params (dictionary): + Parameters for the protection algorithm. + + +------------------+-----------------------------------------------+ + | Key | Description | + +==================+===============================================+ + | iteration_count | The KDF algorithm is repeated several times to| + | | slow down brute force attacks on passwords | + | | (called *N* or CPU/memory cost in scrypt). | + | | The default value for PBKDF2 is 1000. | + | | The default value for scrypt is 16384. | + +------------------+-----------------------------------------------+ + | salt_size | Salt is used to thwart dictionary and rainbow | + | | attacks on passwords. The default value is 8 | + | | bytes. | + +------------------+-----------------------------------------------+ + | block_size | *(scrypt only)* Memory-cost (r). The default | + | | value is 8. | + +------------------+-----------------------------------------------+ + | parallelization | *(scrypt only)* CPU-cost (p). The default | + | | value is 1. | + +------------------+-----------------------------------------------+ + + key_params (DER object): + The algorithm parameters associated to the private key. + It is required for algorithms like DSA, but not for others like RSA. + + 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:`Crypto.Random`. + + Return: + The PKCS#8-wrapped private key (possibly encrypted), as a byte string. + """ + + if key_params is None: + key_params = DerNull() + + # + # PrivateKeyInfo ::= SEQUENCE { + # version Version, + # privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, + # privateKey PrivateKey, + # attributes [0] IMPLICIT Attributes OPTIONAL + # } + # + pk_info = DerSequence([ + 0, + DerSequence([ + DerObjectId(key_oid), + key_params + ]), + DerOctetString(private_key) + ]) + pk_info_der = pk_info.encode() + + if passphrase is None: + return pk_info_der + + if not passphrase: + raise ValueError("Empty passphrase") + + # Encryption with PBES2 + passphrase = tobytes(passphrase) + if protection is None: + protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC' + return PBES2.encrypt(pk_info_der, passphrase, + protection, prot_params, randfunc) + + +def unwrap(p8_private_key, passphrase=None): + """Unwrap a private key from a PKCS#8 blob (clear or encrypted). + + Args: + p8_private_key (byte string): + The private key wrapped into a PKCS#8 blob, DER encoded. + passphrase (byte string or string): + The passphrase to use to decrypt the blob (if it is encrypted). + + Return: + A tuple containing + + #. the algorithm identifier of the wrapped key (OID, dotted string) + #. the private key (byte string, DER encoded) + #. the associated parameters (byte string, DER encoded) or ``None`` + + Raises: + ValueError : if decoding fails + """ + + if passphrase: + passphrase = tobytes(passphrase) + + found = False + try: + p8_private_key = PBES1.decrypt(p8_private_key, passphrase) + found = True + except PbesError as e: + error_str = "PBES1[%s]" % str(e) + except ValueError: + error_str = "PBES1[Invalid]" + + if not found: + try: + p8_private_key = PBES2.decrypt(p8_private_key, passphrase) + found = True + except PbesError as e: + error_str += ",PBES2[%s]" % str(e) + except ValueError: + error_str += ",PBES2[Invalid]" + + if not found: + raise ValueError("Error decoding PKCS#8 (%s)" % error_str) + + pk_info = DerSequence().decode(p8_private_key, nr_elements=(2, 3, 4)) + if len(pk_info) == 2 and not passphrase: + raise ValueError("Not a valid clear PKCS#8 structure " + "(maybe it is encrypted?)") + + # + # PrivateKeyInfo ::= SEQUENCE { + # version Version, + # privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, + # privateKey PrivateKey, + # attributes [0] IMPLICIT Attributes OPTIONAL + # } + # Version ::= INTEGER + if pk_info[0] != 0: + raise ValueError("Not a valid PrivateKeyInfo SEQUENCE") + + # PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier + # + # EncryptedPrivateKeyInfo ::= SEQUENCE { + # encryptionAlgorithm EncryptionAlgorithmIdentifier, + # encryptedData EncryptedData + # } + # EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier + + # AlgorithmIdentifier ::= SEQUENCE { + # algorithm OBJECT IDENTIFIER, + # parameters ANY DEFINED BY algorithm OPTIONAL + # } + + 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] + + # EncryptedData ::= OCTET STRING + private_key = DerOctetString().decode(pk_info[2]).payload + + return (algo_oid, private_key, algo_params) diff --git a/server/www/packages/packages-linux/x64/Crypto/IO/_PBES.py b/server/www/packages/packages-linux/x64/Crypto/IO/_PBES.py new file mode 100644 index 0000000..a47c775 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/IO/_PBES.py @@ -0,0 +1,435 @@ +# +# PublicKey/_PBES.py : Password-Based Encryption functions +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Crypto import Random +from Crypto.Util.asn1 import ( + DerSequence, DerOctetString, + DerObjectId, DerInteger, + ) + +from Crypto.Util.Padding import pad, unpad +from Crypto.Hash import MD5, SHA1, SHA224, SHA256, SHA384, SHA512 +from Crypto.Cipher import DES, ARC2, DES3, AES +from Crypto.Protocol.KDF import PBKDF1, PBKDF2, scrypt + +_OID_PBE_WITH_MD5_AND_DES_CBC = "1.2.840.113549.1.5.3" +_OID_PBE_WITH_MD5_AND_RC2_CBC = "1.2.840.113549.1.5.6" +_OID_PBE_WITH_SHA1_AND_DES_CBC = "1.2.840.113549.1.5.10" +_OID_PBE_WITH_SHA1_AND_RC2_CBC = "1.2.840.113549.1.5.11" + +_OID_PBES2 = "1.2.840.113549.1.5.13" + +_OID_PBKDF2 = "1.2.840.113549.1.5.12" +_OID_SCRYPT = "1.3.6.1.4.1.11591.4.11" + +_OID_HMAC_SHA1 = "1.2.840.113549.2.7" +_OID_HMAC_SHA224 = "1.2.840.113549.2.8" +_OID_HMAC_SHA256 = "1.2.840.113549.2.9" +_OID_HMAC_SHA384 = "1.2.840.113549.2.10" +_OID_HMAC_SHA512 = "1.2.840.113549.2.11" + +_OID_DES_EDE3_CBC = "1.2.840.113549.3.7" +_OID_AES128_CBC = "2.16.840.1.101.3.4.1.2" +_OID_AES192_CBC = "2.16.840.1.101.3.4.1.22" +_OID_AES256_CBC = "2.16.840.1.101.3.4.1.42" + + +class PbesError(ValueError): + pass + +# These are the ASN.1 definitions used by the PBES1/2 logic: +# +# EncryptedPrivateKeyInfo ::= SEQUENCE { +# encryptionAlgorithm EncryptionAlgorithmIdentifier, +# encryptedData EncryptedData +# } +# +# EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier +# +# EncryptedData ::= OCTET STRING +# +# AlgorithmIdentifier ::= SEQUENCE { +# algorithm OBJECT IDENTIFIER, +# parameters ANY DEFINED BY algorithm OPTIONAL +# } +# +# PBEParameter ::= SEQUENCE { +# salt OCTET STRING (SIZE(8)), +# iterationCount INTEGER +# } +# +# PBES2-params ::= SEQUENCE { +# keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}}, +# encryptionScheme AlgorithmIdentifier {{PBES2-Encs}} +# } +# +# PBKDF2-params ::= SEQUENCE { +# salt CHOICE { +# specified OCTET STRING, +# otherSource AlgorithmIdentifier {{PBKDF2-SaltSources}} +# }, +# iterationCount INTEGER (1..MAX), +# keyLength INTEGER (1..MAX) OPTIONAL, +# prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1 +# } +# +# scrypt-params ::= SEQUENCE { +# salt OCTET STRING, +# costParameter INTEGER (1..MAX), +# blockSize INTEGER (1..MAX), +# parallelizationParameter INTEGER (1..MAX), +# keyLength INTEGER (1..MAX) OPTIONAL +# } + +class PBES1(object): + """Deprecated encryption scheme with password-based key derivation + (originally defined in PKCS#5 v1.5, but still present in `v2.0`__). + + .. __: http://www.ietf.org/rfc/rfc2898.txt + """ + + @staticmethod + def decrypt(data, passphrase): + """Decrypt a piece of data using a passphrase and *PBES1*. + + The algorithm to use is automatically detected. + + :Parameters: + data : byte string + The piece of data to decrypt. + passphrase : byte string + The passphrase to use for decrypting the data. + :Returns: + The decrypted data, as a binary string. + """ + + enc_private_key_info = DerSequence().decode(data) + encrypted_algorithm = DerSequence().decode(enc_private_key_info[0]) + encrypted_data = DerOctetString().decode(enc_private_key_info[1]).payload + + pbe_oid = DerObjectId().decode(encrypted_algorithm[0]).value + cipher_params = {} + if pbe_oid == _OID_PBE_WITH_MD5_AND_DES_CBC: + # PBE_MD5_DES_CBC + hashmod = MD5 + ciphermod = DES + elif pbe_oid == _OID_PBE_WITH_MD5_AND_RC2_CBC: + # PBE_MD5_RC2_CBC + hashmod = MD5 + ciphermod = ARC2 + cipher_params['effective_keylen'] = 64 + elif pbe_oid == _OID_PBE_WITH_SHA1_AND_DES_CBC: + # PBE_SHA1_DES_CBC + hashmod = SHA1 + ciphermod = DES + elif pbe_oid == _OID_PBE_WITH_SHA1_AND_RC2_CBC: + # PBE_SHA1_RC2_CBC + hashmod = SHA1 + ciphermod = ARC2 + cipher_params['effective_keylen'] = 64 + else: + raise PbesError("Unknown OID for PBES1") + + pbe_params = DerSequence().decode(encrypted_algorithm[1], nr_elements=2) + salt = DerOctetString().decode(pbe_params[0]).payload + iterations = pbe_params[1] + + key_iv = PBKDF1(passphrase, salt, 16, iterations, hashmod) + key, iv = key_iv[:8], key_iv[8:] + + cipher = ciphermod.new(key, ciphermod.MODE_CBC, iv, **cipher_params) + pt = cipher.decrypt(encrypted_data) + return unpad(pt, cipher.block_size) + + +class PBES2(object): + """Encryption scheme with password-based key derivation + (defined in `PKCS#5 v2.0`__). + + .. __: http://www.ietf.org/rfc/rfc2898.txt.""" + + @staticmethod + def encrypt(data, passphrase, protection, prot_params=None, randfunc=None): + """Encrypt a piece of data using a passphrase and *PBES2*. + + :Parameters: + data : byte string + The piece of data to encrypt. + passphrase : byte string + The passphrase to use for encrypting the data. + protection : string + The identifier of the encryption algorithm to use. + The default value is '``PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC``'. + prot_params : dictionary + Parameters of the protection algorithm. + + +------------------+-----------------------------------------------+ + | Key | Description | + +==================+===============================================+ + | iteration_count | The KDF algorithm is repeated several times to| + | | slow down brute force attacks on passwords | + | | (called *N* or CPU/memory cost in scrypt). | + | | | + | | The default value for PBKDF2 is 1 000. | + | | The default value for scrypt is 16 384. | + +------------------+-----------------------------------------------+ + | salt_size | Salt is used to thwart dictionary and rainbow | + | | attacks on passwords. The default value is 8 | + | | bytes. | + +------------------+-----------------------------------------------+ + | block_size | *(scrypt only)* Memory-cost (r). The default | + | | value is 8. | + +------------------+-----------------------------------------------+ + | parallelization | *(scrypt only)* CPU-cost (p). The default | + | | value is 1. | + +------------------+-----------------------------------------------+ + + + randfunc : callable + Random number generation function; it should accept + a single integer N and return a string of random data, + N bytes long. If not specified, a new RNG will be + instantiated from ``Crypto.Random``. + + :Returns: + The encrypted data, as a binary string. + """ + + if prot_params is None: + prot_params = {} + + if randfunc is None: + randfunc = Random.new().read + + if protection == 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC': + key_size = 24 + module = DES3 + cipher_mode = DES3.MODE_CBC + enc_oid = _OID_DES_EDE3_CBC + elif protection in ('PBKDF2WithHMAC-SHA1AndAES128-CBC', + 'scryptAndAES128-CBC'): + key_size = 16 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES128_CBC + elif protection in ('PBKDF2WithHMAC-SHA1AndAES192-CBC', + 'scryptAndAES192-CBC'): + key_size = 24 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES192_CBC + elif protection in ('PBKDF2WithHMAC-SHA1AndAES256-CBC', + 'scryptAndAES256-CBC'): + key_size = 32 + module = AES + cipher_mode = AES.MODE_CBC + enc_oid = _OID_AES256_CBC + else: + raise ValueError("Unknown PBES2 mode") + + # Get random data + iv = randfunc(module.block_size) + salt = randfunc(prot_params.get("salt_size", 8)) + + # Derive key from password + if protection.startswith('PBKDF2'): + count = prot_params.get("iteration_count", 1000) + key = PBKDF2(passphrase, salt, key_size, count) + kdf_info = DerSequence([ + DerObjectId(_OID_PBKDF2), # PBKDF2 + DerSequence([ + DerOctetString(salt), + DerInteger(count) + ]) + ]) + else: + # It must be scrypt + count = prot_params.get("iteration_count", 16384) + scrypt_r = prot_params.get('block_size', 8) + scrypt_p = prot_params.get('parallelization', 1) + key = scrypt(passphrase, salt, key_size, + count, scrypt_r, scrypt_p) + kdf_info = DerSequence([ + DerObjectId(_OID_SCRYPT), # scrypt + DerSequence([ + DerOctetString(salt), + DerInteger(count), + DerInteger(scrypt_r), + DerInteger(scrypt_p) + ]) + ]) + + # Create cipher and use it + cipher = module.new(key, cipher_mode, iv) + encrypted_data = cipher.encrypt(pad(data, cipher.block_size)) + enc_info = DerSequence([ + DerObjectId(enc_oid), + DerOctetString(iv) + ]) + + # Result + enc_private_key_info = DerSequence([ + # encryptionAlgorithm + DerSequence([ + DerObjectId(_OID_PBES2), + DerSequence([ + kdf_info, + enc_info + ]), + ]), + DerOctetString(encrypted_data) + ]) + return enc_private_key_info.encode() + + @staticmethod + def decrypt(data, passphrase): + """Decrypt a piece of data using a passphrase and *PBES2*. + + The algorithm to use is automatically detected. + + :Parameters: + data : byte string + The piece of data to decrypt. + passphrase : byte string + The passphrase to use for decrypting the data. + :Returns: + The decrypted data, as a binary string. + """ + + enc_private_key_info = DerSequence().decode(data, nr_elements=2) + enc_algo = DerSequence().decode(enc_private_key_info[0]) + encrypted_data = DerOctetString().decode(enc_private_key_info[1]).payload + + pbe_oid = DerObjectId().decode(enc_algo[0]).value + if pbe_oid != _OID_PBES2: + raise PbesError("Not a PBES2 object") + + pbes2_params = DerSequence().decode(enc_algo[1], nr_elements=2) + + ### Key Derivation Function selection + kdf_info = DerSequence().decode(pbes2_params[0], nr_elements=2) + kdf_oid = DerObjectId().decode(kdf_info[0]).value + + kdf_key_length = None + + # We only support PBKDF2 or scrypt + if kdf_oid == _OID_PBKDF2: + + pbkdf2_params = DerSequence().decode(kdf_info[1], nr_elements=(2, 3, 4)) + salt = DerOctetString().decode(pbkdf2_params[0]).payload + iteration_count = pbkdf2_params[1] + + left = len(pbkdf2_params) - 2 + idx = 2 + + if left > 0: + try: + kdf_key_length = pbkdf2_params[idx] - 0 + left -= 1 + idx += 1 + except TypeError: + pass + + # Default is HMAC-SHA1 + pbkdf2_prf_oid = "1.2.840.113549.2.7" + if left > 0: + pbkdf2_prf_algo_id = DerSequence().decode(pbkdf2_params[idx]) + pbkdf2_prf_oid = DerObjectId().decode(pbkdf2_prf_algo_id[0]).value + + elif kdf_oid == _OID_SCRYPT: + + scrypt_params = DerSequence().decode(kdf_info[1], nr_elements=(4, 5)) + salt = DerOctetString().decode(scrypt_params[0]).payload + iteration_count, scrypt_r, scrypt_p = [scrypt_params[x] + for x in (1, 2, 3)] + if len(scrypt_params) > 4: + kdf_key_length = scrypt_params[4] + else: + kdf_key_length = None + else: + raise PbesError("Unsupported PBES2 KDF") + + ### Cipher selection + enc_info = DerSequence().decode(pbes2_params[1]) + enc_oid = DerObjectId().decode(enc_info[0]).value + + if enc_oid == _OID_DES_EDE3_CBC: + # DES_EDE3_CBC + ciphermod = DES3 + key_size = 24 + elif enc_oid == _OID_AES128_CBC: + # AES128_CBC + ciphermod = AES + key_size = 16 + elif enc_oid == _OID_AES192_CBC: + # AES192_CBC + ciphermod = AES + key_size = 24 + elif enc_oid == _OID_AES256_CBC: + # AES256_CBC + ciphermod = AES + key_size = 32 + else: + raise PbesError("Unsupported PBES2 cipher") + + if kdf_key_length and kdf_key_length != key_size: + raise PbesError("Mismatch between PBES2 KDF parameters" + " and selected cipher") + + IV = DerOctetString().decode(enc_info[1]).payload + + # Create cipher + if kdf_oid == _OID_PBKDF2: + if pbkdf2_prf_oid == _OID_HMAC_SHA1: + hmac_hash_module = SHA1 + elif pbkdf2_prf_oid == _OID_HMAC_SHA224: + hmac_hash_module = SHA224 + elif pbkdf2_prf_oid == _OID_HMAC_SHA256: + hmac_hash_module = SHA256 + elif pbkdf2_prf_oid == _OID_HMAC_SHA384: + hmac_hash_module = SHA384 + elif pbkdf2_prf_oid == _OID_HMAC_SHA512: + hmac_hash_module = SHA512 + else: + raise PbesError("Unsupported HMAC %s" % pbkdf2_prf_oid) + + key = PBKDF2(passphrase, salt, key_size, iteration_count, + hmac_hash_module=hmac_hash_module) + else: + key = scrypt(passphrase, salt, key_size, iteration_count, + scrypt_r, scrypt_p) + cipher = ciphermod.new(key, ciphermod.MODE_CBC, IV) + + # Decrypt data + pt = cipher.decrypt(encrypted_data) + return unpad(pt, cipher.block_size) diff --git a/server/www/packages/packages-linux/x64/Crypto/IO/__init__.py b/server/www/packages/packages-linux/x64/Crypto/IO/__init__.py new file mode 100644 index 0000000..85a0d0b --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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/server/www/packages/packages-linux/x64/Crypto/Math/Numbers.py b/server/www/packages/packages-linux/x64/Crypto/Math/Numbers.py new file mode 100644 index 0000000..c2c4483 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Math/Numbers.py @@ -0,0 +1,42 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +__all__ = ["Integer"] + +try: + from Crypto.Math._IntegerGMP import IntegerGMP as Integer + from Crypto.Math._IntegerGMP import implementation as _implementation +except (ImportError, OSError, AttributeError): + try: + from Crypto.Math._IntegerCustom import IntegerCustom as Integer + from Crypto.Math._IntegerCustom import implementation as _implementation + except (ImportError, OSError): + from Crypto.Math._IntegerNative import IntegerNative as Integer + _implementation = {} diff --git a/server/www/packages/packages-linux/x64/Crypto/Math/Primality.py b/server/www/packages/packages-linux/x64/Crypto/Math/Primality.py new file mode 100644 index 0000000..884c418 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto import Random +from Crypto.Math.Numbers import Integer + +from Crypto.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 Crypto.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/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerBase.py b/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerBase.py new file mode 100644 index 0000000..48e8f48 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerBase.py @@ -0,0 +1,392 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import abc + +from Crypto.Util.py3compat import iter_range, bord, bchr, ABC + +from Crypto 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): + pass + + @staticmethod + @abc.abstractmethod + def from_bytes(byte_string): + pass + + # Relations + @abc.abstractmethod + def __eq__(self, term): + pass + + @abc.abstractmethod + def __ne__(self, term): + pass + + @abc.abstractmethod + def __lt__(self, term): + pass + + @abc.abstractmethod + def __le__(self, term): + pass + + @abc.abstractmethod + def __gt__(self, term): + pass + + @abc.abstractmethod + def __ge__(self, term): + pass + + @abc.abstractmethod + def __nonzero__(self): + pass + __bool__ = __nonzero__ + + @abc.abstractmethod + def is_negative(self): + pass + + # Arithmetic operations + @abc.abstractmethod + def __add__(self, term): + pass + + @abc.abstractmethod + def __sub__(self, term): + pass + + @abc.abstractmethod + def __mul__(self, factor): + pass + + @abc.abstractmethod + def __floordiv__(self, divisor): + pass + + @abc.abstractmethod + def __mod__(self, divisor): + pass + + @abc.abstractmethod + def inplace_pow(self, exponent, modulus=None): + pass + + @abc.abstractmethod + def __pow__(self, exponent, modulus=None): + pass + + @abc.abstractmethod + def __abs__(self): + pass + + @abc.abstractmethod + def sqrt(self, modulus=None): + pass + + @abc.abstractmethod + def __iadd__(self, term): + pass + + @abc.abstractmethod + def __isub__(self, term): + pass + + @abc.abstractmethod + def __imul__(self, term): + pass + + @abc.abstractmethod + def __imod__(self, term): + pass + + # Boolean/bit operations + @abc.abstractmethod + def __and__(self, term): + pass + + @abc.abstractmethod + def __or__(self, term): + pass + + @abc.abstractmethod + def __rshift__(self, pos): + pass + + @abc.abstractmethod + def __irshift__(self, pos): + pass + + @abc.abstractmethod + def __lshift__(self, pos): + pass + + @abc.abstractmethod + def __ilshift__(self, pos): + pass + + @abc.abstractmethod + def get_bit(self, n): + pass + + # Extra + @abc.abstractmethod + def is_odd(self): + pass + + @abc.abstractmethod + def is_even(self): + pass + + @abc.abstractmethod + def size_in_bits(self): + pass + + @abc.abstractmethod + def size_in_bytes(self): + pass + + @abc.abstractmethod + def is_perfect_square(self): + pass + + @abc.abstractmethod + def fail_if_divisible_by(self, small_prime): + pass + + @abc.abstractmethod + def multiply_accumulate(self, a, b): + pass + + @abc.abstractmethod + def set(self, source): + pass + + @abc.abstractmethod + def inplace_inverse(self, modulus): + pass + + @abc.abstractmethod + def inverse(self, modulus): + pass + + @abc.abstractmethod + def gcd(self, term): + pass + + @abc.abstractmethod + def lcm(self, term): + pass + + @staticmethod + @abc.abstractmethod + def jacobi_symbol(a, n): + pass + + @staticmethod + def _tonelli_shanks(n, p): + """Tonelli-shanks algorithm for computing the square root + of n modulo a prime p. + + n must be in the range [0..p-1]. + p must be at least even. + + The return value r is the square root of modulo p. If non-zero, + another solution will also exist (p-r). + + Note we cannot assume that p is really a prime: if it's not, + we can either raise an exception or return the correct value. + """ + + # See https://rosettacode.org/wiki/Tonelli-Shanks_algorithm + + if n in (0, 1): + return n + + if p % 4 == 3: + root = pow(n, (p + 1) // 4, p) + if pow(root, 2, p) != n: + raise ValueError("Cannot compute square root") + return root + + s = 1 + q = (p - 1) // 2 + while not (q & 1): + s += 1 + q >>= 1 + + z = n.__class__(2) + while True: + euler = pow(z, (p - 1) // 2, p) + if euler == 1: + z += 1 + continue + if euler == p - 1: + break + # Most probably p is not a prime + raise ValueError("Cannot compute square root") + + m = s + c = pow(z, q, p) + t = pow(n, q, p) + r = pow(n, (q + 1) // 2, p) + + while t != 1: + for i in iter_range(0, m): + if pow(t, 2**i, p) == 1: + break + if i == m: + raise ValueError("Cannot compute square root of %d mod %d" % (n, p)) + b = pow(c, 2**(m - i - 1), p) + m = i + c = b**2 % p + t = (t * b**2) % p + r = (r * b) % p + + if pow(r, 2, p) != n: + raise ValueError("Cannot compute square root") + + return r + + @classmethod + def random(cls, **kwargs): + """Generate a random natural integer of a certain size. + + :Keywords: + exact_bits : positive integer + The length in bits of the resulting random Integer number. + The number is guaranteed to fulfil the relation: + + 2^bits > result >= 2^(bits - 1) + + max_bits : positive integer + The maximum length in bits of the resulting random Integer number. + The number is guaranteed to fulfil the relation: + + 2^bits > result >=0 + + randfunc : callable + A function that returns a random byte string. The length of the + byte string is passed as parameter. Optional. + If not provided (or ``None``), randomness is read from the system RNG. + + :Return: a Integer object + """ + + exact_bits = kwargs.pop("exact_bits", None) + max_bits = kwargs.pop("max_bits", None) + randfunc = kwargs.pop("randfunc", None) + + if randfunc is None: + randfunc = Random.new().read + + if exact_bits is None and max_bits is None: + raise ValueError("Either 'exact_bits' or 'max_bits' must be specified") + + if exact_bits is not None and max_bits is not None: + raise ValueError("'exact_bits' and 'max_bits' are mutually exclusive") + + bits = exact_bits or max_bits + bytes_needed = ((bits - 1) // 8) + 1 + significant_bits_msb = 8 - (bytes_needed * 8 - bits) + msb = bord(randfunc(1)[0]) + if exact_bits is not None: + msb |= 1 << (significant_bits_msb - 1) + msb &= (1 << significant_bits_msb) - 1 + + return cls.from_bytes(bchr(msb) + randfunc(bytes_needed - 1)) + + @classmethod + def random_range(cls, **kwargs): + """Generate a random integer within a given internal. + + :Keywords: + min_inclusive : integer + The lower end of the interval (inclusive). + max_inclusive : integer + The higher end of the interval (inclusive). + max_exclusive : integer + The higher end of the interval (exclusive). + randfunc : callable + A function that returns a random byte string. The length of the + byte string is passed as parameter. Optional. + If not provided (or ``None``), randomness is read from the system RNG. + :Returns: + An Integer randomly taken in the given interval. + """ + + min_inclusive = kwargs.pop("min_inclusive", None) + max_inclusive = kwargs.pop("max_inclusive", None) + max_exclusive = kwargs.pop("max_exclusive", None) + randfunc = kwargs.pop("randfunc", None) + + if kwargs: + raise ValueError("Unknown keywords: " + str(kwargs.keys)) + if None not in (max_inclusive, max_exclusive): + raise ValueError("max_inclusive and max_exclusive cannot be both" + " specified") + if max_exclusive is not None: + max_inclusive = max_exclusive - 1 + if None in (min_inclusive, max_inclusive): + raise ValueError("Missing keyword to identify the interval") + + if randfunc is None: + randfunc = Random.new().read + + norm_maximum = max_inclusive - min_inclusive + bits_needed = cls(norm_maximum).size_in_bits() + + norm_candidate = -1 + while not 0 <= norm_candidate <= norm_maximum: + norm_candidate = cls.random( + max_bits=bits_needed, + randfunc=randfunc + ) + return norm_candidate + min_inclusive + diff --git a/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerCustom.py b/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerCustom.py new file mode 100644 index 0000000..3ed1dda --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerCustom.py @@ -0,0 +1,111 @@ +# =================================================================== +# +# 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 Crypto.Util.number import long_to_bytes, bytes_to_long + +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, backend, + c_size_t, c_ulonglong) + + +from Crypto.Random.random import getrandbits + +c_defs = """ +int monty_pow(const uint8_t *base, + const uint8_t *exp, + const uint8_t *modulus, + uint8_t *out, + size_t len, + uint64_t seed); +""" + + +_raw_montgomery = load_pycryptodome_raw_lib("Crypto.Math._modexp", c_defs) +implementation = {"library": "custom", "api": backend} + + +class IntegerCustom(IntegerNative): + + @staticmethod + def from_bytes(byte_string): + return IntegerCustom(bytes_to_long(byte_string)) + + def inplace_pow(self, exponent, modulus=None): + exp_value = int(exponent) + if exp_value < 0: + raise ValueError("Exponent must not be negative") + + # No modular reduction + if modulus is None: + self._value = pow(self._value, exp_value) + return self + + # With modular reduction + mod_value = int(modulus) + if mod_value < 0: + raise ValueError("Modulus must be positive") + if mod_value == 0: + raise ZeroDivisionError("Modulus cannot be zero") + + # C extension only works with odd moduli + if (mod_value & 1) == 0: + self._value = pow(self._value, exp_value, mod_value) + return self + + # C extension only works with bases smaller than modulus + if self._value >= mod_value: + self._value %= mod_value + + max_len = len(long_to_bytes(max(self._value, exp_value, mod_value))) + + base_b = long_to_bytes(self._value, max_len) + exp_b = long_to_bytes(exp_value, max_len) + modulus_b = long_to_bytes(mod_value, max_len) + + out = create_string_buffer(max_len) + + error = _raw_montgomery.monty_pow( + out, + base_b, + exp_b, + modulus_b, + c_size_t(max_len), + c_ulonglong(getrandbits(64)) + ) + + if error: + raise ValueError("monty_pow failed with error: %d" % error) + + result = bytes_to_long(get_raw_buffer(out)) + self._value = result + return self diff --git a/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerGMP.py b/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerGMP.py new file mode 100644 index 0000000..0de6688 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerGMP.py @@ -0,0 +1,727 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import sys + +from Crypto.Util.py3compat import tobytes, is_native_int + +from Crypto.Util._raw_api import (backend, load_lib, + get_raw_buffer, get_c_string, + null_pointer, create_string_buffer, + c_ulong, c_size_t) + +from ._IntegerBase import IntegerBase + +gmp_defs = """typedef unsigned long UNIX_ULONG; + typedef struct { int a; int b; void *c; } MPZ; + typedef MPZ mpz_t[1]; + typedef UNIX_ULONG mp_bitcnt_t; + void __gmpz_init (mpz_t x); + void __gmpz_init_set (mpz_t rop, const mpz_t op); + void __gmpz_init_set_ui (mpz_t rop, UNIX_ULONG op); + UNIX_ULONG __gmpz_get_ui (const mpz_t op); + void __gmpz_set (mpz_t rop, const mpz_t op); + void __gmpz_set_ui (mpz_t rop, UNIX_ULONG op); + void __gmpz_add (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_add_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_sub_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_addmul (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_addmul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_submul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + void __gmpz_import (mpz_t rop, size_t count, int order, size_t size, + int endian, size_t nails, const void *op); + void * __gmpz_export (void *rop, size_t *countp, int order, + size_t size, + int endian, size_t nails, const mpz_t op); + size_t __gmpz_sizeinbase (const mpz_t op, int base); + void __gmpz_sub (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_mul (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_mul_ui (mpz_t rop, const mpz_t op1, UNIX_ULONG op2); + int __gmpz_cmp (const mpz_t op1, const mpz_t op2); + void __gmpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const + mpz_t mod); + void __gmpz_powm_ui (mpz_t rop, const mpz_t base, UNIX_ULONG exp, + const mpz_t mod); + void __gmpz_pow_ui (mpz_t rop, const mpz_t base, UNIX_ULONG exp); + void __gmpz_sqrt(mpz_t rop, const mpz_t op); + void __gmpz_mod (mpz_t r, const mpz_t n, const mpz_t d); + void __gmpz_neg (mpz_t rop, const mpz_t op); + void __gmpz_abs (mpz_t rop, const mpz_t op); + void __gmpz_and (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_ior (mpz_t rop, const mpz_t op1, const mpz_t op2); + void __gmpz_clear (mpz_t x); + void __gmpz_tdiv_q_2exp (mpz_t q, const mpz_t n, mp_bitcnt_t b); + void __gmpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d); + void __gmpz_mul_2exp (mpz_t rop, const mpz_t op1, mp_bitcnt_t op2); + int __gmpz_tstbit (const mpz_t op, mp_bitcnt_t bit_index); + int __gmpz_perfect_square_p (const mpz_t op); + int __gmpz_jacobi (const mpz_t a, const mpz_t b); + void __gmpz_gcd (mpz_t rop, const mpz_t op1, const mpz_t op2); + UNIX_ULONG __gmpz_gcd_ui (mpz_t rop, const mpz_t op1, + UNIX_ULONG op2); + void __gmpz_lcm (mpz_t rop, const mpz_t op1, const mpz_t op2); + int __gmpz_invert (mpz_t rop, const mpz_t op1, const mpz_t op2); + int __gmpz_divisible_p (const mpz_t n, const mpz_t d); + int __gmpz_divisible_ui_p (const mpz_t n, UNIX_ULONG d); + """ + +if sys.platform == "win32": + raise ImportError("Not using GMP on Windows") + +lib = load_lib("gmp", gmp_defs) +implementation = {"library": "gmp", "api": backend} + +if hasattr(lib, "__mpir_version"): + raise ImportError("MPIR library detected") + +# In order to create a function that returns a pointer to +# a new MPZ structure, we need to break the abstraction +# and know exactly what ffi backend we have +if implementation["api"] == "ctypes": + from ctypes import Structure, c_int, c_void_p, byref + + class _MPZ(Structure): + _fields_ = [('_mp_alloc', c_int), + ('_mp_size', c_int), + ('_mp_d', c_void_p)] + + def new_mpz(): + return byref(_MPZ()) + +else: + # We are using CFFI + from Crypto.Util._raw_api import ffi + + def new_mpz(): + return ffi.new("MPZ*") + + +# Lazy creation of GMP methods +class _GMP(object): + + def __getattr__(self, name): + if name.startswith("mpz_"): + func_name = "__gmpz_" + name[4:] + elif name.startswith("gmp_"): + func_name = "__gmp_" + name[4:] + else: + raise AttributeError("Attribute %s is invalid" % name) + func = getattr(lib, func_name) + setattr(self, name, func) + return func + + +_gmp = _GMP() + + +class IntegerGMP(IntegerBase): + """A fast, arbitrary precision integer""" + + _zero_mpz_p = new_mpz() + _gmp.mpz_init_set_ui(_zero_mpz_p, c_ulong(0)) + + def __init__(self, value): + """Initialize the integer to the given value.""" + + self._mpz_p = new_mpz() + self._initialized = False + + if isinstance(value, float): + raise ValueError("A floating point type is not a natural number") + + self._initialized = True + + if is_native_int(value): + _gmp.mpz_init(self._mpz_p) + if value == 0: + return + + tmp = new_mpz() + _gmp.mpz_init(tmp) + 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) + + 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) + else: + raise NotImplementedError + + # Conversions + def __int__(self): + tmp = new_mpz() + _gmp.mpz_init_set(tmp, self._mpz_p) + 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 + 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): + """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. + :Returns: + A byte string. + :Raise ValueError: + If the value is negative or if ``block_size`` is + provided and the length of the byte string would exceed it. + """ + + if self < 0: + raise ValueError("Conversion only valid for non-negative numbers") + + buf_len = (_gmp.mpz_sizeinbase(self._mpz_p, 2) + 7) // 8 + if buf_len > block_size > 0: + raise ValueError("Number is too big to convert to byte string" + " of prescribed length") + buf = create_string_buffer(buf_len) + + _gmp.mpz_export( + buf, + null_pointer, # Ignore countp + 1, # Big endian + c_size_t(1), # Each word is 1 byte long + 0, # Endianess within a word - not relevant + c_size_t(0), # No nails + self._mpz_p) + + return b'\x00' * max(0, block_size - buf_len) + get_raw_buffer(buf) + + @staticmethod + def from_bytes(byte_string): + """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. + :Return: + The ``Integer`` object carrying the same value as the input. + """ + result = IntegerGMP(0) + _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 + 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 even for the Jacobi symbol") + return _gmp.mpz_jacobi(a._mpz_p, n._mpz_p) + + # Clean-up + def __del__(self): + + try: + if self._mpz_p is not None: + if self._initialized: + _gmp.mpz_clear(self._mpz_p) + + self._mpz_p = None + except AttributeError: + pass diff --git a/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerNative.py b/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerNative.py new file mode 100644 index 0000000..07bf1c6 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Math/_IntegerNative.py @@ -0,0 +1,380 @@ +# =================================================================== +# +# 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 Crypto.Util.number import long_to_bytes, bytes_to_long + + +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): + 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") + return result + + @classmethod + def from_bytes(cls, byte_string): + 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 + + bit_size = 0 + tmp = self._value + while tmp: + tmp >>= 1 + bit_size += 1 + + return bit_size + + 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): + modulus = int(modulus) + if modulus == 0: + raise ZeroDivisionError("Modulus cannot be zero") + if modulus < 0: + raise ValueError("Modulus cannot be negative") + r_p, r_n = self._value, modulus + s_p, s_n = 1, 0 + while r_n > 0: + q = r_p // r_n + r_p, r_n = r_n, r_p - q * r_n + s_p, s_n = s_n, s_p - q * s_n + if r_p != 1: + raise ValueError("No inverse value can be computed" + str(r_p)) + while s_p < 0: + s_p += modulus + self._value = s_p + return self + + def inverse(self, modulus): + result = self.__class__(self) + result.inplace_inverse(modulus) + return result + + def gcd(self, term): + r_p, r_n = abs(self._value), abs(int(term)) + while r_n > 0: + q = r_p // r_n + r_p, r_n = r_n, r_p - q * r_n + return self.__class__(r_p) + + 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 even for the Jacobi symbol") + + # Step 1 + a = a % n + # Step 2 + if a == 1 or n == 1: + return 1 + # Step 3 + if a == 0: + return 0 + # Step 4 + e = 0 + a1 = a + while (a1 & 1) == 0: + a1 >>= 1 + e += 1 + # Step 5 + if (e & 1) == 0: + s = 1 + elif n % 8 in (1, 7): + s = 1 + else: + s = -1 + # Step 6 + if n % 4 == 3 and a1 % 4 == 3: + s = -s + # Step 7 + n1 = n % a1 + # Step 8 + return s * IntegerNative.jacobi_symbol(n1, a1) diff --git a/server/www/packages/packages-linux/x64/Crypto/Math/__init__.py b/server/www/packages/packages-linux/x64/Crypto/Math/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/www/packages/packages-linux/x64/Crypto/Math/_modexp.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Math/_modexp.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..ff39edd83d8baf7f474d1632feb64865dc8b3a44 GIT binary patch literal 241288 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

(^aBTFM`?|CVU~q396zov)T-ge31E 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 GgZ~RIO{|3g literal 0 HcmV?d00001 diff --git a/server/www/packages/packages-linux/x64/Crypto/Protocol/KDF.py b/server/www/packages/packages-linux/x64/Crypto/Protocol/KDF.py new file mode 100644 index 0000000..1348265 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Protocol/KDF.py @@ -0,0 +1,574 @@ +# 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 Crypto.Util.py3compat import (tobytes, bord, _copy_bytes, iter_range, + tostr, bchr, bstr) + +from Crypto.Hash import SHA1, SHA256, HMAC, CMAC, BLAKE2s +from Crypto.Util.strxor import strxor +from Crypto.Random import get_random_bytes +from Crypto.Util.number import size as bit_size, long_to_bytes, bytes_to_long + +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, + create_string_buffer, + get_raw_buffer, c_size_t) + +_raw_salsa20_lib = load_pycryptodome_raw_lib("Crypto.Cipher._Salsa20", + """ + int Salsa20_8_core(const uint8_t *x, const uint8_t *y, + uint8_t *out); + """) + +_raw_scrypt_lib = load_pycryptodome_raw_lib("Crypto.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:`Crypto.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:`Crypto.Hash` package. + The digest length must be no shorter than ``dkLen``. + The default algorithm is :mod:`Crypto.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. + 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. + 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 ``Crypto.Hash`` implementing a Merkle-Damgard cryptographic + hash, which PBKDF2 must use in combination with HMAC. + This parameter is mutually exclusive with ``prf``. + + Return: + A byte string of length ``dkLen`` that can be used as key material. + If you want multiple keys, just break up this string into segments of the desired length. + """ + + password = tobytes(password) + salt = tobytes(salt) + + if prf and hmac_hash_module: + raise ValueError("'prf' and 'hmac_hash_module' are mutually exlusive") + + if prf is None and hmac_hash_module is None: + hmac_hash_module = SHA1 + + if prf or not hasattr(hmac_hash_module, "_pbkdf2_hmac_assist"): + # Generic (and slow) implementation + + if prf is None: + prf = lambda p,s: HMAC.new(p, s, hmac_hash_module).digest() + + def link(s): + s[0], s[1] = s[1], prf(password, s[1]) + return s[0] + + key = b'' + i = 1 + while len(key) < dkLen: + s = [ prf(password, salt + struct.pack(">I", i)) ] * 2 + key += reduce(strxor, (link(s) for j in range(count)) ) + i += 1 + + else: + # Optimized implementation + key = b'' + i = 1 + while len(key)I", i)).digest() + key += base._pbkdf2_hmac_assist(first_digest, count) + i += 1 + + return key[:dkLen] + + +class _S2V(object): + """String-to-vector PRF as defined in `RFC5297`_. + + This class implements a pseudorandom function family + based on CMAC that takes as input a vector of strings. + + .. _RFC5297: http://tools.ietf.org/html/rfc5297 + """ + + def __init__(self, key, ciphermod, cipher_params=None): + """Initialize the S2V PRF. + + :Parameters: + key : byte string + A secret that can be used as key for CMACs + based on ciphers from ``ciphermod``. + ciphermod : module + A block cipher module from `Crypto.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 `Crypto.Cipher`. + """ + return _S2V(key, ciphermod) + + def _double(self, bs): + doubled = bytes_to_long(bs)<<1 + if bord(bs[0]) & 0x80: + doubled ^= 0x87 + return long_to_bytes(doubled, len(bs))[-len(bs):] + + def update(self, item): + """Pass the next component of the vector. + + The maximum number of components you can pass is equal to the block + length of the cipher (in bits) minus 1. + + :Parameters: + item : byte string + The next component of the vector. + :Raise TypeError: when the limit on the number of components has been reached. + """ + + if self._n_updates == 0: + raise TypeError("Too many components passed to S2V") + self._n_updates -= 1 + + mac = CMAC.new(self._key, + msg=self._last_string, + ciphermod=self._ciphermod, + cipher_params=self._cipher_params) + self._cache = strxor(self._double(self._cache), mac.digest()) + self._last_string = _copy_bytes(None, None, item) + + def derive(self): + """"Derive a secret from the vector of components. + + :Return: a byte string, as long as the block length of the cipher. + """ + + if len(self._last_string) >= 16: + # xorend + final = self._last_string[:-16] + strxor(self._last_string[-16:], self._cache) + else: + # zero-pad & xor + padded = (self._last_string + b'\x80' + b'\x00' * 15)[:16] + final = strxor(padded, self._double(self._cache)) + mac = CMAC.new(self._key, + msg=final, + ciphermod=self._ciphermod, + cipher_params=self._cipher_params) + return mac.digest() + + +def HKDF(master, key_len, salt, hashmod, num_keys=1, context=None): + """Derive one or more keys from a master secret using + the HMAC-based KDF defined in RFC5869_. + + Args: + master (byte string): + The unguessable value used by the KDF to generate the other keys. + It must be a high-entropy secret, though not necessarily uniform. + It must not be a password. + salt (byte string): + A non-secret, reusable value that strengthens the randomness + extraction step. + Ideally, it is as long as the digest size of the chosen hash. + If empty, a string of zeroes in used. + key_len (integer): + The length in bytes of every derived key. + hashmod (module): + A cryptographic hash algorithm from :mod:`Crypto.Hash`. + :mod:`Crypto.Hash.SHA512` is a good choice. + num_keys (integer): + The number of keys to derive. Every key is :data:`key_len` bytes long. + The maximum cumulative length of all keys is + 255 times the digest size. + context (byte string): + Optional identifier describing what the keys are used for. + + Return: + A byte string or a tuple of byte strings. + + .. _RFC5869: http://tools.ietf.org/html/rfc5869 + """ + + output_len = key_len * num_keys + if output_len > (255 * hashmod.digest_size): + raise ValueError("Too much secret data to derive") + if not salt: + salt = b'\x00' * hashmod.digest_size + if context is None: + context = b"" + + # Step 1: extract + hmac = HMAC.new(salt, master, digestmod=hashmod) + prk = hmac.digest() + + # Step 2: expand + t = [ b"" ] + n = 1 + tlen = 0 + while tlen < output_len: + hmac = HMAC.new(prk, t[-1] + context + struct.pack('B', n), digestmod=hashmod) + t.append(hmac.digest()) + tlen += hashmod.digest_size + n += 1 + derived_output = b"".join(t) + if num_keys == 1: + return derived_output[:key_len] + kol = [derived_output[idx:idx + key_len] + for idx in iter_range(0, output_len, key_len)] + return list(kol[:num_keys]) + + + +def scrypt(password, salt, key_len, N, r, p, num_keys=1): + """Derive one or more keys from a passphrase. + + Args: + password (string): + The secret pass phrase to generate the keys from. + salt (string): + A string to use for better protection from dictionary attacks. + This value does not need to be kept secret, + but it should be randomly chosen for each derivation. + It is recommended to be at least 16 bytes long. + key_len (integer): + The length in bytes of every 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 Crypto.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") diff --git a/server/www/packages/packages-linux/x64/Crypto/Protocol/SecretSharing.py b/server/www/packages/packages-linux/x64/Crypto/Protocol/SecretSharing.py new file mode 100644 index 0000000..a757e7c --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Protocol/SecretSharing.py @@ -0,0 +1,278 @@ +# +# SecretSharing.py : distribute a secret amongst a group of participants +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Crypto.Util.py3compat import is_native_int +from Crypto.Util import number +from Crypto.Util.number import long_to_bytes, bytes_to_long +from Crypto.Random import get_random_bytes as rng + + +def _mult_gf2(f1, f2): + """Multiply two polynomials in GF(2)""" + + # Ensure f2 is the smallest + if f2 > f1: + f1, f2 = f2, f1 + z = 0 + while f2: + if f2 & 1: + z ^= f1 + f1 <<= 1 + f2 >>= 1 + return z + + +def _div_gf2(a, b): + """ + Compute division of polynomials over GF(2). + Given a and b, it finds two polynomials q and r such that: + + a = b*q + r with deg(r)= d: + s = 1 << (deg(r) - d) + q ^= s + r ^= _mult_gf2(b, s) + return (q, r) + + +class _Element(object): + """Element of GF(2^128) field""" + + # The irreducible polynomial defining this field is 1+x+x^2+x^7+x^128 + irr_poly = 1 + 2 + 4 + 128 + 2 ** 128 + + def __init__(self, encoded_value): + """Initialize the element to a certain value. + + The value passed as parameter is internally encoded as + a 128-bit integer, where each bit represents a polynomial + coefficient. The LSB is the constant coefficient. + """ + + if is_native_int(encoded_value): + self._value = encoded_value + elif len(encoded_value) == 16: + self._value = bytes_to_long(encoded_value) + else: + raise ValueError("The encoded value must be an integer or a 16 byte string") + + def __eq__(self, other): + return self._value == other._value + + def __int__(self): + """Return the field element, encoded as a 128-bit integer.""" + return self._value + + def encode(self): + """Return the field element, encoded as a 16 byte string.""" + return long_to_bytes(self._value, 16) + + def __mul__(self, factor): + + f1 = self._value + f2 = factor._value + + # Make sure that f2 is the smallest, to speed up the loop + if f2 > f1: + f1, f2 = f2, f1 + + if self.irr_poly in (f1, f2): + return _Element(0) + + mask1 = 2 ** 128 + v, z = f1, 0 + while f2: + # if f2 ^ 1: z ^= v + mask2 = int(bin(f2 & 1)[2:] * 128, base=2) + z = (mask2 & (z ^ v)) | ((mask1 - mask2 - 1) & z) + v <<= 1 + # if v & mask1: v ^= self.irr_poly + mask3 = int(bin((v >> 128) & 1)[2:] * 128, base=2) + v = (mask3 & (v ^ self.irr_poly)) | ((mask1 - mask3 - 1) & v) + f2 >>= 1 + return _Element(z) + + def __add__(self, term): + return _Element(self._value ^ term._value) + + def inverse(self): + """Return the inverse of this element in GF(2^128).""" + + # We use the Extended GCD algorithm + # http://en.wikipedia.org/wiki/Polynomial_greatest_common_divisor + + if self._value == 0: + raise ValueError("Inversion of zero") + + r0, r1 = self._value, self.irr_poly + s0, s1 = 1, 0 + while r1 > 0: + q = _div_gf2(r0, r1)[0] + r0, r1 = r1, r0 ^ _mult_gf2(q, r1) + s0, s1 = s1, s0 ^ _mult_gf2(q, s1) + return _Element(s0) + + def __pow__(self, exponent): + result = _Element(self._value) + for _ in range(exponent - 1): + result = result * self + return result + + +class Shamir(object): + """Shamir's secret sharing scheme. + + A secret is split into ``n`` shares, and it is sufficient to collect + ``k`` of them to reconstruct the secret. + """ + + @staticmethod + def split(k, n, secret, ssss=False): + """Split a secret into ``n`` shares. + + The secret can be reconstructed later using just ``k`` shares + out of the original ``n``. + Each share must be kept confidential to the person it was + assigned to. + + Each share is associated to an index (starting from 1). + + Args: + k (integer): + The sufficient number of shares to reconstruct the secret (``k < n``). + n (integer): + The number of shares that this method will create. + secret (byte string): + A byte string of 16 bytes (e.g. the AES 128 key). + ssss (bool): + If ``True``, the shares can be used with the ``ssss`` utility. + Default: ``False``. + + Return (tuples): + ``n`` tuples. A tuple is meant for each participant and it contains two items: + + 1. the unique index (an integer) + 2. the share (a byte string, 16 bytes) + """ + + # + # We create a polynomial with random coefficients in GF(2^128): + # + # p(x) = \sum_{i=0}^{k-1} c_i * x^i + # + # c_0 is the encoded secret + # + + coeffs = [_Element(rng(16)) for i in range(k - 1)] + coeffs.append(_Element(secret)) + + # Each share is y_i = p(x_i) where x_i is the public index + # associated to each of the n users. + + def make_share(user, coeffs, ssss): + idx = _Element(user) + share = _Element(0) + for coeff in coeffs: + share = idx * share + coeff + if ssss: + share += _Element(user) ** len(coeffs) + return share.encode() + + return [(i, make_share(i, coeffs, ssss)) for i in range(1, n + 1)] + + @staticmethod + def combine(shares, ssss=False): + """Recombine a secret, if enough shares are presented. + + Args: + shares (tuples): + The *k* tuples, each containin the index (an integer) and + the share (a byte string, 16 bytes long) that were assigned to + a participant. + ssss (bool): + If ``True``, the shares were produced by the ``ssss`` utility. + Default: ``False``. + + Return: + The original secret, as a byte string (16 bytes long). + """ + + # + # Given k points (x,y), the interpolation polynomial of degree k-1 is: + # + # L(x) = \sum_{j=0}^{k-1} y_i * l_j(x) + # + # where: + # + # l_j(x) = \prod_{ \overset{0 \le m \le k-1}{m \ne j} } + # \frac{x - x_m}{x_j - x_m} + # + # However, in this case we are purely interested in the constant + # coefficient of L(x). + # + + k = len(shares) + + gf_shares = [] + for x in shares: + idx = _Element(x[0]) + value = _Element(x[1]) + if any(y[0] == idx for y in gf_shares): + raise ValueError("Duplicate share") + if ssss: + value += idx ** k + gf_shares.append((idx, value)) + + result = _Element(0) + for j in range(k): + x_j, y_j = gf_shares[j] + + numerator = _Element(1) + denominator = _Element(1) + + for m in range(k): + x_m = gf_shares[m][0] + if m != j: + numerator *= x_m + denominator *= x_j + x_m + result += y_j * numerator * denominator.inverse() + return result.encode() diff --git a/server/www/packages/packages-linux/x64/Crypto/Protocol/__init__.py b/server/www/packages/packages-linux/x64/Crypto/Protocol/__init__.py new file mode 100644 index 0000000..efdf034 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Protocol/__init__.py @@ -0,0 +1,31 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +__all__ = ['KDF', 'SecretSharing'] diff --git a/server/www/packages/packages-linux/x64/Crypto/Protocol/_scrypt.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Protocol/_scrypt.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..b1bea791fbb248f4dd8252767391209dd35ff873 GIT binary patch literal 25024 zcmeHv4RjpUmF9b0s#dptx@AkYCI2>d+t`lPl5Am1L5?L`hLR)y2^-`DXvR48b z?v{TB#{&NlcZ`A!4C6@xO_&)HvN;3U{ z`|92PQyZ8$d-m*}@-}cV^%eIDNFt~MlWFQ!ecSYmDpa_Ns z!f_GoMInN18&(Ha!1K9G$6e_8&-f`l>0CKD^QUL{lsyvDQ%Uh>GH`7|;pZ}NZjvhA z&%n8D!Yg&2kgOy?Z@vti<{)o#GjKk4P+e^Xo|!TY8F*&9*8bnQ&QMZX`=4|@!PbQs zy=3NOpBSC($I&~Z85Hq-ByjfhD7M*?iI>EmQv7)0DKuwKD87hza{257igyrCuAaRc zJhf{bHt($R3G3jAxMTE`a-i2c;{Zh9&dAbVQQe670u_z#$0tC%SBtwxPkU$FKypv$ z67u&c`AhDhV%|sA$&U;xan3q8ELNC{{iCZWWe*2y;u+ea$q zT8TaW%J#-n-UDS&YWW|{XtOQxv^BEw#M7;Qm4R*Z{?I0$wi5mR+IBbrl~%vio_K$C z;+JiSCwZJ;cW!&)wYv9K*1fl8WP#5*`0M!6-XpDvcUx(+UUlw&MOxnb`~8*ApJ|tW zu;f$ZN||-?6=%Erif2dzl1LZZ|qCQ`#Ab2p2*-!vU%(99)H6b=U+xg>rPlVK1m_|;x#Q- zw_MY5ZA`bww?T~(>i(9XiuD8Eng#a z(As~ZtX+<_CwlzrRD`U=86;@|1=xpSu;dBr)`L(Mhccu?Jg4URE}HT zl~1j#`#p&R+iZ=rU_!lij+AbI(&~|VrO}5xXiuD5o%jetW#>Bu(|34-zhG9GJ;dJo zkw*W^X-Q1LJ^p6lJy=J>4|-6;<}CW3DvRFT`Iwb>V>RZ1J)&sE zIt(X}ZtaPGKU4GP(b1NXm9n+5-(TQ8a2i?Bl6dOu18NfU`6?q&jTET6(t#RQ5&etT zd()7bTJ8Qm3QfU8M5&|<@j00tpLTh={n8%)X77QwsELQlT52b?jco8stMNteO}|mt zI@wZtl_b=m(5G$G0n|aLq0sN!r~%XsGHCtg-){3BA`Wt7AsWRXfe=YLQ53-1_JJV zXk7`=5<*KA`l5}N0xc!fqtM3`+U#kmz1(y5zk;#z-uqAqqF6#XNKxGR=Gi-_E_K2_ zPV@il_zzkBxVn-#Qaq)@AkNs<;gVBrbtS*B?fhcs&9iG@=S=AbqoejYUtdOJ(e4`i z<|xoD=I)4ud*;sz5BM%x>eEbQD2^8O4b*bnIBlbQC?Tg9m->Ozh4aw+qod6zpZU}1 zC|!BqN4W=wszPvzH)so6Qza?M==W zPs9GgHJ($_sFfbq6F++PxqtfUX0ZDUZ*tyjjud>&xW#crk*5K|EuOhhhLPo-vgIDv z3i`2dVY?843lX>wfeR715P=I3xDbI05x5Y63lX>wfeR715P=I3_|2FiDgEp>z_oGqzFNQd$ z8^%LwwH>1eDcJabGqvg54ls0Y;&%KoYhqOHYo1l1(<2lW%e=0){k7!hV%1>qO|K5TBZ=T!Y zd%FKl9q@^|oTJOdy1abFiqHDy;y=#weD#6)z!KlW+Pa0ci|Q8n=5~a7d{$T7#;X@D znkO=Z8v=_0btK#f;kvZ2!mA;>03O+cWry6SN8%mMh#Zgo$OJoxF8OuTm0X9AcLQO? za!yq;JR1k&rAducxC#fTkgnZm&u|oeABsjnVN8L}>lJ8z1w}!D86Jp3!90pO7sf=I`;uBB-&+xddc)k*K!cL%J;nfpD6o0Dv=(tR7cV^-Rn&wVpVR@vNK_Z*U(Y;(2ltI6gRn`>}alH^pIYj!_L z+;p3>+*gpz88)}hT|k`A<~rS5$mUEraTw)h_XM)(mlX%W^|?PJZjRlDLHFBabH2^R z-A%+Tkfql_W|!MfT&)~`Ik+3#cazOJ>D>r!pL;P`StwnHf$n#|Op=SG_Z#32xtobw zCcR&V%n|oE^30NMT4-?0T}fP<&E4&uLEI{v`;L1Kai6!j2i(=fwacPv=pA=|KsMLd zex7jGQ{6i0`WD)IQWPyE*BvY|TW=d(usSh5?FG6Y575aTf%Y}C@jLEWbK+G@5X;dR++5N+||%_{zDZFhLqzd8=dzuw-o(yew(?kL$Yv6NjFrbEPWl43sFB_6kd#C z+?C)9r%oqGN~HG95W|!Rqi}p4psTL38FV4#iQ`EKyXq&cp~`xq8>Ubf9W+^8*V}Y0 zb*sg5JLJn{H!A)SR7LvmAXtPXh{EY2s}p215V@^PN%MjVp04tn@@Y){iT9D&ZJ!}K zyhdQ6rLd)B@p+gyiG3nnP-Oos8t!ALK7bwm%KpXVG|l1|_KA<-Ap2X$aunKIuvhvB z8z>>oOK|p{jlF7zkP+{1AT@axs4Aj90RB4m$zdS}J!JJEoRaRrKII6Qn{i^SJWZyK zjPHTjzXpE`_NiaRJpUPAE<_o*euujXYSZpVO%W_RuuuDYFkc5TK+G{P--gch*r$`q zj7NZ+!A0&6cHdKAju84I5HEO<#Mo!N0Ok(F=#U+!iwr0q*9{vfiV=D1xckV736QYH z32_n76>(2I3a%GubNJn&E@q zPf_z@>@((rnNc+y z()b_Hui0{=V=s;y3XUGPg?2z_Ds}N3_Vgwb?p^?@TYlVh_^_*PZ2@sDG1RTQK^!B7 zx>bl1u7Q0zSy5eC0d6UF)s>?lMu?%VJO|=w>=#p4HbZ_f45;o*#R{Xz*!_D@LtCml z=sybIAqQ(KCCU@5uEt=Tgwo=eaZzN(u7w9)SpLe}?>5K_dXJVOfIPoYBb$ zg9AqA{Zh+NfF7`A3dkze?}5g8lA80n_NNHpgcT)0r-Vb8G^KQ2pvk7rpv!sRiX}-o!)4U4Pb)A~7RhY`_Cy-uM zRLBlB;j4$y;6XsrZCItMhayn5Tgc9GG769Ad__7bkI08oIvT_jmYY0S4zD^wWJ_%|hu>q44Z3u#I%r2JEP-GVe*hF#_LHV|QAD5?G$ z#BIb-UOxunhuG(^$tpVo+(xyIJQBri_)^Szhik)Z*^wR@Ar?vbFNn?y*o#HIl&x@= zcK5HO2kckSP1@aOWa%YRZbOG@FIrhDnt5 z8z#Qt7sbV&g9OrEljx!81&U#yf}{%P2r69V((n`)L)&aDmH^zPwlT16(M*S-1-)5}T-8mA$pZbRcQLdVM|$csyC zI~AsKbV5KbE8%WZ9reDs=x>&nP-7F#j1V}SKUj{iU{#Uf;;?9}GP6C6RRK%M;bfD^ zYLO|$a-);lnL16@m3PSF%gv3>&f-nQSE(ROGeupw7M)I_bXH44zG5g5cu`85oKNe| zEXJsgM=s3DBY;z1VjpgiYEN@5;MP{sTJ zhT4wD#U=0w&}TA3gh`zlMIovwSZ(F?B@Q$eD29JEnc>5P&9vB7ZriL2pto6rvyfte zoDT>Z;jc7%Y&V3c&qk1PxOK_KkQhjZw{XAW5GFj3^3NVj0&IYZ#{vgY6B&%xMEh!b zLObG-NPjF8uWqP`Mk4W=p;)vAi#=<$c6Zn8YFHdxTwfgx_4IYctNX(PL%V7kYQh8E z{X;z=p+q%Pvn3plWg)yk0*ffnC>Dr@y9PqBSfG#CSiGkv)C(F@G`@Qrg@(pOuI>IR6m<)CHL_VQMnZrU;w?vGc82R?^hV=k8pw}Ve?#rIDR+)2EOkC0%K{ zowBLP)dbZ|O3`%Q_Aliy;C3E0OPoeqr|CA9#LZHt(YnesCzO{1MXSy)I9)!o*r;FS zs2*KEZKkhI z8WzK8`0P>^AkH@OxR9n_kXn&3NN{xreWsGTs^M11o@xbsQcy8w_sj(}@@NLQ+ zzHv?V*nM7)T{3&@_U%)ncM?rZa2h+|{wmj9X2AHnVOJ--aNTN7B9DkfLO|CSGTl^j zl(X!IE z=^>b}dOOzWFGLX^8VD`j8X5>i!`)!JqTPKZ@M6$XDIFGukz{1LeB5 z74)J2dKXFeoz~{wAx zsMBbATPUhd$OxW#Yaq4gEo-eD318OMzA`x2KV-MLGa8PE)F8xg4o6oo8ZipA8Vn4I zio7o?hGZqywIgH)8gCiUc^rY&FDC?Py`2s;d96CQPz1L}a7Dsck=J=R5;enpe zE`dPq!qAYFl;bMfRcfZXCpy0iLSbpp zq1e*Zy=`dF9*~;&_Q9IL@E~pquB)c8>8Xxx4KL{neTiIJ*RgWLhE2iCHm+H*p>6FN zdW$6$Y~`K07-t-6HBGnfv`Mj%NqS^zLsv6-hlUEoJ91-^xrb7M8=1Tp&o^kZ1(|zT zqiBT5pQNCxndHaKwytgG{73G<0WBiM1}51*L*PjPGwdPcn0!|IujH8d*Nm=iNHWJg zQKHOnUtp3+?t_v$zw_xD?gl+ar%j6WOmgt0xROck49uU-)3f#5Gj^Loxjxm2TXEAz zo6=^6J7bG7$NhmjO!6?n9VWTAwytgb0UKWHO_>r}A{SBVTtrQr%sg z?(V6*%y0+E<&GqC+(#)onB+df9VRoo+mZbEj^Y=G7U2F#(aB^+zfR=oS10$2a}on~ zVlOk9W80bPEcZl-GQ)jA(@b(7lw58Xbn2(zwVDd+(iGQ;#j}&layO*7;$E%Fo@+^F zf3B+`$s~8fNhu1W%!l!Fgf@sW`DhBdl1c6cq-^nwqeG9ohUV$Ex21fzhDmy$OB=?R zn}0J6RcJdrQy|4;SIVPnnLL?-u4a;lL5gcRh5nE_?Okg(oj#_#R=*c*{0F+4=f6YL zCb>UR?I}j`!M)6+hh!c1i2mzAn-uGq@~Iv=_4L%VdEA))Gn5aqo?*dZ!b_@O-{0DAAWAqmQ&5myr^TEQ*G;H91Yv) z|E3$G2bQ$qe8yyx?v^Qbh()tg?WenzI`i>3YDwEt&XIokpMOKc_5iX!Gsni1JC33I zyp92v8BkDH8DdZ-nHfrhjwCaO)1Z-L=38m7Aj!-R(x91S=D9TJOfvIw8Z1mQ^QScE zN;2cs;{-q5NoHoJ!J;HHm!`quBs1&NU`djht!c0{$;_A2peM=9jcL%E{HkWSbc#Wo z+GeKkZ|ZuNjbnl^!nwd2oP?YZ7?+$hu-Wq`0@aL32F^sBI&xD&tcsoyhC-nT3-ISB&GsoG|OPM^aqP zHdprW`ZJ(qKW7 znSV$tGkIU895erz2F)ZhkEE5Ed@NIrnJ3erGs(>JX=Nr~%#>s1pVMGrl9|`i%1pkI zDaXvYH0Vk)^Ov-8icFpT_PCN#GtM;VPBK%jLEQN>N$)(JzwQ;r!c4VEOC*_c*la#N-pGuNiU(j+t6(#lLmGUb?wr$JAW znS*I%Cex>v>tyPh!dDIimd_J>=R%W|>GXwUy&d)RF?E?xcMiET9oGe(=v-o=9~x$c zXMZ7q&RMQxt`{)CPH^eMiExpBFRqM?{8sn2h-+YoF?Jnw!%7QvY42?cH(mC9&w2W= zj@{)F7gQ!2^?3|85c#}c$3Ajtdp~$y?@@DJ@9nxV-n;phl}oqSi<`xnuI8y@x>`6! zxIo?C<{C8%*%+4}V|1*rQ@nkR9+WK04#6YNzen=^=CkjDS(JZref+O4HkjwvSKd~S z@6GZI47JK_cBO87^Zl60)wKD`wGR7BGl=Q$rR_19c6dX6dvq(#HrbzyQDBIhaEm=W z>I{7=)#}E3G^v(f!7#$aWZIF9xsKqUuBni)QTlnY1V6a7LDt3;KE2n8id-AS^YUG8 z^3%0WUY^qC_~)_8mtFR+6v4kN^CnR~ZM2)Kn0RN6-C-}gmnYDamqQSdo_l0D3fWo$K)J+ zfrqVqF{QbY))~^4*1XaNvX7>CQ3L5U(|JxL4euSC?huWvTa8vT>|Io$kwo6m4J; zHGfwuv(gad_&#Ai`3k|`AIp}<%1vKB`H5q`M@M>w;I~vVtq{&{q2%KHR!%NHIUCTN zA^5GG>}o@Okt7=<&Jfeaf(oBL2B&l_5O0m^aotG}`TYM0 zaI(XzkY;Ix(=CGQnYSgn}54} zZ*hH1cQhUjMAX0RGrk=u0LS7(y}ej^m;PpCFupz5O<#?qwF^Cw;MV@gmahI_PdpNh z1-pju5y;5)!TwM@)Du`z*FcK}@(8J~Q3kuB(XQS2=3_icAB*hT9t!phZQs5dDjA&m zd}Wqs>Z3~8i%0^4_}(SHFqvodKwwdQLnA6K>u6cMGPrV0D=jDp_QWE=zOI3uek`bH z-L$4zhdw7SG_4$5~%O)+!x1RXT zleIN~qZPue&-aa7_ThX*8?{R$>+_vPGcdBv`uszmOa9FR5w&S^%nAz>y(7!|d>_gs z-$AhdEXO51v7mQundkdeE`7SCT>mvJdO%Pe>+^kWs?>tqes2E*QGrdrE_35|H}Fh- z{$0T339ZLPZu{Rw1&tBs2jBnk_q%iDndkB$=+ZqN>!*Ha=)`9^h^UQuE*}R<{deGRu%g2 zw?3Q5waa=eYXHc_sP4x;TVigJUGgzk)_WfPx9A50ws(1A*zB0L=>9&}CW*dUZ7aOX z1AiWUdSXcWx&8e0LR*2KfoSzqTij;7*5`UIzr5I{UYp2>U9ujd%g&?Uv)Y#MeM0}q zUXF-TJhax +# +# =================================================================== +# 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 Crypto.Util.py3compat import bchr, bord, tobytes, tostr, iter_range + +from Crypto import Random +from Crypto.IO import PKCS8, PEM +from Crypto.Hash import SHA256 +from Crypto.Util.asn1 import ( + DerObject, DerSequence, + DerInteger, DerObjectId, + DerBitString, + ) + +from Crypto.Math.Numbers import Integer +from Crypto.Math.Primality import (test_probable_prime, COMPOSITE, + PROBABLY_PRIME) + +from Crypto.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:`Crypto.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:`Crypto.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 PyCrypto that we don't support anymore + + def sign(self, M, K): + raise NotImplementedError("Use module Crypto.Signature.DSS instead") + + def verify(self, M, signature): + raise NotImplementedError("Use module Crypto.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:`Crypto.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/server/www/packages/packages-linux/x64/Crypto/PublicKey/ECC.py b/server/www/packages/packages-linux/x64/Crypto/PublicKey/ECC.py new file mode 100644 index 0000000..415eced --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/PublicKey/ECC.py @@ -0,0 +1,1182 @@ +# =================================================================== +# +# Copyright (c) 2015, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from __future__ import print_function + +import re +import struct +import binascii +from collections import namedtuple + +from Crypto.Util.py3compat import bord, tobytes, tostr, bchr, is_string +from Crypto.Util.number import bytes_to_long, long_to_bytes + +from Crypto.Math.Numbers import Integer +from Crypto.Util.asn1 import (DerObjectId, DerOctetString, DerSequence, + DerBitString) + +from Crypto.PublicKey import (_expand_subject_public_key_info, + _create_subject_public_key_info, + _extract_subject_public_key_info) + +from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, VoidPointer, + SmartPointer, c_size_t, c_uint8_ptr, + c_ulonglong) + +from Crypto.Random import get_random_bytes +from Crypto.Random.random import getrandbits + + +_ec_lib = load_pycryptodome_raw_lib("Crypto.PublicKey._ec_ws", """ +typedef void EcContext; +typedef void EcPoint; +int ec_ws_new_context(EcContext **pec_ctx, + const uint8_t *modulus, + const uint8_t *b, + const uint8_t *order, + size_t len, + uint64_t seed); +void ec_free_context(EcContext *ec_ctx); +int ec_ws_new_point(EcPoint **pecp, + const uint8_t *x, + const uint8_t *y, + size_t len, + const EcContext *ec_ctx); +void ec_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_copy(EcPoint *ecp1, const EcPoint *ecp2); +int ec_ws_cmp(const EcPoint *ecp1, const EcPoint *ecp2); +int ec_ws_neg(EcPoint *p); +int ec_ws_normalize(EcPoint *ecp); +int ec_ws_is_pai(EcPoint *ecp); +""") + +_Curve = namedtuple("_Curve", "p b order Gx Gy G modulus_bits oid context desc openssh") +_curves = {} + + +p256_names = ["p256", "NIST P-256", "P-256", "prime256v1", "secp256r1", + "nistp256"] + + +def init_p256(): + p = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff + b = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b + order = 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 + Gx = 0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296 + Gy = 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5 + + p256_modulus = long_to_bytes(p, 32) + p256_b = long_to_bytes(b, 32) + p256_order = long_to_bytes(order, 32) + + ec_p256_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p256_context.address_of(), + c_uint8_ptr(p256_modulus), + c_uint8_ptr(p256_b), + c_uint8_ptr(p256_order), + c_size_t(len(p256_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-256 context" % result) + + context = SmartPointer(ec_p256_context.get(), _ec_lib.ec_free_context) + p256 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 256, + "1.2.840.10045.3.1.7", # ANSI X9.62 + context, + "NIST P-256", + "ecdsa-sha2-nistp256") + global p256_names + _curves.update(dict.fromkeys(p256_names, p256)) + + +init_p256() +del init_p256 + + +p384_names = ["p384", "NIST P-384", "P-384", "prime384v1", "secp384r1", + "nistp384"] + + +def init_p384(): + p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff + b = 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef + order = 0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 + Gx = 0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760aB7 + Gy = 0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5F + + p384_modulus = long_to_bytes(p, 48) + p384_b = long_to_bytes(b, 48) + p384_order = long_to_bytes(order, 48) + + ec_p384_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p384_context.address_of(), + c_uint8_ptr(p384_modulus), + c_uint8_ptr(p384_b), + c_uint8_ptr(p384_order), + c_size_t(len(p384_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-384 context" % result) + + context = SmartPointer(ec_p384_context.get(), _ec_lib.ec_free_context) + p384 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 384, + "1.3.132.0.34", # SEC 2 + context, + "NIST P-384", + "ecdsa-sha2-nistp384") + global p384_names + _curves.update(dict.fromkeys(p384_names, p384)) + + +init_p384() +del init_p384 + + +p521_names = ["p521", "NIST P-521", "P-521", "prime521v1", "secp521r1", + "nistp521"] + + +def init_p521(): + p = 0x000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + b = 0x00000051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00 + order = 0x000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409 + Gx = 0x000000c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66 + Gy = 0x0000011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650 + + p521_modulus = long_to_bytes(p, 66) + p521_b = long_to_bytes(b, 66) + p521_order = long_to_bytes(order, 66) + + ec_p521_context = VoidPointer() + result = _ec_lib.ec_ws_new_context(ec_p521_context.address_of(), + c_uint8_ptr(p521_modulus), + c_uint8_ptr(p521_b), + c_uint8_ptr(p521_order), + c_size_t(len(p521_modulus)), + c_ulonglong(getrandbits(64)) + ) + if result: + raise ImportError("Error %d initializing P-521 context" % result) + + context = SmartPointer(ec_p521_context.get(), _ec_lib.ec_free_context) + p521 = _Curve(Integer(p), + Integer(b), + Integer(order), + Integer(Gx), + Integer(Gy), + None, + 521, + "1.3.132.0.35", # SEC 2 + context, + "NIST P-521", + "ecdsa-sha2-nistp521") + global p521_names + _curves.update(dict.fromkeys(p521_names, p521)) + + +init_p521() +del init_p521 + + +class UnsupportedEccFeature(ValueError): + pass + + +class EccPoint(object): + """A class to abstract a point over an Elliptic Curve. + + The class support special methods for: + + * Adding two points: ``R = S + T`` + * In-place addition: ``S += T`` + * Negating a point: ``R = -T`` + * Comparing two points: ``if S == T: ...`` + * Multiplying a point by a scalar: ``R = S*k`` + * In-place multiplication by a scalar: ``T *= k`` + + :ivar x: The affine X-coordinate of the ECC point + :vartype x: integer + + :ivar y: The affine Y-coordinate of the ECC point + :vartype y: integer + + :ivar xy: The tuple with X- and Y- coordinates + """ + + def __init__(self, x, y, curve="p256"): + + try: + self._curve = _curves[curve] + except KeyError: + raise ValueError("Unknown curve name %s" % str(curve)) + self._curve_name = curve + + modulus_bytes = self.size_in_bytes() + context = self._curve.context + + 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") + + self._point = VoidPointer() + result = _ec_lib.ec_ws_new_point(self._point.address_of(), + c_uint8_ptr(xb), + c_uint8_ptr(yb), + c_size_t(modulus_bytes), + context.get()) + 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(), + _ec_lib.ec_free_point) + + def set(self, point): + self._point = VoidPointer() + result = _ec_lib.ec_ws_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(), + _ec_lib.ec_free_point) + return self + + def __eq__(self, point): + return 0 == _ec_lib.ec_ws_cmp(self._point.get(), point._point.get()) + + def __neg__(self): + np = self.copy() + result = _ec_lib.ec_ws_neg(np._point.get()) + if result: + raise ValueError("Error %d while inverting an EC point" % result) + return np + + def copy(self): + """Return a copy of this point.""" + x, y = self.xy + np = EccPoint(x, y, self._curve_name) + return np + + def is_point_at_infinity(self): + """``True`` if this is the point-at-infinity.""" + return self.xy == (0, 0) + + def point_at_infinity(self): + """Return the point-at-infinity for the curve this point is on.""" + return EccPoint(0, 0, self._curve_name) + + @property + def x(self): + return self.xy[0] + + @property + def y(self): + return self.xy[1] + + @property + def xy(self): + modulus_bytes = self.size_in_bytes() + xb = bytearray(modulus_bytes) + yb = bytearray(modulus_bytes) + result = _ec_lib.ec_ws_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). + + :Return: + :class:`EccPoint` : this same object (to enable chaining) + """ + + result = _ec_lib.ec_ws_double(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""" + + result = _ec_lib.ec_ws_add(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""" + + if scalar < 0: + raise ValueError("Scalar multiplication is only defined for non-negative integers") + sb = long_to_bytes(scalar) + result = _ec_lib.ec_ws_scalar(self._point.get(), + c_uint8_ptr(sb), + c_size_t(len(sb)), + c_ulonglong(getrandbits(64))) + if result: + raise ValueError("Error %d during scalar multiplication" % result) + return self + + def __mul__(self, scalar): + """Return a new point, the scalar product of this one""" + + np = self.copy() + np *= scalar + return np + + def __rmul__(self, left_hand): + return self.__mul__(left_hand) + + +# Last piece of initialization +p256_G = EccPoint(_curves['p256'].Gx, _curves['p256'].Gy, "p256") +p256 = _curves['p256']._replace(G=p256_G) +_curves.update(dict.fromkeys(p256_names, p256)) +del p256_G, p256, p256_names + +p384_G = EccPoint(_curves['p384'].Gx, _curves['p384'].Gy, "p384") +p384 = _curves['p384']._replace(G=p384_G) +_curves.update(dict.fromkeys(p384_names, p384)) +del p384_G, p384, p384_names + +p521_G = EccPoint(_curves['p521'].Gx, _curves['p521'].Gy, "p521") +p521 = _curves['p521']._replace(G=p521_G) +_curves.update(dict.fromkeys(p521_names, p521)) +del p521_G, p521, p521_names + + +class EccKey(object): + r"""Class defining an ECC key. + Do not instantiate directly. + Use :func:`generate`, :func:`construct` or :func:`import_key` instead. + + :ivar curve: The name of the ECC as defined in :numref:`curve_names`. + :vartype curve: string + + :ivar pointQ: an ECC point representating the public component + :vartype pointQ: :class:`EccPoint` + + :ivar d: A scalar representating the private component + :vartype d: integer + """ + + def __init__(self, **kwargs): + """Create a new ECC key + + Keywords: + curve : string + It must be *"p256"*, *"P-256"*, *"prime256v1"* or *"secp256r1"*. + d : integer + Only for a private key. It must be in the range ``[1..order-1]``. + point : EccPoint + Mandatory for a public key. If provided for a private key, + the implementation will NOT check whether it matches ``d``. + """ + + kwargs_ = dict(kwargs) + curve_name = kwargs_.pop("curve", None) + self._d = kwargs_.pop("d", None) + self._point = kwargs_.pop("point", None) + 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] + + if self._d is None: + if self._point is None: + raise ValueError("Either private or public ECC component must be specified, not both") + else: + self._d = Integer(self._d) + if not 1 <= self._d < self._curve.order: + raise ValueError("Invalid ECC private component") + + self.curve = self._curve.desc + + def __eq__(self, other): + if other.has_private() != self.has_private(): + return False + + return other.pointQ == self.pointQ + + def __repr__(self): + if self.has_private(): + extra = ", d=%d" % int(self._d) + else: + extra = "" + x, y = self.pointQ.xy + return "EccKey(curve='%s', point_x=%d, point_y=%d%s)" % (self._curve.desc, x, y, extra) + + def has_private(self): + """``True`` if this key can be used for making signatures or decrypting data.""" + + return self._d is not None + + 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) + + 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 pointQ(self): + if self._point is None: + self._point = self._curve.G * self._d + return self._point + + def public_key(self): + """A matching ECC public key. + + Returns: + a new :class:`EccKey` object + """ + + return EccKey(curve=self._curve.desc, point=self.pointQ) + + def _export_subjectPublicKeyInfo(self, compress): + + # 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: + 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)) + + unrestricted_oid = "1.2.840.10045.2.1" + return _create_subject_public_key_info(unrestricted_oid, + public_key, + DerObjectId(self._curve.oid)) + + def _export_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 Crypto.IO import PKCS8 + + if kwargs.get('passphrase', None) is not None and 'protection' not in kwargs: + raise ValueError("At least the 'protection' parameter should be present") + + unrestricted_oid = "1.2.840.10045.2.1" + private_key = self._export_private_der(include_ec_params=False) + result = PKCS8.wrap(private_key, + unrestricted_oid, + key_params=DerObjectId(self._curve.oid), + **kwargs) + return result + + def _export_public_pem(self, compress): + from Crypto.IO import PEM + + encoded_der = self._export_subjectPublicKeyInfo(compress) + return PEM.encode(encoded_der, "PUBLIC KEY") + + def _export_private_pem(self, passphrase, **kwargs): + from Crypto.IO import PEM + + encoded_der = self._export_private_der() + return PEM.encode(encoded_der, "EC PRIVATE KEY", passphrase, **kwargs) + + def _export_private_clear_pkcs8_in_clear_pem(self): + from Crypto.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 Crypto.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 + modulus_bytes = self.pointQ.size_in_bytes() + + if compress: + first_byte = 2 + self.pointQ.y.is_odd() + public_key = (bchr(first_byte) + + self.pointQ.x.to_bytes(modulus_bytes)) + else: + public_key = (b'\x04' + + self.pointQ.x.to_bytes(modulus_bytes) + + self.pointQ.y.to_bytes(modulus_bytes)) + + middle = desc.split("-")[2] + comps = (tobytes(desc), tobytes(middle), public_key) + blob = b"".join([struct.pack(">I", len(x)) + x for x in comps]) + return desc + " " + tostr(binascii.b2a_base64(blob)) + + def export_key(self, **kwargs): + """Export this ECC key. + + Args: + format (string): + The format to use for encoding the key: + + - ``'DER'``. The key will be encoded in ASN.1 DER format (binary). + For a public key, the ASN.1 ``subjectPublicKeyInfo`` structure + defined in `RFC5480`_ will be used. + For a private key, the ASN.1 ``ECPrivateKey`` structure defined + in `RFC5915`_ is used instead (possibly within a PKCS#8 envelope, + see the ``use_pkcs8`` flag below). + - ``'PEM'``. The key will be encoded in a PEM_ envelope (ASCII). + - ``'OpenSSH'``. The key will be encoded in the OpenSSH_ format + (ASCII, public keys only). + + passphrase (byte string or string): + The passphrase to use for protecting the private key. + + use_pkcs8 (boolean): + Only relevant for private keys. + + If ``True`` (default and recommended), the `PKCS#8`_ representation + will be used. + + If ``False``, the much weaker `PEM encryption`_ mechanism will be used. + + protection (string): + When a private key is exported with password-protection + and PKCS#8 (both ``DER`` and ``PEM`` formats), this parameter MUST be + present and be a valid algorithm supported by :mod:`Crypto.IO.PKCS8`. + It is recommended to use ``PBKDF2WithHMAC-SHA1AndAES128-CBC``. + + compress (boolean): + If ``True``, a more compact representation of the public key + with the X-coordinate only is used. + + If ``False`` (default), the full public key will be exported. + + .. 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:`Crypto.IO.PKCS8`. + + .. _PEM: http://www.ietf.org/rfc/rfc1421.txt + .. _`PEM encryption`: http://www.ietf.org/rfc/rfc1423.txt + .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt + .. _OpenSSH: http://www.openssh.com/txt/rfc5656.txt + .. _RFC5480: https://tools.ietf.org/html/rfc5480 + .. _RFC5915: http://www.ietf.org/rfc/rfc5915.txt + + Returns: + A multi-line string (for PEM and OpenSSH) or bytes (for DER) with the encoded key. + """ + + args = kwargs.copy() + ext_format = args.pop("format") + if ext_format not in ("PEM", "DER", "OpenSSH"): + 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 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_private_der() + else: + raise ValueError("Private keys cannot be exported in OpenSSH 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) + 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 :numref:`curve_names`. + + randfunc (callable): + Optional. The RNG to read randomness from. + If ``None``, :func:`Crypto.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)) + + d = Integer.random_range(min_inclusive=1, + max_exclusive=curve.order, + randfunc=randfunc) + + return EccKey(curve=curve_name, d=d) + + +def construct(**kwargs): + """Build a new ECC key (private or public) starting + from some base components. + + Args: + + curve (string): + Mandatory. It must be a curve name defined in :numref:`curve_names`. + + d (integer): + Only for a private key. It must be in the range ``[1..order-1]``. + + point_x (integer): + Mandatory for a public key. X coordinate (affine) of the ECC point. + + point_y (integer): + Mandatory for a public key. Y coordinate (affine) of the ECC point. + + Returns: + :class:`EccKey` : a new ECC key object + """ + + curve_name = kwargs["curve"] + curve = _curves[curve_name] + point_x = kwargs.pop("point_x", None) + point_y = kwargs.pop("point_y", None) + + if "point" in kwargs: + raise TypeError("Unknown keyword: point") + + if None not in (point_x, point_y): + # ValueError is raised if the point is not on the curve + kwargs["point"] = EccPoint(point_x, point_y, curve_name) + + # Validate that the private key matches the public one + d = kwargs.get("d", None) + if d is not None and "point" in kwargs: + pub_key = curve.G * d + if pub_key.xy != (point_x, point_y): + raise ValueError("Private and public ECC keys do not match") + + return EccKey(**kwargs) + + +def _import_public_der(curve_oid, ec_point): + """Convert an encoded EC point into an EccKey object + + curve_name: string with the OID of the curve + ec_point: byte string with the EC point (not DER encoded) + + """ + + for curve_name, curve in _curves.items(): + if curve.oid == curve_oid: + break + else: + raise UnsupportedEccFeature("Unsupported ECC curve (OID: %s)" % curve_oid) + + # 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, 0x3): + if len(ec_point) != (1 + modulus_bytes): + raise ValueError("Incorrect EC point length") + x = Integer.from_bytes(ec_point[1:]) + y = (x**3 - x*3 + curve.b).sqrt(curve.p) # Short Weierstrass + 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) + + # ec_point must be an encoded OCTET STRING + # params is encoded ECParameters + + # We accept id-ecPublicKey, id-ecDH, id-ecMQV without making any + # distiction for now. + + # Restrictions can be captured in the key usage certificate + # extension + unrestricted_oid = "1.2.840.10045.2.1" + ecdh_oid = "1.3.132.1.12" + ecmqv_oid = "1.3.132.1.13" + + if oid not in (unrestricted_oid, ecdh_oid, ecmqv_oid): + raise UnsupportedEccFeature("Unsupported ECC purpose (OID: %s)" % oid) + + # Parameters are mandatory for all three types + if not params: + raise ValueError("Missing ECC parameters") + + # ECParameters ::= CHOICE { + # namedCurve OBJECT IDENTIFIER + # -- implicitCurve NULL + # -- specifiedCurve SpecifiedECDomain + # } + # + # implicitCurve and specifiedCurve are not supported (as per RFC) + curve_oid = DerObjectId().decode(params).value + + return _import_public_der(curve_oid, ec_point) + + +def _import_private_der(encoded, passphrase, curve_oid=None): + + # See RFC5915 https://tools.ietf.org/html/rfc5915 + # + # ECPrivateKey ::= SEQUENCE { + # version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), + # privateKey OCTET STRING, + # parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, + # publicKey [1] BIT STRING OPTIONAL + # } + + private_key = DerSequence().decode(encoded, nr_elements=(3, 4)) + if private_key[0] != 1: + raise ValueError("Incorrect ECC private key version") + + try: + parameters = DerObjectId(explicit=0).decode(private_key[2]).value + if curve_oid is not None and parameters != curve_oid: + raise ValueError("Curve mismatch") + curve_oid = parameters + except ValueError: + pass + + if curve_oid is None: + raise ValueError("No curve found") + + for curve_name, curve in _curves.items(): + if curve.oid == curve_oid: + break + else: + raise UnsupportedEccFeature("Unsupported ECC curve (OID: %s)" % curve_oid) + + scalar_bytes = DerOctetString().decode(private_key[1]).payload + modulus_bytes = curve.p.size_in_bytes() + if len(scalar_bytes) != modulus_bytes: + raise ValueError("Private key is too small") + d = Integer.from_bytes(scalar_bytes) + + # Decode public key (if any) + if len(private_key) == 4: + public_key_enc = DerBitString(explicit=1).decode(private_key[3]).value + public_key = _import_public_der(curve_oid, public_key_enc) + point_x = public_key.pointQ.x + point_y = public_key.pointQ.y + else: + point_x = point_y = None + + return construct(curve=curve_name, d=d, point_x=point_x, point_y=point_y) + + +def _import_pkcs8(encoded, passphrase): + from Crypto.IO import PKCS8 + + # From RFC5915, Section 1: + # + # Distributing an EC private key with PKCS#8 [RFC5208] involves including: + # a) id-ecPublicKey, id-ecDH, or id-ecMQV (from [RFC5480]) with the + # namedCurve as the parameters in the privateKeyAlgorithm field; and + # b) ECPrivateKey in the PrivateKey field, which is an OCTET STRING. + + algo_oid, private_key, params = PKCS8.unwrap(encoded, passphrase) + + # We accept id-ecPublicKey, id-ecDH, id-ecMQV without making any + # distiction for now. + unrestricted_oid = "1.2.840.10045.2.1" + ecdh_oid = "1.3.132.1.12" + ecmqv_oid = "1.3.132.1.13" + + if algo_oid not in (unrestricted_oid, ecdh_oid, ecmqv_oid): + raise UnsupportedEccFeature("Unsupported ECC purpose (OID: %s)" % algo_oid) + + curve_oid = DerObjectId().decode(params).value + + return _import_private_der(private_key, passphrase, curve_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_private_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): + keystring = binascii.a2b_base64(encoded.split(b' ')[1]) + + keyparts = [] + while len(keystring) > 4: + lk = struct.unpack(">I", keystring[:4])[0] + keyparts.append(keystring[4:4 + lk]) + keystring = keystring[4 + lk:] + + for curve_name, curve in _curves.items(): + middle = tobytes(curve.openssh.split("-")[2]) + if keyparts[1] == middle: + break + else: + raise ValueError("Unsupported ECC curve") + + return _import_public_der(curve.oid, keyparts[2]) + + +def _import_openssh_private_ecc(data, password): + + from ._openssh import (import_openssh_private_generic, + read_bytes, read_string, check_padding) + + ssh_name, decrypted = import_openssh_private_generic(data, password) + + name, decrypted = read_string(decrypted) + if name not in _curves: + raise UnsupportedEccFeature("Unsupported ECC curve %s" % name) + curve = _curves[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:]) + point = EccPoint(point_x, point_y, curve=name) + + private_key, decrypted = read_bytes(decrypted) + d = Integer.from_bytes(private_key) + + _, padded = read_string(decrypted) # Comment + check_padding(padded) + + return EccKey(curve=name, d=d, point=point) + + +def import_key(encoded, passphrase=None): + """Import an ECC key (public or private). + + Args: + encoded (bytes or multi-line string): + The ECC key to import. + + An ECC **public** key can be: + + - An X.509 certificate, binary (DER) or ASCII (PEM) + - An X.509 ``subjectPublicKeyInfo``, binary (DER) or ASCII (PEM) + - An OpenSSH line (e.g. the content of ``~/.ssh/id_ecdsa``, ASCII) + + An ECC **private** key can be: + + - In binary format (DER, see section 3 of `RFC5915`_ or `PKCS#8`_) + - In ASCII format (PEM or `OpenSSH 6.5+`_) + + 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 or at the PKCS#8 level. + This parameter is ignored if the key in input is not encrypted. + + 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: http://www.ietf.org/rfc/rfc1421.txt + .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt + .. _RFC5915: http://www.ietf.org/rfc/rfc5915.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 Crypto.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-'): + return _import_openssh_public(encoded) + + # DER + if len(encoded) > 0 and bord(encoded[0]) == 0x30: + return _import_der(encoded, passphrase) + + 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/server/www/packages/packages-linux/x64/Crypto/PublicKey/ElGamal.py b/server/www/packages/packages-linux/x64/Crypto/PublicKey/ElGamal.py new file mode 100644 index 0000000..3b10840 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto import Random +from Crypto.Math.Primality import ( generate_probable_safe_prime, + test_probable_prime, COMPOSITE ) +from Crypto.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 PyCrypto 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/server/www/packages/packages-linux/x64/Crypto/PublicKey/RSA.py b/server/www/packages/packages-linux/x64/Crypto/PublicKey/RSA.py new file mode 100644 index 0000000..8875c76 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/PublicKey/RSA.py @@ -0,0 +1,799 @@ +# -*- 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 Crypto import Random +from Crypto.Util.py3compat import tobytes, bord, tostr +from Crypto.Util.asn1 import DerSequence + +from Crypto.Math.Numbers import Integer +from Crypto.Math.Primality import (test_probable_prime, + generate_probable_prime, COMPOSITE) + +from Crypto.PublicKey import (_expand_subject_public_key_info, + _create_subject_public_key_info, + _extract_subject_public_key_info) + + +class RsaKey(object): + r"""Class defining an actual RSA key. + Do not instantiate directly. + Use :func:`generate`, :func:`construct` or :func:`import_key` instead. + + :ivar n: RSA modulus + :vartype n: integer + + :ivar e: RSA public exponent + :vartype e: integer + + :ivar d: RSA private exponent + :vartype d: integer + + :ivar p: First factor of the RSA modulus + :vartype p: integer + + :ivar q: Second factor of the RSA modulus + :vartype q: integer + + :ivar u: Chinese remainder component (:math:`p^{-1} \text{mod } q`) + :vartype u: integer + + :undocumented: exportKey, publickey + """ + + def __init__(self, **kwargs): + """Build an RSA key. + + :Keywords: + n : integer + The modulus. + e : integer + The public exponent. + d : integer + The private exponent. Only required for private keys. + p : integer + The first factor of the modulus. Only required for private keys. + q : integer + The second factor of the modulus. Only required for private keys. + u : integer + The CRT coefficient (inverse of p modulo q). Only required for + private keys. + """ + + input_set = set(kwargs.keys()) + public_set = set(('n', 'e')) + private_set = public_set | set(('p', 'q', 'd', 'u')) + if input_set not in (private_set, public_set): + raise ValueError("Some RSA components are missing") + for component, value in kwargs.items(): + setattr(self, "_" + component, value) + if input_set == private_set: + self._dp = self._d % (self._p - 1) # = (e⁻¹) mod (p-1) + self._dq = self._d % (self._q - 1) # = (e⁻¹) mod (q-1) + + @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 u(self): + if not self.has_private(): + raise AttributeError("No CRT component 'u' available for public keys") + return int(self._u) + + def size_in_bits(self): + """Size of the RSA modulus in bits""" + return self._n.size_in_bits() + + def size_in_bytes(self): + """The minimal amount of bytes that can hold the RSA modulus""" + return (self._n.size_in_bits() - 1) // 8 + 1 + + def _encrypt(self, plaintext): + if not 0 <= plaintext < self._n: + raise ValueError("Plaintext too large") + return int(pow(Integer(plaintext), self._e, self._n)) + + def _decrypt(self, ciphertext): + if not 0 <= ciphertext < self._n: + raise ValueError("Ciphertext too large") + if not self.has_private(): + raise TypeError("This is not a private key") + + # Blinded RSA decryption (to prevent timing attacks): + # Step 1: Generate random secret blinding factor r, + # such that 0 < r < n-1 + r = Integer.random_range(min_inclusive=1, max_exclusive=self._n) + # Step 2: Compute c' = c * r**e mod n + cp = Integer(ciphertext) * pow(r, self._e, self._n) % self._n + # Step 3: Compute m' = c'**d mod n (normal RSA decryption) + m1 = pow(cp, self._dp, self._p) + m2 = pow(cp, self._dq, self._q) + h = ((m2 - m1) * self._u) % self._q + mp = h * self._p + m1 + # Step 4: Compute m = m**(r-1) mod n + result = (r.inverse(self._n) * mp) % self._n + # Verify no faults occurred + if ciphertext != pow(result, self._e, self._n): + raise ValueError("Fault detected in RSA decryption") + return result + + def has_private(self): + """Whether this is an RSA private key""" + + return hasattr(self, "_d") + + def can_encrypt(self): # legacy + return True + + def can_sign(self): # legacy + return True + + def public_key(self): + """A matching RSA public key. + + Returns: + a new :class:`RsaKey` object + """ + return RsaKey(n=self._n, e=self._e) + + def __eq__(self, other): + if self.has_private() != other.has_private(): + return False + if self.n != other.n or self.e != other.e: + return False + if not self.has_private(): + return True + return (self.d == other.d) + + def __ne__(self, other): + return not (self == other) + + def __getstate__(self): + # RSA key is not pickable + from pickle import PicklingError + raise PicklingError + + def __repr__(self): + if self.has_private(): + extra = ", d=%d, p=%d, q=%d, u=%d" % (int(self._d), int(self._p), + int(self._q), int(self._u)) + else: + extra = "" + return "RsaKey(n=%d, e=%d%s)" % (int(self._n), int(self._e), extra) + + def __str__(self): + if self.has_private(): + key_type = "Private" + else: + key_type = "Public" + return "%s RSA key at 0x%X" % (key_type, id(self)) + + def export_key(self, format='PEM', passphrase=None, pkcs=1, + protection=None, randfunc=None): + """Export this RSA key. + + Args: + format (string): + The format to use for wrapping the key: + + - *'PEM'*. (*Default*) Text encoding, done according to `RFC1421`_/`RFC1423`_. + - *'DER'*. Binary encoding. + - *'OpenSSH'*. Textual encoding, done according to OpenSSH specification. + Only suitable for public keys (not private keys). + + passphrase (string): + (*For private keys only*) The pass phrase used for protecting the output. + + pkcs (integer): + (*For private keys only*) The ASN.1 structure to use for + serializing the key. Note that even in case of PEM + encoding, there is an inner ASN.1 DER structure. + + With ``pkcs=1`` (*default*), the private key is encoded in a + simple `PKCS#1`_ structure (``RSAPrivateKey``). + + With ``pkcs=8``, the private key is encoded in a `PKCS#8`_ structure + (``PrivateKeyInfo``). + + .. note:: + This parameter is ignored for a public key. + For DER and PEM, an ASN.1 DER ``SubjectPublicKeyInfo`` + structure is always used. + + protection (string): + (*For private keys only*) + The encryption scheme to use for protecting the private key. + + If ``None`` (default), the behavior depends on :attr:`format`: + + - For *'DER'*, the *PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC* + scheme is used. The following operations are performed: + + 1. A 16 byte Triple DES key is derived from the passphrase + using :func:`Crypto.Protocol.KDF.PBKDF2` with 8 bytes salt, + and 1 000 iterations of :mod:`Crypto.Hash.HMAC`. + 2. The private key is encrypted using CBC. + 3. The encrypted key is encoded according to PKCS#8. + + - For *'PEM'*, the obsolete PEM encryption scheme is used. + It is based on MD5 for key derivation, and Triple DES for encryption. + + Specifying a value for :attr:`protection` is only meaningful for PKCS#8 + (that is, ``pkcs=8``) and only if a pass phrase is present too. + + The supported schemes for PKCS#8 are listed in the + :mod:`Crypto.IO.PKCS8` module (see :attr:`wrap_algo` parameter). + + randfunc (callable): + A function that provides random bytes. Only used for PEM encoding. + The default is :func:`Crypto.Random.get_random_bytes`. + + Returns: + byte string: the encoded key + + Raises: + ValueError:when the format is unknown or when you try to encrypt a private + key with *DER* format and PKCS#1. + + .. warning:: + If you don't provide a pass phrase, the private key will be + exported in the clear! + + .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt + .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt + .. _`PKCS#1`: http://www.ietf.org/rfc/rfc3447.txt + .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt + """ + + if passphrase is not None: + passphrase = tobytes(passphrase) + + if randfunc is None: + randfunc = Random.get_random_bytes + + if format == 'OpenSSH': + e_bytes, n_bytes = [x.to_bytes() for x in (self._e, self._n)] + if bord(e_bytes[0]) & 0x80: + e_bytes = b'\x00' + e_bytes + if bord(n_bytes[0]) & 0x80: + n_bytes = b'\x00' + n_bytes + keyparts = [b'ssh-rsa', e_bytes, n_bytes] + keystring = b''.join([struct.pack(">I", len(kp)) + kp for kp in keyparts]) + return b'ssh-rsa ' + binascii.b2a_base64(keystring)[:-1] + + # DER format is always used, even in case of PEM, which simply + # encodes it into BASE64. + if self.has_private(): + binary_key = DerSequence([0, + self.n, + self.e, + self.d, + self.p, + self.q, + self.d % (self.p-1), + self.d % (self.q-1), + Integer(self.q).inverse(self.p) + ]).encode() + if pkcs == 1: + key_type = 'RSA PRIVATE KEY' + if format == 'DER' and passphrase: + raise ValueError("PKCS#1 private key cannot be encrypted") + else: # PKCS#8 + from Crypto.IO import PKCS8 + + if format == 'PEM' and protection is None: + key_type = 'PRIVATE KEY' + binary_key = PKCS8.wrap(binary_key, oid, None) + else: + key_type = 'ENCRYPTED PRIVATE KEY' + if not protection: + protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC' + binary_key = PKCS8.wrap(binary_key, oid, + passphrase, protection) + passphrase = None + else: + key_type = "PUBLIC KEY" + binary_key = _create_subject_public_key_info(oid, + DerSequence([self.n, + self.e]) + ) + + if format == 'DER': + return binary_key + if format == 'PEM': + from Crypto.IO import PEM + + pem_str = PEM.encode(binary_key, key_type, passphrase, randfunc) + return tobytes(pem_str) + + raise ValueError("Unknown key format '%s'. Cannot export the RSA key." % format) + + # Backward compatibility + exportKey = export_key + publickey = public_key + + # Methods defined in PyCrypto that we don't support anymore + def sign(self, M, K): + raise NotImplementedError("Use module Crypto.Signature.pkcs1_15 instead") + + def verify(self, M, signature): + raise NotImplementedError("Use module Crypto.Signature.pkcs1_15 instead") + + def encrypt(self, plaintext, K): + raise NotImplementedError("Use module Crypto.Cipher.PKCS1_OAEP instead") + + def decrypt(self, ciphertext): + raise NotImplementedError("Use module Crypto.Cipher.PKCS1_OAEP instead") + + def blind(self, M, B): + raise NotImplementedError + + def unblind(self, M, B): + raise NotImplementedError + + def size(self): + raise NotImplementedError + + +def generate(bits, randfunc=None, e=65537): + """Create a new RSA key pair. + + The algorithm closely follows NIST `FIPS 186-4`_ in its + sections B.3.1 and B.3.3. The modulus is the product of + two non-strong probable primes. + Each prime passes a suitable number of Miller-Rabin tests + with random bases and a single Lucas test. + + Args: + bits (integer): + Key length, or size (in bits) of the RSA modulus. + It must be at least 1024, but **2048 is recommended.** + The FIPS standard only defines 1024, 2048 and 3072. + randfunc (callable): + Function that returns random bytes. + The default is :func:`Crypto.Random.get_random_bytes`. + e (integer): + Public RSA exponent. It must be an odd positive integer. + It is typically a small number with very few ones in its + binary representation. + The FIPS standard requires the public exponent to be + at least 65537 (the default). + + Returns: an RSA key object (:class:`RsaKey`, with private key). + + .. _FIPS 186-4: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + """ + + if bits < 1024: + raise ValueError("RSA modulus length must be >= 1024") + if e % 2 == 0 or e < 3: + raise ValueError("RSA public exponent must be a positive, odd integer larger than 2.") + + if randfunc is None: + randfunc = Random.get_random_bytes + + d = n = Integer(1) + e = Integer(e) + + while n.size_in_bits() != bits and d < (1 << (bits // 2)): + # Generate the prime factors of n: p and q. + # By construciton, their product is always + # 2^{bits-1} < p*q < 2^bits. + size_q = bits // 2 + size_p = bits - size_q + + min_p = min_q = (Integer(1) << (2 * size_q - 1)).sqrt() + if size_q != size_p: + min_p = (Integer(1) << (2 * size_p - 1)).sqrt() + + def filter_p(candidate): + return candidate > min_p and (candidate - 1).gcd(e) == 1 + + p = generate_probable_prime(exact_bits=size_p, + randfunc=randfunc, + prime_filter=filter_p) + + min_distance = Integer(1) << (bits // 2 - 100) + + def filter_q(candidate): + return (candidate > min_q and + (candidate - 1).gcd(e) == 1 and + abs(candidate - p) > min_distance) + + q = generate_probable_prime(exact_bits=size_q, + randfunc=randfunc, + prime_filter=filter_q) + + n = p * q + lcm = (p - 1).lcm(q - 1) + d = e.inverse(lcm) + + if p > q: + p, q = q, p + + u = p.inverse(q) + + return RsaKey(n=n, e=e, d=d, p=p, q=q, u=u) + + +def construct(rsa_components, consistency_check=True): + r"""Construct an RSA key from a tuple of valid RSA components. + + The modulus **n** must be the product of two primes. + The public exponent **e** must be odd and larger than 1. + + In case of a private key, the following equations must apply: + + .. math:: + + \begin{align} + p*q &= n \\ + e*d &\equiv 1 ( \text{mod lcm} [(p-1)(q-1)]) \\ + p*u &\equiv 1 ( \text{mod } q) + \end{align} + + Args: + rsa_components (tuple): + A tuple of integers, with at least 2 and no + more than 6 items. The items come in the following order: + + 1. RSA modulus *n*. + 2. Public exponent *e*. + 3. Private exponent *d*. + Only required if the key is private. + 4. First factor of *n* (*p*). + Optional, but the other factor *q* must also be present. + 5. Second factor of *n* (*q*). Optional. + 6. CRT coefficient *q*, that is :math:`p^{-1} \text{mod }q`. Optional. + + consistency_check (boolean): + If ``True``, the library will verify that the provided components + fulfil the main RSA properties. + + Raises: + ValueError: when the key being imported fails the most basic RSA validity checks. + + Returns: An RSA key object (:class:`RsaKey`). + """ + + class InputComps(object): + pass + + input_comps = InputComps() + for (comp, value) in zip(('n', 'e', 'd', 'p', 'q', 'u'), rsa_components): + setattr(input_comps, comp, Integer(value)) + + n = input_comps.n + e = input_comps.e + if not hasattr(input_comps, 'd'): + key = RsaKey(n=n, e=e) + else: + d = input_comps.d + if hasattr(input_comps, 'q'): + p = input_comps.p + q = input_comps.q + else: + # Compute factors p and q from the private exponent d. + # We assume that n has no more than two factors. + # See 8.2.2(i) in Handbook of Applied Cryptography. + ktot = d * e - 1 + # The quantity d*e-1 is a multiple of phi(n), even, + # and can be represented as t*2^s. + t = ktot + while t % 2 == 0: + t //= 2 + # Cycle through all multiplicative inverses in Zn. + # The algorithm is non-deterministic, but there is a 50% chance + # any candidate a leads to successful factoring. + # See "Digitalized Signatures and Public Key Functions as Intractable + # as Factorization", M. Rabin, 1979 + spotted = False + a = Integer(2) + while not spotted and a < 100: + k = Integer(t) + # Cycle through all values a^{t*2^i}=a^k + while k < ktot: + cand = pow(a, k, n) + # Check if a^k is a non-trivial root of unity (mod n) + if cand != 1 and cand != (n - 1) and pow(cand, 2, n) == 1: + # We have found a number such that (cand-1)(cand+1)=0 (mod n). + # Either of the terms divides n. + p = Integer(n).gcd(cand + 1) + spotted = True + break + k *= 2 + # This value was not any good... let's try another! + a += 2 + if not spotted: + raise ValueError("Unable to compute factors p and q from exponent d.") + # Found ! + assert ((n % p) == 0) + q = n // p + + if hasattr(input_comps, 'u'): + u = input_comps.u + else: + u = p.inverse(q) + + # Build key object + key = RsaKey(n=n, e=e, d=d, p=p, q=q, u=u) + + # Verify consistency of the key + if consistency_check: + + # Modulus and public exponent must be coprime + if e <= 1 or e >= n: + raise ValueError("Invalid RSA public exponent") + if Integer(n).gcd(e) != 1: + raise ValueError("RSA public exponent is not coprime to modulus") + + # For RSA, modulus must be odd + if not n & 1: + raise ValueError("RSA modulus is not odd") + + if key.has_private(): + # Modulus and private exponent must be coprime + if d <= 1 or d >= n: + raise ValueError("Invalid RSA private exponent") + if Integer(n).gcd(d) != 1: + raise ValueError("RSA private exponent is not coprime to modulus") + # Modulus must be product of 2 primes + if p * q != n: + raise ValueError("RSA factors do not match modulus") + if test_probable_prime(p) == COMPOSITE: + raise ValueError("RSA factor p is composite") + if test_probable_prime(q) == COMPOSITE: + raise ValueError("RSA factor q is composite") + # See Carmichael theorem + phi = (p - 1) * (q - 1) + lcm = phi // (p - 1).gcd(q - 1) + if (e * d % int(lcm)) != 1: + raise ValueError("Invalid RSA condition") + if hasattr(key, 'u'): + # CRT coefficient + if u <= 1 or u >= q: + raise ValueError("Invalid RSA component u") + if (p * u % q) != 1: + raise ValueError("Invalid RSA component u with p") + + return key + + +def _import_pkcs1_private(encoded, *kwargs): + # RSAPrivateKey ::= SEQUENCE { + # version Version, + # modulus INTEGER, -- n + # publicExponent INTEGER, -- e + # privateExponent INTEGER, -- d + # prime1 INTEGER, -- p + # prime2 INTEGER, -- q + # exponent1 INTEGER, -- d mod (p-1) + # exponent2 INTEGER, -- d mod (q-1) + # coefficient INTEGER -- (inverse of q) mod p + # } + # + # Version ::= INTEGER + der = DerSequence().decode(encoded, nr_elements=9, only_ints_expected=True) + if der[0] != 0: + raise ValueError("No PKCS#1 encoding of an RSA private key") + return construct(der[1:6] + [Integer(der[4]).inverse(der[5])]) + + +def _import_pkcs1_public(encoded, *kwargs): + # RSAPublicKey ::= SEQUENCE { + # modulus INTEGER, -- n + # publicExponent INTEGER -- e + # } + der = DerSequence().decode(encoded, nr_elements=2, only_ints_expected=True) + return construct(der) + + +def _import_subjectPublicKeyInfo(encoded, *kwargs): + + algoid, encoded_key, params = _expand_subject_public_key_info(encoded) + if algoid != oid or params is not None: + raise ValueError("No RSA subjectPublicKeyInfo") + return _import_pkcs1_public(encoded_key) + + +def _import_x509_cert(encoded, *kwargs): + + sp_info = _extract_subject_public_key_info(encoded) + return _import_subjectPublicKeyInfo(sp_info) + + +def _import_pkcs8(encoded, passphrase): + from Crypto.IO import PKCS8 + + k = PKCS8.unwrap(encoded, passphrase) + if k[0] != oid: + raise ValueError("No PKCS#8 encoded RSA key") + return _import_keyDER(k[1], passphrase) + + +def _import_keyDER(extern_key, passphrase): + """Import an RSA key (public or private half), encoded in DER form.""" + + decodings = (_import_pkcs1_private, + _import_pkcs1_public, + _import_subjectPublicKeyInfo, + _import_x509_cert, + _import_pkcs8) + + for decoding in decodings: + try: + return decoding(extern_key, passphrase) + except ValueError: + pass + + raise ValueError("RSA key format is not supported") + + +def _import_openssh_private_rsa(data, password): + + from ._openssh import (import_openssh_private_generic, + read_bytes, read_string, check_padding) + + ssh_name, decrypted = import_openssh_private_generic(data, password) + + if ssh_name != "ssh-rsa": + raise ValueError("This SSH key is not RSA") + + n, decrypted = read_bytes(decrypted) + e, decrypted = read_bytes(decrypted) + d, decrypted = read_bytes(decrypted) + iqmp, decrypted = read_bytes(decrypted) + p, decrypted = read_bytes(decrypted) + q, decrypted = read_bytes(decrypted) + + _, padded = read_string(decrypted) # Comment + check_padding(padded) + + build = [Integer.from_bytes(x) for x in (n, e, d, q, p, iqmp)] + return construct(build) + + +def import_key(extern_key, passphrase=None): + """Import an RSA key (public or private). + + Args: + extern_key (string or byte string): + The RSA key to import. + + The following formats are supported for an RSA **public key**: + + - X.509 certificate (binary or PEM format) + - X.509 ``subjectPublicKeyInfo`` DER SEQUENCE (binary or PEM + encoding) + - `PKCS#1`_ ``RSAPublicKey`` DER SEQUENCE (binary or PEM encoding) + - An OpenSSH line (e.g. the content of ``~/.ssh/id_ecdsa``, ASCII) + + The following formats are supported for an RSA **private key**: + + - PKCS#1 ``RSAPrivateKey`` DER SEQUENCE (binary or PEM encoding) + - `PKCS#8`_ ``PrivateKeyInfo`` or ``EncryptedPrivateKeyInfo`` + DER SEQUENCE (binary or PEM encoding) + - OpenSSH (text format, introduced in `OpenSSH 6.5`_) + + For details about the PEM encoding, see `RFC1421`_/`RFC1423`_. + + passphrase (string or byte string): + For private keys only, the pass phrase that encrypts the key. + + Returns: An RSA key object (:class:`RsaKey`). + + Raises: + ValueError/IndexError/TypeError: + When the given key cannot be parsed (possibly because the pass + phrase is wrong). + + .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt + .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt + .. _`PKCS#1`: http://www.ietf.org/rfc/rfc3447.txt + .. _`PKCS#8`: http://www.ietf.org/rfc/rfc5208.txt + .. _`OpenSSH 6.5`: https://flak.tedunangst.com/post/new-openssh-key-format-and-bcrypt-pbkdf + """ + + from Crypto.IO import PEM + + extern_key = tobytes(extern_key) + if passphrase is not None: + passphrase = tobytes(passphrase) + + if extern_key.startswith(b'-----BEGIN OPENSSH PRIVATE KEY'): + text_encoded = tostr(extern_key) + openssh_encoded, marker, enc_flag = PEM.decode(text_encoded, passphrase) + result = _import_openssh_private_rsa(openssh_encoded, passphrase) + return result + + if extern_key.startswith(b'-----'): + # This is probably a PEM encoded key. + (der, marker, enc_flag) = PEM.decode(tostr(extern_key), passphrase) + if enc_flag: + passphrase = None + return _import_keyDER(der, passphrase) + + if extern_key.startswith(b'ssh-rsa '): + # This is probably an OpenSSH key + keystring = binascii.a2b_base64(extern_key.split(b' ')[1]) + keyparts = [] + while len(keystring) > 4: + length = struct.unpack(">I", keystring[:4])[0] + keyparts.append(keystring[4:4 + length]) + keystring = keystring[4 + length:] + e = Integer.from_bytes(keyparts[1]) + n = Integer.from_bytes(keyparts[2]) + return construct([n, e]) + + if len(extern_key) > 0 and bord(extern_key[0]) == 0x30: + # This is probably a DER encoded key + return _import_keyDER(extern_key, passphrase) + + raise ValueError("RSA key format is not supported") + + +# Backward compatibility +importKey = import_key + +#: `Object ID`_ for the RSA encryption algorithm. This OID often indicates +#: a generic RSA key, even when such key will be actually used for digital +#: signatures. +#: +#: .. _`Object ID`: http://www.alvestrand.no/objectid/1.2.840.113549.1.1.1.html +oid = "1.2.840.113549.1.1.1" diff --git a/server/www/packages/packages-linux/x64/Crypto/PublicKey/__init__.py b/server/www/packages/packages-linux/x64/Crypto/PublicKey/__init__.py new file mode 100644 index 0000000..c9ff59b --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/PublicKey/__init__.py @@ -0,0 +1,95 @@ +# -*- 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 Crypto.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, secret_key, params=None): + + if params is None: + params = DerNull() + + spki = DerSequence([ + DerSequence([ + DerObjectId(algo_oid), + params]), + DerBitString(secret_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/server/www/packages/packages-linux/x64/Crypto/PublicKey/_ec_ws.abi3.so b/server/www/packages/packages-linux/x64/Crypto/PublicKey/_ec_ws.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..292bd4eb89a2b185a0e1033fe5d90f929f2c4360 GIT binary patch literal 1019608 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 z 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

    JWQwTf=93*L*5?2 z;6OT3pgoC{b`Hy+{q!;Sd0|Q=eo3(1Ck5r-$Y*FPKj!N=a~RwfrmR3py^d$h)sm9W zORK<!iFn}uOJ|+(hd|`h_cz(&dzqhktwrzIbZs~+++RB_4)hz$CKWy5iV^uP zk87IoeMIT<~BBu+!Y-021`aEa`_8RJlU11 zK%yTIL5G^dP`P&mFD>ax$m4-$>i*P*>`4D}VD`2dCcAO^P?WIk5|4{IO&(q3u!(_! zLt&EOD%uLOn>H5i8|GXfcVzb!qNVzSAlgk*Is+zm=Un70&dha<%+I>dUB7IhwR6AD zZbVV3(vV5%?KSHMQD;P6#lM;34l>ax6?z%UGAiha4?&YqRP`m~c(9!Ha+0~8rShFG z5SSt$R`xoi!y(BVJDMgxrdMmv+^l*m*i<=H&s}+5SOW@;i(k-zjAEXCC96pX8ZN%q zLU79#a z;yo|2kWEaaJ%Btmn3bL2kOS&p>8Tg*Fzwt@#QT#N%#$Z%32PeqS43%~{OX2&yA4B0 zjfkAJ?!|}`Pl?gb*!MuRgm%<4r-3xaV9CgI4J+l5 z=SYA#I&wJ0*RA#s>NpIx%4HC+wT4{E3^sgOB#ZWM8parynFzqAhKJNJ;-)YQg?ERQ z$^1;hAS*<}WadLUX^(wODp2Am!JHCgGsl`$)l`|ftgiD=ZfPk38}ZjfqIYeZK~hVJ zJ0U�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

    HO5W7NXi`CWa44ucO9-n5fU? z75coJ0`TNZS&o2)LDm5S%GgFl=HFlK(?03-5$kgFMQq;xSAjWOzn=~kTg6zo1O0K`FNy)f* zLJ*LCfAH~nnL@1FDo~U%vn=H}pUQS9O20FbnCVQrcrFqeXAO2$ETzF@4#)5FIg#IS zQGcLzfAcmwml$el_z#X1z)3Ob2;dIFGl7ec*x1ZP@D48#*UE+Jh5NKk*rjX6M}Q7t zBCmUFL#g!RZ8Xlv9bH36Myw`h-E`MmOZon#XWgYmKMRdt-XK6qbnlQ8MV+ny_ED6S zyfNsSgq9C_zk)Rj*{$2kJ6m@RH(axRa2}}Wh37mVhEmN);J`%FA1R15DFygpzgV1p& zWN!EZsLWiF)dej!&~?SyYd<&}tM<1y%6mITPDQ5=mQkK`3YHX|wB7bAqb_s|Lo6Oq zFoP>y`+eNnUtzUT~TAX55GSSlClpXBOM5zWw%M zMUx84;ca^I-}U@;hg;qL%lc~weQbFc%b`s!BUPRM%hWsWyr?MTC^`EK{v-s%u6IyCK^{Kthf$)I#%xE#-gSC=4)kv41o z!|oInmgv&dM^u&)QJnF%?LfGSg{34QR>s5#$v9C!f7f965M=Bi@NN43YuLaHY2R0& z9!jVOOD{T&@E;V`e0*^}ID0mZCFVm7reT{Ki8Y$P3}QNB^g~a`sL(Jo;AJ~(;WyQS%Ze?j`)47AqM~(J)|w;RDTEh1nRXkz6U)j`tGv8zWF<8s)!eG> z2(Ndk-$=>|R(tFAc3Y89lTfJUy~AzKrtIJo`0M){V;f_~H!sz@EQMub9X0pWN+-~v zPD0@JD3NiO5eFPqz4B-Tpndf!1h3YR{+^x#LmTUsVyG|f*%JmT3GS<)I8H;}ZyNSY zQ;MOZxt`tGWn4VuBOdmzod_fSIS%%UgBoVQO@vG9U@;mlvoEcSa(2v4jtA?~rpuzj zKkN9y^vNyjP?&1TKB46}sT?tVq8yP&dP!@GCQMNtMq1!5Ta|nFg_?tlC5XKggzu68 z(sH7#S3{@eu*C$RbWsJQQQWuy`sVgJH>9~Lq$g*bxR!w{ht_>FDemEWxlEV3c zXP>+nV>G&+PSMlhm_4*Z?R%F!8hr!Sp`1|LcbASS;!pfHdJfCvfcBaYv)q;GQ`LZ8 zXhx|AGqpL%vtRa&T}~?u7G{^Io2Xke7LWR{=U_%$7`G~GMygc>5HITfqK7s4W!Du3+~=@^|!A9Qz! z1Kh%QhK1zu={Gtd>t8Z%sEpW`)|1us5dLXHUCou1IoIKM!>@_~rjImJ_3keG2s_^L zOF|`D618U(?G2|%mBtA`#5n`kvmhdQ$6>&ggWY)f8#jdq?nId;@27!wYcPi0B~rM_ zw1La`o<)^iEe=n3yxqT}K+}B`7SY|RmxKwTM%rYp%nS<|O34n5yZ0vRBW`A_GDMn1 zk$4!qCye=Y?FilN6UpLx$|IWfDGFd#Nc_pc7aVfTd74CP>b}^2=hn0DOug z^zr!tGV;5BoG9G$iK^M2p9Bt~!&-R>vMCaT06f}qk?G>DDaXjpU4+q}8i5XQq8i7+ zX>cfIwW;6-wCU!{T7g_@0qBEvP;&F)x}{qG;!Gw#`7>w-Eb8ZOVj<9qSfUsoNs-a~ zEN!WOne8IS;Zbt%e!C}{(umHPrSKJ{;0-QL=pf`etvDkFv*2lQ5NNWzrb_XUbXm00 zH56J^TKe?mp`Au5d06tKON5?Y z2drzjvJ+R0Zkg_0p?W1L5}gs*OJUEwiT&Mk`0J8mRc8z`X2&*ZE8S9S_??0Jmi)Tz zyNuDnxc_T1Of5sKX;sJ5v$9qNcWkriK3^uE^b!&uC~sg|FEeO(c&Ty}>qw;NA_Xfc&vl=;jrG z>N%Eu=-VJ03OD~UchYk)K+g1dJs+Z(Lr=Ausg#^Zmb;{1lH6+9MfC1Y)*+YbrFW&RL&_A z0C)eg(lOo$p$znk)y$MiV66pfi2I0ERmMA(6-k7d4nAYH>PVMI#GVo5{qZBQ0NDwl z8-NeeIlR_%sk1&F%=rt_&h(>@pYhn#)J>mDu+VN7Tr2J{0ug|ba#s}G7=-ke{wZx~ zr{ZKz(e?vJ-Hx=<;$j~To!vaj=FW=N3rXXvVCAHWf45gTN+iV;Dl(hx9fD00iJL8o zOHaD8$>&=i>9J|`b?6#9MHw_i^|P*b#`^X0CCiTa$>sLncRv6kLZ%61d5TTzUUfXn zX}>;8o(9UJzPI))-35>Xo2r<-8`jU0)E``in>3YaUMa(bc?XVfVffqNB1xz~mgLC( zubsHT+BUBX!4tPY$m+w|gGYo9j9Y8ZI~ecommu>eR5fx646t)AP@%Zb2Y;z?P^eD& z#?qwE^aFZS5k#p>IT;Ve-EYfbzXh1pObrSX$O;`!m9jzj?spnyssH(q|9>1Tt1Rvj zf#pl|&O7)yl9`|JZGX-N>QzJMLo~#L_boz6A~F38&~U(8qj$XSVuA@fB=V^_0jWV_ zqO=(lKLWe^7NF_0;iy#O6%kEipy?enV2{6aC?6B2!?LmAXS7LM3iy1=UW`IDmAm_m zCd?8;`>Qf@@R|0QxAPrFtAj7%*?<0%*KB6&xW!4eNHfPNqLMxIp|C{0x=2E!`)(=f zwiZVv`_DqZ)k0iF{Lc2w99i;>IkOdjJ&N)EUh_DaEkPD28zafQXH{GR8Kaj<2YA$?QOQZJbs_0PB9 z+pNhCxsys-UoC4Pa1}xCojnUn8NMZ2fvJ*;&B3Ph%P?2Gs)Tb6QKhOSmH%*uWM17T zJJDi}qh{qEs*nrHBTxXjiccvH!0B5`dVJipt9hxUSJo50NSDXi2E(mr-w7KbT9C#B z{m;x^d$q=p7~@tB?JGwIC(8{|fpW`i=)+M~u+4wZptowEH2g#>b>ZLEM`A71ya;2n z8ZuQk%ENTtwId!vh?)dQVB_$eP~6KQNRogq``yv6LiN8ck21YqU^XBewn2p_O$P+Z__Ul~0^jf4# z+5-ZPM7R@P?ndL_<@O)gMA(CzlDrN@5u3ytUa@uVwJT2>P~7?JEfg%uX=Db8zS@3> z5K!y4xmB&I?B(i7-Be3KYwBrPL+_c$$W7!6Rb-=~E}Y9DboLQ4B}RD`1<3X`bF15R z^H>%)fHhB?1KH~?z)Jp2HGbSX@}nb26N|RD@#MMla+H7VIX`xaU4}zDVk-P+@H=Lr zF?RKf1q@6u=T0PUoogrfhKWHnVTIOf%=J;S4ujp3^T3{?ER0XTNdT3!m@)`=D^044 zB!75hb3B&`r>Y1r>*lDd09le$m7Eptl*T77bcwy)LcHG7I@sGOJT!X@oI1CpJ>6!P z(1V`GxC2{$K;tjy2}@Ysv_4F&)49OxxIpU($|cgOBKVJ}>9B_-%z%wwo^4)!`Sza{XT*tx0ogwp~;cvgh^)71vf_IaZy8RV!L^(9#cp2E_u4iwBEBM%J#3i)JJ zJ@gk)AX<~H+?|NU);d0OXzKh121z$oNPHbAVbBwN1D&xn~&D@HINrDc$9o z995*Hl*nngr2>A^(w3FZLfOP;RpE*5REUFc2zu)3e;#k&_yd%DlY#Yam|r|1RsGhO z<>FP2m<;kI$WKPlx7%qemB3JGtJCLd8kiXAbSd>0gi~5v_q+5zLD33V3Bb~b??C-c z2RPk-q>AFuFJq)KHsyIsK{$8u63t6gGQsWOSxXN}xhdN-tHC({%g7BMY~R*=@Ieh2^W9@KLe? zuz}X~n>OGHdFtp{k0|wzhS)1`nq7nWKN?U*x={C~2NK_>tGw5>)(%iE^0fEz2tbG8 z50qPyF1?+i1N&%JCLn^t30mbTSE_)Kreg$3DQHp=kheg7PJxw?G&0buI-!ZhRNjfh zBZbnDocKGN-oj;8Ij@~F!`=#g_tTnvA=v~hqD)et7qpX}U49Q0w!)(w4ubo3rm~R9 zn7RkM1-$_<<*Nc-NmYAfHbGTlUoy!mR|#j7|7>)gE%v>Q?TAdNlh0W{{_++d)@AT7 zM5TP6M9f3m1}}64qD+)VqIsd;Jh4DY2! zNXh5(pYJ@4*_eC5i#NrNH+Q}zrm%IFev-=icsZ&Lr$v<98qfadl$aki_zbgFJkbAw zG5Ae+orO67aiw}xOn~T|&miele?1is;cuGH|7W!;{qAm%&k&q6nj{%UH#wzRvlb@I zMBz=OCv)|13gIp5(xCA{YFm!&#>cd+o(c~Tyd%tU-LUYVFS}@?u$U0+H`Dpuh}ul$ zfF(XI*urvz=-SqBbVriM(0h%VT{8tO2lrQFk$m-pk?+djMJA_=CO@^B?ir9c+N)op zuGZSaCL|R>pWKFjKcv(t!`Bkyh!gW*8U~MjzAdB-4vq3DcpKQ0X{K$&iHNVlZh>sa z{{C>oA1|+?7DEeY)_3|KA zU=>+#SLNSEnwmXI_P0UkyCC=;gd}6`*`Pamy0l~k+1NY89cTz&U9iM>6JlXAlDX1R zAkJ{@gvbKqHf#3O||>z{)kkJ5RK`e5H=~g~d9W5Sa{^ zfcNm`k7`k=+Z9Oc-l;YZTVuMVUMiyWziYqzbU&B3{JGGdImX`@hxxQJ5b}|4%Qs6` zrF{t5BEVu>2Qbf!t%5M>pc0Fw_j@c{L9k;7xiM**wb?&(qE>*m3A@-`x90pQ~Xg*CQL(tj}z0<=k@nXNhGp zGPtjWlN~}l#=~zdRXv`Z0wTgBYk{o;#|}!Q&;HiqHbLnEX+LOjP248MFV8Y_uChj5 z2Lx{jfB||Ai2LQjraByihRzK+mH{VbNS}>%-*dYsBsHScv{2h`G!#u+Atn+S1gw93 zMaUXeUZBv-jURA{*?JcONVwy}#Ua|6c@~EoQ9o-{2(8)iUa5Tl zukIE)@&Z7cONL2{DHx&mP<{|g3gl|+H%2bvv-qsq)G&lpF8<_m$@5Mo_Igsog)pEG z!}!ZXgS+N@u69izjfo!AA+h5eo@Mz#wNvg3kjFnzjUrsU;cPqQfaftRTpG{TcG+1 zq%lS2kFZOE53~n=2ra3MJfNyKpVfkD4QL4@u4JJkb2PPd3ej6tbiE3gAblug^c}nk zhvKzznCbK+jhm5txL-PX#R8H4$U+w2g zn09T&Nk*^tQ6q-CI(INXQH1op+fZ%y?jC-K2Fka|Pp#T?;G_K2zV}b``gzE2F5bV9 z-GQ+#i@!uzdhoUTdm`IQX!mr`4Y4iI`9nGVvc7Us3oaCkLu>Hc`ejeLr-5wef`^Uo zW`;m^z}?*ZaV(Q~*V3QjHoA7H?WsyOx4vGz1&S|Y2zQ=cDz&=*-Z4~R2^n3!qgIzf zvFoz?)XLPP57$7-v9D>Gxm#NQz+u)GhcjiRkW%tw!L*uLw+j8&GDd>>sicXK&L%l` znIvs&b!NyL@`b6V0QK2ZP?&;SQ$W&pUR8IA00fNZ@RC* zz8b9lASnv8;mJW^B9~tO$E!dWm8S`ibm&Ql(#PajI8W281~mg? z2&~nenN+f!*nQp3Xibv4`XGDC8;>6}V!x2!epp;pB>J`>*bQCoxln54*ZFrs23LzGyY^SqOrbq&*wkB&~#z)(5nIdTrgYz;` zK(|9^-v8-54(PnLw9P|BEn(QaWhlx1#bJMwzLPDEeCY2!>y@Oc| z&2zA_j^bd$IR1Z}ol|pQ-4;b-qhs5)ZQHhO+qP{x>Dabyb!_|QCwz6^_kKE6r)I6S z=NOE9f&^C)8D9+?CqKn5q7=u{^oErmNa3^OIyl(ZWRYunmtL*{|x6Ve_l-^9kx#LiLPby_2Pv-g6n zwBVFjSPco~d`IHQ2b2i!{^4 z`;Wi{U@Mk3`D1i1H}Gg9&B~|C`TlUVaw61+PJ#HSCu|4Si%*L;zooq7^R2%`QkcT{=9RFfX?zk(EM;ep;J9Y`_pjseDD)T2Ut}F7kH8YoQF2@jx%8DmeZ&R zq5EJa+#L~T#}aC1(7$D?F{!&`@KlDNFy6bn<}fBX5n)+0^c$!4_V`A52CYspy&fb` zHr>IqamcgDgee;eE?QZHcBaxl1JT3|*r}nhKuZlDrXL&0vzcL0ttdi$~g35IuUwAXmxFp%2Y~!627q z*Q|yQHVzU%WCVitoWIqxA@IpfPyJOv0kbt&>vEwHO661|7J+3o3#9mJni`&NCEKAR zd;Ili+z<++%_1le8UeHD4z&p4EFFmbS!w6ZaP8)AG`(g8LCM-i$o_iN<=$+Iwa$@KMJKM-;n7H6E(KA&URT+rB&$Dr{BKJ>mJ0uR; z-)XYaD*bu4i{q`j6%M7)$f!>5P~w| z%!dqX?%2xEkXHqZz-hI)$0dThj@fkL)di}Si}#8_*3KZ#8JiLvkn~b{RPE5`7cKF_ zl4M&QxIyGKpGgqHM+d?zo)o%{q(L{kQ5nfLdDs1QwEiagw3+7T2IsV39WOY!?si{% zxAl(==~`0hdHTUvJ=ddC0f{3T91B*9Ni^?MgrtfaPA1&ljgY67H+#6EVNySUuI7AS z;1v$k_KwWjs+B8(+iEu`6QZC#t$7CfJW=*pkhTgUmWuX&Q}1K|^kJU_3lL7(e1M>n z7d-DaTC^;9;T1Jj1{~y^y9*@f$t$(5U0A0n&qD}r2ug|DJ6r;@-u|>t{nLuMy2BK{ zO~4OhIqKpgEnGsNJ5?C85@+67_+cw8tY@PRS_e0sX)oRsx3i%99-DhG%j{r9#u8nP zn>=lo@3u`Clt|-&qOLLdVrIqi6Zq&aLGKQA7=9spQht z-*^!BncF6uP(JR#wa=<;NW@YjmcLlABL^6JA_;q4KL_@2==`CHcp#u#;Jx}(U+9F5 z7>qq}q)`NMdS@?YCbS#;mx9@IL=6^0$`euv`Bg`WDoN_RCM|I)l0*AKj9cw=E?Q)6H`wx2^ehgw9news@x&{yUsAfVETQ*a<0aq)4Q#2hh z&Xk*ENmIe0h}|%>Njuf*u5K2)ler$#=^BZvVhb8`FKgSgy$*%*qf}=>62mcPXUqIrc2%$k%Oh(h?)H|B)?R5 z6Sz<`vFG(#X09F&{bx0>djm(DT$-@1|^ zz5`{{s%G5#Nt!amu9Wi^x@r-X@7v$EP~C#pobL;maD6ojq`6WtvediJA~baq1H`+5 z7vU;;`LX-$9BhEjL48K>A7AZe_B@6IRz#oo??r`@zJh`*D)NS&aL2;jiqmiK_gpaS zvu}I#mQe|{_mP=8yRxmGgJC1-hP&6I!AO^6)ds9e+rFHZ3JN9{cIt|BExp)xLs2U3 zFHt+Ikr9x~0s%V*PwWN_w>o-|3D3u+hGFa%c#Jbdz4)?ygx`uah`1} z3}88V;eop}1*wuUgD=UjHjnkgNm>1+hRVl_{c9%Je|g22)!0TwU)}`wAN)bEZoXWC z!HjIrorgv#np`FB+AMXUjk=>4v38k&WWUeqI_5aHRwnFrytSM?kx9*u5x~)`o zPq0);sUjidM|Z!5rM1XVbEImCei)JN5zUB0a!tCTbrqnWVzS@KTE`?ML|!gQ=DBc< zi5Lm^Nf)0SnSmIa?+=7OOLvi2Ke%Xn`4h(`eHJ1i7KC_RmBaneu`mWOyS zP5_~nppf4F!M8|Q`FlUaQ|XL2HxKg4w>tIBUkv}J(7O=g*mV?U-PdJ`ZHP>~RVsX_ zmP~R`GEgKQrn1A}W$|s%GF-p5WPOg6Ltr~U=(cxR`MYe^9$zY2;1i7~LQqU*t3X4E zwC_M1F|Y=ofcsRofE0!_g3K!l#D(m;W!b^k$S`j2VHqhgxS=*rvz#U}lFlIY#=s3k zt(eObsO$#9l@LT^w#IA{+5U!Jsn%0-SREGB?Dc8VDSDyvw7I?(I zWmaTelEGOUF(>b~N+K#6EAuoTc8ND09ZVb4XPLXWs%d`>>_Y%7fYc(sPcuVe!z*wM z99781R(FiV(dKqJLuaW`#_Wj1I#Wlle=DXfR!Y#3BM$v)AW(TBOYrIyU_#c+Z1!Z< zG+c|M$Hbt?BMjWzz8V%)e9O{KYcpANwRl2-TWblan8+%~txZCz_8=~BO`n0qm|WyS zn>u${i;=;+FWjV8<`a51-GhTUU$8EUAQaHeMYPVgG)#c?On+81cyatdp1bc->R0bh z@OL~5GT>suJtrQ5h0Wlww>=VrsNfbgXBo0xZhGh1;wB-kxPVXl_qRBi=m*Tf{^-Mb z;hav~?2;lS{ZjQ?bE>vO%(M&&cJ>xe!!O-O&swyn1MY)-Q+@&J0 zzm8)~u5V>g-|4YOzYTbX$?_U)#k|<;Zq5BR{rv72 zGzT7glKqV^d%WmyaEj$$J)7gK>F0-*GvF+0cW>pXe`A_3yZ!-Mu`Dp`ZAgAb{<9SQ zb0nO7C9uoFb(+yVibzdn;PIvD-+Urzc_A?cm*6?{s4a6kdAXZ%v6^-ii{1JlbaZJa ztym{UVz>LO0X}}CmFAP$M$3kPhWTfeZf_zzF`ewUm{Ox*UJMFnvlm+PNc4jANtIQ4wb7jaJa z9M8QkH4gv!m|FOO8c8$hWcMl2D0{()GuLZq=mWpHc#=M=L^{=`(Hg4R$q&4nV;C59 zKT|YtpvVJH|5zwi>TCxqS|#REkq@7(yVO(08t3LSDkbgs)(Gb-y%tX(A@so>s$H#c zxpAErUdTTm+&+86Gtxo!is(=bq^ek}1b^+ItYf_(0EN=vaj0B<(1e3aNsHJqOrodz z{Df1xpcnL6Qk-xd)QXV%b|QAZw88DH?y!y7^9w=>yrH1WwZ6X55eB~#4x9C>1{sVP zyb_(W?hlr#8b#KRerNj{@$4LVTrey1GRjjqg<9%8>)D89fsKBS)JUh%@~MR02DG+p zd?q*5!Gq``$!MvP9oFG>?PR4%sNt0S-fmi{NTNWX1zKaLv6Ks2z-|O=;L^+JZO70E zu9UtmaV6~>ADCZ3J2X}KQTs@#kuTIF^6~&Vc`>eMlHCNv#4H7AgIl~AT}g`rXlF%Q zX2Q;r60U&GEcj#?^;xc0%Hkx@1YpcX<2K%1IFIb6%|dU-n~(7h!0rcCzqkx}P$~&@5Z19!vo;MQO1A#^ zQC&|Z8n)Fy7+gZp|jHu7A>7}1?{!*~Z)AB-}k{Pi_hFAOv^;Yek zDu(xI#pr9tfoteCMai7iMufDLIHbZrR%(oPNB%69ZS0#CuH7Pc)xM7RG7;!1GXCZL zZnzxlz-MZ;2a;PuE}8G_mm==1H=Qe*q)?{(+l>Xv=%MK}g&D=ZPV3$vipM&!UqJsn z6nf-0@&A@0=I{+Di+3Z{r_n=g$1av$E)7;?lf1K`(SzZ)joc|}zvOGU2=!gd`*kfaOuHOGiB9;Y`u{)UV zw~7F!cRsMt$;Vui(^jPLaU_Ai*eH^kKkcMbmY2I5?bnjH%7)&F*<0hpYaXY|;GQ2^ zfO!;GIA9sNIgUwyeM0qZJ8NY zCS`$SUCnIJXK{@ef*XBSG|Z33k9zwG7aK|lML04rnMC2QB!@W$qWiYBJ5i-_H9C-- zCyXkI_%Yqb2-i>UaKR7K+V)xc6`rrdMCbT6qxxv<-@+96%l2(2xrl43FW97(E855M zCiUM5S6tqS=pksCN%;8F@y#c?X3qkO-ECUv$ZL1HGP=YGMdKlc=u-3yrsrv_lmHi@ z*iuz}>FT+Vr6r9U^iW0I^4i5Ryj_C;A8yn8u)sJ!knoH;Fs`gnwKB2Lfx7|BiT3bQ z)`pdSi0h#9Y>oB`Azj_Q`|BNBiqBPiWv=VH<_Xv1nY3x=FarWr4$9PB92eh6PQ0AC zo{$LrqLxrq`1ZL3vXJJ=M#1+3xX3FHfUHxIIQPNKa9GWEhYPy5oW-Zq#3cfqQB({y$z?j!bkTU)%xcY7aeRa^%Nj$|Do;_8#NpDCx?x%=Pqqp za@!f?9A`~Ra9{5pnBTXN9$xk1r%jqrR<;;iw1y8T+LDu>Spy(X$M^q?_5b-Ahy2nE z%oWigQW;c*8T1T@Z0yP@7#(D`4z2T?rpnV=;_f0qugm;FRjq>@ie5=H4hM~~BaQ2P zx9L#rz~UEd*?oYa^kgM9=P@v=eX*7i#q75PPC!Mn!Go13Ev;!#o2-c;i zCIphh!CafDXQ>a;lzWuLXM~hUQc@(z&VK2=MXWgL2?)9#OK%ejkczc;Kdp9s2_zhs znBrX`++mIs6x0b>(!>&^Q4%sNGip>e8-ekRH+i|Ttg9vS!^)+E+CNZ%J2CSkh-Z11 zmd5NETCmy2mx4Qy$VD=0gv^F%4Cv$FMwdlaP~#3*k$^JRdrkeXyZ^So6@I~ZcL9hg+BD$2;ZQc2UlgpHF5-~3 zS)bQ!&Wr_~&QCb1uKJ%%U9ZjSw0_2=+vxIEC>Bk?Z7e5zZ9YOH<)8vRJ_}-hhW*4t zTqk8fsPo$0aA3{-908@=vBU}z?(!8%OnH)hc%Y8LEs*V{*ACeT4HZ{;_4eo`s_`9v z$e5P5)r`U%69hO)gvqlTC3Fbxyrw=lkvR^dQ@Z zO&MLw0wt6q7_CoPQSd5O<{{L@%wvQ`j@K#Fyh{`kaLX-V6X!`=a4hW+7e}h#zfdkL z!`Cw}IwVgs*bY9aiIWft;2&Jm{ApO1k+3kw5JtI}2C6Z+mPKt-NawG?g^+6bKi8gm zY;tP)vU7qG0L|iiXGmHhkl8JzX8gX+@fJ~1DW(_HMu7zdmKZCLwX49gzEBgDK7`TF< zBB7{O%PgNuyV`?{^UA2n>p6epVplF&6JZPFJvD&Urf5oEXEbswQ{t59Lo>@-->rq|H}ZWD_iae z+yUT%a=9M!i4D>+ur3usStY&XB^PivEbD=IPp6@;A!`fDB%S*@>_(*1BP?yA2V|eM z0}+b98pPywI-iHAw3oTFe}%^7U~WU_F?Kxh3VvMPf5>;bnj;F7sOaoyLcX11vapZ4 zWjo3g8pr~PdEI*y`a4T!j`-0Jr5lHxo+lIba-QQ>*RZflne8%AzERWTnK?8wK}?`h z11XAH12?ps4K}Z40EN*TssP3!pPEETIAv>2(Y@nU`5og;QUJ*c&` zuZ3sQ+U)-f;|GOL0+Q0BAJL2mi=WgWB2h5^1+*qQN5%`cdW9%^7i0-B)o;r|K}vPv zkJ9gS^|s03JVvenQ$fFbp>u=WlLrT64PBov0ccqggE|s9?9nY_IYJu?%@lkI<=@Mu z&cq8$jk#`P_pN|ZaRILl#N57OZV-7Idr9^)3&r?luFuu9#W+7YC zXiUI(4+y~(TK#g2uq$4Q1}gt&-hA@Pvo{;4$&Kw0oK$Dq62H{)9do=G4yCqp)>LkT zRR=op16?f;#W=HPiaL{)ShT}oLegd%d@U7667JzjR*b}M=uKep;5 zaDmtE62 zEF+P>)@)#a+-33~vm8Sp4dkeh8Pk4=8^2#4(*S>oFC}Z~a=%5i`-(5 zBToCYg7x!zY?3f7YI2&YUEM5_KI+I@%5HZ`@;g|tAMB)na$hMo5vOZ}wy$99cargz zOIPIIO+m8m_se>RT_ze#^a zLi3e!(r8V46MDm+)Be}?7(S>nY;;}%^%HsHN)ld^MvH{Fh+*aRe4T-)IBeaP!%y&waCL#9 zIUQED>^p`h2WaRpZa@lOYuT@43rgP23+a2P%-9bg>B~rL{F9t)D2! z+ejHSVi2rJi0K(u$|&8`;EAhc`M0vrK>osOdVcMLCapcN?m}A*P?2_%GslT*WsP)7 z6}erCTqPxjJWE0!e_edA&dn4X<6!Sl1Z)Kp9v!m8W0_cD;im;JNTYt9&@iEkf@6UM!7Cc2x}N`RYX8ycUG? z{Myw9tZ4MO6qBTa+Zt^+Ea-_(kefJNNivv^_2w>LLH7>qX5TY+qg(A^=)9pEQ!H}I zy8zMvD-S;PTsV9~!BjM=iXJTvfK64k{-)55z@>9tZ?U6AW}f|^&ErmCrpU~c+T#uu zTOW_=+Xa>SsyT1K=o6P@!}Sj87qwOrI~ARXB;w;u7uQ&&B*MPo>nLrKVWUBS>o9L< z?g7u&q@A*6LcMG~DdTnH^V<>MSA+Q_^fEpHqVP~DUOgpveL`Bskvq*QBuVwXzrY}8 z*-r+hr!u99Sn}*IU<3;wUv^axuZ$G;W)wuWQ^hg%qQ(!o+i_A|3NW}2wv(r6<}gIe zt*!W(OzTR zB2*OS=r+N&b7+VEbCCZ(4;r3X+E~XYP6w=kr=zF_8KPip;ki>-z~UO@kVa$9i9pqx zq}tmf8SjiC0LOpI;Zt&ES?jNq^j79|bb z!y-?ZUb!^v0uz>{=o06(FLgnMimyFu+;owf5_>B%%W%0C0sqEgRPi31_mk}&hl79_Tzyb)jve~`vSsU&Ht)<|!v@BQ@?dD;P6 z9ST^VK4jEuy(``owFc~Np&Z-D$hW}U`~}(KHR8l5Zm&G2L%2Dj;ZAxOigqkqiVDMVH* zoB>2(wdr#~u+@gv&FC;@JdmKE#)W$~0Ow#41dp>+uZd5{#|N`P5HhyCk4p`qmv5BS z9?x_IhJ$E1yt34B8dXq)=d|w|Dc|9j2h%*oH0YS6&LzC+<}CO$56n3WaHM&Z)0d+) zfE_c4MF`-m&4T*Kj@31|8lwktIUnSKv8_276v?C9CxzbBTs_*?mOJUQx)RI{Z@A*8 zW2C^Co|91*1 zFj*7iEC|u0V;}U;dmmN7^>X$P9|+Sxq=IT+ZM{ttyU*dFp}I9KT;v}x^E>nw`%5Z0 z{zBMD6r?U~xSl5g%q7yrV}V;8N!%H$8pdb&zfgEXe9VU|$nbWYt?a0b^#^8h5HVhL zn}>+ye3CT`k!hR?5Zo%3A$NvcnIqd1a*!&_z?me845OJ@64KTgv-t?BU04x9;@?2w z=di*=i>{5oLkdR$z)mc1tr0kiLMlb2gz8!+FIXD{ z>5j*nJgbM{J9y3u(%%qKd@c;$)To0Szpe=|A8u`sKsBq-mbp?_6Hy|yjGKC3h6itL zAfV_XV~nBr_F=`$u`yOvWrHHrTYtSDhl<=$+3E+dZybS$h$ti~PP~!U6QA63a3izY zjQzGGm}C*zrsyYJxJ+y$-HG27q6a?l>e-K;vwc% z>z$$fHjkqex6(^XI?7f)lcg|tK*i%|ce2Ks$n8dofT-G}@=E>20hua>gr^d&EKbJU zG6Rg-O~DC|9>q1mG$4CCaT{!XK&S(jd(sTnAey)umL<#?v5@jH;jcR4O?ZxH`3JrL z`tbHTwz(Wlowlr^iCBLR&PrSPdHH+LeRhNv{=4!D8uYdKUsId28#Hf-Bo#)k739QA zI+y{gXqne|{B6(t{63whg33B1ZWqtBx%#rqK@$dR+iEiNpOq#GKrW3Gr@E%RD<1t$ z!JCSS&oR?ZiJ}wU5(Yh&aCdpOnEr&d{n8Jrm|B_2kPLVFCWhMa+NfkWmvl`E^J~zD z?Uh%lAXsZe!?cH8rmFNg1(?crLKyghur@({en!TtC}QN&X9mNSJ#6|=Jcb#-Yf>cw z4r6_v%D~B2%PNjPF6)@D^9QiwJG+iI1Zc2Q!LSgsDca-mq2r1{ znR~II5p%;}4gKH-Fc*M#+*Ih-|F}E8k}!y6K1qx(m>s`u9znmWMS|FU)(XvMKfx8< zH$u*(C6Mpdr)Qw#*}{Iz{V9RHA=Yu5WP;N9Ia{5%1c9cl91#J1IA@`qQV1v1wk@UO`a3sbZk z7F174o$SEqA;AMHAbMlB)G&l{vn50Iji}f$I*v{3AifpB>sdB*&zF_J+&o@bZLw*Y zU*m*l)!!-3E^P#F-njwgVT>k#+!g`cWY`~qgxkD#eyr&q?n5270Z{H9XMF?bL`T}y z;YDew?|}ggQ`DZ&Dr3+m0yj%f*2YzXrFv5sniPvAHMdLx6~LgIz%T}w))GdJO(>`3 zAF|u#>A4fb>{;+eoR`d_>}IP|LhUo_JY;LG;_bv?wi?_ zqdA4%*AMGrS00$HO|ZJh`!Ois-uvn$(vAgp-k9$xoaDK(a;25A`k?ji4MFO1yF`Nc zLT78&OrcawBL};q!Ys=o6<+J^slG#XvM~9mG=6{`QmNFtm zwh&0@_!xScfRAV+3xY`n-DhUxG9JWXT2AG~x>UY$W!OAxr@(e4lUsXPp2iziY`;Jl zK$R2A*eaUjb!F6pU9yRxz>%iOlXBdTuT{lBB)o)WagZqKF0yA@A+@PPIOcf0>uOCy%+4<0hqbQ#?2Tpzt9h)vHO~s#IvdcsUGl#Zt7x)cG6kPfp26 zOk^EA$R)QvpzKBE*;LuER;`I0+h}|Xi}^@03_|wDOS7rVnoL;h-7S*3;7*Tdx}rJF zqbS@PP;%7O`62V%_8{2Hsn-iG+A5N_8#FH2yDFZVQ%=++-kE`0+G>!kA*yTlOr>LK( zugTe@2nm(dmvZoQ^K7^e7uV9&8lZHQ#~ZLj^3151Yye4K2H>2ixfs z7bL0{CvM@#zhzlu$GlL?X!uJ7-%tu*y*Bs0D2ZO#3a1D-{*4?=tmA)?8BsBCeV!`b zDfL%0n4b|zqrTt^Ieh6~9nJ-Zo3&puk=KAQwGi2UXlFkmV+_0uI$kQlw_y}{ON)Jk z9D1qo5`Kd@H^^pMt_&g5fzk$eQfbigAH@p=h;}0MnJp*xLOxu` z%YTF03tQ`m#)2me8WvQgqiG|cw&Vy%ozE53SX@0^mmk2Jq5?J5zf$rr`1j?Pf&HkP zPR>_PcpR&2&mYl}&>^Hn9a%5?w5E((2N8C4yuh70n`8I*TbSREZ(y`oqMU;Si=~Cq zm2OhjjS4&k4Ck9uV6I`cM)gMNe`R$c*s^_){>|2_m8nhz?Hf`FZ8p8UX!Ra#5|0xA zw_U#k=IR{gS<(u<>gEw((MKyD3*@6`Q^oRYt4`zpGuHp-Ylbu9SI^xx)wTfH@WNVg zCH4E{TZb|hs0ePxrT5vuG*VIZ!*)Gf1v6_Gf9NY@j!-j=F~ac0rtfrk&4p#-_Q~I~ z5`m4Ln|dVz1B7DPyw|<`g8iexTv0oG)93&4ToVSH)TZsRBkDcHsBYpIHOp&Dznmx| zif{#hhA*H-5!rg`CX#!l6LtN;q@PR3`5jfVWP_d!)#I;X6s5YOyz%iXhnVW<&#=339H==L z+7ja06iZlRggByycd}qwV?()4tkxcx`3~zhA2(t2v<;gmqo^BK4fgbQZOr7~J{Ga2y4L2vx!Wg28&Pq}-@FQiro9zP+$srmje zi1~%@J5KS>D;s!kqiB%`{ka2{{edj7rZ5GMkB z|Ct%b5Ez6XMxafIV3aed(E1s`CcH2ic_)yla4v9n3tGn7q>VAWWN2|cLqX!PZ@;oX zuws)cQ8WHy=FA3$gW)KK^fTpHE_z>I;GAwP-pt5T&>B2L;Zqs#qPpU3Z$(rBJX))M zP$8v)&Qu(~6U5?d!&*OTYb815(xxj)NZCT2G^Qj44(l-JES&vyQXly)BEV`0$1M#E z!wvKDm8{T3&5eW2SD#-I(NmV!L+&KFw(haxN$UaaUHJ8*6udnVs6dOTln)=1ngY+W z#wqTO)f2BFO&!LII?6!Wbkeb~{e}76=Uj;eZeg;2W%%c?1wPn4M0DA;K>byl z36H^2yUNgL;-YpTZVICzYR)Bgrc^P*+vnP6aKG~+Czx=JMu(k81tw*UIXYwd{VqCx z5xc$rE-+yDC!i$Lw)oyuAYwyOg&wfmlDr41BPIz87z7Muf#K` zo-ne-D$X3#E2zp5BR~aybp$wg+!_)_NM|6UVk|&BODJ?zkgF^Gd>fJh` z&%)V1g7XhfX%2cu2bGDQv6U>v+jE3WDtw_b_Ma#YPMc2--U3a7gHS2s?&wRkKN#U0 zV2QL;sm>UT@(!cEoBIKE*IePU+QL)8WcF99m02i3C7zK@!gF-Ct&V^MewJ~ag)H|} z(gj8bmby6(oy>j6f8$KNr*$T-B|I8x?OoM-(i=#6Cz3v6h#FI<1Tj@aY%E0+UXf;4 z+}-)Cg)OE8r~Puw;DXaD3t_P`-O!0Z?}b@3dT->KiVp3)lH2EI7fS5*AIWYWDQgLl z7TOo=-^;92znU;4Ak3>)Dp$uGWN!5ZyZ#&zoNo$dCC8YI_*8<21;4D9?(lHlb=l16 zBlh1ym=x$=4;yMLsZPcf?Ml^`mdJ&kBrK*bNYmK!aHDZQ73tY&XlFCBZQ~%PEV^yU z_LktZV@*Ittz)x)aW=xgck5q?2Vyi7TYO}%=cphBPFm-ypRFlF|0+y!Vh~nlPD3Pe zIw1oR0f}4k-~?>PoNe}-8Mu5}p@9^Ex)hJ7A<66tQB|i+;_|y>+{`SNqxzDUpj3mx zBx+bUNP7~p0sX4RT!Cy!#T7R=gCTEtn;SOF#YzY_Q1`>#>Bi$nMFG9mcS60Spv0fhH2^h&Wd-pg)Iq7DX0MSoMA+U- z&D-&I7f^1<)9Q+>+9YxD6XPUk`+ZW2HOhF^sbZ$_QK3opOcNuZYR)&MH= z(sPUr>&IrsKm=3CFnjh8y&cF$_SH&gdK2!o3pOaWHE5DG|C< z;|MF@=Kjhr*3 z412~K8k@3TC5sZ~D5`FkP{$J>)Dl_NgR|AS7RoZO#DzD}fp0+!jSw1)UzT9X-S;C{ zw^X=VQVW;YZaL*L{S&NAraj$|G{LA8eH@f)KBMGWr280>c2`PDJKBwtw-K*D_ZKXF zVm|&!NC59m=57d z%@$TcEfUfg7-2pEecaI7yyqb40Qb^M^F`ps1#bFcNuwCZ#39`YvLkxU=tp{7p#X~wY>>AOp)%3h!3d`T+MkSs6;Ni|m}aAi15lkh%c6+SiJPJ{90(nQjr zEgYa*v;~vCB$}S1pzpf6`6XSw?f!uuZhJkQ$PSjhPzxQS-bbDd!lcJIw27{(Fc9Be zFU=*?P|zks|Hpj1uLX+#5|lqb&iw&pKNmOyTP^Sknlx#7Chi*DCg_hxU6$r^vE>kC z6p1$j&lB6}@TKU~#WTh~6}~(3Cey-uSVyDy@;ffSq^ZqfJ4QXjpZCQ%`ZU0^4yLFS zwA43BcMo@AU8kfj7vIY{AT=FAo8FJ%?E$Xk{lBDtaFUTs*~WTVQT&8~n`b`N>p@ zyY<`?eWJ-%Mu5|HftE!B9;HnYG``Ee)o5t5>j$tzv2$Rz52ZD!UIqxmpB(wVn^%8I zvEGtP-%#w=GZQmhrV^&PLEdqf8q#m29&$OWfH+E2h`C!Z6ikiumo&IhaBBbPWbDF9 z`VRa#G-5h%({r9I%6MS3+cjB*+|P)lgPFL^*9O9E?JXTF$;*+0qJ|DS4#w=RmQJYc z@A@uY(`}-s?VSx4rHY?)G5RDScU^)8$&nA?E>SNZW?n-M5@#?)5@#sLSqkbVU{K`D zNLL&x^ZhC0L2mE}7<88s23v4k`XMAhvhg<$K0REYgpOl4rpv%Spe?fr%H?*Jwot2# zrmi5Hmw6X6I)mOm{=>y3Ze4ol-h4p92Suv_qmvQ!lGlTlEZcqMt^kq3amvX2q&naq z(0>f?t?_nIE?WwU$L7!1Ahl$BjVS%Cn@?fc6x6vVWGTc;K(Xqasl&>?iW@sfbgIk8 z2ljr7#8?7}bi&f?dE|%7?7B9tYFtOM+hOC28B`sb#DQd1m8dHDmH)J&P1^c>V{w2v zOs=AW*R_pgLVZ<`hfvY6$k~@d4S`?K!alsd0Wk!bM^$Nar;zP z3NA>)I<6JOUP|B+|Svrb3K&Bf6-hAB_pF)ft$CLsKm~t|jVeji9X((KW90VUl`kq7F0ZC=uxe zzJhchi~SghBv%Lo8e0?c;zX$3-B2;#e}zZ|+DXr53s})|Mi=Y2s4@vcjnqtf(=~OJ zSj(t3sjIeIo2suP>NYr?7ugs?n4vo|bM6|Ix!3anYw9Gdl~PiFvP@8L@)`;CBuEWID4*lKg!?55c8A0CW zZ7>WY1b)TPcre9@HOz@_K_bKLD1V1arC>|yQmUd45E?u&=|3yEdYgeZ0s0!8ug-Fu zfm3D%rtiGE9a>*3c_Oe#?0=D?EyDW1f1tkL0*|vZ&QKXLO=||YKawzoMK@>NygIL4 z0}hOWsH5IU2`v4F4AagOS|PgSf%%@zzlgzvn&b8YmeC52hp(goRw8%<^nymp1$Poa#KD&uXWyfy$UJ;5nM$f z*(qR(G6^%j59sQ|j%<*rLAaX=Lj~UeJrLpzIt=E7e=rGxM#w!Oh*b^|mS3zB z5Ql#H2L^jMn9{ji0S<)O?91q2{Tt3ef?F8%UCC`mcHnyp*UU;=!c*;UlvxYC0BYp% zF&c~iSTj>Xrvff;$Kk1d!@O~M@!H$4^eMT~t~gX=SFUKO-n;N`(^M z6{X@WX4l}O7P1Yb7NB2iI;oI%|ftyM0q493y|I8WnH7&T6`aeV|-BM`Xn zOv*ATe~qRAiEFS^F@xAn{m>~`@zZGgct0EI6#tf|%W};6Ve_-nd!?p&j%6FCjh=2F zDoar2mh`Lo-Igzf679ESDR(mBdt~1Afs>a`2Gqp@+*gJ9)GST^?o#L-J##3%6r$=` z!J1G(<1aUe2gT?wk{lN2qWM)uP!8ER}QvuTO<)#8l2ZO0R%e)Piq9=m~fX>#r0%n9#!8-i$d0v zISNsVFJ#0PwN_G5qUUy`(YCAW@$;^lHeUwpny)TfdyuNR<0xmVEITnNDAyLeDN-I$>SfcmSkNu=TAp)W?OsW-P&|n>$N9Q4c zlR{8Z+=g=QGkCkjt%mQ9fF|n#2hUuwEde9XTGTcepL2okx)|O{mTS8Xzoj%#>1ZJn zl*qdNm%D-MQ$KpwPXj0AYdR1R(Gcb-s`Q2@dn&mM;jCc)O`HGZRyU|y(|v%BA|n;@ z1BLnEI4flgT;Rx#tPI#q^i5ahdctuT!f%Qd80n`J`SXMe{tQSav`ey*6!y%}W8x|Q z_d=G9|4AAXUmytJevv-$@gn;%H4)NPj>li(?fgWdeF%_pKU@)NHbM2~%?@9YK{kYy zj-%(M{_wUCkG=bkedDjS=L&@$mrg+4au7_-{<#W@?;hTIi44f$%X zxb;eHz4XL^BG`j13pb0ja}PcU7?SrpzTcmUY$eEq`|Dop&m^z%V;c1hL`tE7d^v%q z;qdAQX}(p7CN_ex*jN#+`(ULvSPe|2Ne4}`Zsv%aP4AY_=UHFEAe-u;RRMzh z6?H9h)3vFas@RKGe^n8HO2(l8fI`y7dj`XQ}*a`zrd}x@SC#T&2T8EZq5a zqS8?=wLAA|*27^HOA-gXL`z}siC{w`ACSTW@mZZnaU%a8XXn%-jMA*pv2EM7ZQGuC z$F^JF2s)J1CTeyzf6w4o-qNysZw}%6$BQfpN-{?5Ru92y-l3AVA^i)}_-Hi&R z0jIJv*2i@21Zow_Rntx?xbmMg4`R1`sKlXi3whs53LtT_Ug*EOIW@gzmJ2%JzmL*?}_)t6F_wv5;Z3Y;+^2zFuFx=#^fpTud zL1uu`M||rb`AfApb$&OPakX(Az1-tTGaTs(`>`ACh6W3*(J%?ffzD3ikHwhFeMxf& z&bPC;7{rA7djZ|%bDUMJ6R*W9K>TpSW2Jwe(2?rIU0~=WH*dBFKdTVCaK@C>Zjxwd z?-pp26US=0L32DU(ZD+wT0%=m70e|PE1R{~*k`!I83q1e|NJYbF~R}mT%{8@yz-1E zPQI*X2yx%0qQBBLt6By5w-O+SF)hAYa)8@X+o{$gaX{ipWOqD>tKdeSyipwJC`FY- zT?Ds+^Zz|lPi)OxbTnL!zNTlEwk~8+2T_97Of#uBq7c{AmzIiQ5I{-rdeh+*&+C00 zmp;K)16x48Lj6Cn{(o+Z`rF^+b(MMtKwAhSw)SAOR@kj5#LEBz9ICf=n7Ws*ps`c6tC#VS1Bf6q}C3X=L%YdI%OPwZUwLXosX;6UcEd)X^oMf6_ zyooDieN^U7kIyCVU+!y~Y!}nF@!)wF3^tC~i;;A-i|-}1gFEHuj4tV%qfTQ$*jD%s z$ToUwQ+$ovYS}VeAo8tAoQ&~C_8x=`KaiGEFgq>ySH{uzti>IcNc`hk?3!PF89#_H zikwT)#&O~zxY^@)k3bts_FIUrqY2L51~=z z82dhh4pi7v>6(`Rj#tmLL@2*Czf$Ov9>VWaRN ztI;L(US<#M3ju_kEDyvKBd6p_-BhlB`Cl7~GnjZP3DLJQ-QgY$nADm#4|BtK9~c7p z_OO%%H?W3l* zIWgnUwHBQ>nNTxI}+^MU))QB-z04DPxZ(;y#o!F4LVDvlQW$i?v^ah`_F*GJIrPh+Ci74bM9UCW&!j3Fe3JA9kBCswaOJD*rs`oQsQ(px3W064P64SHp7j_U zF5{@n<7hyZ0JvpDmpe1~$Kg_EzbzRhSV1r)6kvFnqH<)Z(tqoy$OTwTI$JFCE{0#% zdy3SPH!u*t;V^8#5Ehi3NEnQ4{bBX|5|)1(P!0Om2kSlre&BCP-Sqt;?Q1j1w1s49O8mcUW3A}bLey&K$VTZ1=smWLtY7OdM|oflXxsb){GDLtFh38y{3 z)8Woz(#;tx2t09>fN%i2Yv?ZnU?3{*T2;;=44_NKz!Z6DTY(<$MKJV=JcIwMJ%v(k!{^Y~9>yFIhx7*@T9*JTZzinY zW}rL!IoBlH#x9A7{NA->D81Y7=qpnhGw631l@NNsh_&Fc=W-Y4S+*Si&!G0MkSg`j zK%YEcWjRuy&H z@)mL&UDsD=^&CvrRxM608)i^xKl)dtpW{91p>`unOaE9rej~?S7dlzm7mM`T%Y??U z+=X=Pows3sI%gZJXeFfo8KYQQ1xSLuoITc~_pqNnoE|cB@8cJheRlVnq+V$;40Zg_ zs5;Edk_<;5PUVnaTjRI`HJ@6SG33tL@Xr;Ua5QF6m^oozWxcREh$*CIlqVUuR_6`G zA;A!8mOVP?BQ)&V=cBf2Bo@25{&C?Y?l$v9n1xrCc)~sIB=@GtSZll6XPsHgUXffI3uc7V7iAkIM2x<{b6ag?4?7+CK7KN2jPsVrzU}`QlC`D zhQ`!}!JF+9Frb*~DUH$U0SK>*(!+pDG2DmWq^4O=^lUY0w_!;odPa&u7W@Y6fLbi) z+gyd!cOHYo7Ig$5IfQtHN{M?$5BJ%V0_f{Nkr>SgF<7(*9e+M`b+cT{;RvN6hv=4G zXOPxf6At2O(F$-6gq@(RWA3d9rs_~WV9c$(W&qEXUFUkGkx^q=H5P2O1%zg#?GLv~ zU(jYrU8S;_b84JN$m|&R+D5JPXA=mHLRG(nhl2-ZEP=Ux^vtxJyq~_PPY4P+{Y@7E zCPB@8v8fQ)VeEbP3Ay5TPx@ZodPe{ei4UMb-JTK7Ca}@#`DU-`w82ugc)>!NDpDHJ zOlNdWN!9_>bvFR|RnLQkT@&-;3N77_9J;LuXoJrC#1gzar^07+HbBC-p49AhGL@ez z(%`lDzfj5?gS2~8rK2Q3K(oL=8*MeU0>(cFO_O6|FW}=h5f>YYmds00!V%wC7gK?H z@r$XXY_6byfkY;e^E}V~$#XJf5Z;-!OVHCqgU1kbM?0(vX&~eO@*qO=m_Iu@+A8?E z!j#7=tl(=KBkb_=vSk4eD^ohCQwrudM*L;Z-W`3lTLj8+8WRZ9YlijIh}cIgUJ5)_ zJ|?X+CBzzdVn(N0p9bAvS>j)x{b>#}_i2`#qkyy%_8#D~973_~>^Kjc~vK`qBqD0F6AC3 zs1ugPpw7}4Zhtw&@nB5(?Ehw`^X!*gQTO$4WJo=*KoW;0_79}lj(*@Q>1o<^h8_TF zNKqW};!rM;>g8fH9_|7w=S`#5G+#XC4BDrep?1pC*A6SNnfdgg&NGpA;KhgTsyfTL z|D*~}Aij6UU3Sy6Q>WCT)&y`O7T3xsbpBJ__Mz1Ldjqqv_55nA29P1K)!1WQ9;zh$ zIPqFNb~Ce%lo>>P=&~07PHhg-Bn~pjcPNKU7(kx34|r3{1A+7Ayr{F4F73fQ60C%5 z#peJ45RHcJ+Fm~X%xssD9a*$ebW>vcjEX)JKf66rA$uVQ-$+jh0)13NVxJ|F!_ROXog+|aY&v?H?8H8aXD?;Fek7K%!)p`=gN8F|v6D%Kp$h7a zXYsDBq{G+ZZ<^K@a9``+9rm#qN@jo4V@FG1B zp2uYr3MM^Gv|wFceBA+^+%MS`m!u2L|C+Y8jmLqNA(pgcsSboGtKF)E9(%HnFDL9(BjAO}=$woD`ohPVRO`c! zsxZf%VYKD^3;9vw?hh0e(U@FB|KRh10u~zn{InEeETa@0y{OdtL;tHL=H@r?7Yxbm zG2PEa!O}YYEumwRgCJm`!%G+g3_r1>_N)LBie8dcjOzFql#HR8+;7xT9%Hd*%4r#1 zTHO!R5LaXc?-EI=_kEP#6kf{>;y}xi_0CSi5201 z+$19$x;O@JAK&&2HlcI+JG^4nAyaF zyO&g&dgV^y*WiZbEd|PQHXBz&b|1kltJ#On)2G2R=4@R)8Fr(o=YS5FLM8~sZ34^7 zKb5vNtGyS#`jb}hEEuh#lWg81weDT<`{)Zk&;9m2ETjcn+xSvps$Lv5yt>2IzN?$+ zx0yppBwTP1hck`^FfZ5;Hc^|8Ic(^?s2R*=);Q%*X#SmQtbUoVzEtAaCe`9580?Ia z1ibPAF($NShdA)Oytd^97D~S2ooS-NT0v1vY1xiTMHEjYd%OSQ--2o6xFj}tA5T@6 zT953XGH!7g^h#UfgEZ9zIIBQIS(ibv%ltB1uAjW^N+#$lcvY~@q(qQ^n=G(!Hp3|q z-0g+w#*hZ`sRp*f>ko48MOMOb&h01@aH$CKtjSY?R6zpHIkAI|*Cu!MK+|}@j99SD zNzI?!Hgvm1{`DN@ByHIH4mh2BHn{|H?cUVr11({NxW?q?paZTaGQVX(uPz9-d6G9fYP-#fD`S!ao7EKM(Fa_3y#O9mwk1}rvt%;*2ZOuUEf%f3bZuo0} zqYU3o9B(Zi5aC9CasrQyBP#3VO5dWm_lrlFRNSQS5#RHZ9o2S-$kWpUE)yZKn~Lu3 zOt*+E%)Hkx`X6v}Q%fx;QkkPh$l}+^H;MWjmBEX61`Vi6u{U2T(P;ev4K!1ZqUvek zd4x1~qqTxgA-tzwI`FMe9hbqgeJxS}+#0z@j13kxR^^bB77+(D&|T%z%92*Wa&U)icO zj%0sS zwg9(;3A+G)!p~a^H`Vd1%;A479s0IGs+3h5&iIFM{DWU|BCGOkg5G;_^P=ed9nvuH zH*?NWKN3Q`RW&VDH$gx2E4d1lA~3cNXSdv#_LP?<<};!Xllu_nQ90zF~O@h&om@#4~X2G5SUv zv6VI&jQxli?$*U(EW8XR-_CX~RdO8iHuc(pgVdF)nGWI$)dvdTVr%-&>SKJ;l8DcA z?K99*7D&^xHG@a01+#kWT&Jr6gx*QJa_QoRYN$VP0n)buH@Nn01!C43edO~u6cX7SXf`H6i{6z z**819DwMK+iv6P2$Nv~CHHJEM3z?D34qPXzphzFBN=ReM10Du1@q#9yt@Tm}o6yK6 z&fcy(^BmtfL`uN&*o_uV$7*?8!_XQ*gXTHCn{eX`PjMD6CHd8Cd8|#(guxfXd(=ux3cMdSda#)OVAfuJ1l|Jqp%yl=+Sf8ulV#@H!N5B(>nzr^lL65OrCSlt4bwDh=f9cc^)O+6UyQ$ zT}4M`Uv^ZEQ!g z%b?!#+>0flXmm8Q$gt?g;*7t<+)h`26P3AmGXH#U#B}2_7^vlu@`Q+(QfLH3x1YB{y(w) ze{RcaQPQ~OWhC-z%5Oa%SF`gUvMsBny}S`D&SOu`sfi)yy|rJtqcj1BX6C+yB?%idnnuU`3ph zPX#34s#OYSIoseV7}Yc);>38ZXe_)XQ%31J-cW9RmA?LSC)buCk9_~;pi5+2l?zKd z-88G*?2$_Uw}mpBJkIW~1V%2o1j0U(PuaQ7dYmhdGXRNlsclwUdHt0nu}e=$#LTcO zCM>dID+;L{>4j?T?Lq2cY2XAVGr;WqJYO;C@bO8LI_~w86K|r(<7z9^SAl|k+=cy} zn>#$^tG%H~9oIze!3eXJHq@j{osc$GH6~i=!7+7?AmvbK!4&1|SXeA@KWnTLN^y)b zrq!LCU-jd+fUEqdzKWqPuo&96l|jEz4}KngCt(g>PBDDK(>4zYe%GYBSVDwpp;Q(c zQh-6sdD_>+{QB)UmQRtc#KV8xOjHw)#Y!^Q6EK6rB(rr$wq%!mboCxZR4=2nKGQgx zV<}nJbTN;mg$N&cce~Ek2T{p+b^?Z4!la~F0v^0_@kw~zoE%Y)kwc;62?<#)cGNsi zD8>Y@C^*`VRh%OAV>S}MBKyxbQ!Cg;C{Ch#BDP+L5FyP+_ z-QbiRO_<{o3^kM&;zV#aK5y%{K`Y#M=~`fBc+p`A>CWJG&1IeQXy1 z@}taEdOJk9#BGje3v9>9aGL6v1qemu#%1#e9M>Cx6U&~-^SiZf`*+{~*0(r;IEFD{-!E3Jal=M7eNM*Xwi=1(GREnSM%xTptf zT+1cz!GR<10UEJi+r{veZ845_oC{0o?KStf$x(;QdLldtY6+`W1x6+^n%c{fc6H&H ze}=pU^P(@BZ2Ey~w<+F2c4yx9-$b1w4CsD#0Nu!Sd_xa5v$GXKKb4TFWfIK%UZgBB zQ(CuJUw7g8Krbb0Ja6pPh1{$0-0WYVFy&#?j4J_M4#dO_%-{)$vCSH&E97Y@PBYMz zM_y^V^Zvh_C5|*#@w7xssR34?AA3hdC;+a6R4ypw5^kZ?MD(V!2Eu1-yfCb-Zbd5q zVL7pu7H->V73*(0Jam%5n3E;(ioJ@mxr-b~W^MFMR0LW|QZIY0Qoamy{f;SEQE`xe z3W`Y+%H-IfjpFcgFj2`6v3E>{IM}LPiSMK=!Tm(ZBgzuxPU~@W{(FBwd(eL#ZJdEg7CuS>2i4>{ zkES>IV&w%KYY|Qb-jyw!cR59S%-+LJ4LF*P?VVO0)j9d}oe++5Yae{yEKr_|5d%E% z97EmIql~r9{b4}KW>jkrEJx-v98S!oqXa$WFpTp*%>6=P(oThtqO&m%@k=Ew-&lOo zXTjf(4#!Bokf5u^mCe*up?}e;WhR$M!C_Kgs?_vu&>o+0`RNKx9sCPEh?-4n&c~c9 zMJMM28O}pyh8km<=6za`*YJ$x+$hL{aS1MYX~L`*J@r#YSz0eiS*(-*^8>5dku#67 z%oO#nuJGy!i4N_wT3~>-98{*Y0vpOxENFWlg4%IGURp-Y1(vtJ$ISU%okDp3mM;{| zgE?T22cb=+5WBu32<`dZCsCSNf5oh<7}cd7t>c)~7O*&4h@BIN8t7JtkC}lc>QxYx zf`SLNk0k%yW#`kVTrchp)!B3N-s~vJiX)Hj!`&nG5%SZHqCO_N#>M9gfMm;E82EJT zm$$MEAk+l&p?TY;{IJ^%?W@m^pI3Sp60)lfD#TT-aGG`LU%W9Xmn<_eeIF!TlA-9gk4_|Im=x$jUKx2s#PulKj6 zZKAzmnK`Tz!ZYXsh~|i%Sw*&Wqkk)PMzJXxC$ux-r{xCm@JySFb=BtjQO`xk;T}9> z;wcgLs?dCcn{7L;3kOC-__YOloev5G&Qi_n!-T+)l_A00BuhUhWuS=q+yQIKy2PQI zIVv{fK@!ff)KqBe(JC$jxOe2W>_U)QCpq5=+Bf>a^Pby$xWa8*hCPUW>bTQC3Z4ULkU7%V`^vMk_Z1F@?+l6eoYZ_h! z@iE3jv<3Lby~DE*Cr_Byf>OWVwzbKTqC=8A9j!uh^quL?cqHxMoAR55ATrwR@0X%Y zNQ*NlBoo=SEl=Bd?H%A;w`~2ndPy-t+~SuD*MQ>o7qC{VDsrEk*h1Zc`KdF~Khh5I z&S^Epy)@j7ZKjjl|M>64JCkO*_gHCFDeY`U2C$)BSl7A$RFJ(if761`W)s&4y*Q*( zA)B4<%3?6c-y59t(SHi#waF}CL5LC$Jh51H%CpWXQm}X>N$-4g;$123>CHqZ2Aywz zGpeic)R(@_`d{6>?g3W=*~5F%-$K8_Wxm3JG0vNivwhc{W+r4d=QO4=?Q%&N?4)Sr z$4mDwSPn0F{CmR0%y8xXb1yOT(xZWr?5a&(5j)!xl1`%0&ZPJF$!BSD2-M zIpY<9Wl0q<3eKQ$a`2h)aYqn^J(4deLaF8=#_}3Kt(0}-9Nfs>hn`71eVJy9tw@hq zuXijV=T=U3fMKn*^VCOK$HN)9X?g&nO-097^;5jEMRr-g`J|&yXg-8z8(_(C3The* zy6L2k{ti<=ZMO9}q2)tp>{T@CgC&!>@}CD#3H5^}HQg`1s7+w#mYCLB^(ix+phVUI zPKFX3$q0;os1ah+hl7Uk(n#$$o-}t=`s=*neT+vbUHm)P;8?0Y@%Dxz-1=Rj zw?kzD3w-OCqBgbKIPr~c=C>DM84OA0F<7+~&L}uBLxIQ0=Ho-hkvEK3ew;mz@Krcp zbUt(wSEn6favVwb(Bc*};m~5BFRoNUl-BDbfBa%Q+MS(($nr>=zh(H@Z497y(Q#-P zLlVJffsSBt(c$>4!F15{fSr?09x2RywEM?zO)2Hh6rj$Hb|3*CuvAc(MiM_#4siqW zKvq=LN1v^X&WpuFhQ4O4O5eYby3+P{76XJ+d}N;4!(jUzq65TJI}+(vnBYeT8XOdq_09gLv*y8=7I5DCJ^;k4aU`Gb(rS+CI4^WxzvmF}G2Qi$^ z`lI_yd4Ec1N?c!mD<2P^|1-${KMNZL^Bs2wREnUO7brC!dCz;Om2)x>OwAP00hQ*S z2ix?HG+*VHL@m6y8492m(T!@bT}V53019o?mH^`&rOND@11t4KFc`46XTPh9PKWXi zm6`3&EziY6e1Ez^{Bhhbx0{dtSuwC${6kJ8K#;!N*^P=Y?_#T_EHcwIVN9BxPV6N6 z9Yblx1ns4?@R2)IkVWgs8G;?jHfzXd7+&rS4E@9ie;Z4yfoiR>toU3AdsPcnkRCMosM=K zh#Z5OnuQ^17xn6FZ=O5$9d&Ib37cuW`@FszfMzk{?Y?LcRGsW-6u4nB&IN1Yi_CgU zLw5Wws}y$NIxn;4ITR!1`Ak|dY;5ePN0 zPsUB=gs5IjIz7}IBWBMPvTId@0x?nM(gKF2*6=H}L4!J|xF#?ek)a{*Z4y07jr2?j zY`?_Df@R;~y4RRD zOFBc%`%ec290*(V5tXo~IU$%lAx*1tixzE5&&i$@e1EE8zJ;3L^YiM7Iv zG-6<~d@uq0WeCq>c=$ChEeV+cFN^BVLMh)w;yDk?6o_r7zhW#u@rF&RsN?9<5+Rb1 z-`c>nT+H=p;5pYLBmvqgb44W^nNaD)=u@5Xw>ia=k7Ql|0Cyve2L(+&msxMcK~eoC z$TdcYJoDTmi!4mSIkf(3#|)v|D4^J9-GaJRYt4YLw9WA&l`NjRd<~KkS8UF|=#ON} z!^Q$ag!1g?P(FE?Ry6M~oiSvAhSd_~uV$TaLzmB^qY^ZtS~VnvNcKaZ5fmlE^!Ha< zJh!j6(XZ&S_-_s+KeQSe3Z45P1tGkm5^wOT$ie_|lm12vhrXx7*hra%hH>`~CpUm& zc6Bf4gTXpi7&={Mnu)#QNjmcjj*!D_;8|9-v)Ab7m-cq=?+K-VY4Xr zz`*L)g1A8{x{NyvHh`5mGB{b6OHiUb!GHs(B!?#UdXDB%1 zr^YWSNi;M#`iC zxU1R(h+l|uQ?L(-9McZW((Y~s1xa?KnfE=nd~38as7*?JBaOn#AxlmZ@Q$Js=s`wO ziGgfMUwh~Us;o;qcL@T9ql`XG=B{-r^<5ReBCPWd(EF12u=QUZIoOqU;3@X@V5r8) z4dK>W?dHp9<6LWY=HX{KR;#(TgcjEe8lEQ~QR7)6bSqjGR{`5PGd*+Rf^``3keR5X z2hNA?Xk#;Syt$Pm>O~bdGuTRbU7H+~cdRjP_2Z!MAP-?fYWFCqz;OhjcObOS`R*j3 zX(-)MwnMX;@_B3kz;`pb^X47x1km^}vkokvzM@7IYp9HTJ=Bixx^IrGmA+Qi4mF>u z7C@De_#8v@T6Gl03tQL^;Wng~u~y{w0N5l4Oz{^9s+?3S|H?nGHR{X)aG$eKxTCHz zITV#*)eUGOu-4c*>%k`f>4?|9sk=O#3;3~JZEeZJ^A9s`_Peeu5bNQ${BI0%93-Q^x6yTE@DH}?hlj?L9_&kse_{I3v%^}-J4AUv{_j51 zRG_}aVliNC_>VUPKt8yI3<)e(v89#09@Eq8wW!_MQGcK}MmF;yblb^320+qLIJlSI zE}JBUK!f-ea3ZW-{)#;%XR#KFJO6;3c>z^i|GO+HXy?Ymg8gN7%q83dQ0QF+d%<-; zPc>L^?gkU$VI?4J4iHNhpLCHYdPGb575 zr-!q?VQ<4>H|bsG9;yeh0HzEMGxZjfd7NWY;SX3v;f4%4?cv(A7-<4m6rXbyP_W~< zD1iTsv8V+!ZDRAp>ikfi@v9M^G1>z;64rGKPxKq?UOA7on&W;;kUwhbd#t1cAjWt{ zr0R-g2@cMIK+B>SB~PTYnu0W3Gj)@rFkP`6ai%g3B|S35Z@yB8vncPcQg0bx&~}zw z^|sq8;u$GM+q&~@&-h3Fg2&lRAov?6rEtMt0;LWJc;uG5C}L9AYh>*WYr9FU()bX=iFOqy> zSDoH@g0GHQ^?xrtc9f^OJ}bZP*L$aa`9SsU9YNGRuln%xD;#L(3@YGd3`6|?h80a4 zI}UQO<3O&Hvv*9^;H_=wOPdiEw-c7y^27`omxpdLkX`n=s*xv9k>ig8LhMf9=_*t-W=GffYXn$3K6S1c**|}jLvCv~h$iSTV@|I&2yYSiW zV~+5xy6gz3ptl$y)SpZLi)*3N%xOsN`dFV2F~X7+tjTnf^lsP7!n%bCkg<0EW3x3g zmRv%57{@R*O5vNg!7wCfM1%OZ7Atj(AY3#p+}fdkxY$x8VHgO0H)vwp02=`>!a)&! zc=dbnTwxCEI;s}yd@jQ`F#!|z*ZTmOwQFmP$twrAX+?X1p9rHgLU2m18nSkKK$Z2w zXJ8qCDrRmT7^fX|bA*fikC@arhg0aq?h$NpTIPw^4mY_cFJ@T9%jLf~mn%&U&pNnT zO7W?iS$H<25#_M^Wp4|8*ID1EDDTJ#z*-*gO=;6T%@9gk9t3Gj@}Jpr2TS|_Dm(_Y z?pM|4PB&DjCZ@gQ__EvDS=25o_|7LRO){l(XR3}$d8kj{I8TUR69dg)?2OSMveqxk zoWM6kXH4Kwdg*$m-2@~W$M%vZ;oik4--&N}Z#x301ppQG)9yRy-5}8}u}Sqyc1Sf& zu_ekt%(lmazHOkLWeRFB$W`W|^jUbtUeM29jvjrF9H1#|Vwt1WA>X*5?*yhNaYx&S zmjXblnWpZ3A~&ZGH|xl0-xt1-vIm8+I>#i!ZUec6p)^ar|0mY}&uxYLmr}8dspS{8 z^){lO$fMJ!UtrO{o!B)$dpN0$m9$)0hzH|$vgt*nRJ%Mf%h^sgH!8DoFJ&tB@d|!` zL5o7k+?L;P$QImaA!g(c=(J0I zze8!vcKGu7uZH?udDhew@lDb>@H{HbN#bp6%(+(gjwmcJH3@4yG!dR42!cU8D<+^D zB%eM2u7b=Oe5*W03p76w2+pEQA!I;_yjDQtp{$I4Ls&+kQx)u!oA$3>*)e6S>b6YQE9@JYH?tJB z)9KO~gp9*+HD)bei)Ol*dD~5X_AJQxEBF%l29_<>cL6b3NxuaZ#7I@=iaP9b&Ra7xH!p4WrMey{jhfd_fPFv=uY5VHE5 zO~P9}0pQxQNCQAb;A^fSz^qyYI_PVTJjd4%3Y%k7=k;BN{@pZ_fWu~(k)&=D#mJ8B z;(Ued*sC>HWY#h5Q3b?_>g*4}*IidD-inBpnw%Re%EDKJujyzc>tLhlij9m@!5yGS z3HQTh6XciCyEgL9NQwz3ffsN15;VJ0-1SiGgW<(YHU2WM0uHGH4g*NR)C8;PJsJC{ z{}17lBNC1y?%x{Z4Wctr0F&K4a!&5rnuoj9Akl5*b-o_gC+`MpF+D5WjE zE(Aq-rIl_>jNf-BY<7{y89u1y^>PHuZXaRNFvnh}?8<#453ll@Mmm8WO!r-9JtDr2 zoBOOIxN!JVzhBDSaf(Ygax77{OZ4_VRMqROqTdn@Hgl*w(@u8fsOuQQav7grECR*2 zXp52*qlg<@kt1Lg;66FXChPXPE;i3~^zwN_D+jF0*Sy7cI=c^-pD?Fa1YXzP78W*D ziJJW>zU%$Y6y>flA}zUgbAT@V5W3kW%SXrWTye-CnNi~6r(PGwvGO-#)MnvAgSTmQ zshsCA_3`KqCwu722g4q3OaaE0Fr>@?*4i>43WLGxg51)l^yacMqR1*RQBleXsjtx2 z+qwhg%#TbR>>;i#!6w6@@Of{!b`1BRNczZ-H-sY!M15G}bqZ&TH2r)>kJL)FdCVLl za7hy0(vDt$_!d!n>Wc$JSS!?t`xvZ-Vh!vxbrb^H1Sb_XDR9eN8)mR2diSB@Ugr|O=CGp1y}yjZys>u~+_C8P+;^9hJ8I^y43NUopmh85DH49} zhQ0lBO-Al8en5n3Xr~hS~G-;^~n;2&me&-7aOnr(4)a z$0^0iBK$q~r}3+c|JnO0Ead3mK z(546Mp$|LO4AM7N+n3+{cF8v)%(A8fJiU(5D%bqc7Qe^ct^8Ugx@^and!_glOl5FV!o=*r>q*ngf?5+SnL+_#-eM?W0$-NLq5qta0s- z1BmqA!bRCJ4)cU*Mg{B5qe-~jFF<1A6o1v)vr2Lr%F9N-+3G64nfR8mqNnho0G1`@ zQUP7i{O{-8$GW0j3^;=E`*XQA2~!o{VK+X!gMlJcN&AZ@lvvh#m2EZO(1D2*ozH1w zH|HZ%elW|1fCIpIddz_)WLO{VpaBj~BHZO8nO^*$IEM|={mBPZw6#>x;5myKQs5Sp zbr8i?3{w(d+U7DCtWaa4KkyOQx@C_$U0{Stb&(eFh<57Q@uI#@l|c-4MsZ}qcoUtJ z_6{1g8(KW%TehS2O=@QrorI=1`h2{rsYOX;fk1wk0=QpVw~pa0UI<9R>HGF-s`DJR zhpO#r^)`aRJ{PwX*Qb@S$R4iydzaRY^vKYr8`8()LP>jq2Ym3gNhQt|Zqsw7QlcfO z9c5CsFylNEma_~1d0$)-05leL!(;vUT%%7#IINB)r=oUQ;0I+azO3l0@vCLW+QnPV zWeC}s6CNz-$8mPqW_j-^%$V=_FryGU%;_6Emc!-K%0G&dQ&S@{|FpYrFUCN{t1&iT zRMgC<>}y=SLR~s&bbSgLFm;X{^G-ffT+8br4Nlac!}gF}%V52OP5Qp+QR|jz9HQ}v zy$HW-$(@xmLm_F>PlYH_LE>Ctig%+Em|9y~`r+)X5L{j;J$W9)+Otj0({ez)QWg+Y7Y*c|AWBfpoO^7 zMOwMs3441%HddImd52ptdO3$l(kdh0EPZ%0|F5F(9Z9HXLvCZ3O(_O*%HknnxHsVY z2E@=8ciJJC4pJZcv!^vVEJYVlja?$hhTFnbBrCgs_pX;9-Xkr@fp4WQP0o+<8Fg66 z^IIE612@*ZM>;T%I5ZQlebM3CB#qZQq%<^`lbt=`cBF?te3BwOR1Vhv-}s-HgXf7L zrW=u;R0ZRZPbjA}gvvz{Q>i>fp^(iBe#xR+)FY^(Dmp-Q?8a=aa&hE9mDxGz zrZoVE(x;=L`hn7grtW1%KAyZUvL4&>tT9?;G4%N#Yt&_^%(*kd*-tc(DRuIw`vVI& zCb+1zAiLzOx@fAJjH2|;`#PIYgBuRW%e`iL3xIz7gj;I%kZ@E2SBR`jpT z(!5e`lG?7=MaGFya)e+l|KgYPy-bj1rpzB7=Lgp%S_y9J*2@G}8PkW)8gmu*Z``hx zkUhk6gNgjmNn|yPIj9>2gN=vT_wGZ%sGIoGf$ekZG~?m`1IbQ*XkM*xt#=DmVYb%D z9qqyf6LP3-G*sBQfzmJ{)cPYV2$3XFz&HcCgZJ6pGgZP8Q&u}ZE@0X0-hsLFzO<@K z+n{gFd7n-U_LrV}co>Q&r-}N1P9FRLsd6QFv>Nz>oV-wJ%sjGGs|Pd*JsAt;_;9|9 z4VU&H3y$L0eWv$(<~aJwgkw*)zKQb@1|($-8HHk8S==K&FgqUj@9GttP9||99FqRz zSyX2KGsyox3yBlCQ=;sj(4M^E+}{1!Vapx5$Qw~h(^RAA(TvMG$~*Y+HjIL9{a@v| z-XSvq8Uu_h2Drk?z_)cFi3b7x&^rxaLwU{pgs7In@X0kZE^`-qR%BH{a&l0fS5wlB8BM{EPvTV z+r+pYUasyd)~lijam~qz*{7|Z7%-x3)fv4QM@-wgvr5%*@3xnZniwR#6PEjqEAdwZ z|ElGO(FGe6=8Ew=O=A6{z*S-TlgbAwN8oW}r|0J~rb>wm_>&|MaOo>}fHVz^C0Pj5 zpU94wHFj{^M<%3U>0Vs)Vs3){^n;4d5AgL(T7@NTDPP6%YAzhmI)((_QGV5Hq?#c*_Z~n&*eui~&LyA9+k) zKKq})<+uOS&}&iTgpU}|PHCA!K%QVDLuqC|9HN^ZH+1`ORg|STtcgq2%$o!xpO^*1 z0vULbk#1;U$a^m4OQH zhXYQ5JyU^QaTxz2JPRnABs6(FxTnO05hXzOB z{>wD^6r}W=>T-g~{qiM%^bP4zo&>~3|NJi@xaji^JA5sJr6L7sF6Bh7zMlbaCO%eW zZvR^jJJ41*@DsN_Gfl%owu`zvdRaRFN9sqw)d<^iu2Z9Iqe=`Cl~L`|Djvlrhi1Wc zAAJs5bn#CG8S=$ox8DV`r=W{tdTsBJ<*b|v>A98H?d~7^GsK7k?QC$eFBIu}kvlWG z$MnRlSF^TfHB4*EThVcTFOF!y!BTwY!*#@K4HOj^HtbvV{S$s3rBH{`pcbcS=|3Od z_84)a!k-bTMJh@hTCPf1+A0$i3mrqX!p^;)u)MLwjgJx3)fpkI1#QKHzTzy$ zQn*6cM2>xX5b(~ZOfElG3+4uMIV@&U0`5>Tg}1fE%R;s( zixLQouKKu9)c$N`{*;3|yUcCZanWmo-QMbR?{lHl(Wjl@?`x~Tc&;1ClPb#MY4zuv zLf|0kv-X0EWeD}VGY{;Mjc^V<@NGDH1c`Eavd%Yx?*gg+{CcP=M(}8{bg_d0s&p(y zqB5WUH2+82J2eZVEK9q?wr$(CZQHhO+qR8&*tTukw!V4(!HOMm?yIglqbr}x#AU3b ziw^u%f5dZ49ACNJQrT8R%ISYzR=}J8v`M$X`ef_Dsza^bm}A+^Bvkx3He>9A)Y^9) zyIQYJt~h3oy5@U~yFz&FsRU^~2d}TSqpgebuYrgJ8^FyRy3JOqdX^2B)*txfmQeV4 zuHb-vo0n}(gLEf4M=6^AA_}ZuVzSagwl`((nXl#_N>`Ipq zx@91Ae^@k=;r9PadZEf(_Ay>ZjqBufuNDz&om7;%%rU(GqgzukS1e)Un%Ru3Uzc-7 z6{}HN8Y73TBa}|;T8K-|OiaItib`d%pULt7ySh!*cQ5^-KB*vVshD zczvAy{G+Beh0u}Ny!SrskJ9b_Z0Ic+ArqFEJLhC$mSq z^SA~C3DZ_LW*yS`Zs6LVSZ>jY8no%np8m_@OfCw^%J~;lq7WvEt7Ep%C$bub8;dC? zEEa5*JQO$we*$j-5e;_LJke0aL@^Qs@v*7fcYVhbBy$xrCDc+*n1hBST+HrzBYH}ObU2+s3uO^lw z&5CbJBaI}iV5q!|?VWQ~7C>l{Gm7UvvcBhafp;e~n9hM_>aIk1VT z#Elx)Ff!(T5kqHBm5OeEj)xa$V@)*U@g>EdM2Qho__eML~IqY ze!l|GW%(n9IFM0l)j>a1EGC#5Zn1s;%s7o8*~hig>SKhP`c{ER~X81v;R96N^Tx!cH6#8@gSg8 zs-COu!hj@ArpHqi>*tcYXEt4-)te#xiJHKF0basONw_0Icd>{ZTv;5I#rHDoa@B_w zH%CNvJFYI~bD((Qo_0_I;hdBc7By6JlCgUX~Nr$OOAw&WGGkWD12TYgjtq_`?h5!QJ7CkTM(#FP_J_c#L7`p?l>nc0Hk z3b^_Yr2xK@&c(U^u%tGUwjH}q$s(5$Zo+bl^$njLadtfT=$^aSQQT2zDdx!iFIQeP z=L-8qOevANRtrvdTT?UI-&Dlj2{l;`eqiO`l#FL$3zsTv$*;W^yTrnrRPqajP%@I4 zN3^$AdB#EFBireqE#M~L4RV&1(a=$ z%mL*@Ncb$3U8wDJoK{s)oaAx&Q_8ozo?!rdzcfG`nri`a{^XGn4Fnyk00LLwL%eQY z3c>$#Bya9|@sd*N18{Vl&r(7z%U|HMl@|E>T=ysV?PrY<(j63JlRmBX4fdAEJG8h8yH`tm4j$-u$A z1Sf9x)Nh>+X#cKu1h>!#LvNSb4rcxkZ5^9bJZok9#ggOj0~>k$>zml~%I55(A8ixv zfx7P~im5nho}%E?77$43mx8OiOKkMVs*^7|wkiUFkiOor@qKuVjen@Ps>7LcBEK zA5rLm?iyy6t#1fV{E5&1J$_5)fh8(a1N6xjv=KpvwUW`unv=ZvSJ|H%f9V9ATl(^c z-%5fN*cTN%me6kR|5WyWl=c7f8hFFP0*;BEZGv(2Ge&RBWVS;u>b zff(BK?yFEkL3hE^7Z#7b6y(Q*B8`kviUhkYmq2aP)62(!j~%Ti#wQER_Zoe7TrwJz zhhRPxFeX5m8eYH$OSr|5(V}`s$@?71cW4P}{r-kyQGlL0;)!{(^s>bte7?IUk#m{$ zi$(nEa@n*~uFNmIW}}oiptP|p_<;!gA}KB+TQFCG@g0tGwLTRKyZJhu!x{g?(!raj zk)`kgs3QB;Jq%?=liP$)X8uv%wM=53;=VN>*M zrAAl(23chi_+|$GZd;I&;kD&yx>)rBvz3*LJ(0H48m2FF%cWiNQPZelMv(*8E^y5en)$ z7E7bR852$y)}y=G{V@E4^IRhVLgoK7Qq9lth1lC~lGh7}@!2hEE%Fh9NlK04^99vD@H_)*8F;zB*R#CYX9<+vZ5Z?(uEAv@b za32!HLh=d0iQFZerEHXO#!K(g`5lCi2my@(*d9d z0rgO^0o*_)DLmvE(?_pjx^SSqim9(>2Q{}|ZMH_qVMdzgAX5dcp=fRU0y4H+HVTB9 z@{fbC1(W})yi{G6=gdb3Rbl@6krX*xok(U*=xLt3atJUVDaz#Ff`!83wNP`S0pyM^ z35fWP7$tx4wO3Jx#6Z(!bd=6!&O_=_tE7NYONhOtTQ<17rdB31Rw(bN3$mIi-Q#0r zxlvERpv~NJ4w`;%Irs*}mR(@-feQAy))$q{zNDz%q3G54E~+u=YNZVol&Weo{T4OI z!%0zevr{)h{HExe@nDzDQihv8_J_+mmIu4QR0m0DrF# zcFFH@fPo5bfIwln2831&)EYAO{z=y77UhJ3x*$a#%Z`V4sJ^*l|1RpnW9(j?GguX} zioy#odE~+dZN9&{A8dD@HFFPHgp!!34#8U3FgDVm8&96|1%Mg*%On~%+1Qgy*E|Ye zov3Y@hU(+0I`2Y5Cj>LOwyY)no!3R!R}ZPGIaB{p0pRXlkZ&#b%m&8Azd6xL6C2>?Tk#C4a(pGCo5CIvCGQR)ex%mt&kp z{NZ);rY0E5?btql^dDN*+|)VDk?WG5Dl!XIMX3->tLwBmiY5(_Ym-w1FvGY`v>$ zCs5a3hf1F^KETT-(9g2WcCs@DQ00#gOLL8(K&fcEhc;_;kOdf)M!wX6^m|`4zmepD z79>F}0{2{>da7ik2bO^Dh9mgn*tNA$*5L>LR#CmZs^l+Go)~2Fe6h-$BhXg%MpksA zU|$zqftx+BO%BYZMwP*R`M}Qq^TLg=Plpi|oyNE1j5^+fu(Szlj-OnsG1V$1>JiXn zvno1LF8Y}++Gsk-)Rt1r9&TrnxID$dC)4WkQU>wsxueFye1l$|$A8NfSx%}Na9v}` z0xa%TLqn8b6}>Jdu|V(^_#e{Y7+{Ma95M-xCI6sQ80yPXPm7ycT1;$RcXB7=Kcs>! zU8O*i6zr8vZFDgXuGIFQV!qLUUn|7f=x~lsZ-CtHtO|d!>2mM)fd-I25XD^Xr7)q+ z2RdwNg@y>fpnnn!mV_uXbDk^H4~Tw5wJD$Z{hD)Fm3&jRC8<@=?9I`{V#p2V$b3MH znGKgbj|rze+H)!OOd2Nn9K=w~dUPJToeN74PxPJ69Z7-{f+VjzROiIbmm^$SzDk_? zL38=dBR4BSt;E)7L4t2!=J)kHU!O-qQL4cb{Ue(gIPYdCmFMDX$7)*%0Lrx;1aF6~ zAsBkSP2F9YOrq(37aVaKJV=BmMXwvWh%p(`zJG{3%yw*N&YLHO^SNpar8->R)uYzs z4BAJ0cMtf5*lAMDtF;XKWi+nP4c@g5hxF%8K;)cBSS0fH-NY$U9ni>l8WAG7(is)y z6+fPppJ{&mX$vK9wdw=e5@+NL3z?_ zuVY?-M)DvNaJq;flzy}|{eWPD^P~>?Qx^wG=G4p}xG5s6#q2>6|B237VG?guNO3a+K7P5rt zDEl{V!AEe)Wv!lwx)}QF_PDg)QChs}y91XD z{Ive;@aX85IqUkX9hAJe+J<*3SzoDi+9yBpEuAblq=Fe1N1ZA~4&-dm*K&iG)5GU97Xt8V=cODv_t5fbU@_COv3E%oAi?Z;N z3Y3B=M9azZHm{o<*Xp4{6Z~|<`g1PB;g{Jqb;6)pzhi_TO?{>ZdwFvwG0x89u)u>@ zIV29F6|7fHb`%zCV?RP>Y#$;3WVk+pd4qQ@ zlO8B>|7*>hAmb@qgW6Tv$=C2-5&~J|UHAE(;uCN`6UY0Xh5Y|s>{TBZQU^!wW1OiKtJP|izR!I{&^1Vsz z(!m8Q>iSVf9XIlkFt7;o0q9ljqIae)x0Ikdn14L`%%{gW9IboEuFUVU3Y)mB*m1W8 zLi0ZLTN@+JB|iyAj?F$(MC(_RWS^B;xXxv5WR?~t*5cl1{)MZ(e!Qp~+V99ROl8y- zGS1qU7l*I>e!iQAl(oDSfC>$Zcu=oJ!?>wT|3>4YSC>j>>lgQJaAHBX31I{=&s=wf z0a#vi4rn}gcNe+odQO&WZoQMF*TWl(q)By8ii3=AiWpC?drZ zT?By_fCn(7FY8jw3S|a0B{Yw`K1=dDhk-tl9!BtS!F-i-qj-wHe!GMrJ&1JuXyP9Z8d{K?2` z8bM^@)^U{lZeIHo5mnNqjjSNWmCt>c#)aqhYM0&lJi}-Z73Fnhr81RQy>$fi(LvP` zA=y#D(6OVJ6w-

    ZcL<0p-k?^-#3-*G{RSa%{WCSxdcJrEz5{a+$`a>9>NA)8ASyUwI0Zt0ArQnKq#HSTki znm7J_IJz0a0dz6rmDRN^R7E4gjDFC0J@50~ zd#B)1S24D*_xO~Ts6h9t=r*r8c3Wg7FeS#Oo}yrr7MeY)H{TuTb71Jo9*B1Ld=|Ii z#W&`tt+Q+Dr~T(L$;3(TU}6$Z5`kZ02kh@R{)c&AST2GXh0g7=e~Wk}m$c})ozi>_*kApl)=5kMPMIz%EO-R&0w%?- z-9%`*4g}gsN<@yS+vhb?vbWrX;XAu}CMKqh8xk*U4b;EG)1nzK{edo!h>$0sf9wH7 zrGMZ0_TRknR8!AePo#b|4Dq2**sumc?cdSdv9%_=0jP%k@eKHZ+VAJMOy0raGOZsT&28j^Ch?yk(#Qp@+q_%sMXsDX}sm`wKpu&y6h6V=hJkG zyuZYiRXqL1HjWI5IH<>KUnI`tnQLTVF<%4B9|a$cWB2y1J)PhSyjeOgpMNV!e`sL; zb}R^C%~MJ#f&b?nqEK{vAok@~(NWs6m*cb3kqyv&N_MFbHl|Z0oah1Yq3@TlhhC=` zfSMc#E(nQ5gC`?LLBkZRDpBQpE^ofXTudK^Het>V8&APTY~qg48xIe2XD{ZidLn~% zDX|wZS_kj}{rQFIs3;YH#cTwbf$fQrh}m6gyLhEF$;N}~9z)dCRFPnHS8)V;@?$pd zf>d)%SIL$rZHd#hzPkrsAa zDXJ&y%z(Hv7)BPH?@P8S>C!-t;3V>;^=YjsPbhpCX3Z4ne@1^@l7p>@Gh`cj|G{LQ zKZ{pFS6{|ZKxlBVsX4z!Faxwcwadz{x6upgfa(d zNbL5R-dHrWLmUJ{>;LNiPey3F>sSPflB{NAu^pc?8KGDu*fm{f$$i_1*>Wrb;UBTY zR`SmMlVULY>;H=Dj1Ndlo}jXB?c6@9^jA=}KCFPevzY#~qde%TI1Bqg8!lI3Ak+%_ zMuB-d96)lAeW*ATtoUuJ)R*QzM-G`r)1%KdwRbAINQ~!pcg4T;?ssRmC}4eq@7hlO z*e2fD!5a?tQbe@wyMzAB8!P0+a1gkq&KiQ-_vEP&sl^29%&LW@P)N0F#H{|)Bq%mM z#E_#N7nWQHQ~)2enEwAhC1Ku+IX(~T6gH8A z`cst79X;*PWI5-5T5dh-XABMz7r?#Iubjkr8Dw;&7RT$zrR9P9I|zL;--4+lZK1R#Ltpm|9cs35i1m6Xj;WKhg*IxiWxSynXd)M`fF?n&w9I)EN&sVBud4$ zRJ1~rSQK&ZdjtGGLs1B?&fG;?FY-mzNnU8A^SHLB8cB#pKmk z|5uJmScBWT6h@K@Eo!5ZqOMefKK$xF1z4vwPsa^@vx(+SRK0uS)a~)K30>8RY$1rv zo$9V{mN;wWCQnDVTfNZhv)ojiKdR_e%c~SD(W?!H&+e)tRfm0s0L&lqb&zP|S4I5J zI7m3f%8@j2TohaX9R2~{8hL~PNp3TB%J9vfQ4Lcm+%D*& zrgOtF_=cIeCO7^9?B6T()(|T4Q4R@fItfbWq{sPl3{8H(GMt!1{D=*ym6~fx6aGYf z3wfV2>_TC#Sen}tOT4=7Q@%gq)>OK>!}|l?9VhvuxH=Lew1oGF08Y(A=qBQV7ybr$2VdObY zBwOv%K`P}&f|5$WapALxT6V-a($uY<+e^1vv5gsN#sLtSm|Pph2n_yj*@qoA*LtU5Am(&}Tmjn#>S`ak+28-et3G3v6`}w$8Q4EW-G@LgI>?TL8F?Ft z>rpu^_GZ4+Sq;%5DcvtOx5N|qn1b}e6*pJGL!wT+Oymv7SI0D@N~z}H0ZXLWd$Zph zu}J8+$^0N_`7+H6I?2b9v+8fre-r;*o;54$EOUYTvOp74x!=#dKQXd{p%SD{XQ9Q3FCn@6Z(Sau*WIjD}tE>cb z@ZMdUQi0=8bc-KegaY^V0>P->S)+$hr>oi~tZ-~k>W>Fveth8SF%IrxjFJB=6Me)u zdRU{JP%uBemqexBT@+$1m3bn9U=1XI?q)WzNXh zr6JtK`%Doyt*N*oj>7Al2h$4u5OW39XZrnv458x#dr;1$*W^t~S;4rq9S|Qdeyed3 zumuB!hAM@u&4p`%CJH*Oq*~u{(9im_uowfW=GMAW=pe-YHailH`JZ9h4=$Yh4l@(k z%DYu4ol&dI0GvOqIt&<8KT~_oHW0Rq(VXk}K(k>M4-g%=T;^>n(OXf~Bcpy4vPVXG z@S1PBpbb_xoIpUA$&6Wl@ALWl_c$N8KGo8semyh`;5$_I0@Yrv_%qL?V^qcP&BwzZ zw{V*n0tc;5RK|96B-GB!x_nG*=^M+I(OEgu`(Cik(WQX|Qu;lBPph7fImLyB63bQn zP`;gOFdHIPFx>E%WsdG=<>T#q#m_gx%@e#tRy@~!zq{Kx$ttL`dtBUIw3j|U!A+VEf z%l2!S1_Bv$b2j7!MivQu?`E)qk}Wq#=miz z&fA0f_omIW3Z}Y1HP{q304ENO>0cj5JJj(U_@WRj`-MKVR&nfQYaemkY0oMx>sd%7 z#?orC7vFZqRDXB+pH$hhjbP=X;_#BAxLy3imLlLe1zNShnrRn4@IHuQ-KO2NsHZJn zmBR!tY{Lb-OOL<``@Q|v9&*1#$Otr}*_p#ck#|b;cRhShg&uW~KXrn_t~Y=QtqrX&c}a6~B00oQXXX~e^y zS2}Nnmr0k@FP#9K7?h3u$sraHi*ppE@&*&iAw>p01^Vy3?~O?U6=DQ3SNiAKX6YePx1suAHaERA{rtHJog)@R$b7kSLj(XmF&^{K9R|whf*59F?B;8- z6GV)z3;}2Li~OB#vKKe`&+YnXdpDlP=fB|14h}#@@QHqB6(ug2kNu{J*1#^5%LCxp z=PhdZu4LO+r(k`PeQCWa?w^RDCrG&^+FsgY;24X|(r7K2(=_sosGRt)WNqLjz6@Go zYvj7sKP}{4D`ACkYO$%K;t-e(lj3+PNFg5-xxp1T}vLXXIwf5B*<_0Jt z*-H;s1fKvLT=Nug-X)1hSdo_=+xjJEV~Z9POy7Z>q?}q)b*F4|8<4k!zv-t~{*r~( zbVb^Na2$PXYW^RQoM+DRi?&~uMgU!2GcCzIlSn_LZloJaeff68bozxAYy`PNZAOn+ z2{vAsZ!^9V+lhk}b}(yFg>_*Ma9(K#>^(e($6U66RfJdp*E{5*pGpLnkh;y2?rO+g z3W2P+ZhO!37~Mu@uNDIbFvCO`>ZK&YWeTNr((7HxbZ+Fy-;?`UXYVc0Vt9K=f`wlJ zx+0~K-}#7qGb2+cbdlj>y-u`67F@n9gZ$a99wzm+yT4%w#BfUNCrU+jHLzIR+fPZx zY%AdN^|esjJ&T-v(x864c$ZPrMdfM@VOn z*iP$ZAW!InV@cI3Z%KIoj&%871Mox7_z-!l5{dFORbFdDQP?1OL>EOeVBaSg85DwC zGhBTPWI?X2b!xw9ew9jxffkQ$Y_Q!F6o#loFUaaVZZpuGJ56oEo?0f^`QX$)`qoIV znWalMAwSxHbtF|+;?GkQ4vgy`&mH7xAGO(dJtsd|`*_fcFOc)XU)@#&v;)se%;~Ew zP3lKk>9QbmaUaX^7+(tBC(A!9kL2h8x}aueel&tomu)%9J!Sc?yvdmgn?&JC5Rz8Q z*$~0Ef9<5Vj&!s|9Y{ywkNmy3&hHk)rai(;(_4p1M;gMfYr_NJc)HSlQgT(Qr9U9= zvk)ts+Sw+ebm1n83lw5P4iQC%I>6fpV1D<KGN+jfAw37K>49Y5SQA|L^4w3k={HqDcJm{ z(=Ea$vO^4gWvq)4^f$iUbO267*lcYlHHDVTVb{3acnhngvx2ZOzJC4_J~tMF*m}Xp zl(k;X*|@QSw7cJe?Bm$fgQR?Es5?y=7=u3hEoK860H?FMk{Gf#Ug4l8YJ=Z$+Gv{n zpW4z@A!&f2lIi%u$}==b4OMRFEcZ3i_HO-7?v^|H*!?vql%Jz<7bA-O9GM6pJ^;A? znSrifMcaFN72jH{!e>gz#WSg)Qu1%1>>%>br~<;sure;u0nGE}8cq}9|E`E=MQ?kB zaf=`FXcqY7Cpv50 zN6RP!Lizj`JL;7pvk-zq$zs^wMe2C}%&8~Hani$VZ~NVD*Z78S>^2<3TfIo@W&a?3 zXTJf@x!eS;=#;L&?FD5!_l%-Xp-jeZB{LeE05%5iFqSKW@cQz>J`McSMg4>f5mj5V!^+$ynk zY>&+P)dXhIEqG)DQVM>!8u#y&!FsFIr-gbjI?AdOlNW%4udg5CcY8r}lG~*&W^+sY zwZ9qWH7iS%yCt}})zccz05wBu&pTE{0PFjJ?3qAZU6Uyb|aRYG}@iPAy??g(5S{o!&xE7ciPhDuvhi%p^9%Ua<1_|Z}taBa{xoYaxuI4AU zlVu_OEK3@v+YyZgo-1M7;G*}LYH`$|U<;%%p$KJE%T*jN1>2lLC>Q|r>&<=v0pC+8h?OANfjf6YNkzobH~hEj}L z3aQ<2cQ~HCO=o84dOQyde}4wy5d(C&q1X+=3C1SP81x?Y2~6?-ca^PaJw+?3>GM8` zT80;$R$hgj;{!P@VYA@2G-8~RjeBu%O5A_<)AMbfzEt>e0PFL-R4v7nopk8@6w(r* zeMU1;Qm@oVZ^26hi#B~I6K~hCh3Ou;X$NhmUJg^V{Cw74qMWOC`=tGXBp^%(5h{xq z06zUrNeDy^Muz+)B`LL_Vq!#6$IA1+5D}}o;*h%gLqV?zlgeQmbAN{`##?E?<#+8A zIT4;jzBYX?H92O4xT6C;?+bgiw7<%xgsRdoRP=W-ZnUI@S#%D1&+PsxY;SQ3DsS?6 zn`v1xzJD`5MuA`v+RB7%zm+BX&4cdK<)kJy(dr7|qh3o${`D@1L7%$qBz?0p{~&{r z0Ugij0iRr&4^8=_FY0&IXfNBiHEj9cMpmw!fDvS_gW(BQ=5#$R+C&?{Y>JiNS8^K6rd$ycl^Z13t&6t-@oZz1( z)Bk!+mZjmOK?2{;{l^xr(`WE$vm)TB3Q^VbLL|SHPPYPJTxLwz5uCb`P91gjs28N< z4Ba@+&)3^yh7F_qdY5_KOQ5N4C4>-OeE@tQUf3NuQA zVX_L-8P@o(Pw@O1r94;3kO`D!$GgW=hqak>T;fcJNg)+1p0UV*{qQZ%@HMka3KX#B zzxn%^ylTB34`|*$6wn$${%2*tFMN>-M}Q;N(*G#oc(!$mE)(KB{Jvr0R~of#H0^6e zwSG|#;G@zNJkAHA#KP#^83vIkWA^h~1>yIWM-#@7ArI?00_NsOjT6Y9C_D>lw+~CL z(~>I6rO%a9mym*NJ<+hG;H&)r95yv@m=1ezGSS%-*Kf+GFgrY<>`s^Sp-c5zY1OKBi zoIcZf&MmpIqF9f~4K4|}Yaqjq&)4Wf2$>5l#LsIDDfJQ8emZHkb5bI2Y+yE}RAgh= zdikV~ple7J`EQ6N0(4m{$88SYNUm23PuB`*53Ek?fIzj>t=F&wceX@+atZnAOE)?a zC44%BD2*4c{&^}@;2V5N4*$Sw+xk@;tEjpH(4|pVxywgroGy2|+EXuxGR7XA31!fc zzrEI$Qh1HKL%}{F75%YAqdd8eiN>x8eYy%#>Jl{?E9Aca-gTX7-9QcC1AzOV8BA1g z;)VLiPvHuFzfTsPZ8`JONLf&IEO8q2bWvJlbz<&NR=G!Kt5V+m#gTo^JdxFy{i>dl#gseL%)WHaNg%xcWJ5uZU@912k z?^ga^z;hg2PA!_dh4+>{I!ref@&&8?xKM=1E$sjyIyiHL|s6K=w6-2>Ja+lvo^DD9Gi@qjk zu_Qh%{{8_S+VvV`_A>7ni%zE+k*rC$iAodV&EE-urGk40=;ARo9qfZm(Cu0t3JJDq zo^HfEpwT3KD59d(JMFvu!dV*??!GZyB$=U3gS5A5M7^+navX9Y($x_Xq}q7JHKYgN zh*ew(#y=3*HHOf%%POP4(9R&zc)`D?&HY_(xKvDWM=Ygvohm^9mI! z>w3VpwnVXAnc+qVetk+5ufN<(9`V1`6}K^QXB=rn}|C zHCO!l0Wn#%HnpyF;OxLuNIUPI@rX7v2!WV1FXL}CX1+~sfvKdw7FyEKhE`qFc;FKc z(A9-w{syCYckKSa=(1NUMZgXBPjmW0h>0mH8?mKZE{-a<|{;OjT)rm zw=CAU!9%ksZo*-R5s zyn&7H`~EN}U>-^y^#(9%g$6?6P17_T&iv$#3uYZzX6)o~;;eaMH-Sba)#BAs6Wp_O zd6o!MT}rxbzR5?AU&GW5`}uWx-b?2Mz;X0NtFGVpX9=%YovJ2zSB0?oI9CdP05(YG zB^WC+BR(}msSc)zi+U8}{LS8+b=xtLp~pj3i+;Al3Zp}FMqmPf!BoS(oFBYM2lHtGb&hrNq9{%fTndU?h`dhg92*XFgMTgWbWx`M<_8-fl#oL*)os z=~RHcANQOFY!hfjiVJ5_(3B%8&2P+z5DniK8@IaMAmy`LDe+8M3X{9g!nxqiX%+F$ zyq+}l#!tsQiBAPb>H_%8G&t;LT;i%02|C8S4XZXvQOZ_^)HtSuayKI0f7j=1 zBpv{X61fS*`W4g$tUuS|U`KL=k!`V+GpP6_Pm~7X zLGW1^6cH;bL*t`Cv!*J^T(y{$J8JtsnQq_ZO?fdxY;j1VK(DgU< z&SiDA94j)dLwFH(J<4wCS1H4k(!R(?@mSdwQ=1nhD^Jx`8Yx9bdM<^zs=E_BnWkic z>EhkFhNWNRJ26`^%Bv>Jw@V zLSEquT)E}sZ}&6MX=$f($HA^Cdn^9zP2heUxybh=ChOY~B?xXTie(yiv0uT^WQpj( zxw%y0U19{UHtBF}l-+aZ(DE-_3HR+94Ho~Fux3sxRI;WGpe7o$djYy~cdLb*RPwkH z7%=j7deh!HF+fyI)QA&xj0B5)J1Sjd%H%{6#~=dFX^l_%ZRVLmyu~ST&htWk70uCk z%BhV5*Kuz*OOk&QK0w7*rJap2>I|}{y&PRA#AxO=p0+#VTDZf%`K&Bzull0N(e2~dY=l{I&@7Mn{M)G3r(6p-+DT-fwF$CycAV;I5 zj{^N;$aw2vT1V`or4rr$VA^}yTrIS&$^YjRUhW>z3h{hNdLaT290{q>R=|8F%Z<**@O@~AkA)^!YaQM2 zzqM%h(l&T?+%bF~sDhE23HfcbyD+7orpbTqq~^>By0td+K=`rVGSi0pPt`1d0)W#5 zyFhe@WJ@Or!Elvp_>`4BX4CAgsh5=>(pz!7dU!4unWNbeajd*-+pxev^4d~E3Okef z8lntYcAwE#30`6Z&}EZZA~v4QaDq`yv0Bw(?U=K)AWfL{P~N)bFn!QiDZq54a{F5~ z6`rk%;!&`Nt(tO{@uE*X0YY-3NldLBsR$jwhhVGz1IO-R=-8#f`6oBa#JiR5YI#zqXnZKTmoxtaG5QmUXJ$be{ zk;jvltnHarEPLGZC}O5YX5iD7tCS~x<62M?cRp(R5_-QvJ^Mb=GM)c~FStE?K{*nH zSlVg`==1z(VQde2`dZ#s`5VOcGIQJQ9jXPgJ-EoGr_sxhrB_H4e$QBpGNzxWB-RksrZNH6EaxJXop^-jx8-foa;)G%DgjT5Gl*+t~hG( zW_@-cSGave(oqyzv@j2bhgxaREh;&5(z)*uGUDyH3#t7wvJRpVYOW|de}bNTD^Y*CxU!UhN1g`kKitlZn9a=DtfzY zhGW!BT*^qhG(cj9KzN2SIxhf$;c+eQs8g&F1jsw0rb0Tw6-Py|RMB$XRc$q!(W`CB z975TDCfYMK@Uk=VvwQh=d~DDAHP7l&ojE@#+u8F$9^YPpxeuS~*Ej`W|7R3CDmQnT z)B#+94rtq;z2@v}qdL73e7YV+Y2B{=a6JM%jo&=N-sm()Rct5*n1Wm`bVp-4js5eKrFr*(5G4A0?kW&L8{{!t`d+6Od(|t{ehzrAV${f+G$^r>t?^k| zcZIaNV6DI^7oV7#+)_^#BUEqHVs3EV(*R7MRq)jgzDlRM4&&-ky{H(tkI(zoI2GS2=hqEx5&RFj6l27} zC|RojVXu{=&fIAcMRqOD>m`kp+nFw<)0V<5vp+m~a9<$=A^76BdYURyZ~?fFUm19t z=`y$VLJMhP(F6&xy=(tFcNq63wrX96G)o_$2-;wWWV$0$BMGxN1mN&_9U4OgLcVO2 zH!-SW9%y#!87I@3LZ0Q>rjUt3{F00us(hfL?#zF9j?UzxF%`?BsR_aS7>h%SH;M8+ z3{j*4=yDO*0skfb@@?<(4f?o@+W33DkkJfD0oQ}~sZKJNuL&qCSVdWt+v(R|BuxiW zo4Jgb6?Qtebm0fR77hr6*;Sxl9rOFbWc0V{4K4u}-wl0C=y3wvig=P4$U%Go17ltl zqb_0>cl9VYs7>pVW_$xD)(+J4`eYixEh6Zc=1Lgk5mAdwY0+}d2?<*0K+rur>K*DPXfRZKZIB7 zp@n2hZg10SXckec%j#d(r`R>bmc)4~+9WXmUH@x?kSn9oxq5NuMX*9U`Fqlo!%if` zEHC$cv4p?ouYHt__yNK7W3gKa8DlmCZa+2yw}FB{15vF6mmc@q0rhM}VEsA0Rdy{J z!;C>6hnkN$WMI6h3T&^d#ipS7OX#a<_c*U+kNT)`T69#*30(`S8 z$1mUc6)cz1aLm&AH2W^`I-0`sRL>z_hI3#*Aah@sW1qI*;|F}+GlcZX$!eXOKDJ?g zaD|WF!%fk0ayVB^w}a`GVx9UNNwcJEomSLmySh$>$(h@v>T4BsW8Z7xv0o|kG5R0# z0}^hhQ@-CZtwEGJ1sYyV3K`0)KclgBY@5KYy~mO`9LwNpoC#8;UNTUsLH&Fu87ifP zs?wA^OXXdnwLkKk)$?y40LMrbLj3-C&69AM*;Vl8x8LUKMyt?@8zuF~tH95<1-NCyrlOUUhgq-9BdrAETSw&TiU8{g0|biA z55Ka&b)cb_xK^sW#l1Lnr3>I;*u@31yu5EI>l7Ne#?rU) z{cRt=xPOwS1J_^A!WZ9S`a=KZF{qd!h9S9!FJ^aJAD3v>qxFk%Q|q=gk9b(i3;dD4|?Z~|AB2t2-wr`S+@c?l8Vf7Dz4^ZQuPDS!5y z@Xuw!k^PV-x$luR5-zmvvoHkZp?NP@lad6Zu||6SNPHT`lb?qYzMquYL=#0gJk#cw z8-IZR^Fb2i3Kfvxzk=}Sk+i=_q(`^UXEyxf>j2Hb$x874JPr!+Hy>lsMy`GHe$&GH zM~y^|5d&-ADvOX>k=dUOE&=@iiE}!;e>Q4?9l-TBNz6vkSqWRZ^9U zQ>{y+WjNXN@EL&ri{00g(M@=@wuPXZI?!sPkZk!UMJpgacU5A_@KD8);#gTZFQT@% z8;jyRl{sew>*D-4qMYi??8OITnBhZ*CJy_PqD@YMMO9}!x=ZnL{&C;GA=f-C3<7Xm zHUgMMZj@0gO1c{JSri4X*RN+g`(F^X!$A@6@}z5~ywK^Ge+7P)TsmKWeQvz(crKyx zun5M+(3>adOs{c;0B{Tuy=Q5%rLnj!Wu-eQ5`9_DNZ~}p)3~eAvdsF31P9i5Cq30A zVBK9MZ)ADFnfVicKaer3`Po9Xie#(}3xkXTa47#g7n(DeoffaF6IPd0rv5N&X~je~ z%L`7%d~e_;WAdN*e#;zwpCNT9kRZU%wndO0#B2brEwcLaruCsy0}QxsI(NxcE45|* zw5c0spcYW&$b#1^)EKl`UdK3)>HoGVgx9gQvYm+HS7c*(1-N!3vyW&m{QxHflF>7(~X683s6ofZ&P6~D?aOrn?MF-ftC ziUiugspSnd3=0qrh~|j8osH~|d#%lFj9({G;le(t{3G)Q-V>_m)o{T(8tquVnH}3; z#Ta18Yd6e4RRLCB1Bx0sApeVuvMEn-?T}dBcx%z%Y#6R_AeSl-gtEfM#WFEh*I$DO zz^56O$$22ORwFIl4D?|V47>3z$6Yn}5nR~Yg;#R_D` zS5*ISAv1$( zNfTq*FJP;fk-tT>5<2wL8^05j&jffNGj}Ij8Zg$nbLh+I@ zLf=ks$(891RsUTm>(|2^l#-Pyl8!m=udS4`9_jM#j$-EpG(DEkXF(cg0{79}tStVx zq=FA!_s(=T4QpAk!Y_P}U~%#O7?(8Esf0t&;`ePQAine1QUHM!)XOb`|5Z?hjgRj{ zXm?)x(>(_s=nqd$!(PD0rWV?Lb2Qz`yofKT#VaRgc3S4<<_QBoYU@(^M8W%h zA0?)r#%$E~&nOqI#Tpf>-4xl;a7G6D)qPGkOfY02u=W{pH%~;Y2LcYIEZxDAeE1-H z=H{FmJgjMTvHy@~tFXH4U3aL@o)>`8A3fr?JjrtWQ(fTcd%u&s6i9~!t@6nfZ1Fw$5k!{rr&shS$YT?&J+q@u_(V}uDY`zr#S#{{?~@(VD2MBF0H3=@xzb~RmJIgi)4G{Dip1|8sY=* z8MG7k6#2LhDMQLC_DK4Qzq6t=Ox%U>u{lrMEK4Gn`%}-rb0v3uwsrne7>AGbzQ#NX z5S^QJuX&P6ukKzS`v#0Heltfu1pcAgk_D-5Tn;AqG2|8nO38(HG|d$Gk@)2ITmJ+4 zQgAo;nG!|y3HjtnLM>Q`(+h%E6F=Vq+Ciwa>nktrG@a)jtQIh&>95=Ee=VX1NpO1z zjj=?7ihvnbLJ^|3=mF39c3!q7J6kRkxg_Z%q2MG+NEy(VehTTFWp>8j!zirk%cb*W zvL7a3P@vhaGjN4TKrw&`V<;DXfD4SjNzK5&6#)`;U#O%}VE@G}If#T@N6&}Y3s#g^ z&_1MN#LPI%nYSED#(|7}iFpU#e&?s;2p5B(Dx8q|xKY6eTvrOi6G?fT zQ7o!+Q|Qvkkz|FbHg8~NN7`bB4wigdbvnOECC=sZQWW^c zoA@E;UGD(*Q%FQGD5{^OBPbO~E?O*-R`cJ`cl{@tc?n~0IIJMG`_A|h9SI^9BOi^T zbfhJOt=}Usn=rjostoM??M{(0P~id31)-W`QIep3xZkVUc_8)YJA6VQ2Xa7O4dbq6 zPYn0EE-EtB+tYISv4#8J76+63Zh3y+MNxFDJb`EtjoTiI(k)o# za6p_T)~!tBBEldJ6+2(T4N_4e*DzhJ*6}~O30}8PNdi(A-&5hoK<=dvevm=QW1pK> z^RSuDCd6p7_H_~JH*hin`$&Uhc<@56w`pj8l2m{l+izD?^8P+zSTO9^F^yAiBR#Cz z%=IItX>9yqeP7^ZMJlROcFYIApn<8yU790NLhqyk(AA6ghPjAEf#r4L{jWBwPOL8E zkH9%**fb^~vo_(Nng{iDzf2ZVappCQXVgBa5+d!w(naq=1lr;EX_D0fY9} zvg9!ljK(W(Tk-EY(I+{KYGlzz-Bap&Fr8vmtAWCor1 zoM&daQRW9iMp-4EHRkTpFfIGqpLIK`f((c=!xiM!ahvuj_Mq;EKhy;c9Gx)F2z;MK zWoZ_nl5Y+Q&EeHEyc!DpMRe4StnnSZw1ha5U&3Y9USF4jj@se(++RDC*xpv2|+wB>)PgrZDT)# z+3JllAN*n@sXpK6`kIb~>VcmNkctU`?R;1{VRld3HYKHjw9<+N`(us~5g{EIMt*gc z8|F<7S%JnWq1&)1I-C0r_YO#Nn9hD7ouPlb()ci!8^CpeiiAtuuX#lcT;{yRq)u_r zlE+<))W=~l@EGMwZNczvxF*HWIQTTeKHKfG_osEg8P20>rUic3?b=);yZ`~3Wq>Xu zg(4K3Xa&qy>s0A8N2G`hIYt5q#Ls&5dK%--nxWxQzE1YzT!iS@q7sRj!llGmc>D6$ z3v^Xfl%VLr@H>KZ01o`$>tmBo4@tSD6>zwzG?+iXmn{nvzhiYc>ENv%oA1Yu`9?w%fiqc!8(KE(KN zFjls)6pXIR4r-jSh%O0Z0TOU5KdKOgV43E&jqgRC0B|HQl`68|xfz50^OOeb z^yuC+LV4$!qdM~vidI7PA(h@dvf^b7O);v73#zF5H>{ zaA<1C>tSd8HcclokQPq`M*6djJr?rcel?y-7h1cCF!4HlV*!m1^1`GGC1=_AZ*%o4J#ynYUFFh~xR`u-}iK0zpIlS%(X(rSe-Cv$58r3k@#a?@T z$8VPG%o4}WfV=}}{m%@j4@a>*+&CDF`mX=J-{r(Wsjz}A<*Yl!EYDuIw^0>IiDR(P z*W*sx7QVtqdSs6OK;5@32|qF?S)W@)6#sq+-2bwSH}88QLnqgkY5Td|z@83O__CJY z$GT9NU3fs!E!cgzA88R|3L?$20sD2v{xGJs`k@cyddyHX@&K|LMMAF(h)>AO(tkG@ z;eTrDB=u5`zm4Qkd4=u%Wwu#Mn>>yz2!eUwCVA5t5HAMlzjocR(r_U_s;7l}oXXim zWh4rigp=n5;GC^iU{c(UgCy89PW*PcKg9jQ=uULNDQngl#~Pa_7We+U)rIuFNNR;P zng=U=y}anr|B9-)OySl-%es-s8gKx>!Qu#n^T!uteNtt$P>z?6&C1jgiF4A^pNzoG zBX93Xp>Vq0CxV8th z2{2>kx%&w_+7bWw`5kfHN!tpY4sV+#)fPWZl2g$uey9*3ly@pg2(TH1b5x(VhfkWY zP@7!G)x^;)%;3mPJzB?31NfLBCAt4NV2?zV9q5Zil&0*jAr=v0W?O9KK7Lw8gCh^Z zNwCK(QP7BzUjgH9ptET`JwYZH#PwbrwpFZ>N$v*vqx6dl=gb;Zg|(Pua%uH>UcKf_ zdPMkazs;8at)P74Db`cZKrs9j3t~hF6@OHA_25qwX8+XB;!)n{8s{@b#)$>cB^b(u zB9qWgEWa>QQ3>tj4aL3(*>;}L_&OhZEy^}&7hs5Hx{!AV1ADFWW+mAaJH;Rt$ckmI zPrFQ_yR};1E&#yMPV4*qSeMez>ZDLUB!QVaW4RZEs_(eJUBEFGb_f!k>1nJ?rpgk` z;bQ6c%kp*dqVRkK?HzvRir;YG#dHU3X0~9F|B>KbJ&}s@|HgQBeA- z*3!Y0a(Lez%%r*rUAumStLFf4;8j;l)|Kat^bJGXeJwq-V$|-QA$+@4uFG%Ivjzv< zS)L-Nzu>dcbky?9^H{g1taUmU4^P`J9r!zy(e!jIfai1X;~V3vD+J!=nsc)UEO4)4 z5V?-rkRqC!TE70iW6#=I87)Imjtcl`Vo|BbQPKtE@UIW-%X^{L!1`j%@!Jy2@RSS&OvY|{NC@P;j$7uYG6~($pw4WwX46Rh& zvr|TZad#C~Ga)p>IlrG=P!GRWqe+@=9+n<}PsiIIA-ttW4cEkm2UR%F;dTpeyQ<9N zHpb7290_-ka>+s}{D&;BFIdfO<5Ug~_xBi_X^7!l&8|ej?ygFA3l9L!eYGTVm>%-# zpY0il@6FDat_aqxBwi0 z4^b{=xc2PvN+zS0(C&Y|Y>6wG{-Mqc{3y`)`p|BlN3#2)9K5aZ@~hIrlNRg$nES@= z%9^h0*fu(L$96g$+qP}nPRF)wCmq|i?R0ED*BI}~`y1}_rM}HE=d8W=sak8*szec? zS1#j;LhRD2vT2yYv~X@!OaP9og6*`MW(eh(`oB9k(cQ^X`xvy0tEEq#M%`hDfu#NS zC-c_MIT^z*7s*Bpc|@k-mRJunQYu-cU9HYFQAfA$eH<5}GZlZd>i9NSXqptC?@8wB ze}}-JiIGW`bkSprs{P;WYA!xo#+^H8oJ z>#WT8LO*)R0cqHhN}MbzsyINvII3-Ii~{Bhr`e45A$qg~VJit3AveX$bB%j?7J|R{ zInnvA=>f%>LQPZ;?Lj&VFH-K=ki_b6_)dg|9<9|vs0&c{V0?h<_kB{d4(lr~701Ij z4&=e-rQruUQ*4DHhzGPJ0iM>KPdPpGx$P{g7shYwz|zT+oFlZyK6|5C$cR6rc_L$8 zrJ;y&0R8}I{m%?<1EokDe~TTp`9?3)R~6;$Q?r{;{EED81Qu$p)_eZNxlFea!+^JW z151m1CgbytNkaw{`eQ1gDzQd3z)$`At_SGjq^`c)N5ygXC*r|_VjLK1F{|!H>(Bx# z0FP}~C!1cZ9;Q3(T}Fear^EluVApzqvkjX&V1CEMlc}6JMx(a}IMTBiKr_mDL?M(V ziPTD=3<}>Y!YRm_j~J<;Z0Nt{}eu2LpVCjVmE&Rn(%h)8!32v&0ju#f<}q;2AEk^6&3p6M4hHmkMAq z@wFm+1%^7>XsptXvJ@FWGI2@*U_8Io48SaWyd=W+FLBr~X5R7zG(61A+XZhp~wgzsHdx2|@U){wd! zKD8KXApmFlEAOMaAjyXNpT=2-4DbMkShK-1wrbpCee9NfL@wPnn;0&GcH8EsE@y{_< zbG_sZ1})`#H3rF~%AX_IiPBoH$1ctwiN0{jL>da(pe{7feJ1$-_Ve6RwhM63JHPAI zKg|*jdA+>X-VZjSjQIN+Sv<}~pJCa+KN#Tcz*56@9!2jV=c;zo3_@ijR9g-iKI*BM zlOS>~Q;HJJ-e+vvivfHP!cZ=?$Pim7eguM$UQZ*sVUvb_LQt%hYm2_g6%9M@ac76M z+lQkFDZR*(N6~-|*U39e)a^QZOJ>h%c!kf*@c209lxodzgXTHdA|_8d}q zs#5_+Yl+v>_q@||Bs1U79KeSt+{+q|bOTOTI34ueQm(GM59{*j_5$q_$QQ)^FD7%` zhk=RR5(y%6_rcJlcwOEFF&~XYHg#f8MOF$P->Y+^){i4Ax59O;n1s^ zFT2bF{QO||D|G-)dW*7ezw!DcUqi6A?f|*X7>sD$6gD<8q+ZX_PGY_XbP^EHkvAc$ z!@$g@SR(SYwGuc_<}Gf|sV$0KF-6mp^20L3HGiy zUtR^$IYK`reO$$*r~=T$H2bbP$i?6as5+CBhhWeO`%G>rND$DEBEljeij2kiyxJnZ^}j=XO3iF2(X zsdDV&v&YOlW1QM745mgE&rdad>%p&-gSkGI^i7SM9e^$a+|>sJ<{5XtCYyuI$CJA> zXCH{tLLFRnWoAp}AUT1~-&KutJR!j!t$5`alMYF&YJ{>Umd?r+FCzuje52h+}|5lB%ws!&P;K5_SGQi{rOgT}q? zTtq0M=1}vyUc%c+!2(NZVR*@jS7EkU3N#~_8bOAi3(|2-IAP_8BYpqBOOF=qMWsm4 zv_Rl`PO9Pf2$vmXMv*cpMTOhda?W4?d`cAB7$5N9Kz;T_@pg+{{SkO<3u8MEJ6j0xEDN*rzQzj#8K64l$9U z`n|6l_VW=KW!nEKx>UWfKsDGe$baw1f`x4dR5|&~0bu z4FQMZSeS(THy~T+3mu2sbGGXrJl)j$fnRV!Vs%$0A1I*fO`?jV*+$Y-;Aq$YoIa@S zCHCzX(8B2TMcH4pb*kNte`BEri3@}96OTn0Q6};%d+a4SEUP&dN z*=;p?LX10k2qXYF9>yqSVltmG33JQ{q~U=hoT&_5PtW(&WhDN1xzaOhayZ_g4$Y)v zxNnkgYaIUjkF`6{==^A&`6=E(nTZ`o!r%VT@8Rx9tizN*@}zE(9JO!h&U=83^LUhG zp@!9q0w*$8Elme@lvoKJ5R>WnJ+9$y6tw`)|MTY~a;BIdCQkm2lbqh(+#wWLH@{~t z@q(3J{7^&zj^^64B~pg$$om~oL_oT&<&yo@zWM&sRly8oBZ89Es$6jJseaHcd@6F? z-WV3Z$1giD->5|al{gX{BL%)lKWfJ!D|85?(^lTyB=S-mHJ@IpW7OP-_kEWXJ`aUX zic?QeG>YG1}IqRc8!=xkcP4qObF6H_}U?g z2|M{{b!Eg0+p@r*-n<>1D^aS*8Vw_by>DC|&prYNy#SvTGFf#z-yz${gz^jo3rxiW zno-a-Cj}28kdZNUy*fj7LI1$3=a4>Bke7Gy-1cCR3gZ0{4y1-aF)kUOr{h=O1mI{` zb}Bxv!jo)@1>UTNe+nx|FL;K3ceUHntE0aLze;%cIf`Rd3Whb97W*K( zUhV(>(+1iE9UTB3Z}Es|=|;(}Qy|$ABOy%E^(&jsoS^g+f;?1g{;ul|V~55+F9iKP zYii}pqDA^rM!!Mk;hb!?;d_?}Ag!Ra1%VtyC%oEa1i>cY!I$Jc7y#w}*7lqFzGG+W4+X~mc|+(AAavyK3c1xq=Z z@N`cdUeZ7f&aeEdLQm6~Z3=6>68ct4=>KJfN)}@&0rMN+57g`f<17^3Cr=ZXTy0wy z7?Ik>xdu#23t71?`g1bK4k55;tk1Ay4==NFC;po)MUwb+0eS%Sr|~ddI)Nn%bY~ zpDXxs&DuTNe|FyH5@vg}P?+w5pqtDdjmXP)YT{T55; zJxiubyNDBhX0Q{S#Jew$V7|muZKW{EsZELOWefPpDUaap9Kh#)ZV(Ff9u&EY5RQSi zZ~Ak(%CD;8js(TOKJA_U@0`p9QGkqhbOs$wJ02p+tkKE$nIzaK2X{X|hsvH~oK#Lu z1_B@m!ofx;(-&$lxGAzxH1SdIww;jBK#grp1!a-P)G&WU$BTZb&T!}tVJG#m@o(#q z{m7wm&e*B1Qoa6uFDEOjh3|P6BXGNsMW8x=S~B7N@6xXYY-yqJ8>t1oAVXXBFuwy?|R3SU|LWa^8 z8g|L){_3KDXWpI>W`2U_^yEOcy&^7da=#=^n)`uKk_6>{_uX`;S3s@tt9d{GKF;R? zSX+|8RiG?!ADj{k3X~6$$(y>gTQR7#UA1EGKx!vu?v!q>;%-k(?uHSzOp3=gAS=xY zwYJP&5I_l?Y~SkyM^J9wEOOpQk161A9pwdICCHxZilWxfh`WPXQsrRkGCp;rbS=_z zs%lWhI7+Z6;fn)L{eh4PP_2SG?jY@%@4R{OrJu%p3AaSyN;InOKt)ZxP7;)50Z?#F zUoqwooh7gJ(W06+I~ zv=3zfPKCrH?kcK=zL*ZmWv&Wb6;?A2J^VJY3Y)HoPunP?V+@J84oS|_DLNz}@m2)h zu{d@0m z6DnA824Oj#9qZ4zRj)0Dxn<%dwE$f9O@Visv;Oh z&zI2zDmVP`T613x@JHYv<9+7O)^gs_<|yKU0!)Xv{STwBLhvFkdR=(y#*Ha2?$z?eoBiTHn9v9qm(TFjy z;g3HOe$8hL{__3(!48TUPxP+wb>=%StmmUyMbbGC z+-it(Ut3F*o~0OveUlc*hQm$mNi=$EYMS53!7Sh79V3DCJM^@R&(z-RxvY%$xJgDA zJ@K{;%oo7Nr+Y&Y&0`%W+pPtvntbqWa_}WDrdt*W%A`>&aV9mT=PBi;| zNKL8`#Eo-bdVjjE_?Z)ZbXElAAek&)vGj&bt#kFj5(dKDk8fqM?&DDYcWSe%%24*( zXSR(A4#sTFc_U^@O%iNgYzB%-3{xoNUyY`}9`Rk(M$%R-1d238UMc_lcTZk53B6;} ze%O6K7?y}!$YR$T%)`-6zw(!)vPVpy9$qk!|0_rzr5@gG zTe_$|b8-|@5!brlN)a_hn*c2gzc7chNzX$VW4&LEE~ab>X*4|S@J{N2_|EISRj`b4 zjI6Ti@c7GGkFUUgTx_d=dJL8)@DZ~o#3Ca`dkSfe`iJUTHlzOQNv5xGimll{XA7B+ zpk6ZzP_?4k1@IAIye;eGTiE^-n8JAsw70V(l1*Y3ZKBQRE!Yn}M#7n#6>BAwW4sdU znbet5O2j;=-bI}@R}6wrV{6KNC2jler&m`(?0uE{a-npWgs>;DF=AShctelVKzl{% z-Ymce!I-+bz`-0%^YfRYpR*`8#d~Wmm^No~oLnXOQi$!Y;ies`gPA#dWNs(CuLlKY zpH2YKiAs-`r;Gz9agtZT_jiMk`S~$VbFp+r?{XlSMf~`r(Q+4YH&+=M6Qicmti-#i zAi1lDDerO&uhIAG3tA$!`w>;N$Gnp@LoPrf_*_B-@ZHesyS9Ue$Q;M}FI2f+`x*za z(vdYX@H)rAVo6@`>oz_JvPwnLyB!$f%xI)?1_K0bTN(Dy66H@Y!O!x@yx&RR_guTx zlcOyP1^&tq%}9^f_Kx`xYd+Kuch%_r#Dgt+Voaen0Xf*QuQ2}kjUBZb|djNavBrAs51xD(|sRFb!>we z>1hxC*Vh7iSfo^CiC1~UcqhyuTY%mFGlN6t?$XGFRk7CVo&?cpA$|z~ z2<@$gtBI?K)Xz6Od+P?jeU0{$^38W-M7_jtbVb31#I<$ey3b9b_w84l?*IPe|KBg} zSu&8ZWEzyo57sbP4_GEydR<&SV>)&-ON$we{3H1-l{*?qn5c*TEFX^<;-9rk6+)Ja z^&0i<+reELLawAaVBYAyq+M#3LzyiE(CDYmrTpVHPPYC zG&)*aVn_{<95~>J;B8DT%=(Jvpa5NrVXqewe9V;zHr5eWk5E|_Zz*T2E0?#oB5;tH zLid{mGUn{v>Wui{7T%GWj03fAXm|P!&K)p5V8y`0kE%f5acpkNXN%1SDZ-NM3L%Ww ze=>)wEeUBVH|`M=S#!hJBjtw=Kw=ah34361K{`9`~z853&BT(9KG(&23VYLRP7U5cVn2N%L}Dz4(JR&6v9RWLst^Kgcv)mPoh zqUD}P4jWb^0LPA2vbO&(5c$i?oz$;}q$0e~>{UK^6CzMC&NAy1o%5>&{D|p0@IAQp zZGWcz#PXGTO>n5mYoIrvcMUNGrYzhRMe>K0;H5s@j zy^{bqZkk;v7jU64{JRingG4lOc|5y|ADB)ll=ypX5!LJ2=GXP8XTnoCx8rv~ur8fs zz#rkHQ~f(sCM5KCUt@2!3WnY2+jhSbiV^QaZFtW+U~D967>{MEnf(6V0L zL_sO(VP-qT1w1oP4V;vfb)mu}r$H-TxMS4d$o3}}zZ@pVMk7EcoZvBp6*q#^|GN4s z$V6#1pHHh*naTp@oe#rdhq>(KZE4Dc#Gxt;6@3FV@b`DDTrtAp)74ocw1}%wmbf}}@M;%_amBoW zpRM&M{lb?HcTF~U-Ppgh+>~xo{OSV?WnkVc>~WsA{jA;~!N?TP{WM`F-IngJVmx*%|ji99{(?UV$lD;)u<66RW|8JBhPfF{mqB~osbhUuuir`LW`7*!xE>%PdGb~7ZYXR3t)8u1_NSpf#s^23_lM)* zfm{X54(6X^(2jHjQA8~C>|s$D?~R#lc=CT! zWPa4UL~P9A*gxdl0ncHllL8I3$)o4J?kc>Ppac8bZ!pH)yjie2=~GwPn{DD(@|NFS z7R4A?<)CB}@@rf^R}-`}=h2}AmT*SDO>3Lx0lF>`$|Rty6x-Q>talgRHjSQ%UYfxi z!xm6KieI=8XwX8m?A_k&c8}-sW9j1?^%W$tR)W-?pCHtLl;!I`FO9eWeBLit1rvf} zwa9f_J>sX8{bjg=IOthXv9*P!Lcr91M-Mm*8!1k6*-L#1N`z*?%Jx_n!XCSEH_+7g}uE1H*Zavn-eGJ706@aH)&i zH_W3Br@pdqN+?6|q(xukQUxy3N&$2M;QnWZuRW&ArS@QR*j!c~V#J&yT%Ik2>c)yX zCgatFt&8P?3LbM=^}RFm7h|?h6PpFelQTUJF29PL5YG&uIAh@n^f5Cb$m6nqN^Tz zL!Oy&C1q5qf-t^bOoDV@G$Gi<8nq^_Hqufl_?+i z?wO+uMA$`f2OkL!-iNMC%u@iIAehx<2kCR^K{xh1K0;1kv$z(|h)F0C%1)#b)+;zs zVXeQY`E||Ky*h`dn@O7cnl;#N6(rYY1VVPE;o=K&p@8{Hh~VidwWRqdme(Mw{u^qb zX2$%k1HEPS=dGzy$@Y&)xN3w-fO0eW-37dM*6hsEwTEbE4 zok&IMy>dr7ypGfk0LM~%`Xtz4+bR%5WVialGan3zxpe<94&+_UC+RH8TCjoLBF5#g zO5q814C?%pQA)4PQz>@@YjyrHQ4pwZD%ca?4-@{n0Tfd56MiIOA5gAtDBmH`k#VbJ zr@%C;!{D$;g596Vc$J8gh=t~eAuhUB2zyHl$MmwT8CDdFKZR#fMc;iLpAwtH&5^dy zWS04a<9-sp)*1}7B=ECfGrQ_$q2IJ^j$hf^Ox_^rC*^qmxA|W`HEA!v1+{Kv zRZdlnFiY_CQ=#iAT$!4*Ns_0G4aKYuNJS$|gTyy(=IaR(fP?Hj8$k~J_Mrzu{g+5A zc_cYXkJ+g2U$JWIEY=o#_-b20QE=7RC1N}g5&=lNrwWV&t`NH$T6hRAq6`v-Xn7kz z*N+Yf|F%ztosaiWM}a4w@`R~F(NY;1)Y>m`swSSCslhyCzETCIQXz80zf=JX)baVw zXDzlZ`2J|qj+XNo@I(MU+{6fjQA?e|E?qsvtZb!2NH4oRzs~f_-zYv#lKkd9KBKMN z>kH0k*E-T>+=^z>^Z1f}S_EUO(em-CC%Af2fA4eIeBedJ2j9ZzUEFtmlEhuR3VDF| zOa(=g-h;Jl+Z_^t_u0&B6YT>KSTeTN_*KVM<5mbASAnbia zT8?6rKNl=c)clv9e>~cD@-`T7=5RkG{Tgrf}-ZGqjj)C zZ@2zPSufBlj+^LBnZZkdei1)4TdM7KAXv>r@Svim=hY~zTe)C=ij%5y>>a>|@l4)s z^yg>bol9avFPCM>KW0+CojKu4*z`2`f>vw2`oY1pzlmKa1Q43$!k8p`QdjYyXrW&) zEx*}zj%Y_Z|9`x9T^hgGGJK-W0raPD8q_shD%lcon)7=4{N#f&?3;pIpj zDLL!#(6+W>GEdY^-mt@ac8ix00xICmAQK8WrjNWtr&Sh+q(=VRDv2{?$ zGNh_By~Ny}DA99p+{g$0j~pERXhTc(W}aw7Vu(H$gBkv-c{tK8Kbn8ZjWJ6GQkSy$ z6Q|!e{a*c3%=>>SQ61Qx?E3Dosa*JeWRD39`2Q1^RX&D;=VnpkL0PULSZy0 z+_b%spI=I&Lf5b-rqIc>>#|P8)DQiI@hA()^=PLHzzK8|6H1sJkK%2(2a_0fyNcsd~ zw(Z)tZ?R2>KW`(aw5WX4{e-dFHaR(2p8bHd_3ylCEW&-i;09TzifA2@@bcWZ{(0L% z4fM)N6YISn^4-4<0QWyL+%Wn|HHf_A!uv}CU8GQ>)Mw%Z&bmCOQpa~z!+^$`pn&1# z&$8yD#1N+JfcgK^YNnqT|HqsGb{<+6YOowe_Z<(P%Pp^#!SjQH3GB0lp$6yf<-f9x zVFZzBkGO+~5GB>PTli-kuLw8l$qD(DEkVc6e$jc;y^OlW-s1$5rX&nV772uZ(WIl|E!3%bj$>vhE5h zc9@CrwQp|+I1B0231&>YUUuE`eZ&tjEcw2~hg46ERE5>aAjsQ0#$U+Baf}GGFxfUP^k!XZ?kqi}jvqF|< zy)qs4h~lqNS>LVvu@}k%U)?bE!e?|g9}#SjXlm28NagwHlrjFiu^$=s3zmzj z-~A<4u1XTgxe$zHn>dGgp|B7j_DvJ$NbY3TqXVzumiKAr&_l-rPmEAU>d1bujY$XF z*&%myAon<)hM<7k&U2q+0N&G&jE5d%6XF{w z)AT9wVFvVv#N!RJ*N5bCS4YSZ()>m39gLaO=q$PffUf(Zy5azR`)IkPyyNiO z=z@>MQA0pT8vl+Tp8vx=#`qn^Hy3!ca*f6~z*?VW*XXJ+gp9#&$ZVj4$}@Q(H8xxkQe>^|7K-wlM6Wcq9H_%R%eJYzw*(X-O`J)28MMacrFex2RM{QY73 zcXx4R06yM%XrF~!OUtPnGOC(y1z*pIj;Kr|!0|Es6#`5xCspu0^wOH|L%1jT?)EHu z({`D&6zq9Mv#z;4&3aYGlW9xjIlZpRjx_22+LB+4kA>7kcGO|juJxo0T> z{Ok_P1IL$HZa0zXnCyBy1lW)$mJITx`i&i3Ec=(JQu`CFI_A8+n$Gu#MTrl0-|_HE zzZdE2VdhOK_Vefm>m2x=L}+6QJtdc48dL=(gmWrtRxVj*w#D4yi|f)+3{)`$@L!8K zlyU#H@1@%1%B#ivJ~wKXo10?}*=eI|7>cFa`9t)I3GO(DrYm;pyyN74QY`!33Ns|b zI*|+5FPe(kob$h6-oM1jzlOx;yrO2*${6Be0Dm?YkVVkP?B*{H_+t)}^EY--o!VuK zdioOe5l2ZyAkr#9quuwsSYK^REHj~(1D>A#=AbwS+xI*Ds)C;0bdI+G_`?_*Hz4JC zY%@3{%IS8IUEA>xXwga+(;1EO@ix63L{`;r_GiZP1$ma4NOy+N37u7Ja~2(oCq_Nh znkgoG2U#0{L&yvbv?g-I7Hjq)WD8sMJfH9Wkf?^Z5~HR#nvryUUiH{g8e!LXwJEnc zZ7LShsok|MR@X^ER8(>HYT5oi{+<7#5s6>*o<#W^azZ&pC)RDCquaIT;*-_xEug8r zvke?WcTdI15BcF?yrAq`?Jh$yODH{R2llwQ%`~9rp(s&z3GnB44abbtK1^3Yk5jC% z;Zc8112R#HQpp|Z-l3&3KS!`)eBVdu@6sb0s1UO!T2fm($S?>IlRfF*O6ID370adH z&rh%Ln}A&*y|Aj<5(wjg(&QLH`A}k#;3G#E%~(1qST%&8oQDfCbLyfe&+*XJQ%=dQ>i*{FehD6nBPr{5JsvgknPS{ z=gQ2!YT+EHzq6yd5}nDZ@B#**@BeK0vd|WQ=!t{gTaims({Y8l3n<5@eBYlEjO+8O zZk8W8Tq8!APHFYIgTP=+sYcCA-jC}QG8`T#RG?tK^P^wZx z1uT2Kc&1Cl7{JGamNBuBRoPIxEV-atoXEt#LQHT|ou}UWjdWUhQ9ZX9Iku}itDm=c z5kG3R4cP}p@-2^?TW(8~6WEXK*x z^U@{FV83mNHY3NI`hcNZ`!J3IubZtZBMBMin4~q|ZTb6k@c#4B`*dB@dG>(Y{SzG> z4uDVjV(jDZ{{8|I^_}0fUsAoq^ga3Gl0GzhH4*(7WUTHlhj(kx?A@jd<#SGD3|=2` z=qZt*A!dy$vUg1yD%&1R06zAsZ#D41rvYh`0G48;7ijf zyjO(QnG+Zbm||&8$bb#Xd>sX2h6YB^e?)ZA%YYVADS@A8X=3v!J%Zi!;eFS^%25B2 zuZ`!2ybw1dRs;QzL8Mh1F&mKKxL`2GTo_}+KBk}ogzl5Z#feo8r)%j2w(KpztO34Jw zHIp-o#a38w-fdN)T6i)OcP`-X*Q{90g)5ZlUp z3W_#~JE}!z$h9+`o{LZ(myatP=^@l*nUW6IALA74k%L z8~-~VbzRU`SXs66iI^b3w>kM+OP$*YzwG3d{Rj}c0+{g%}A zD2i)_Y()NWBzPYljc6o< z?}u?xMBzBv5Y;n>byn zGa+}VmwDsl;`l5g5s^sr?S0T3ov5}n6(K8=bGVIWl;0=O&Gu@=%QD6vSl|F z4Syg75%MFdJV<$J={7<3r2J+Lu4f|9&Tn4x%kmj?BUKoj*=n2tNrv4_Z2q%u%=K2w z$t^tdd)?a#;_#Q6YCi!+=TqlT`(uX78+D08uAYq1&f6LCrvEew@hwlZob*msF&i^>$Dl%voexfzn%)Zh%&g({HAwN;R<4_p;BT!RP1ZcyXf%`O(mAq}^Hytey2cZK!)xf%e)z zngSpR%!AIqga@+xQpVt_X58hlt2{LVih(d(zkPOfEmh+Mky|AJDUQq>s??d;(@TS4 zu#TR~W762q+Czhja}<#`CoG}Ouutmwr7zq8-T|ddBe2pvi5ln|j#u|xf4GQ8_Tt5& z{i3hyg^{$~^efC2PVwiJ15|&~z(Tn!D4 zyQjjvhNAzMqPQL=+(U~_)7`8y%KJXIj!^eBMB02*(i&n8T%K*la0nMGS~)l(#iR*r z@)Wk!8II(u7#J$_x;CR{esm457klUXrr%&7cAcfZPIfNNV*udeU3Z7Z*8UP1^4qii zid^X2IO|S+hbff+=<5)ky#Adx>H@PW?N85FB!#cu;28`^F%IQv6FwhJ)E?Ky+;E61 z2jDr>D6oknY$G}eef9VdP!l4-Y25BympP|fBX6Jyg#c@Xsm6z!;V>w+B{&wR?B=hIg``;xq+!$ z>;TQk`T8y>qxxIN29F-zFNjIIp||p8-R9Y^tcdwL&epxtx-wcQcBctEG8X*4?y1k z%#aOf9y9RI$C|zkRF*%Q?%Kc3WgG+9d7BJdiiGA|xv&03qD;p-t>(7``|LHZult%+ zDhceIFKcTRKl<9l*o`+pNf|gs4-XsIPbGYB@0A`ecR4)cNIe>C_>OmMr`V?lSU9aT8gj1vD^f6vgs&Q+~WlOVp&tLHZR4$?r}i^)%z-v?R(-~-9{TQy~^QtWvQSV~$grc*hk52r-zo`bKO z$~rKJW8xnHzthX#0d(*VlGw>ZayQgOVOePSl3^;NaK<6f6TI&{zR>TxDZJI%iuTfa zfmcxVj@Q8h4wWnSy>l>4>uj6f4O1j-o>?{X2)4c*<$j<1;&%7_j&`P&CjZD6}M^qL{Aoe`F8v;3w79%Sd{ zf`~=r)`{H9$8nQ(XcEzC9snHS$PLuI-)pl`8HN$0*8i1)4!&$n{SdsPmmvJ(%?Me| z#j$jkC*C=Zf7DLJq&_cLnkSeH4e@G8Py$X^pN7Wy-7go{b;jLC!j(UdLr(p_CJc;* za*+e757uAin9lv?Og-djQ!{f@Y;Y#I*~{}p(d_nTVOi+jQvi4hI}`#v&acwRahQ-;Zw{|d*{sE7 z{vdBh+8eiF0%YOueWhIEDP{CarK?RkN-1j#3Dg||LDWm`UmOSh{w*lvx4xZV<=_Qd zF=+)@p)4hk8H!5DWKC3+roJuPoP5*;95Mj_AD?-SUD2#9(a;}0eCBtdj`lTTFns<% znUgsICx%}4S!NP@*kV1y-VD0}=DQ?VylMKA`Ct4(^raCPsXMTb=ilc>typxqA!CzM z1CP>MUM_NhY)#*u*Wqn(*+x>`?dRDRCx<07mDbjGIf-}e3uv6Fd3%!kE@zmR(19#+ z2H7K(zW)cQ!)I(-+GlN^y24s48HmK!*Lk`f7l0hBramrXgvM`b6=N^2Q=T@+hj zIf!GWPwOhj8M@TCvy}r{wiX8;- zQH8A6&KuLu(+H4L+__)-*%L6>p)pUbL)lSa|2Yz#Mj8=Lxkn);{7JP;4-$n`qJ_x# zr^`AhD;^aQAw5%xY(&>FIUJ`56&Q z9e{PPMMe3&mBFGTfsJXF-DA%Nhs)FFiEN&Wl!10;Ep^aV)rg~t%3qbF|3O6HkI>MajjZXKK~XZ7XMiiPIeQk^*`2HC=Ou}ii*yX9HwnR+1MXv{Px zxC)*|-kg@Q4`NHnGHW|xfj|#An7Rgl&+5m6Z~ctz#$T$ISAQiQlYs0k0!0q!r~kTc z*}qcoQoWl@`_43I^$3GaBL5A^va8GW6;E1R`tb$jw2-?}p)&;FgDTqG>{^Hqv;p)g zE=L`MHbggdm12tolsN&u7lNKwS?RP=><_i9*GrW%ho-g3UKfYFJ2GUUHdF7KOpGX+ zdW1zg)IQxfE$FgMuC?v)&0G~0-$348^Ffm5ft%w+y2qjxH z4ig>{17Mm%2A*dN8tG^F^j<^>6oWezuZbwElXnHzmR7>>Vr%_w;%0^+cy=KGANV(U z%^_OIeQwhUroL6n+&Z5hX?&Yb`z}%5VVCU+NHZd?;hRf>8M3g0R{v65-$1c$sG(ry z1Ao1^dB0fClU@OEK!#2YLLAh9IXV1>%W&@YUE|K+{H;e;$oQX*nCrej(`_r%VuB^bHDzA@a>knUu+r8~P61NZ}=^*=Ktr03cc zT=gtB^Z~y?XFn$G$uTYvVd8?wcetzVKz?!V!#!9r@hrn5hN`LloHx%}jYIhHXX0MF zLTMX4OpX~S0HEsuW#cy7!npnZT|}#$Ny17Y@7Rt;g!FE%+=n1t4o@-={m`Yvx0H7x z&a8=!~zVMuzjzRq(tMQ`hX0SPYnPojOBI z2HYvH){;52$lJ55prPADEgiMG8H`e%OB_<+wQfEyM{PrWs>2%qpQDHjwF#FTX39dk z9f>67yh?wt)F)T`8)pOcP#PY%@TZIxzp1t99n0AL|6}f&+VgzAZjvTxY}>YN+qUgA zw%MpbV>@YV+qP{tZj$$R@I3El_#e&Ly4KpW=e}oVV+tuYm_gEz2lBTL?yrjO257NS zenvV1`1In0Y?A83v=`3^cl|p?oFVtRu3ku3M2=3!m;R?cP$nMoDp)M#-6q}|gL^*| zZ71P@Zdi6dR$jDbGZUeO;svY&V)-R;8nrRRZ~KsKN(5$HURfCv%=BNnS~ud2(a)nL z9kr6#3e(e_&UKDgHsj6MpdSl39)QJQOxPt$3J*HS;US1+RS77*LDk7^Os&6?6F`GU_NteKbA8i*foX@G-R(% zrRLQbrwQ4eB=TW@0PI}u@F5ynGPjFIiz*vt;>kzKg0-g<19ze&3TY{Edk)jW{2xar|D<+HW5w^>1;h$9=ks4d&ZZCS{KbZh6BmxX3jCvdq~rSe zJ6g+P=$6J#Nb)21M`mSw08OB;AwXA9J8{YfTvYD2p{R=k5pYbTCR@a>$B-kB?dCD1*3AJ_(Hi|#;R91Tqm8krJnHtKe^@}EIx zS>H!Nt(wvW6pN^($NRG~`n%E#W_!POCDdN1gCBQNJF4*?2?q0FQ z)j1UqPJ6DUO*eip1Oe*;G^E*iS#q2I=+nUey9^$oM10xFySb>R?e~tPqtJ@4;p!=b z!wi>Vz&sjbYiz0WIEZuFz#13PA3BE+rIGs62Yf%Jmu7@kuSnR>o~C}WFX~#*LRkO@ zH#sME3$qtBim2=)U?nA*Ly>21DciK5aN6j|EiePM)*S&Z*ww_5*dNiz44_MysEtTM zK*QN=L>r%Lyg5U`HX@HPr1O<1prDszg__&Rwh1j_2}F_zdRn|^yHE%`fu1bNrLwo9 zISEugq7M_;PxwdvjyMvS;EvP=U8~b#>;0^*5)FgOzc7h8mtw|D1l1wpm|3%sZDIes zu=BQtb6cJMbfvs0Qww~*n`~k42(lOepWFIkPxILeX3|cdhxv8TpC<3rg`{HZSRxgd zkNQ-FYGlM|0`4`CZd1Si#cFUW$TjfP=_-Gda47{7d0&DET1o@>4|$}j9aP%&dU&Q` z&HJ8edZiqyj9A`aAtIGmhHIHy_uXSZX6)b~MCgDXKe3$|CFHBpdUN%xLny>e_DpfM z=`Dbd19p?E09d;DGD4(E^`XJ#Gfb@Bcdls#&_$2oE3hn^y&sLydZLT)*uus1@}{KL zxE9CM+O^$Cf4(Fh{osWDe}70(M6)z@BD+GVU?VrYIwwYXT;}v5;36=t?Rr6`NR?JJ0 z(YSy)v!=l&pwa=r!8Mh2q-%{t`b7-=?oj$)cfrhMB2*Zml==pfwV912x86-}2PjRQ zoG(nQmjVMzPE-WvY-k#L%A9k0i6r!T9bQRTW$v(WHzSN);Xmz_4Rrr4gatFQj36tD zJ7$`x0^mFzmQERs*!!qW7QZ!~^&vesq{JB_F2E4Ut>=tA8jvgT7bW{6Q~K51_I%H? z`z|5oK6>UlUwd6=DOO|cCDjG|9#a_)U1Nxja3L`??JT zQPv3Vb-Ffxsq2?yh=5;OKUUrMwGJQoyOEQ3`^D7|#gz$k)mYx>mZY!ybRYVs6W6g@ zTD6&v11fPbDa6BX&wu}0VTPFozLh^GW{FStdppSGn%LHu9o|?Pn%vqW_j~Q;|~^HgiGO2~E0pCgZ6de{KQnQziWn&;0wZ z=+7ElCW?~BLrE;Fc@rChlx}F>FlF1PczscHK{vCnb$x|a{;6b5;{ImbN?CdE`e}72 zEs$PsxmEz5tCsx!jq+}l{qU9DuqiQ51|1D~?>G$1#xEUo+7VQgcqSVozpx?-ED+tM zWg`g3skS}0Q|T~Y{>$rZlRR3M834}0T<&8lh7(Nc&PC13K3pI5y=7Y;fQhvYo2xbY}0XUgiio+!qC!9LdgBZ=b zk9P4+-9Gzu1= z`zQ+*RkL;%?Aq-;iCeQrb}F+(48@bpHxM?z9#{k;&!KG1J;5GO4(6kV!0RU6ie^7v zanpQeyCl2Feic1NIoAPjT9KH4&VZdCp5-fTGlMOE;_Uu}IW6uo;YK~EMpb2u%xDii0Kj^E;Kzw7NeRcWpuEP3}-RlYGILxL!+-DD}DgT-) zs#99cGu4m)<2z}L9-pipEL zSU-X7$Lx-||U9cBZ3DJ=$+ITV-``DYX$(q!)5cYY?WD$m77dCHMdt3$? z2Y~kp5FC|S`>-y0zjG6j{l|!?Ow?;GHpDuMEEC_A7NG3o*bX5BFGKyd@4rNTcM%^n ze^3fLX_f(e6zn1YbQ_ zkoW*0s=4>%%2%7|1qrSn4&Ta7(^_4>T@m zOpV7lFAPrwsmlf6<&nx9MbnC&kZX&EmmSIy=00IXwFm8cl2`9jhVhQS^1HIurwg;8 z&X~Zgh@Zh#v%muQd~T#XQa83LLKcE?DvtOMk?j|AU6_TJp^Q?yE75m-+h*JS^aPJ; ztWj$ygaQrq;JEmkylL0+^8=Ia2T2aIJV=plV2ke>~## zKKUTH1b=C*Ig|wdm)*HJyOMf;^>unO_X}x6f?QB2%6~tNm_}^tmC7nCA3CuY{GT)U zfHKtG?#I^q5MHEsI`CZJg=4?%PGn2X`p`}u1nb0%%Irdby;$XcU%w)c(w4fvQW(mT zWh8UCv$Ba0+q6U^QJ!ZK=D#Q7BQRUV#&X3qfp^Y;4cBX28KPTuThuYc*J(fo-J)exKt$V28bg@hK+y7DBGbl1nvTK;W$Zo1ReRd z@+wD^dlIgDa=KMz9`#)^)A$b=81(p0DE>X14uFWGds^P{k$9I`4cfLf??=(sAi`g~ z&)%3a1MUw;4#1TcvcOp(_!CJORQ7A-4p=p`Yo!=*LYTd>{BHV_Z?Gy24g+-zt@lPtyh70 zJ29W;YSzfD9teHs(i(iKX~tV@4Je0+L~JZBUaRe+ z&76Y_q6ozpqbAi1b8WxQ2(?*(h`;Vyf6Djt5DV9MRf-NCjDc~7N~;peAkIFwV1W|ltGDsj^hybD(o?s{BE#w`spTDGF3q{dd`M}Jk~@WOi04pYMpLB&Rn8R9t6z67V*a=)fL@AzFS?Uzq0W8v8g(qxSobO~;ywNamxPIgQ`j43`ELqo>q@C|Ujr1+%n zOKbu#dyhErbW6()lCTzU7^xv2^^;NUOX{Jn za%YEoqf)_Lb%7%^`!zk!+Bl46U&Z`*}q%ZId$$j|OftIBj@8Smeo2J0gszKzI4mZ%@F&ZFX&h;-zw~-euD_FpiS9-G)cC$Q;RWN0MEIy z3T3P?met8be%ww@t@2Abm0;Y*SW{EEsxsUlZk<*?kG_4{uK}zt*wF1r)KYIW z3^*KjGWr_M9pcra{iV09qxKuiVNdeWwPM{_fzM&63FhJ*XBM(Xy65oi6Ka{2kxBTZ zE1<5~2lx*7PKI4S^<^hA2vO9odKH>#m4*efH0LFLe^3MEYp;RPsl*!kIJB)*(5?I3 zYZ02J>)iFcYIIuUp0RVxI3;h>BtX~y+VC^caEc^~eh*jhS=toS_mclYYy^!*XEMKw z-c#fumG*GUsuDt)Dk9o~=%h`})ht;w%QdCMZ}(NakFF=y%xQUecpST}w z1+af_NoFYP28M``V33FpSf!U&1*JbSb9-~2ZTEohj}B^bmyaZA6(;zrfLe@L=4-C zD7ujY4CuV0Sm_Ht@MWC(=fA52m%AYpJIh~=j?mKraZsLiF=kkAK=}(>t_PGSJC*42 zB@X)7C!HG5+elH+=M7E1c+i-b{tPZTv{)(}v^+<)A(6y4E-^;lX+o^88(agvKaqUp z6vn?3o!oGwk?-26DY+SN)ta2tqPTAiN59b=Me0q1HC8*w0MMDTfjW7*GkP_qid zt8(vLFyV6=GEM^Ez;KC93r6!xlb#}@`BP5MJ))aOmq z_j-W%67u;$0zTmNH(=hz)u>#~69W6++)sc5LaQ|d%%^*t3VqBNJCpwj{}uva`d_pO zWeiF1n?Q2T4OV`7y_^Seuol&3AkxR?FT#o*D`!8qkW3WR0(K{jZ<_!a<^ebyce@##JogW=Cpd_qDf&10atBWVzZ{HZAX)Rct-kZE}ZN3&q&V41l&2IxZM3cW>2DLX%Gixx+CPD}|Mj>m^^v9!H9dnWib zl8bXAtoP?8)PE3K0d&|ifb;so8Ck_$W-bvEg@dK@9T^uHz$br%x5Rcb>Up9mIhkE? zrK5=K4=m=BU}LP3SQ!#{ple`+#1Kn(L2_T&4b72>-PnKkLVmE*AjL9Fxg7VDznXw? z^I`^ih%?+)D~JD@R5Lg2oJ)q27rH(RPtC3&u2_!NJ)Mvq`G8JF{nqI5mr7pAAS-a0 z?LEDr8+~b{JMHM{PlN#QIogD<)R}=;@hveCQy}X87hnP}IuL_xK$u~EVp7b%_cFxd zL^VFs9L*GhS-EBf6$=M3I!x6(v|X0W)5jn{#tp#nltxTMLC2Gzx|}!Nx-E?zI`B1` zPfJ?wpzjD0%%|069uRsSk?})6`8^nXf~<<4^81q4S%OI~u96f+w}5aJ=+9qh7>{ob zvG$#cG2yBUGerFrpd{$+*_kUK*l|~JUAE-bDQ`F@g?2iw19>`!L9W+|{A~p-*;Cfj zUE<2fLN&m+1G3u|=uH58eXnqZq!7~Y+=ia33gG}tPBS=m5=nvmgLAkqrf7xKWGzWu zS(HedU-z{t?grY`wlPe}wEVcI@EHJINlUPd7FkhdCTXb;?k2{)HQeAEa)l z77H$}hjt@q>mcYIeUM*pQ6zeBVDg!oOD^Rt;kT>2G{^BE9RU8*wM~T9Wd4Zl@tLUN zP>KE9t%j=c{)>90TO-(BE`xJFU4Va$PffAqYb;}F=EP|5^@7ZcaADcDzP@VOj`@4_ zF@O*3Cp#wT0|%O5dRZz|A}WL01{~5qso1)r*n=QDX^$0#ybet<`p)dog+AhZX>HiJ z_^-0Gx^rvTr;e1=0Be6I2ZAVDBFd$!2IjB9oge?AMFRhOPdk zlahq^NixrAuczZUrKjW@Z_%oLoV#|`)vdQ%Q!1Fb2b-CVdaVxmc|akE2BCB$6?C0tx#D;fu(xgrMevDqag zzuTNosJ}ubVK&Z@=^kd=h#IvkD}nE4l)f1oSzW7;EXN5k$v~*^3Lv~`RWku4C|3)X z_sE+b(zLv&zz5)DI{gI;+j}g7`*@+UhwkUw=&bD6Q{b}K+GN}`2*jv>Vw)?{!YElX z#?>Qt7Rst&wHGa+DvLxfopV!|Z~u-k1kk09uGESd(aUqt%@`!fDi;aO!Qt^;i>+L1 z?+PdMSbjri3B~kWiOb$W$G6DMooulu-WR-{d8+C7CKf;Js(6wNz-OvdnTAvOQ--%4 z=|~?wW}X%wPye)f2xkkPRUT~hatpCjJ4tx>TL2BhWP|K8Xa=L!b@l8IpNxmw9nTbD z6LH}Alx++gRkOtSzX${QU-HJIaIhjKR_c+~Wq9Zy5w+B7%N|2~9^`TjCN5d&^c;bI ze&FZ69#}j>D8>dDq?ccVbPxbtEpdGKlmvEn$>S20NTR<6K|W*AZ6S4VKKGLD$}<{G zT$?g~OBwuz>w^L@eQ*3u%>z|~okt&%^=xe2pTDkc{0PvsYPXSY5ra&4T&AqTKDvq9&r@;C$kr-66oJuzowgrVyyt1lnCdQl9$cm5NA+%)3 zsRwwe=M^QFeY0>LfDZufe`X*I^{z}Ye4vGYKk(!#?AlB>#Ln|hL2bi7auUsgIT*dx zI=Uqk5Q^Tcvo{*FobyY(q15W;W2+EFoUT~D2S=*{>Kdx!FV5N9(U7^3a&`va`f*v@ zmXln`rSc-B5vD=^)BlNrQjj?)phNBFQwryd@Z~bvwhDq!c6(ipT>ghdZ#2Lnp%QKp zUz&m%bkip0l6Uv3PO?7J-+5VjIIhwYaFFXQwOy=W`@*8(ln9o@SFDRkHJ#QXGw(z# zW`mR?cql6gfPJyvd-AbTwpqK3szB0S;J5y3P7`8$v7yQ7Tds{$`5R~9BH{V1p!RD# z#=#Pet&bx&LQ@S(cirKpNTLdQ$jv5DAHYYtNa3pk^L#uX?Jg0g@BoCgKG#s`t5(kfIZyb#nd|BmZE5 ziohw6PGhoIDwGAsUXW9f!luTVfz0)KssbF6WZWcA;?}^G+TPaZW{iQVq)yw%^hH0LEp? z7)*>oE0^U9S7EyS-c`MiY<$*Iw4SiFx%uwqe>QX~ zp32iALC`q|!16MA*kMH2LWnV-C{Hsvl|Pe0N1 z9R_YAGXwLZ)PgkSrDh+mCGw8hN9o*Y;;-5&Ww0ml|1pfEcbGFcc;=k8KiI(icbS=# zehdv^2h;rkdj3i$r^cmGr}Qy2RsopzfBr(e6N0wh%vXGng|kl(54^VzfumkBqg-g- zUxZjGvkpia(h6^qghbD8`s`^H*nQ7nIgn;3uJw@r)v1F$M*whowDwQDC*nAKv=2|u z&7uvbJ5e2JXFAe(a-sc9;^BG|tyl~|2ER#lRMWDJU1yWfW$a2j!UXaD3U@c18diU2 z1lai|Cj$Q7yADeNsXlNpNp_R$?Z7o6MEAk}&o`zN_GCxW0T@(+pBCh9HH2ImpOdcY z3U@HYOnQM_|Gl=*k0i(k)W!W77j#B_;0jl^;>0%}qS3R$*yM!S&e}jVEgWooWJ2P8-)kKTziqNR?z8G!r0DbFc0h(N2~F@;|62>d&wx;_Qud_3#>?X zi=b!3@#wX$hI9WXnry6*J?nz`N(Mw~5|96}lWl(S+A%yNSyPB3-s`{qYT!DpyR3ki z{~g!TceUM#CY&B`%bJp`6u1aWcMiitA*lM!7c}f2Vm!_AsFtbnWg)^79mg2TbNZ{U2FD7@-|xwyOZ16rv;vXlT5o9_i5I+ zut$T^(xdYO%@rD2?g7Hx5YYC;?3PbppLP{X{;ZTF+{&R~ws0`Et!nx?IY|8}HOjD~ zH%{M75MEt43lXVu2J0t&7yTfJSW;)r5x>dRyMyFk;5tN`!o$Ek5CV^MJw$ux-LqJd zR40~xh^(=(i7N4*4NR+*Efd`Ge|0HAFeEg2w9d3vY^`w=a z)7!*df9%rpNDFi~9zah51@@D%PR=lLq+i`s4&P`L?(`6+@OpR&%GWj){9SKWS(9Iu zSdEo~O7}Bj_Ts+Rt>dVMsoqiJ&Fz@a{@!OUpXiweVyAXlJUv9Y>quu(1tf=^LSY*cFBT%z?oaN?} z`KIH)a(Nw7K6Q*Tj)~hSuIOfv7?oGF#Eky}_^b|0kB^rX=HQJ`=ZHdy$}ebT3|u0_ zL>^mCAAg|#_#9anvr06`bI-wNk;!X({`#ISyUT{kPf#*B^-s@Nlo#07x@!t8xge6V zQlvDg8Kc!%w$xkx^A4oQwLdF1~riam1~gcVFqbe z6)4l$%Q-+7fY$%aaNh21_!0UJCVrTB242loutk&RD@>mWAFUoM`N~aJwdycRKo>nS zK+VWYpBci=spiJ4v`Cdk-tNu0KT)pg1I&kolKK0~fCSm)v}`_1!U6|+weohN z;+h`Goh>FCubkGXvM6tVaTgyoz@Dcu078j0HgLZ1Pq2)?Gfhz1 zMuJON&4cDF_xbwZN07XZH_S>#qvHSREd_CFt5LN`W~3;{r*Zb)9k(r#AJuAtim2)I z!&MOn;DoO7#ffrsePb^)!N2A#B~sN>OfdA=~Q_ktyWaf8O@LF#N0K z6=(XbcL0nO&a>SE#_OHCBL!28#bK)q#sQ9rv5%-r!>VBP#`KDY*rSU!x1`1)(b1oZmPo(h_ck#k*41g%E zWP0Y^eF66gP)SOpQ}WvYy#!bvf|t89}eCB6(vp+TaW|NVjt7xI~jk(s);%idf9 z;6vSCw^TW%Y&&kUpVN&(jqhL|8?yBPWg>>Yw|rFIHgJ|oVZ)jc-wMf+eLmXO6lBec zA`13!U&_nV=^B2h+yVSwtdMs*U9OZEV7p6Wq5UFt{^NyWfh=+v?tFp2XvS*EXSETE z^{eM`1pM;Sg8}LSv+QwNt}YY(Qfkfmdea!*lnKD+IlH8h#0#M0ky~}AryTL5&&mxZmHjM zTdTVG(v(6t!}`SDvN#|?y9Tw5l!qOue$7}{J@5E^rabq1)GmwLJ$^iaLF7&+`z)CE zA++s>`&)b;U|mQvnBNF!Nl-p^@r+q8wg*3?Z~x=maq@<>qelaKbk(m`2w_Hp=QQRp zM&y7>_4DisR>3rn^rGnLB`mPG_5%g3)2HI393Hwi?^Zd_C`-C2ci&xY7|%V>twt($ zgeCLMa2HW^Ihu2_x&vs#*ZHHnVSh&6?}{P^er*Kx{2*dgo4`1l3|MSU9L}8FD9X5L z!IH9RGgGJQ-Ovtw#Xk(qd+xT)Ysb-$8=ivvV1I^Bl|W4ndoLMp0Y~^)V{G0x>RdBN z9DuGmo*{SyG`QYT0xSoNPGfB;`C+U5x|pZS@Pv8(2)A)VQ=e@7GK|0&qLc7?ej`HB zzROHShFRtVRi!Eh!NOo*z75j(rQV2*ii)274@dCAklCSFS|w6E+Koy>rDh`WmU3tR zYNj2DepUX#`Y;i2!I-@E>B3OxHz~Zv5UF@xab@Tza!!xC?nvNj<4%A6^Z=iTGKC--tJMBKc zb*Su{NGh^pfVs1=?D|#V{nwqY=7L*&AF?lY#*dK5=sWg(D7Gyaz@InY1*T)J6cm1n z$o$ub(uvA?`lEys1j;$knY-ng^cI=oo{~nHt>vI9oP@>amwCd}Kw2R3*Jca_UFE|stU@YqCjWH?wd8!`* zxq!@LH4%e1H1h$dyBtZj5XKIG&lTG*!EdTm`G{1ebm#DeL+5>~{#ium3GL>`c2Eg} zR+uvA`tg52A~~`|)bIwH%Ftn&$;p4DJSdT^Ty`l7q9_3DoZlQ#_XE!;Zgp6v{_as> z_OD?^kkdaiq@`&k>!$u?0_I{=9UKf6e~k*);;I~RB>#n4CJysrZW3w2z0>ZzOB?_n z0Nnq~;FHn>{jM}Q!nk|BR9kMbmypG_F8FIiQa-(xxTbS)0GsSfoRM#DdK2DL@~%&g zHP9LTu9=XF*yr@>JY4aM$`7EcFm=}`n05rIJ@wh}5|VY~5_9s?0`jRLj_yT*aA~&< zuGpU1U$5J4y01hL9C;!lCX-Ow9??J_i~qvOy4D8^SXXQG?KhU-NG;~0H>%9g8#YYBa`Mzh4=L6r3V zo{%sP>pb}LwTn^**7ffzIM;(dn7v8rywy0rX}eOJI0Nr9cD2^cHE>;kKf0RtgVU^? z`EG}G&}TKP8W$F*Qnl7MeLmZ8c4bf@CGd$JL0~cMEMYW{M_=g*G#@&Ntk;fO9ZpKI z)Hz54?TqK)3avET>40mlAnCm3VTyfjk7%0=;|KnD4l}Jd^W4q|hiUhHe_A5^nTJ9u z6rG$TU?0-o)l#<$RH8QYYo`z3!Lm^g*`P4`-@e;C^bdQy|1(Kt9@BFD1+LqTh+t0l zuCmlEFa!ENM-dXk>e%Zi%tM@tGbbfW`re@@xRGpH-T{nvzviO+LNjdh?1nLv-;-BD zLfe)XgeM<4&8Px7ZutL6iYYG)n`%8O3+ETU99#?<@Q35p^UO|Cf0gMkm z=kL0AV!sCYf!a*1=x;~OIF^qohpwVoQtR4*<3Bw_3G;|&`Qy$@^t6o1kDOs06C{}` z3MRZ9!9$YYHdNx-0CY{D|#2Fwce-jZ*Yk9IUk^>k~jMF$Qf-aQ;Da*MRdy zK?{dT))2|;Bp0pxv`TN74O%K3~t{V`iG&;I>Bg{1KBF?^9MHo4{H)eZljc_IE|mGz;}GQ?*%~T8p%^q zl#9|G;F{9SMIN$gaj<&yG`IT?;Rd-U<#{77)-^3VZ<=0YYy>w>-Pj(0INBc_t)hBN}63+{wtNN_cpL@hn)ususJ68d>m3vvc=#&s~y44wo3 zkhZ{_jNNq2_wm*gQ;bN9QqPZz5)db5U=!NhIZTVQkmUV&%HS(%p#+oyNp;2@XzB1K>nD$8J?rit4-AIjL>J_CB*8z z3XQu^>2c=51+dNAy@EUu{@3>3^u0WiO6=ejfMd?)R&s1}gyHxZC%G=OKZdGBf4KAX zlNw`)8T}D&;*De12YUObM<#K-y0ZB>W`&s%#i*u#_0L>)4)r{*KNCEF@5Zyzzq$Gv z(oQ%ztW3^&Q=M=juVaKS(M~Qp@+A8u_)}mpN=RY~*Q<8%gfuA#J;} zYyzZo>XRALWIUJ38i8~X&?^m1$s@r~-)l|pVh?JWcu7d9z2Az& zuPYjp;uA}fYC$tzJE|QJ4_1rZuC*xOJ8Y>)r z68ny9aPghn9vb0J=t6v^?0(DNKNM3BP&SlX^t#msmAA4g@@G;enODL-g+?vi8`|69Zj;s>+!vS@-DR%qH0+7j zYLnsTPHQnkrqf@{2h@(8035G{WFl$>GMBXU?8`h1IPC!?{lgql_F?x1p-c}GbzK6k zS};yk!x2&?4$?X#NK`BOmLRsMMGvH^ux2(r z8KL7huc;izhDh~nyBx;syBIwtEiIqEM{yH=uB%Eov(*=ytS#-0XcvUJ(H9qxysZfBh4%}qa-~n==?QV0wFoFNFm8T7U6>fdW6ObF)`669W!l4E-x@|*N#WHiiSKJz~_H$(A;bn6nM@z zVW)4evy$yOKk0h-VH$w%+#rb85TeY8@r<#u@@X*zzlLFT=-Gkq@LapE?G1A zk_ctfs>ppu9tY196Yc%WZ!x~XNdUu4>F6%pD+Yko#$M;JUm_xi(a5Rom;5e2FxW0P zOp$^Rq!=1(2)G7=7t$HIhNux7-Vx$Z{kl|&n3(QG#PU4?=Ea4?w?~L7HIQTwo8!$t zO4`9wJYe(d_c4^z7@jF9<;*0{Jr+%}Z+fd7Z}UIg{rT^CZej;A<(8d+EeS6jWS)au z0H1VR*&B70REH;@@|dn>Q^7pg4(yHb@!`SEc)row$lU4QQaD4h^gNaw)aotnOcg!z z9be0Xf2J0HYVa%w^U6p7>{Fxhc7seQCSlTBCAq4Fm14fc=9aY*m@>)0BB~w9P)?8> zY`DD)XRcu!kruM}sPI?fwL->e9Gq_V7fe+&xjPF0CpUg#f%9jDx9X}ZPPr8CPgNbN zo0AR!&!`6hJnFP;MeB7{GdoH|)T=7R5LXtfAHH`wwIrN2U`htjx11G`OTa!k4L>$J zV2zuDz^r*Rw!$ohLR37i>h zOT{Efc-}KB83BAG?KTfq3-m?eIVUG8V&yM$SsA;g#XOG#>XIzI&q2I4eD;Cm=uxBfL*kf~m%C+wwR!3i zJ%uk~m7FhCtqHEj)P=rxBFeeb*`o--+`JTm2s}zmjjoDbKn0#tsyPj**q&o~83}z0 zU+T=WZkbIo9_&->FBCN&I;#kX+%I+CUL#ECXwErW#P=Uydpg13>aNhEX7*ZUnoTgT zf#=E&gG~S6+#Po)qcHdWU?Sqa)#4c%dv3?GoeA4oJZ31o+>Sh6^%$;;Sa`5ZMa$SY zW9YQ`XbZX-{!>C9(M)8ZeLmEgI8XW-sCvfiAh!*5V#v6N<cv~&}8UFdkifsX+M296ABD{mB+l5nW)Y0Ef3)~;7MC)gQ)E)@iheC9QpXu z6FYV3{20gkvrK=YBX0VZk%CFno;fkwl(9_G)i!+gZ^wppo5L*Voo|rd$ilyl^(S+9 zcAUx9ru+4aC@`+a#7)BA&U=T;24c&L(&4i*+RoNJNPJ!th2C62e1G(d3Qst@MM1hT z|Lu69&U^ZQz4_TY&x(*&o|*+9RWRzF?qxHLOIOuMfm!N=11(=IL!+WL~h}K^%AGDAv#1&tl-OCFvFjf6ECjwYFN51 zdRMFf_92TaoL4{kd&X7>@$MtQ7M^BO4Fmz45OEJlLaRp^ERHR=PYfedI@#f+znO2l)_WVJruN^i1uUg`QXhRJyM-%K<|>12?v%t#}Sa}|8Aw4X8v+TU+QgEkmL z6<$_DKLog^K^`*!c4l?!yvzB@=RtqN}0-rty>eWNtET7$kE?fCT#V2QFEW>8T3DAw%bjevOX= z4Mc>-oq013k9meBctpp%SrAlKNHXF_>V zw!Jh}*UOD!Al#pjoaQm&t1Em8fJ3=0$8<$SLs1AN3R@bKUb{=cTKHvC|3Qc@r`L`H z`%qbw^lq(2?`uQHx9;88#a_Qgi_C9`h^h!5{TGh-R1zG{ENWifBFF8DQ5w`Lwvk|7;aQ>fbvW_Ofj*Jg=CsC!l71= z3}?rAgPx&1)1VXKmUqabLGc{zivb!;?%k3ewcZ?!Sj8xybX-!`dByh}`>&gnC_c8>i-?+9CM;H>Rt6LfPe zgl~*Y>m5YINQ4kzXHa!AdB~-{K^mhFBsPZOkr9qWPr+&M*N)x+BlEY#r=nT%Os!toRW87 zq3Gu15n!fKRsyYv*wk$%1_QUi5u20r7sfUVVpJa>Ts>!N9WfS+!j@Y+>hkB&y>bl_ zYQ00fCqs0PBtVEMq*EKacJ1bYaYl#W$D^2zp3TfuHR|5EcV;mMRcLu~I&r+_xjOUoue@+<(dGy(C72i&*d zB(H2=rgm+sXKd`ik^UAsmeOlp0;@q7xI$-t*=gVj&PC=Q$`b^J52Lg)@uVdhii^K+pH-_Z4hr$~xIhzF zBkKC$gmXt0JXiad9dY4Ni-9{Q9Qz0e+}t_Rhn|G_cXF)%DB1BPk%n|&#R-?MuT6xv$4EvXyr`_DD!HnBIv_^%bu za;btM0@#{jz`URAdC>)T_Qx+awtmrB>s>yyNkBm_E#^^Mh_hBro(m&AhAvXG?Tgw+ zVJR(WzrsGOYu;b=V3twDzvoMLf=>a@r;F3HYr^1=>$iUu^vA$sDf!)PxtYNnV}y5E z#g!^zpE}2Am+l_trKt~uLDAK#Lb(1|j1DVvi(7A2c`dU1fd5BWj851jGA!;>`l|i|P^bV#v%2GHt%l#FCow7+D zfPM_r31dEKP1;37PgK@E&Zu=T5O(Kt(g+RQy-eT(1F}5_b_7Gev+{5qb>07-7YyfG ziHPi%n}9flSVZp1l;Z)`IiOBUmbA31XhbK%uZqyr2kaHS9xdBz_;$#ed*6+X59dmH zGT`zgO%to=M%!H$&u&0Ypwr9O<4hJdI=4^HQ3C6hUwC*c)s*SLQkO)Z8cHabrt+Gc zmss9(2@e(Z;b5Pl8-xB;l&Z%^{pI$OoLqWk2s@`M>j6K0fS2ri(VFnn_yMq&8ejQ= z)x6-Xoiwl3wa&Ol$2Jmbl95<*VMi|_$s;%4)_sH9%6K7~%?XS3n3P5jCXdL=uUh<8qvT z!RYOspO!t^mPhW+q1lo=@}-Nt{8U|I0^lS?VY+OcrDP=#K&zaIL)K4mc-}wbsn%h9 zPC82e4S(2HOY1oMYj^D8z)Rz@l{!iMAYC~zn(*)ZU2BK0^6Fj%fYTmZqGE}sTG{CC z_11gpYSjr5g%;c`V! zI?e#l&(N|>%E%g9yvA0y<2Vdg0mQ1uY9fmYV-ksWT@A_E2HGo4Rc+R zzFBb*Q#B5rk!0fD{a43jJObp-JF5_?Wi(6-dH_`@U8ee5sv z1F;_Wn`u#$i`Nx3NLb5e5^8B8SJHVr;Y|fws0dgtQBvu?Lpg4J#W&7?Yy4m0!2T~x zx0L_-9Z^KwHn~@JhdYq-edKU=benXi%Z3fO{(<+gm^~w$&BUTs{Uf4&;qleZ1AlW~ zQ{!QA7qgnCpUe#f_9@)x3gGf;zj(j9f}Gy&F!8WWl*2aqaXKM0VS`e3C=&61`srTT z%+oJX?H$v~?A~@V_&Eo&ao^N>Jz!qdMqY;kbX% zp8p3%Wmz3tj<{@&tAES*jb54p+#~NsH3N0uxxJK7f9qGpqzy4yjX(_m2N%CQWq{tE zssOhaLEOEQKD$~V%*x`wYt~rYNel$)CNGqZ5%j&2*@T{$R<1rKLAiNBK{<2H{D zvuQ0~w*u$ACsg{V^Pt_gnT=$;X|P`DN78&B|8M%7V0Kvx+A-{5KAe>uhp;S|;~w_j z8vUh-HF~cFksD}k`^{F0uUudWj~>A809yYuOCfWI86Mw!bWbmKX0mgR-ys3_PVfNg z8s|ra`Ae`3vy*Wq0>TJp2#JB*%YV0@*@(h^#C%g`!`m0<@Pus0@$v*nqHZG+s#rVR z1#V54lYlY}RpY?*^vK}}zVNcE{WsFv2jmaVm;x>{BIldGC7;2d9(c7nHIAUhp23Ob zBTQvq9B@Bh_T>X+4JuWNniqc*Cj7RL@-gXKs}eCgI(7gr+YN0_^f24?--*lTGq#zY zkxZeb^TSAZ9^J+#ZQ!d!HNY+qn18=LI4ECZO#oy6%`yXWjhPaDY`kTj3y& zWt{q>P@GPl;h6P_84!T&jG2--6{6XoLf9#kJb2>M!M~IrZ>*FCSN=Ql$MfB9+wBQK zGQ^E)Hp!4&2?gS4Bwc|2tbj&93uj>~r5afyV%v|FZi8f>N3=ywz{;!S{}(`AKQxwW z21i6yQ0X@R)>clzFW|iJr_kZ|3kdnya42`k|KAIoMlqAmM%E5r#d7ATrpm#q)Cw7< zVW9R5+eJUcrb>*$`DPD(UA%l9GY&;5QMog~pTXM$a$6;PKyM_@8J@3G2jBxw5<)*e zE2u@*?sGGIF9sDEkiqck~)u+T|X z(kF2ex0p+U@a@KEQ$rr#o`OS1DAA5JRzNhav$md|WXx4s%TE?o*d+9amg*HlY6i|h z1n^wBbbA>Sn=2Ad$Nneq(Mg%1w{=VC>TkQ;{ZJS(|1evYLsIaByEC}iUj_R&g8JQy z>CL->fvH%pg0V95ef8N9;QU^Lm&Jaz14CW^%&s{u=WSUF9cRkT?VU-Pu_OGH?VpU- z2%57^t&D^vjZ~ml1P~s`F6G)blT(b(>6IgGSphw+F30RfaCdh z^M@)IB{nU&5sl;{K}(VyDOL+ztYU&f4YSRNzG;;RCa2{T*=nV1{nkdu#VRATCVvzxyUtcAZ?hvm`}5A9EQR8UPj&Ltws1d87fM+nDFg8J-C*eUR7JM|#=8&^FLM zin76`qzkLlL;SQb-hU{OaFr>cLvu2^g3F{4S(i0;AZtr_nGz*h3gCw@q$$ZX;OGTX zv#!YpYf=f(dr|}8xEqZs2@dRgKIkL8;i4ccky~{UTquxS`gbcbmM&^V=ykh)ZNrdf z10?2!0dkpwdJ^YI$#Af@r=~jf;B(Fge@-0P+MQBH1?%tr;@@62U0|>B%8!yF=C`p) z>L@tcY;~!5(LHv>{tVt1j;;fKS3PD6f~RMPp(YnfGZ)H3+rN3**zg|BZcnx*t&J=wmR`^1;sEoW8)Il_)&xUhHr5*%MNS9q z?}%z!d!Pj-LUp+XD|b*iIlXxopFg{@kKuwCHsHcTB2HXrTH_kp#o3Vg8g!d}2mtic z8;G-RXM_CA_=hLL3`28}UGc~$)v${xb{^;A!f>zoT{YlEsh{8wiTH&Qi;3XlJB2bU zc{xnqN^Y5_q({`F7Xarb`yEYl!_|zsIN7ot%=0j52+IY%iRhu4sK!tMv%!cNLJuo& z{5D5c1nFm)p2tsTzF_(v1q8TLleqKNg$yK}06phW*4ylFDd_x2KK)yN2q&bd`TN-P zM4|C()?kn7Gatz_KI;a9sBJ}TMb6hVJk3CKnxk~2SR+Z|G+#$Qd;8(+tBW7*WGSL8rC}QHV-oIY)$pH5{7R=Iaj+jcbN$*2bJWXqA|I$ zzpD+YOS;t5L9X+m&n87_vyuP6i0lFS$?-&hD5^m*oR^jy9jzN|{bFJa;G6(;A=4NFXEg&v>-(G3HS%P!J1#U=b-xpkgv7BC(axnyC(4gI*PgBaud zBO^Njg}=PMKyVjZmml5>sflF*Rhw~@$l5u+ z0l=rHE>^Orbpv;)dk?8J9=*rceIwF}%HeWWtJPy9sNbbKErXNZ4ysUO(~C?U!_$iE zu#s`&)S~WGwM8Kw4(V7HU@rjN|I8AhwC6}I2x-*YZQ%LJI{EsmlEuZr6=^Ym1c4AL zETrul^eQ;YYDLAdt&|cHzs!qi|Nc3oYQ)yGxnjbk4;qWRd}IfcVr&@XUm@-S zaPr7?zIDPuyuKw|vfDzT(O?NHF`gAC^Uu5Toa!0lHlO!&HKm#E0v z)>4O@46s84)4#5P8>s_m78^#r_@7jTcTOhli0vz<<9UVGm)PUGz!X?wSDFK~BT*@j zlCBI4>Xz%7$eq$yRA54jp*P~^)z{x`;3*y+(0KfC&Jq`o1 zzN*4E*ZTf>wQ;TG>3whGX{5hm`=ycp{`7g%CYU}^MQyu=iddjqi|?&@P{nGPL>eZ< zg#jlQPyT+B4B#`N-kIC^nBRgLt;NuZ5zAxKov?v5C(GoM1Xn>n%XAK>^nLo=^z~`| zhTa!`RxG1)JbYrbOse|YE-^o1(7{y*fKvt{KS@JmCHVzEani3fwQxJIfozmTy)kZ) ztme=5{F8mwgW7b>07R3e(u=4rE8*Jnr!k*v@JIfm2j*9soofLA=b}65DS#GQsvuIa zIC>El=Gf-0+{oG*^f=YK*G1mh;@?E5BB4av&oz>dyY{{|F@j%@$JfvuxLuS%6nb%D zw!rV9eL3>V0?W{cxtZz!$EzH->aqA z_RMza6G-V8hm?J|zdeY0FX1Cf;_%>eXMg$quwWVl=B-MT#a|+8r(e?&qPXMo8P;H# zqiP{D^Pa^PtiZXByO28)1z~bTLW;+bdh=2+Ctd#x4{2LoOdC{r#RW7sG6xm|_-KS< zqhaG_rkgw0wXoAt!suJ9xFyw9mMAqIQN8#S*LCuwIpk{5wPK){arhBaR>cNu#%|8_!2{JB1`#Nr0J%utV8>40ms130fT#s6oW^4;HR!+(t6nd+q=qN1y<7V^O& z%?YfwViY(zboM{Tlwm?=n`mlv8%^{|wYS2Zq>UW`y+v29ZhYXCm&!++(Xxp1oq ziVv7ZS+9>41)}kU|HgB+>Oe9RMvTejcP+sAm}s}LEC{Ecg*-E%P9lNiBY6>6x&3j( zulUMb1L)`A8{r)$eB6&2qVX}GM#}|_Q3gV923t1uWd4f_I*^I?bjLaT;A%GH%4Z*t z;d@T*do*%_hQLJ30(ItroCl#%0FLdn69ncN6Zp(sGi9Cf#P3ejksMGnrkqh7obH7r zDk9XSe;GE|p=A}pqCe5z@=5;)2A^5?Qfys6BQ#c*~m_ zVo*Z`!I8Xoie^<4hHk}1=onB^M0Ts564xR7)h0|vMPX`A7bmB%eCGS|UVQUXMfL#t z!S81V0jqATv@$LBIIeWsv-ZA@vJ_0^t(Ha<&vJ}r<{XLd_K&^lMgC-VNTL(F z5}kJ+5P;${;>RS4lPKIQw*IYPFAA@ur$rY9#y3hvj)r@Sye~!4Ka9GgZFm_6OP$Zl zqPwGKUjN2~5j;T}Rz@6B8Pb*F-s(-Sjo7VvPwCnS%A)_2d%g&k*LPQEGNrrLbkLG%B0JinpIO6fPlsC?Z zY;D+#LOle4Q>`}#4uUe?D8?7oS-QtuH2&jJ-&R65fOwui&N^N3i|r*D1V;DBmt z7-!euo}NlooO9a?=lIF---L(QtXzPep!a;ooIX~9N=WJZ-!WDUI8nZ6ClTB$ytuf_5s<%6V zb48GGe@yb3bMdnogu@c28trPa;R~(#F_4!GsI!SY+~ED?IC;}VSNA4U6HR`dP-;7&}DZ*59+v)mY zTfhHa4IHgF_fm6+)xgK8bbZwPPizrC)w;hJroF)bsp6xy)D2YWie5jr$KGRoM0`BUxEUOdZa`b`y_VuItglg(haTmeAAE^L)2?!rw zW)kJ-p`FFROh3@%b&>qT*!#<&U(x87qO)ebV*!TGe5Oqo_>C{=V0qBN`F!35>Xsn} zt^Z01z7aFR^cEl&0PcTgso+vfn!VkH7m|DV05>JTXIfGYU97gfV*%~H^7WM<(|M-t zp=*n+GD1{3E0N7p;S;0Fcp6?m6<0}(@htP&j!lZR zN$)S&oiH}S2!_AB8@7KtTxDun_sH@9EJSUg2U(~~WZrKc|Ls@u6Z$9Of0wYJ=t00N zBc{bGEumIrj>mVGV2@yB0R^4J@{F!NyuA7Pcwx3xcy~P>@TGAe(vrpK-E#{fSsirJw#QajW%s$QPXV)Uu7h@ z?s)*qg`qJ|d8V0xI@&w{?OlGX9{)}xB&k4SC@!$n$Nv8C^-hI2)*G-fV#0i zE%KVDT$4tc|Fae|Qvay=4IY3aRuR0Pda4nQ$@kSD=ImoXZImxKB4;DL{;v#`=SRql zdxKlS=)L-i_oJ5_l3?hg6|3@86A065QbfzlvX-hJFupau)=ZUMiJQq^4E{CF{-!^z1 z7N^Ue$ss7%EA4=Fl^@hQ<-ci7QdCOHG&&KeIG?Q4)Um&$X#V{-ABx(q+GX4J)HETL zdCx+yJ%iW1#$hvr{!wl*oG>olPq`D%P!a>6A1~&I5fLD_7o@1 zuz9jw89@`iC7zm%m_3?Vf;WFm&HeF7s)DM(|LXUJuGeN1yg0c9(WC=#7%#VB9rnTf zBdcM#6-02rO#R~W=#KN|9PO_gMN-emrJZ)r^cpCHi*!V83s!w5v1EBP~y z`YeR*HQ`7iFtvA2aq3{%BV;Tz1}&I-_)54}^`#f-d^|KU6>WTpJ0GnlLb{UTaCrdE zmQ{x#Wi8x7IPG~^0zspc2Mx?dOrW@hbgTs40O1O zu1bf8iBzNZJ2y>r12gwUlk5Z6KWw?)0)a_P!28~+LuT#-bs!LFX`J64lo$T!o2eZi z*XwlFcs*rT%@Y#=Qbue6va(+o(!}xyQ=m+xl;BMH4SsHf2A-YKf_6y}fOEt;de70_ zQrq$4MSGJ60cOWJvvN*VGUoXKF6V58Q->@}!ayS6cOZ8(&J!w`kFL{*DWt2gdNOCx z(=3JJDhF_mbblD;LzMyj-3*4VzfQP#prV~H1AoB+<;lI8=(ZTx*NvS?OnHQenTS>Gg$zih`J5IxY%>2h#`Sr(qeMp5Rzc^`B~XLY#WTK z8GG$d>JK)1ycr4&2E!&{P^7t40S_D5m7mmk!$&vubr!NDspjCJTQ=6ycC7r1sKVg~(?CYF&!R`P-T@vt9PwyQC2>jjY!lcUS=@b74EB#KB(&ic zk>MI5JCULucn5kXe0g9$K95Aq^Q0sh#d3Qxx9dWAqW}E%LDOxEmVO%2KsIA zMbP6jvL`f|`S&+46I9#A6)#Sh54VryeV)s-R9Aq0RvbO*px1_S5a@8g6eaVI^TxfP zV$h7dVtfc<=y#ATl)1D|%GUk#VdJo!s_pkiWsadu^&J*FNAU1ZN%Py7fpr&>(Ap!U zjW(T-wBu_Z_Fidde{5^93)}ek66yr6w29Exjb?lKSzz?iNW>9?%_ECirsCHX%Fhug z>atn=z`v0H0Qe-qU&*oCeac+IdsQ(_))S8*HzJ$0rI2Jv2TgU1y;RMpRw3b%)%El|>zXBCN4m!ObBf z4zQ0NKX*EfJ9cK)Br4~+lXBsjFwm9z9bBZ|U{CMtbAq>A8J zx%#%SVmq16WU~gU(TjWiFet&vR}*ZzzpAz66ee7MzbREG0l#Cl9wvsy@Z3t!^@9mJ zUF6aQO)I7eTYQrX_NRt_r(&kEUG=Ipe*dMK*82HXKz)rLNd+^tI0QSBpp%^*oRXbx z2jH{9+tf$`Gmb@!_d#(Z@Oxo&%@0}QZnmI5Y>TYo?!Z^q)R2GeSFwzk{xG}qPw8p{ z#oJ`!GgZkeR-VskakM~Sov^?a96zHqP7G-zC>p;YdNT*SfDvWd=oJ$zCaSupNCL>d zc~Web?6Eypxy%jp-=n1yO?21T=6A&l@@i@bv>xF6%po>^4D%v^uRjbEw8Iz2;*j0l zA$WCX?JS$%w^~NtR`!TLyGjQ2*74OqLkSd{RBwiUz% zr1&GK)9N&#(=&d$ifns1`AvxSV2$FA1J5Z;d5SzMaj(}%@yQ(EW89PSyu6R#Fx-U21)GZZdC>Jv^I$a!r}NI`fY$88mr4XF>KOJ<}JP}Z$g_w zyKAVL5@xy0G9Y&Id*mPHqp{x+qclnub^W)|S-@!Nb)b1JNf6HP_6!lRYr%WI#s%Ok z4lB{7yzCO!+wnbR`tIT>W=X z@QEypAG3l3a;sWwYY>`IRac5uNXrlOrXW3SfSxT^-SGEiheg^{Tyr%$2vIB2-8LR! zMdX#Fs!t%o?wHBi@rue0B4tqD z#od)hxO&IT3K^U?6;iVRD}cz4!O%VwUbE>aDfMhf-ex&I0nm@o?P-;b_RhXXniJGq zL%FD=BWR~|#zz$nOEN2VrqcAEe6#5dmW~r}SI!$_=Jk?#DMkXDL7Z_f;(4eLpB&NO zKt6?rBmOqL3(W9$tfM|9JJTt4-&QR_KHpbo5he{thPCTkbo>TNji57} zWr@+6c(rL4v`jxYAxnYVQ7K54V-P4z-?vJo!WQkh%xy0j}gGp5fILO7w%Iy~tDE8gdHs{kA9hr2rf|Por-S z#(L?0$Qvn9?!a^0t{-F%I>Gjm=A5Mf zm8YUo>HOH$t5bp3`>Ha$^2EGo8%@KHt0X;xak{~m=(dmQz&e{HY=RFrCkk^BtZ!=U zK!5Jc`)3bhAJY5FL4zCq{eHX1oqV&dYG&F~Lng77!Bpvn9rN0p39)3EEw4v&9>Pug zKywlbN$&d^nL3Eg?v4@gzx--te9bak_&NPbnSdL69i*->ih!zSd{q=DfQx=}^HEK) z#$kQeg1Rq4?NWNBw5Ch3<&l0jhPNY!lzI|%Su_stXKMXq8vz?u7mYJGG8ze@$7_ND z!Z4ct*@Th4t~K+u)L$t&2ckkD7pK%ZU7qnmnD&jE*#Q-qGD|3&C=D|Palm<20Q3LP zEUN9rnTsVl@8fU7#hAx;)bI1K1>Z&UnQKrm=`9jHcOgtKF)%xZg~nR&`97vE4di!T zz}#3{#|awnVIn=7s(|y*(A6zuGj|A$CTw_E9@(6rH>P8YUyP6LibdEbS&I zoaRpco#r=?Vb=waLx|Gd?&o|ygBBmogFN*J+W<6DWNtFe<@|U;6@n*=gKYnxSE@V| zzB_UEus-$Msya8g<7>v8Psum3E6D`)%?)$dIXh$3|K;BdkEp}X`yFY^7=XQO=mZE& z9%=2hR@SDrcu9Ltorlr_rB6!+NeAxOSR+~c`H(lB+Vi?(BRY|cr85?C`C2u$%zhL% zaGF1)ip{|S=gG8~-@Dk=9CF%}WDm!=G@MFLKHF|-A^y>t2{J!+vkrJ7!e#qp!Aw3{ z%M?9$mAb8lhRr{$9boZv?Lsf7dvgcYy)VE#_Tvhf;`zKL8FBQ+NQWEX6^yOwfytCD zo`6QjhVsa z9gtybTPoFtC4V=08Mk0C%d+i`tSx=V7!~`YlkG%jK3@)D&JuLf|6lV0UwHfxgl;3W z#4$iW86*5?^Q!?V3h|9~9+BxvLnfK8H>tJ0E3?_Nmqv2deC`}eF_JXg2*&S(IJoWj zqTkhIlxt4SdaY$eJ`@qDrvdhQ9wIhIUPBjq9AoP|Trud*wI~_Ju5^ySVL;bF^a zXs07#wldYciWkB|OTa?;@3GDNm4}5Nd+cJbmOpn+062$j7&ek*e6@b{8r5vLBEn0) zF#4cEpJTp>HHS;G?gommlxlqbyK=N0hD|WKuwx-<8ZK5yx6n*@Yc%FD6vVXvoEffx zv`E*))R3uX8m(A2cLjKx|C-d5d$n||wAM_JRULk|Wf5=(NC+g5;)my(`L2&Mh%t?l z%5-T!?r+Wy3j*uMhJP%&N~iKQF(xvPu~c9%)cy>io#kCKkCr%`A}mTCVXo*Aj;m;A z)AyywM_69hWv(i2==v=e8Ir+!e>bLv&IRD}#4*!Tui&7F1ql(Q^NI^~vxlBZk%sB} z%Jh#q^_xG@Y?4NUf3Ku_1?6|l{jIl=4EZ%Nd+{)CLR;h2Rr7=mt@)%+_8mogZyUpQLa{qcAlDio++GeF$w%H}|o2w{fQ6RwgW z+3jiaW?oU~7gzr2e+k}xCf}6<{O4qHLVS5|=Ixkq<@w1!BIef0rDr#)-Q+L@aag<9 zGyZdCA+aF4ns$LKurJ{5Ti*O|U9FY@Cp*WbAKmvUD`#MQ-i3`h(&zfm`7VNra{Zus znmU)ot(V9cbQy_IY=|Y&pYl4Z<)BRK{1+cng6=nPL#GvJA;yQF)`ucx;0Ynh<*?O6I>!B(jIZ&yC*VuoEaFbrj!$x8JL1`l7xXku}J5Z zmVnD}vsH@X_({{z5?R@9%hdpnAqTl}iH@i>uGFD9X~}QcycPOgq&hLX2&+0|3WGM-x|i#NtEK^iv1> zeV_4(Iy9Acz%)_1&b(gg?5tv3V2f8^7TIYK1P;%9v>fTf&29q~OOT(oa zibb})-6E@fy1$8C7O%VXSsHnl!XiRXtxB7%0Wm`0Q23Q+;3F3 zk2I{)1I&sCDqF|Ttvu{cZiHb-Hp|RqF>_z!ypCW$Ot2nVHd7CrLF6XDCA-jibIH8; z#uSzKPd`7K0eq^s+VCcdRua!3>)o#76MJAByR6(3KnIaP1}tzjL#yDoGWNiH$I4ot z=0bmwCf_fD;Ln)L5eELG-*2n<(Thm~z~N8zc@cDui{SldgD9ZaCG*wrGP4-N_{Tq+S8Q`CnUHy7KZl=Mdb7fiKXRyosW?p=d4%hR)zO2D5y!AgUrJ;3 zdSSCx1N_j!p#Si@)49unvs;gL5sUfgF>$YUc{CTNS3~MZUc~cV)Gw%>UDx;UzuIg_ zrIi0QL6Ax1U^-I}Q^)_8hsoy#<{j)Oj}qQ-T~XMyhfIAXJ0E7#aG{Bsd2wSotiT5J zC0S5WGnD_}4DUl-QT*`U(iu5h-w%pJ)h#J*Bu0NmDwwz6K}vvLRW5{ZKW`i&HJG(zOC@EGOaEx^Dxgqc4x$8sq7`TT%I2+n1+5U8`u6y74pX}i}fug+^l_v9{F4;(JwIcR|DfW z(W6{*(RMPp>@mL09@@m`IC^Yu)KChS1|kO};Q9SKm$x^$sMc%pp!Y-EV+2v*NoauI ziEG|}X@ z*QbZS)5%M)DduxNgS)+MyX%n_0Orwj9{Scfo3XCq(b5i`fv0 zG)fJA_iamyz+J?s{Y}o%$Ce*R!8HBVXspy$bbx#0t1q(vncw&$$FD9(&R5mp4xfbx zVE3j~As1Cpn~`qz4sh>gBjKPRnQ@0%8Hko$t=vttH4o{6--RAdj|`-%-m%*}a8bNc zcs0d&>O}$wD)2(S%YndilS<>@5$g-5YDI+~UO@?{-E&P%*56KYZL+N7@48(Q+ZC!U zhq0`y$R9WT|0K@Df+G;}7CrBFu}VDxJ=E=KNYnuDmmf_?UKBeI@rY)q*{fI4uS!o| z#M*M>x*Tc$i+P1EIlF;vd?PL1q z6%i_07SDHLOw`;vi;^IXBN!;DlE_;C=d@Fh7I=`1gHtW_g{Gv_vYYo0QxX`WOyU3j z&WMa%JC~M@6n7PS_UbFn@g>AeY7UG|Rm8dxwcY zwT}KPkwLasjO$0u`KN-5>{ziB)$CXn7<#^%L4Ds~eWT2S^l>`4clf?N?BU1FtLH2m zl!q_?hl9vmHVvVMm&!$oG+*?db7e`Jo;{{o_`29H6okmUvs*J2>wEFN@so>bzsG$M zJ(Nv9Z%EkB+yMVQf7zEfnr;Bj6qUG81<1t)0ophbuYDGCYL)ihrDU%^VebA2a$-X6 zi~g@rdLxqOmyZF)>TysRvD$9XGRqo`F?8NMRjzZ$6@c9dau}-pH`y$klH{mzR^rJ# zP1k5_-q0CpOgefMMS4xR`xZtc z86UePmYUn(2M|BUjHKd}WHI?VG&dpbF;cpsC&q>N*k5gKHONpn zHve(Z?wz~9M`Z?(d6N&D`}vo0I32A z@i8=T&Jt_T8Y$AXB5gojf0%g+j?*e4g0w_K2GDgDfHSdz<|u1`RQXkJYFD z^;XO;X>?u0U8?d0I8ot&?r`8ep~4nBywCxK%}{WUCFh0@dgW%F#X^s&lw~Pun$J?U z*~soVgE=Ige|}H}h$h+GA)LWBQtL6c+^*z26D-^C&&mPp&Wz?43Qr8rcZW;#p!_H; z^-W23s;00mX;aT&+hXG1G}-NvN^9C-Q#IB_qimrUPC zuvJc8Vd|6bDsj#JkpO=-n5%9vS=R6@Lnj>*(+lA$ku{s|!kUZopSO^dmD)NXE=#~d zdrL1l4qx%3Au+U{M+pWaHtSM-cz`?6cu<>QT(e+S_}s}_ntsZ8{y6V3v++h721r7# zgu;ug#ZM^YSkwKEMURjPBGYDAVySoWZ0Bd5h!8E+1A$|ouR9?mTYgf7ck4N(ix0BX z&tjIShS=2fM}ZqyzbX)1cVua{Tm^@g(#7)aJ-3#V0B=Muy;Vdx>h8BVwz_}FydUE8 z5Qew`5gKX`CQ3Ndj%~-UjXBfRwRwFqEPdd9gTT4?V@xZHb6hTqTxv<^u7(AU!eb8o z{1pBtR6tJd9V)87tr&9!dP>-%*MS#Ut9m}P{jvgogCQOK&xS%A)qa5gB&W2>?%%WU z!V{47ikmeenCU4|@#IbwY&3Ekq?*Lyoy}j#)#sWm%o(m6HJY_g@?(X5E;7DTl(GiQ ze#2P-1I~-n3eOo6h1A#};&qw+F%j=-j!Z+z(u=_BCRRK`XJ5HYx13vPI}q+-AreVz zx6{`>u+-jTyC1w26c_Xovg5u2%v1ZD=B{7RU|)UIL^GfWqkbVok98X1sj=jz>kLAE z?WP!*$oe4HqU1?i$#@ALLQ_(xX%q=~ec6vNz_2&b+s;)1{rOYU8KpfD464WEy_9qzWw2rcQGy=4(G1Ff1@|!G zHYh0TANBBak^DIY`aF#_>$3ap%yIvkEyG;hBft-N8-8g)FErH6k!s!b4jB%CZu#a3 z#@kqwvLun8nJvHX6wHn7elVM#a)u>@b!p@ZQsTQW^)kyCV!{TuMJC?_18`P$T$d63 zib&_c#~l#d=7Pc=OO~HpkS%;YN%vF=Zl)JF;$UMpS8LJIuveM6r(P4e)YtsqJ-=+{ z@rTOQ9&>>6{n9U-^lmx_MSN}X{&D_t`ERc;!8OpLYg~*=7SJ>CRLK<20#z@TZHz+& zAMM=xngKb6=B<$hnNS#*y^)OeeGC|9oA5pH=2$zr-{#T-Yj((+KmDG?dECv=eH(Pc z^5>TAp6kJuy>+7hEmrz!axDX0KBoP;CZH3gztSSbwUz;nvjrfR)&o7>yfH|6${%@p zy%MJ0M=)59=_86dq}mXtE$LDL2~&-Q-vsBIvA%8inaE0DrQdS;QB?%e^^YjZBVC0h zk^nepK7ZaS3!?&-2|!G{YA84h)y}8qGu~AGHRm!@*_@~}Zr_rfe2h01+>4%=7Ey55 zQ693TnQ$z%JXBuTpl8`f0Q{$loD*TDl|krCvxx|AH~s?azd&Wxw*myB)}WevpP`sr z0X{UAKiCkZ$ti8 z@16^0o041IKEF~v&z`5=KwYRwbzQB~<(&F7n!8@tEBIYI0)yt##zFm(mDfc8A2A7p z4lr}Ha!fA6&)Dr>PtnI=*zm_~v>I4j)4Rhb7KTw?5f3m$*l$xSp(L4wd?%!MXeJOj;Ig#=-*0DEz|`<{OtW%6~B zvJ8^$3*ypF3Fx`8+RUoY+(yYaAVb)1AG~YExGkOqV!sn>5(;Uv194T^K4f%hSm)+8RP5 z8Qpq|?d3%fe*g&yc)mL{f^UHPx=?NWj0wcN3EpY1&>#S3N!nbbNkWXPx#y}NlzWu& ze3*sPL?%A90aWwPCINML!}dxRkBJYim&pUXDM4OddKXpDb=Rjf^j`{LgCSpKT!7u% zzyc|MC&DmsZsAy^PoTqvDYqBM&stjfn3De#=vwd5z!>%PB||9+kSVkRE4xPGd= zDoQRwCzN9Nuc*rxIA4pZcG4qyDaj&<_~32~*ZMSoL%R2Hw?Pc*4|JjK*L?3t&v{*2 z%gQij@^yq~xVi?e2?zZ^B$=vQf3&koZJ#_AK(2?Dg$^*Ie{fD6gjI|-e;>Y^Y@tys z1aNN=&;4ne6)=omOJ@_s<6zFY+$SlYt~(dcl6K}7VpH-tLC6yOjK>G==UZ`QV^}O` z#ww9Z!gW?5RUuL!pmO3cut59R*Bu~Q9&3@-dakCLCpqWnIicy05Lf2~k{HtARql81 z3e~*idVz8cpFK`&R}XTw^v+z9(=%jSbiZ(iE~bo^;d6z=z{U!_TKD1&3Wl{#jApxILW#!rvayTe_aRokAsqnqn$j-EqGQ7 ziezDyfCx@3>e&z!fe#^}F(y{iDo(WpW0}%1G>gDekKNjDe!1oAYi9alDfnEBL8HOx z_iTV-F6VGNLeA=if`Zr;;YE%e=DAyM$4}7ex)Ebge5U%TAKeVcEEC zA@5@!m#d=d%qC#XG`#-h0=^fwr4U5%m#+*n4oUS4{0$j>KhAX3aS`B%lmgTRvA=j! zH*>f&YNRU37XlHhN49>9;CP#}VYDhnmy$Cctky6B^SSp*_M}(DJvKGh7*6vmF51r1 z6xlgA%95F#ki9j+@NNGh2Qd!>wEiPVHpvcYOXjfLyj;p zN4vv{TzKqbU3uc|S-}1s|E>(Qpqc6{siD}o%y}ke{&!Q{pPRTh3QSUaagvN~L19A~ ziZe72?-IUF#2|rkC4-v-h&6|)^x>8I;Jf8I6d-< zGnC9F3de4)YbObqpb4tH&2e>`X z6jMr(vx*B-)T5<==UyE3ue9Jy%1jZk6eBP*Tq!m#e!obTCDe^ z^-X!KX=MWT+0kRih^#S4T{e)vHAzmzc}2byCH!WK$JgLu;?H*EIQhr(+niuQI`OPK znsY`QqF3T?KgW0P8iHMMIdCS=C6O+G-OJlSdb6WD|LA@-!hS~01~%>n@`BPTNXu(@ ze)F@Jai=o9_p!Ky(?6MHo>QqJw1FJlpxrp?n;_P(<}4Rzw!H%2JdU1WAmF@-ifPm5 zQJIU_WJT46bZ=Zq6io7N*;~m|ZfWt|Lv2Q<_{?7rrWGfiPSN|9fJiCWC{oB8a;F;< z(gF0mFwJ`O^Sqh3?5YOEouah&xifMUr810?ekqEmJHd_|)r?fsg)p`}aJOs%EdTrc z(7E(-Nf{FfpPg0yW_T}#0DzBZ#4TKRJhqm1GQRt^lx)TRuH5CQo zCJXz6AT0k!$mL?&su`@dw1uRAx8OwNt)(?mH*@-)|{f5lSMH+ejKk+K3RC|I$h zAfjSNV~eq1>>WEQ_HMv#EV0I#XpB)~3$ewTXcCPr(L|FNjWuG5Mt=91!p;Io-uJ)X z^?l!7*WsCa=A1b*XX=@!u&&#CcLvQ(SkP{0=WE)+Pegf!pPcOd#>3!IH@gKS<^EW& zd7sC@wf!r3H*a2~*W8hhKPdeqY3Hp!i`1L`s`NxSn&oA)MP z{UT|>xA%94Zp+xw=Rof1rI{DU>%NBLheSTjXS}iR7tecRe=2jceeVzJ-`rTP$%=g! z16L%SThy&ngZRlgk;}S_iz##d^st>(-n|s%@l(cMcYQv5wEeTvUT@xhes^UDQLp6b zNv2oUze^k&vU5fGyCL6XI+B-s6dGSYVn@F<%|bhM?)O%k5oK1@3Gf-WruO?^mT8q? zzWCAlN{RIX26i4)xACp;bD}(9YrfxXygK&c?I^FuSKEFyY*DiceS4>ld2P_r=dFjV zJ#(k>Z;P6DYkL30;vl1KXkDW=I&s{CW61;cUiY4@eHJ^pyr;-V6zl&tmr`%P_4)7> zQ+iC?`1h^4S;0}}fr)L`uRc4?=d~;EY`=H>W#)?xl^dQ2+}^BAX#Zck#2;)@chL9m zzsmi-Mr}ipX@={Y<#XL@#(fj(|8u9|D~i6k;e#%QeEBd_g z`mNNDbE}GcW@r8N%k$~itHi{md}O=t-QaL^%b|xmOq+JDO3)13!SCOD&-~lV+PCk` zUwVFacHevRvJ%&AH1B_-=)LtkbDMLy9}o_u(?qP{4tYKJ3}SAEoPXvX2U z8lFB^WKiAe-~RpM?cK%i+~^$_RiwPF=kneSXRh8iFzYX`d1ty!|KR?kW$V@$8n+So zygxTS^S6iA^a;Ty*PMu(HhZYs)#&0?pUh59eLrmG@L44vPp^0PuP*hgw<|WFad*F` zcgNlydG6kWBKLotSIxie(ayoIiF|Iic>H|N;bwnV{?HPBa7ERqnOi5mUwO;#w|DP4 zR$Mi#s@iP1|6zcd*iEaIW=-cy-HP>>etcR@3U!dohZL( z&^JxyM0_-O(V3P%?tRVP^CypSEq4xm@4Wwtu1)IJ{igVguHM}&ldqTj?X=_J_3MKo zBD>{g$mbl={mahWda-|{g&CXn_*8lB@z<^mjgGcmc(%*DwyR4VyY4pYpzc=Ex9yER zV`8>dN#C`)Smog31N@2~{NR^o58YlJ_LI+Dtox+Su*uDT`n|+QRX+AhsutF){F$FC zeCu2F?33uq;e*1O|DO4?_tOfg>tAiZG`3iyqGtymn?5=z(|ycG9(z`o={INYL1CXF zJrmweTz&JR%wJXa z%GO`zwXJZuZ-v|AZ+_V@C`mqt*8K0!`rNCPaDQ)$SdS{D^y**dBnHK9_|re}+?nC$ z-udM9;C{PT#%zlm;rD_0%&egF^8shFuP;uSJn(sD$0^%)R%_Qz*!kD(e`NnS`@)SA zfqza8G8T>MW*#;F^+(B$_-|L*qk0>LZ?4-QwcICzYrVE(>ggplN>4tMIyi7+`LYwf zA2%iA*Sa61OaH>NL)WNPYd-S5W4^e0ZNFW94ZIHR9WdqPzD1MoO-~!R{rSWj$@aAi zMy=X(F7(SiP1kMq+dF&ajh!tvWk-zoAn|O6FiqI!QNV>kQ=4y?xM|;CkAi{+A6wjU z+WyLYUMt>XTTi`XWa6Y^=J&fy?r7aL;;LZcvd_X6vr4yn|8>)x&F@w+mH%Q&x$704-T(FbfI%H@ zY!5J{)x7(~n_qw0e!Ka0T*XE9kv&Cu?uYf?RO4=y_iS$@^_vHE z!0qyrU*CQ`{P4b{7tdz(e&cAUHL}4m|1Tc@QKndtULL>ns#~?)=Z{`B7IvP|@%v_* zYZh}vf8GAr!YxH#fA@{W2P$v>yibjd_oDl>sd)Xj?x!Qq?_D*-XUb330U7?)CJjD+ zJY>1K?dk0DhBvPrzA#^u$LnONueyhCwd~(he#z7k-XqLK%%xY`|9F`*cg;KI{gDG4 z!*Zk7eD=*ZJx{s~pH#cTYqPGFY&x%^`G@4k1M3BDnEvimkv#;EKZ(lAm?Rs(3hp#S_Y&ma#)`JJaJ_COH@pI#ggI>?}9oSp3n9uH)Prd3z z4BVJIJJ&q#heaV9Css_|^iI=O`W)}Ut1^0B&p54LZIeF6e@l4rpbc9pzgbGY7x}J- zWkI!}UE5xWsXf%QckdT-M_ZOtDRPe!IQmuvHZneo=E0YI zmNxC={?@gtd#4PH8yEOP`QWoVp7!@KzY{zCtSC>J&wY|Q>iZ+2H+{M43;nHi15WHX z*fVTagP6?kPEE;NTW)5x&Yvx8Q1xNm8;jbLKo_4BW}q;>Dq zX?o!GR{q5gkBF=m>0RfGb!`uai1PU0Y68*vss|YBEJyxT5O(y*$=!o+YQLP^{a`rW zKPUGF@Zy0vxe*3U`x@7}xS9s#O~W@XYudA~5sz!irJURyxPE;FdT}!=;c8B98m?)$&ce0CwVd4J6pt(Y zleaWnf2H`JQ7T)+M`C)a|Hw>uu>@vX}G4~TH;|&?pj<^ zaXp0V9ji!O&vRSjTB7vx+*Dle;5r7^jRDVd z=i!=C_Id70T&smX&rR_LAKHX|`na~5KE_86@N&0gqCFglvxEBf&dH5~y)~OpqRp>a z5zo<<46Q-wIu)uqLJ+GZff7Ks`l3FN(;C@)-ZC_{`7JOe+Jfer8rve~nH$=oXSg-A z#ZGl^VjF5W>tTyUOha2lBU?}-n;#?^*(^z(8ugh>P%8RF9Io`ExQ(Dp#6?mBeiTRd zId&j!5=G!g^*9Ie8<3OB#)M&qjrfv5cR&{qe}wA6$_K3rjL<&c)X24b3ARk#=%E){ z!bF&v)wLSx8HfJJzNyie>f6LMzofkS8diH0sA)sWhisdUd}4>>nfxtA^jryvj#o$$gVSt4Q)YFO~$!K51U^+GhJh3NcAKi<`0aAk);6sy`D{M znQq4GUWL}P8I_OP)ed__%;Ei1Y1hK-wpKT6LU!>5s+;IZ{i84P+Oa4nw;{@?HMjZ9 zH=qsXQC()3&=aPbo7kd9dDtQnj@g15o{*}eQ+gv0_xZ{(R! zXgu|S?$Cb$`cqcripI_hrC$*qI>JTpJ?B zFbsi4h)A)WG9}n9n3~wGm=bNbOs$E%RN+%dV^3p4UC1?tTr~cqIli4b3BWkl)br zIl0{s){0ON}%to1^)_&WTqJ2Qp zMQ480x8e|&s>IPeoPxLv#I5k+Itq*r6n=&q8-q=37j&c5TId|W)(IL58ns4nP~GtfU!mqc4!i+nY~#M;8OZd{KA zd$EDYi+%s1ug$N8EvOaE=^4n{fwZ+qO9%uQLG^C#y52kMonRYk+-2em7R{eS)#=k1 zYqE_o{A|n6+uO!8v<<~@EoAC%?rGd&wT(#vTQl33c-v66wr`>G>DbdzyP*t)k4d9h z&o?KqNwzi37c_4b_--LC6?|Nv^2QU}uNJ24TbXfrkY$A#GN zt*vi!+t8l2zVWv1DbSaSwYhb%=egJO^yOPG)&A4nFwNGtg>7hSTi=GZ?gmV9g>GPI zuW<%get@ z@aGCF?f6(=yGZ|2;Jk8*{Qgh5>=Nyqzdmll@V??2CayKaHBnqUi0hl;I!at;i0e{u zeOFxfit9;ny)3RjiR*K5brTQv`HE|pxYiKYL~-pPu5XI#C~=)3u1m%BU2)wjt|!Iy zvbg>vuFu8Q&6iumS6suywMl$@?VyMzE!&q5s#d95rJ6xiqGPH=SBzDxIS=^w@aQ~D~@oDWKiei)g1)x@99@NA{w;)Ov-vBBa#3KwHE{+OO<-6?E2ggmdf711q?5U{qy?BeF5yZ1tpW~KVNmDH_siP1`%DmPz_e60JC zgIg(%{H$A09XCIYf~@qZ1vh_=BCKyCW4F>AMO#xT&j5~Mt@M(co1LRLYdmoVa+GAP zPkEN*sI~PZ=?mhhqxC6qhUmVNaP4lTk>KXgOH2pqYo!~RZehF*L#^G3vjRtHR(d(c zEmHR$28l7&9)zOxVoiWDtnEodj9#QY&=f1Rx?2_9G8ghwt(_^C8hVkHxX!ZDEh@JL zdJ%e5Fw^=S$tCI5*+9#!KN4!n(OT=Tgqm@*#rhke<{a&^{zWKR_oxQB{Z={-bZg1W znQbjWb#JX()*<$|=J5d~?y-69gJM6o0~V^b7j4$v4l)yHUL}a*5VL^A>k5Hv)`&iu zo23~+%WA0crY5I4*r;PsEVVj|B^4~TxK@Nd^{xBR%>}p4dKpU5bsxHy;MOG%rjU47 z3EeEqf!*(bwdheuyKnNR#?bYmBXMzmSE4egm-}XkJdtJz@ahFoUH85RR0T?kY3|{; z6#bS`?ST}f>*(6+!G_^MP3LCmgxKQ78pzHX;}?f0_s)nhWzwNm82 zx{s#BEy&Os8$ea}r2lFkw%>rdSDATbNc*+^fd*TA01cOt~}C&3h!^IxfT z*c??6{JIR(mJvDDVqo^$38sE1VIPpcOzeQkQ1h1}gi7ZrBov^xH~yw$2)bE#@di`z zzH-xVm4P71N-eAODrh$QkdbLfFHW}5+m~U5{i*_`=qbJ{spwzTqIO*Znhy#LBgRY2 zD9;gmMseGzzh7o?0SNko0*}Br`Zp}D5iq@V7)Y-s=vP?WL5YjaSwoh29f0!vzSIGA-x7ywm)Kuk|}lrZ2@sxE@50@R(|dj z5(Il(qD+}R4={T+M`BYDZ=!?Do@0R1KtXh}S9XM^f9gwl??u!u5I6l%7T3i?)7pW` zrj9^wI_67F^cuQvD^S@H!+RmlPI2?$w9Eu)S|}Yg{3%*PzknEhM{s)-+3y+>UV!I! zkl*J3_0X-WgMx_5@e^W>17(98PXS&c@E53D5n6Ka>kUA|AZ!1m06oQEi3`x%cxUaH zwAfU`;RP=smpq@aBSLo?xQ9V6B=i{Y>q%PJO(kssPcuveM~YrW3zLPWGoM{N(UkSa zM6AheOcS*jhvpw73PR(tT!aFk!$7+eHw$$FH%mKok6=9$F?tUVos8RBcx3_7GOP4; zuyuIP(O`+8V5kiyB^urvP11`sZ8zYq6o=_n@5TP3{Y=2gpukb+wt6o%i(du41d5oA zxP8b=w;G3DgjW2@NsUvv^{mErA_dj98sqXn8-t~9fZof4SQN_? z!ofNXX+56T?t<`1TZvj?^!dVycB)-`3;)?vIBhxapKIzqCT0%@u38&RYuik=Io8ic5FsMv<0KIxA z8pC?qvQ(a${*>chByJ&f!8(1{R1YbsliKb=fm8@Z)E&5@5En%uOp$+4O)ClVWr{+W zqISToKun#(pYnYha2`l2ueYRnncZ}~Bl>uS=cL>mK=Vn343<)1HrOi6q5_-iP`NA8 zjV;~XoA@hErLe`jFT#^r)Hf9Wc_Mt~{vsAfR$oJ}tU5CQRe9k~$${E|M!W zhM|nhBB;m}mXP4Gn$$2A_n}(G71mx9jz_M>xA_7cLzb0W{S;@*(&+LtBFEXqu)_rT z6#@7bflCAe0Gi@xqyeZ(I6#%E_*1n3{%F5jQEYuBW5+e9u|d{~lBnun@kwjs3`iG~rFnL6rmnpUp6 zE3=rhh}SR)Okf=+*32dQ=@GT_tebr)Ch4;%?wYC5ckx~@YD!#Pt6QZjS%>*A@I;i*xI@YKxk)C5d{xEY=rhwhg3z{ZDQWuBVbCVy%S;ieGy?HLfB^oOTrq|*oHskz$&DN5H(+*8B27zS0hzfk1sJhWQ6oe2o~pTY)!$O8!lfRU%089`Fw!-%-(;Ud=`Y8i-ja8RR=E25Tyd zGGoENj;Y&sR25CH!J^7xUvxi!qN-xCWl^hfH*`G6cL4H=Wl`0GP%x110OVDRMV$f6 zrl>)hUYo@v2Wwh0kZgp~$Gn00Ubk!=pQ|g)su5?fUB`{r^fHr`bE-C2F z1f{MsNInH(x}G5L2!vlC)$4-LWy}kGCH=x?-VIuGb%m6AY*(DPzLmX1-gMz5O zlEW=8Bza|ddV{qWh?Qp!0<%C=p1}||!jklJ%L~aEeWW>q%0sTv9!Tt_Ea;Jo2vh`V!E%9GhHOLh_Eux2=mR0N_nndlu=i~c zLVI7?M`&K@XQaP0G`-g&GwMZb&T-d_R)j-um@sHJ`ROz?jASYYc2b*aQztEloz!O5 z5w)=IiESkIP<@F72_qv}2+Skv6El=h7GaNwu{RjAL|(ls(%>YK-t{RCjN`xOI=t)f*rx+p~Q{a#@EAy?{pNHdC4RlZ0Y`66u;i*#FJ;48J! zb*1LVsRqg%i}VOw+skBHFaxT(@ zoQpIe=ORtWxkwXoF4BaYi!>qUB2CD-NE31{(uACg^ehzGxk%HK5za-L>fl_Y2{{+( zaX`*Rx;c<@k?scMT%;ExPv;`N5y-hn&j6=$kzNSoT%-v(7imJyMVgRvk&Xd!F49y^ z=OVog`U+X3soHXprf}XOO%}*oq$w*}q}w6V-SRGwH#Irc!A6~oVyV?x>;V~DV3DR2 zWsw#z1>&?wbLeha2W)x(R=G%1QJjmkKw^;=NG#G+PAt;DL4aJUVwx!$7r96?FH1M_ zMH=H`7%O*Aa1@tobpq+`g&0Ey=4(q8J2j|*j#DkwO0}i%7UYdJoN8^Fhxig^3uKCPMH%q&^2b28;w==&`}htS+*`92XTZYHWeL$diNZEH+XumL3P$_(MX(|TV}1J} zSeb%xzWoubO2H)G0SMNlU~8`)=pLRPOm#=i5Q{>2dKxFvB^(VF1^Mxa)9x4a4DZee{j0y%n?G?qq;X(0Z1Hb8AK!7BXCMnw_G7?kNJb8xWsMUMHhqFW zMNcEb%UG%tGQqgs35{MRiC%%h%Pf%hax{h=I@v5!mHjQt{_5$)GW+BL*_$;}C!`kbOc}bBB2Huvzge^8Wgi0lw!G|b zLYd7a`)e}$DJ=UUO6e_{X+LGZfrQ*j5vQ*E>E)2W{t6B*&1P$-;}3qe8T<;TU@NNN zk8`kB=1>ZDEr-1*sC2KiF`BNqvG%`&h>M_rv_at1-B^PdvO1P#M~?0tR&uyh8?O2*QW;scGMTzwIb_NM0b)2rgI z{*90iOBjCIV&8ee4x^!QH85!pYISi zHbT=zf_P=GnOSA`BVrdQ$cyw|H?zu>E|1|13hHJ-?FMVF~ytqQiPV7Cems^GW^&a2?E3T~?4t_q$gApB1S z&;&((h-U9C#>WgaO;uDG{fLd55lVb>CBCT0Wij}BvG|URzq}GZUWsq0#4l3fJ1Ozo zmH2)lem(L(#^TvH4j-??i?NOA@+>AScMEMU{PZIo`Iqom^2sQ_79&l zkDDDd@&An$%K`C8^SHSdO`55ZSP?*cf;`D5$PSdK@n4F(m!a{AB%$6Pl^Cd zxy^9{2%SYtxj~x!o=BuAm)$<1p5!v02L35n*dQ>7YBAuc0DEx-yvNm0pR~6Y@nkc6 zai7_ZX7U~)o;2T;{I1jVXhl?m-Q*%LOA!ra@hG&*^c}ul5q0)2vYwwlmn`(cBsLUp zXzVB34efQNk!+e5rZ5s&SsAB!Ab*@GzA)9My|pKN%Lmbj8rU1hkuOXM`vK|z)C7g>P}yj+ zo5!|TVGE@)IqWFLXb24hIU)c~A#j{PH2@Pjz$*fA0IvbG0XdQZwjr>QKu3UF1b!!w z3eYzmhdv<3P=GHGI87iOASeNi2C7W9i5su6pCKYT4vMnH--J>8`7={&o03; zf$`8^zSv3aeA#Gk%DOw=4Y`Ob$k&kRnLIrm`5XK5R-^O|GJQEupMZ2Y+w4c_V`O>;OJ^n3?9qaQHVf}dj$5KG zOj8?CV!D-EM(10JBt_~6E`>)&SpAuH$gozo%)J{d$ekmn&F`KkuwNz!!2pMu3A4-}3)O1HFpQDtp zh1A3>hw`y@Qgyvl%GWu+6qANj0bAg%8T(NSFW^!J)|*AU7N)6!kfFB9R%MtZBv{W- z%a)*Mc`nN)$Hac>afRvWETqVK5x6Pm9F1(GiP5C$8LE`5GnbHKPmEw1&8oxfmJVjkq2S$+}{lsi^IKF1aqC;mc$Ear>7mvg+cQWcn8V-yX^oL`Q1X{|!W zZ&O7oLue6WMb7>C`(*eVLWXLOQaQD-*`dI^kEZJ^*5<2_I48@tCEZO6m;210WnNdt zyFp;G*m&n4+N}()JU> zom7mX_6lz-5{t4#w$ackWWrs0P+mG4Rm}EB*g!g+jjA$2Ivdr5XMv4d4-h#U)p^w0 z&2UHv3ih6a?3hYYn+*ke19Pb>P!iG)Nv)g1vjT-o1=xweR#4<>fRIf5c?I;6l1BlA zC&M)Wg>(hzgTU(qS^?ZZ;2MDh0AmYmehI_^Gytdv3W)^hi$E%YAb^bstO12mnH<{? z^E=Q3P}D~N%-Q%90U!9Gtx;UZQGh`$HEjSW>I=pKXX6F}ixHCva@+;@5`oV_%-N_q znre;Qv^Zp=2N|tpk(JZg@M(qfd=T3_H$xzi068185ST`QoQ;zR93?=TXj5xs2x6P) zMhMg=K+Z-w0%Hi!COVIeHqm)(w278%p;RX3Z0v{7ZV+=etZm@)fS9vEpLlFQfHu_2 z5m-ooHrDqM_>ll@uYKWq%T&S>x)b$U} z#vCC-%V!rU^PieFD&@%3x2k#FlBLDvHGiR zze>^YsgU?DXJd~dlOyZFwv2fj=mIT&M#xZ$gohQ<@&&e>w-kv^g-PV!*x8>c<(e%d zSY3Fl7pS{s9PeAy<{!IgU@lVu{$PdwfttVEnv1Jy-`a{yaJXo5R`NVs6{tshAw#x$ z%~i&!seru(2q|j&*<4D_oqP-zsLxbI;;_`i+fnK%AhSY|c_g&_yR)%VNRX9-BmO5X ze?rmGPDuQ_vvE~Okj18|5@PI9d#bJSMA7gu=a)O{e{nXfV*MryKM-2PSdnvo{n-KE?=m{ul7XWiM4j~X!1UFc!gXJ*5u%5V21ByDsSm11Y zgTQjcECxAl16)SnOAvE5HVoC+LVHhMRsbsn;EIvXW=!J7fG&2vixnh_vpV;%yt z2+)T63<4(!kh5V)g(m@Go9ILY8WEsPbOr+H1ZWeT$3~mzJT}@yOSVud6LU5WL1-_C zIUC-+agznaoQ1=rRMLj^wPE`=9 zL7%a|RCwkH9zIdiUw&spTIb)Ljpw4rk+X4u=j7sSuqRJpW=el7)7fT|I~yUxcpH$j zL3hL1gr+zfRh9H;na;MG+}TJ}(%Z^(w!x6jMt8wM6Z0&|!57(oaW=*%Qir&dTripT z!rX?1LWZXEr&5#LmR})vrZA};ic~~pVF9@<|3_!zGo^gpq?FVp7aW$0y0qO?bS;!p zQWvvHfknsumyn_5^OThNPfaC;^L8bxzmif?6Kns%oQ+5!MHZ|UozE6bx-e%WLDAKh zOR=rVzd0M76-{reGE5R$nB`U5r72o2$g=(CosBs{imYddQAZ;iX@xi&Yn75!;}UZF zAvP>Dj@6RwRV3bY(eY2t#yO=_%k$~r+uQs)ZYerWx#%dI|GD6&_Ww)pvl-?eoei%M zyvI=6SE|A-B{ooOJQvnq9Ewa&E+bFGxzkjLLt9(OP>U=UdX%|O$gB2ktw@|KOd|ir z&Yr52>$zGN-n$BHoX05qVO4qEd6~F%DXf+#OX2S<_=Tx{#u_f6k@k+{wpqf%^ZZNK~jM#{GXd8`d=E4AYg%uzbZG{6a=n zSs_6^Y=Mge*%$q*fZJ4E(UC1AXk=h!;d5*OC%dVTAd5X#CH}$L=%Hu`!(PqB4UjWl zfjg696{*f#N?KUX{rUT3_*+7TYVV@uAMb3;8Okk8&c?g4Y|Pn^`^yzm=WN*BMcK&NNajq=yBioRdbAeqkJCu{xi};# z%>5C|9P7m32p=SLy0|BrC!XG^gDrVmcWkEnnTuKD;XPm@Hx3k(Wak7EL2jsWcjIpzQi zMkRZK9LoSqFyLbX8v&jG+yps30601fw|qfWjsR3WKMO_oLa~1`nVZF8!>i54pB%(S z{z89l;!h|s#CRbg#*h9u=ub5Lsf|C?WEO_(;vpnmdpOEVM7hx9S|5}zwTJq8p?88|v2W;%{3Cx9Hi03IW72NX2~fE9N< z0xNOWG#2ET37})Ior@!d;7pXTmT);N+6CliaMR62sX$wh6b3#AC}a&la|D`#xK#8c zRtwF9ZUHI0$=^gujRey$DfIyY?~#?oQ8NOwd9|92~OcYNKe$oI|cwa_*IDyC)9v7n}GubMRmi)vps&X@LWT z5$J(d`$z?hkQrjK)WYuxD-avA6P5w0-)VT&^h-h!_HhXs(yV@LxwyjbP>@6QNbu5< z_XXqS4@h~4icjruy;EAkd+UJz0Q= z+)-hPl`Jj~1>1)yEL|i^kV{$SC@d2ti|acb8x)pxk_G(aJbt=j*QR6jM#)iELA*H0~gUWu0Vk?XEKw zmgADewY#oUSbml)uHE&Z!s5|@clvbK?s`dKiIOa?-Sv^e(ps{(c2}#In5YkpkSwm< zHB@0)##xN%`MPU8h3BB;$=6+9Q+RGlo_yVv4m9aU#WBY5Zl9j7yUtenN8lnAtX9Eh z6?~wAgDND3b!Nl#R zP)>e&BNF&fyp@yj2IBBrDXw@cColmI`Lh?MKICuZ(BoG-L3I{OCOSVxPM^6Ur5CK35y>mS!mV?X;yksqx~zoD`& z+o&v&NOK~+4M9DNdChFU%->1grts8}JhU(=JjWECHzW_OObX8pg=ebdp`}UT$x(PV zOCDOA6dv2_yk=D9vyz7vCxs_m;dvx^XmwI};uN0ZiK6bbJSjY#6rNblV;qqUGpS6& z6{goE6I-B^oaQP_QzR2xp%kW#3e&riNm-)OF-f%)4a>Gluc@HB3i_#FxC+LrV44c% zt6-@L-ci986?~uoF*6?%wJ@-+pz1qK<`zj}W=@)l8+0HxGfO^`CPT8*%9(i(SOtlhYED1%z+*%D6Rs#3d*UVk^;hOD1eV2^v~c{Gw~09L<&x% zXee(rS-WD62w9Azg{V~~$Q7(b%BP6^h*D+)G@XWflAw@@0ILvKN?-)QLj>*-=&Po@ zuB3#LQpXO&(CgCjw-i%)MA1Q)r< z5on&gQn0en{YacXn6kD|zU*TR;f)jtrD&pvg-D<*2Sxv*vZgUDbXKf|w{xkca0ifp z^+ux>nJC{UP2rPXY*&88$~CwX4(3v5shwzIpQzXm8*c-Z?ZhLi&?3|WmTm`P>rIAO zZ)V}}j^cXJw=5>}g{clA=?ID~Lca=ix<>yzOrLG?IMM>GNlwvd@C*ZmQVLsyP61_u z*dkPaHUc2F2rcizOKX23@}os)Omk*r#g}i-xoARP$rDvy9tU*xFooraWN|u2#L_@v z`ChWn62$#yV(F-`n36?PJDnq98K$t%6W^>i1i9ogM`39uS)9%h<+4Fx86;U~`Ei!z zkiwEFS)9%h<#I`3*~3{}e0kz|sPJ5oJc@HfJnkKw_I)XN6z7O|f)t)0G&SmNoTRKg z;0atST9Zw}TUD@I1qW4dTm|PC5jaY~8{iiN zekR}#P;4GH>mWxtfEEZeClCWL3W4DS>H+LR;C%v30lq=t5&`xZjQJS+1bQH)Hb5-M zF$ka+0&ftYFJG)iU?s?YS=f}GlBm&&^$gshcFwXtDd`<#`rU~%Sz~9T+5b?|$H?@@ zEFDj4Omx%i9RK|sM+73sz>DN$v{Dl!wej4A7s zs1B<*-R{dTwMaZZG|DECU%wYS<)SD-X*#ydOC6$u7`CDXkksQmMl$3kQL_r z54Frwv}CJVoSn6R1vV-&&x8!SlP@}UVHVggWXJ-JcFY2zHthKgj9^zQf1&7jP4F`v zq6-vK{o6u>sy|Z|VT$CdhE4?RD$s<>6%7H{K2R;hwwQI@!mRtgBGZb?$T{sFyZvz?LoG5{ z=wT&eB`QqIRYhWVK?&Z))RFZ-Db^2aRk(@*Ro6T7PC`vytOKt)FA_H{h1LB175)Ul z&rBtHd%+ULC=#Q%1ZSd04$nRkSX1Qn;S7C)fq*d!#xq|MhMHnP+v z`CLelxh|;^Vm2WwtNgzx8r(6nP;X~VE>^gL^N%JrnPlABLV`6qZUWOBQm_rfO9&CF zc%A~LroftrM=j`hUP{36wqmEc$Yf?m_(!qh$_BCX5y@l9zqOdc z=m-CHV{e?N;*hj2KbQ4efDed+m?PVtJF@$LKcu)`+#kS9nfHo_vn% zGll0D$&=5K^%1Sf99e%Ags7mR3aY7~o(d9G&`JdzRnS8P{Z%kR0qC}~aD)?$y*&S2 zpl&@ z*rBqm1IR(_Z4dp zz*7Vs5{L$fT!cH0AV+P0_6W2gkN}X0zygrHpQt$bg74zY41H3Zy}{*z)1=wQDjX*z zhww)yB8S;ZI-Liz9N1Qfow(W8i*%aaOXCEQdc9Z>*cl&|DRxyCkpqfMYc7KqeuZ}_ zoilb-r7kH_Go%#rMNk*Hk!4p^>X9OKNJ=qR4pOp&1$0^3@a{q@(9`@7Wo6J4Btc* z*c6OX%0!PLu{NK@+DAy_-xkbMBm%qhnu}5~xdQ99eWOyQwp>EE@n{#;7YfQ8P_#^Q z)$$J#7lZ`0$X-{8e<;^oMdH`|<>E4hw7jvc#(vaaLV5^`$zI0V1O25yy96py9iJhp3Q^=wf`Yig7>jPO4d!0__d$}8{ultPg80V*wdx{ zTt|U2%~2#;a|y#RT%tg|=_G-E)Kd}#KN~4xWKsE4%X+or{FMJVHGk*HMS(dbNXU?m zZK{kYQ+^%Q6dl(DKX=5rUGvXD%>+ML$%chgnIFU$F6fANS9HX28PVQMhZyr}&C`@x z40Vy9@)XbzK1<=xn|Yaz0=&X&kP`SpBAsuK7GA?gi?9s_F|R@Lm^2xZn^);ITm$PB zP+(>|-c)QKv_b{zRj^$JdsINjGxTE_oK(RVD!8J8?^SS51-~gE{DlI@IFpznKm8l3 zczyXiM>7_y&62zPRr-s8@EYI@)Hj9EV<4W3akFv}qQ+8G6^hz}sCPm98>{tAbz_jp z>r3#+5QsktQs2~?zMX4XihH<-48T*^dK`b~g#PDTz*vU;dzt9L>;03MOVW_LB%eU$ zV-R;q8gZAT_%b{V0^(m=jpt9S%tOQ!5dXApHg{4?uQE8{+LM)dRmKvPJI3gRiOW|G=@jOy^I!hkK zaUmW{veUj3C6D5`5KpkevtIHjjth7KPl?uKz+DU>mbH%x z{8bR5f{F@2x1|RPR*PC-OHbXly~*5e0J<$bD)7q+99Do_0X;fU?rq$(2C>Hr(hwL- zfF5}`fxxE(=#dBGN<4f(fF5~>2dD>PPZ%smU?C`!l(I)2?gRY{Vvjt8uR`fS?2(7Q zqR_g=4j|@xZ|X1dPXo(v5YxO8ffWSkk%yxQWP|cO@^BwfKNAlXD0DTHfLMW=A&>+L zB^}Bm4{1UDdic0QR7x zt}xNf44RKSy2KkMbL)XH6Fspy3?>=^Vjs3c&v!r~gf@mp2vF z70@MtTD7WE&EmFWS~2Y}Zp3XA$rJnHB>SlB^) zQUBQ(PK)}ewRpk_RF?jqj(*n|L;p}`+&WEr6U5izdq(!<^FHfw7y)7{`F$h%n0nt0 z_{Kk|GuQ({hwCyR}lIG6iO*Bm>JZ$lBbJA z>T^HyM80d~3l?@!_N5Ao#}FoONO!K}#Ij3aiIObNm7G}4C@ifdi*qF>mOBc|2+0zZ z*Zqm*mBO-AvN%_AV)0Aj^`;tqELof@Ik8kxSZ+ub=Sog2$qI`$l=s5)Y;;Dkk`vFH z3J?ATA?vB>%1TZ=846F53*B+bEZA+P~?!(2jefwQa`yRxmZOMlh5-_^tv`znF z)(sRmL}bG%I#vZ!RY1@G(T}k$Q^7hFY*)cYD)>YNr&aKk3cgi9_>T&pX*-=tV6P(v zFO4q;s*DsdzJl;Th)5icxws`yG)$zyZKv1Pg6E{$wml$FC(4X-`oUYZq0As?b!4FR#QO79E^+ z4-Hv-N5+3yiSMMuKT_g{De)Fze{#!bEAhcf{5mDRwi5rb65me5)A7MYB|cTe(|?Ki zg~ijq`PS?Cze$bLq#I1 zAj!G~FIa#=DJ7;aVj7V|YvOAMmBbTD$U$k9z!?d$hcxEdQ#T)rylBi#Kzx5CKFb*& zxJkrQvBGyNOhS-ytGo&tB1M`r)KkRhr;Oe$VDOObU`s(E+Jd4bzvPP9kJN^gQ*|LH zQ}lYM4#`I6PjQgUSmZVu6!^N3lNJozCz^r{>1-985?}#p)!>={I`N@ed~4)x8R$lj z08h8Tpd-WvX;*D-y)-GZO2-kLRpWSN5n-C-$RWymZv?``t5M7K>VN2j4@WEe?BvM2fjN13St|p zaYi5N(-+^vgX^Fm_Fm6;Bl`!M?mKZ?>3zA|O6R++yNEmo;+v=md=pjT1Ki&Q@lDhL zqu!tnuW#`ASvao}z^Lsqpv23K=J8|Ds`N_#TnJ4Cu~+(kN8k|w`anSHZtUPdA@reu zlL%ykLMelP|6o86swh7g5bz=XCk=?@{s96TK*|RLh*x|tVE-ic!GIon@B%1^eK24z z0y_xM2Lq~q1YQvPV8BuY7K7*)d~-5V>v90s8F}ifje&oRh2C5weG0yhK_O28Dx#-^ z5)qrj3%zg&(0q`?AK(Q7PY8qo&@wd?W5-Sd=}J7$>7lsl z6Aadq$dM1G{He|Xm_Nli0Q09XnZP?De>w2%O@tX~`TmwwfnMqlAE89&l^+Q(KD|=a zvVk$rw0)JnX#?Nf|KA7*NP`fO`o10172G$2*AW_%Uu;gB&{menQ|HfsX-( zAAs>ej^hAp5m*YUbP-@Eginq`%9jA855o8$yQ!hm_-`ZCX?(j#aWy_WRW4wBS_gIs zqezqK8x7WY)Q7JH`BR%G|lkcg?Xt_hO>Cq zDD#x)e2tQufr(308`h&ndCwRai_AjG!e|o@qESF0#Q-iMa26CwY>r68L>$7L406;0 zSckwe0*L^n4&(cYAV(X3cm(Qz;%W8jF3LV$T=laCD}9-Ot!B~rQ`xH5uuwU<0v0Y4 zI8fxzRyCLyeZ>pN$`T(K=3v_BgRe5NgEdqLfE@ zwZJ67$JWa>D(EZ#t(W$mO3I@@pY5l<7|T^Y~z<#Z~AdznmGTk4GAX9X{-A*#aP zIf|usM%mtMIM!ahf|0-YYJ4(L(-Ov1r5N@}^>3XQ2SGF|blB`xkCe#xPn%6WG6Qt7MFz|I!A4f7w=~E5wn-{Mc z*=K=j(~XPQjDA#JsxG}J>~0we#Lt ztm1ANqT-&|nN#b3B`f|2DXijODHZ=psrXmUihr$E{E|Uw{YwU=^)DNg*8j$!wEh(i zcC`M&x6@O@Ow*EtdXnj`kTv>5$go z3hp$N)Tz@M2V%zIJ#VL>4)r|Vb$1$?QctNx{}x;Sz)+0XYO&tB+ra+YHFeMrMG@Ki z*?SD^gspMy{&0_Y38~X{MJ_dqQ7*Hj%A0vAXQ?V@sVe8FD(5;?&Qn#+S5&T)Dr*+A zKv@r|jAm|LzaFZx9;&ils1usoE(x!>?B{}(;NxnIhAAAwrcs!4DR1sNr`KiSG58;n=k+i)d5vY^+AKVdg;wcOFHk?FwSKWWZmZ*opqmD<;YN1^deNHT9pV~ z6`&@8YaFodeqCqZ3Sg7nb)DU%tvwDC-*r8dDqHI#np|(_Mc+hY)H=jLSq6@A5Ji9u zuj z63qBR^hmazq($SYSYfaD5vE=bzDxI?rlWy}r|G9(sh+Y94w$ zr`0_4w%lsa=qb5axGsx_nY=_aGn2O->NJy0ub5{hA5mN~Q&Aa4M#W?p}l>M$q zs!9^&zAKIeDf3+^EQktzz|&d%c862-l2|X;-GFM>lsds4HfWksup z(%1QT^%JVG%!o6Q-ScV6=A0&M%4yF23vM4>YgP}^hDXKOhfs`LNP5V~G{jV-$4Qdt zU-cRu)uib!X$(TiRGs8rOr`_HHtnYwp0E#_G#xZzv}Sl(k~mtdCyw8|DZdsiF;^I# zF`gFhU_LWED@l?qXQSEa^=e)D{GB&_on=2F*+k>6d9MQ}F)?h@OqABFGv%Hw%AAP9 z2P#{3BpH>LExQIQaX%D3JDDbOUXkqAD4G}UC@)+N748@>+?OouC#!WVjD@h>H5})S z(5w*}!SJ4+PAh6hZ z5X*G1(ARA!m+2AA;9#C!hfJuoqQx*e6e0XJ)#g{6x6-|$kZ+LYc?5e6P{?h7CJ4k6 zcmyyNfk^~j0GvSJAOZKOILiD4UxfsP6bG1yz&KFrvH*rGEu;dj2N1EBIBEj?fxuJZ zNMIa(A#HF?&PItrt?BC(hOCH?Zn(}s#59m&48U##-X|~};28q<2+$`X#(j$0AfTw# z0LHBB^r&q-Fd=Fm4@`6%N1*XhoF9T57XVfukVW7Ifaw^X@d1ds3t+^jWutOfATvG6 zFpXlCr$-fGfwk%70uUHeSz|x;A^)T0IM6j81A3lj@V>Mdb)|n%JP8?(1+mZ2pF`jj z0s26_e+>ew2&4jhhQJ8|^nw1z z2s|V}AL#c#iNgR8`#}HgO0v!uM2J3zPCxoUfAD-!mqy@^1F>56L!b`Fw^k0~EY4Hjds?V)r`!P`F+QF6n>g zafN$}+U9+5e-@?TR@LJ?9ys5hmE$&{`$P?46L#=$g>f=nSCsS~GX0h_y=)klr-%E; z%k(Yd@KAphC57HRXF0DGWw=WmNeag&l4H5xKq+y?Bsl1<)Nh=F-}=TAEyRaI09ID{ zG3!aF(HKQ0d;zy1ooS-xOgm&)`Bj;PLWb@(z0PHDY$Hm-G!!PaLy=k}rT!Sptt`vO zbgH_JE9E;arKB!)g)WwhDs@fK^+HNsig}SQe?l?`K6dNqzYJ~fuidomtrrPqot(H3utPuXfkH<)@6O4 zNkR*=yIQv4ik4U|f#;@J+Zwaz`?7^qXqFHn|kBK zN#JatJ&MHVE;>k4VLHwzrP8uQlk%#Fd)55OAg7M+6dloALOteZVYL>&3w~<;9)h2l zSD1=fSrzb(;QfVKeu)qeqm8v)Va6?|$efnd$Y3qPt5HY~t0QEnL0+f@lkLvr)snSR zBq}Z}&{No`QTcl*rRpO1SxvZx0yQ74@XvM0pWQ(zz&}^vKj@Ob`Y5@x>E2QJ?+bqZ z_!rNg!fN?H68vPLGK+Y9IX}xEH*(0rs>E3#@&B>+9?(%$ZNKB01 zPWW1!Ixpc_WPrRDrxTF&B=}mK1wblE@U=L10=b<8UyHLB$a5t4TAX7*z5%r2YjIlL zz@HWT;p=Z&@wGRt__~|sj5wXIxk=oQ^HhMm=B6ExLK1w<%@`n~Nbof`D}XE`kpbd< zAe%_=H8*bpd7T7ba}#?2hsFST%}pC1`6T$7o6$f+rKD{>K>59>29xfc6bhNd8=ws zx?f8kF(ykY+%`>IHe;2I)3fzx3@b^Q+p4{`lF{F>a(s-<%m=I_PPf%im(?qdmE&Vb zZqAg#S*{eCx9Qq+;*u+@BoudCm$~9<<5;P<&f+(1&=wpWra2b>Wjs4v@oaFcoIE+D zUc;L?8x*VLCs=|jQ|Z_6F_%@(#&%aEuSaAx6SIHFsJC+wRe;yAN@bFI(n zdqL|i9E>RGKXInka<^>($%rT;@j_^N2D>+f>uH@Qpo3>Ch#^cv}T!=*n^ z>r*rG*4MC4`lZ%q2`!J%KU+^atu0vDkGWG6@|~*ZAu%UBdwr=aoS8_E*wrnvTo!fL zt6Wn@cZxGK@=n@Y49MGSmDTDaR1Ys57aWId$y|64xh;B@$PNAp!ptmvSw`?kTu%7EZk zcvq+BZWVyYc^M8NAeV~%EsNX7lE-7fj(j$9A=iy?ng%h|)~;@p7kKw5v; zZ;P09m%!$P%VvPG3Ga7F+|~O4t^93NRWhcPj+NtiNQz(;F=^2%&1LnZPM?f1;q*m} ztF$T9Hf*b3yKVFc;BMR0@9&DE;oYvj5RRipy2iQU=;yYPUKF{X#yBo<#j!-|%WX!X zT_hJtMvo!3hDAzYxN&`4Jzd(S zdbQ_h8#a^L_o&?KrllO=Y6}A9zqiY#m$K1X=#bidt{%@gSK1cpcx0$`JQfn}YFVHS zWb}6%sJ3;6WL@L3I8xIh!lz|6*1NJ1xYw2Sv$WoAF8%geU(FW$bzV-OW_pJIqDy~T zMEEj8)=1C$F8y^{U(LZR%$lEpJ*o9sLa#*V>lwI4XY%TagiY#nO$*7lyAJAUeKwBl z`&?Z^nqJKm<+;KitM&Cb>Wqjr#*iMaIBsy;oWY-Csg88T@vPQYwV+D1dOMn>^;t?k zDgAI~)t#cc&1J4QGB&AvyW-HD++9+)xpFZ)!h&`+hN&!P5_LQY75W)<;TCYW>RBCw z6~Y{!!ffFQ4A_Q=oI6)HV#Ztzke#a?KprQ-ovTwoPLklxRlV1+$pw&|t1dt~k>Ji% z1&~Q3xN~(KkX0nOgS8FFRubIFdJo7uB)Fp$Qsd56NR2yOj#{3Rd?(Se>-BF0@E1UK zy)s_Mh8RG0y~=>}A;Dd**+6EJ;I7wNAUBiXuGh0bc9Gz&*B?NBBf*zDr@et&odL4z z)f-4p65REg1!M*Z?t0w<R<0BI37nQmquGhL+x;& zZy2fNF8OdrEcB4QALf_E{$D|#vZNl6g3{u z8tm^sIvO%6AeQ|yiBvo7VGn!WWyPmqT;7nHs*pn3y4(NzE}K!>Mo%M>Yj`!1GPljo z+J=4L24&-{_`|7_7~NL!MXGLS^@3w1qYLsRC5X6cq_3s6l9A7`lCcO@ay^r`*3}hP z?t{7=IC1HTj-!q{edlT$jyIDXoBuMV1+JLxaIBn|oKlyPbjP*YWp&80k}-{~NY`(T za(_@;u`HstRLhmbiL#JT+;KhUimSb2rQ*^fb@eI#Lv6v5nC)0Nc{*!6zq;bN*RgW) zv|s1xw(9LKzBt?}jwmacqg-vGMmc0@8jWr;D<2;yH`sGgMo! z6fTUkI7=KeTBw<9y6Cu*9zEAtLlHvA8(E-q0xKJOVCz;>5S ziL&`GC(@T)DVybvM>Ux<#PYc-mb)WkIjhZI+J+VRmX5`}tdK%*XFs8RxV2c1sO*cM za+bAGx=X)})|b)kEG@rS>$A=$YJEwNu8!&zSnkrlrKbKFeBBAI6ul6U1IAOc-7awH z{}K^{@|vnIac*$wx7_L~A;-Z#Lz?b&*_@|rv{vYI<~2OhUD}2vwIrs_|sX?cM)bN!P^$ri`r4eq6v($Mj zt49B&;?&P|hst*gZToz5>QMzV+XO661 zgISJ4cP3A^T8dD2r}9RTBqP6}VuLgzvK)D)NS+v=7< zE#%#9f$b~=%$|p3#zh;(r-WScmX7>rSU$of@9W5=kU1V1saNKzl<`@%i6TcWiLZOJ zOS0IJh>!a(m*iGQLf^LW%PvXdx7@_1ZsIph@UgEDjhLFp9X*W#qRl=yhHbgjcm z$$2?M)+Ji$ZIlue@J;SZP(o%Q`lhwU&!vL3Cc%gOYSXNP3n9?h2DK#`&w&F1nf6fA zY;EG^TtKaF%s7y_UMzh9wT|G)7t?&x#$678K#-O>QP?&I1ky>>MHqxYD^e%@Sm^=+ zt?gl^`7LZd0VFW`Tp)x%b1JSzb09?LMuVE=!Qv1Q-QEXk8WKqew4kPmbP%FjrhuA? zzzKnDM(`W7P5>l=(+Gf&*fS1_w}DNlJ%B+@2p9$-(1bxg1wJ8=Md}vt34vy$?nV*` zfu^KZAv{8K2ZoZ0ToVEfNgV)22&DQ!ZA9r2qKj#_2jLL{4M^<=pAenH%+3Txh;ET$ zygmzeKO1~7!EZi|;)v}MgF8i#+k`7re{~#^U0SS^%cShUPn5w-6VP z=})q7@kHezu^w;KCBpQj2-D8T#p|`F&B8MRetQ#*0Y=ny^)Dp;FsP{O8xptuKL2gF zdQ4v`xy1du5$0ikEz{o@NT3`^_a~T97eHhLP!)zh#SGlYYoLI#I*LjNJcSVabrn@F zuo=1X*Hctl;2UbzS5%9@?FiW4Kv8*tNeru@qKX5uo3+jbwIYzpFbhoojj&%C7|l@HnYHf5^{T*iwCiHlx(qt210U0_ zj~QT#zb)`3slJM;3VcVZOi`NyKauLEsI7rNN%c3QJHqa%z*NRiuF|)dP`Eul=1D|c&%e{pY{zb<{Vpj2BQ}{DyQKvDv4=_QkxEQ3eEz{8eg1n8O&qJ7 zd5CAjBA2x;+@~CFl2Pk@L}Mmg3XXrY*@zO;Oqj&z#)QaWF!!J9kUswg&{4;sn)p1d z1NYWvWte8-d|U$eIaDL$E3nC-Vjzod7|X_HnsGmZYL7^28&Ns9Bz{C`YGblY6HWVW zsG)mEt8RyIV)E^`XHLvXmsG%_(WP8v3$@bwpKht^u}(1 zT5N(4{@ANABE%*N5gW@FqQus&Mf-%5*|R1au}MPIi+zs)Bny$2GBeMJO^IiETg2YV z`0I!uFZSOIxvmh!$O|>Ba~MHAYX|VCas=#2@IHzW!zx2ualyE`VAU~MmP>)vHH~_Q zC}=GL)8q9vmEpzv1Z|Gs$J;XLKC$VK5Fb-E*4GpSQ=b*VPzYYtg6}D4n{+s2@ud>f zTSh^95tvbA)|ZLGTxi>p8nXm>X~0LAz^cy@X@JM67TP(&pU6*XEVO%cgHl60jd_tR zC5SvPMC3j{hs#u%hs>!uz@slBkNDg2lDgsv9L`^j5b9LBIYa&S4NOgdMtBx&s@;yP zii3DL3!sriIMwdY2tNhm2%s?{zCcCX4?}WyK$9mCu{qtA%6Sxw2LVV4rzdliP6;2* z;NOS($`=Zvdee}SQFc>CYYtD72uImPjL;m$sK)3#zKLC0gxYxC{F#P%u8OKNn8g4@ z#Y~xHI;yG{BqpOI9MyJ2#Y~sk%^1}!u(}$ca#&^;Gs5O?fdOE&{Z+IJLCz*iq8*^3 z{Q!)20Em_|8@`jRD(~QK747XhdgO3&Jc5+!eBGNtqSxDaHyfa-yaniWZ~IG8a}U0Q z5BdR`{*Fe7;QDfuoANHc4hm@YF_{OwNy}kwt*Khl%!fvVPjDx#6~>+=%{G(qrZ?$9 zVVqpj#Q79A8_b;7DIxJWh!sE5I-##+2&`Q$VvxeF5Z(Q@!SOC%K<8$5Al2%K;p4Kg3C;T z@k|3T9*{}fmW&6FRV@iJuGheR0T5)IZ9m3|5+KO9w*%Qif@w(k1j8X9d*?GM9dl;k z<_NhlqZMCB)(ZEQ%rn}gi!hz{Ef+nj6!9j>!6=<3cAz6h!i+MAN)b>oAfpt-JwWax zQ3%3+6h?qd+5~xf@*Gf;0Ku^!qCQ2YK(w9?!WaVX3?MgydkrAC2t?!0FvkIMz5p?3 z57hAIG3G$od@S`?01*X(xW@-7O92`GKJyc zaC=<-6TtJg@aJy+ti?|zWx?lwy$^$f4B-_JL%&2@1_a*&(fBLOO91&xAA<QTRu_n(ej@ik!uRzbwUOePc|l%Kc<~s) zP=IDW%G~2GH42*Ojz?j3b>aD1xHTSMzEMKl4JoGG&^0Z*77L~A@pm%{Zgqt-Ppi(O zDmGOLK6MFKR~P!94JYrR>cVq$y)k(&R~IgD3BOfBvj|aQqi?a#D0oPVZ)t|1Hcs-5 z6}rd|FZLn**wAJ27vmT2?b<`$DCEy5c+M4YskRJdW~y#Dwc@BzrBvzGto>8z$t1{jb)#H8A6;3^b z#j#b_V48$erNT)w3U1k_l6XJDDb=bhAnprEajB6wyHIy!>M^*8B2`6C=MW+I{PYOp z=<{+;75Bc05p^MOVRBv-X08!+g~R0BD$K4%)E&UvrJzTck9uR3-)7gs9IybD4OSNC z^rCzvFYJiq7hR$x14QzIBIM;s#R*h<%o|HJI22s%o2#@#VH{Lhcb2|zD6UCx9Ew%m zdYs;)zQZjA=unN|8m{tY()m3F*2e(l+^q7J(78E!0`4iGu{^eaombrD=f21HrU1%e zxXzox5KDf*7!4@st)piRK7#y(Dv5n(s!RB~5~@bNg!5v-dM#!nKc#IiWvxlG9>v|% zg3VfojW0Sug})g5tuB5u&8I%SPyYReM0OB9yNXe8O7l5M4;DVAXrmzhP*{Dwu=yHU zCkbMj-9qay3Ctd%MwEGd!0GdRx*86zHecukoW!1Da$}vrJXj z*I*nWQ~bMrih1o%c!(R&5reD%x_Pc}HmbDeD1MgG^9!YH#rYe38S=>*@Acwuz zr5N7iCH4gcE{k^BLWVb~Hl7DlH_~R7wqfkUs@WI?E3}l=J0p|^Bl}txAJs0YV8wGA z&`i-4zifvplrMAx;DQBtQSN+->U}Lyq|E_b#iV#!%PM9VS5hh7QWBRyHXqPPdR>Zl z0Gq~ZV7x@8c;qSG$!r=;e#K%Cz{N*h)iCCRoDOJ`%K@XFV*U!oF){~ZOa(J#I8u4V zZ}7|jO-3nZ6Ebi39h)%#)mrMSh7tS&D+)mS3$yTkJ)JXr>2e?fYv;8y_%Q3OklzBx z*aYH5AkUMy6GXzF7(D?QYe3u$WG#uyKnyvJXZ``13@P{=ID0`o3kbdr!uSim2Z;|r z3k)b)Xmp#ebmmHz5B{=;4iJU^&`8V;QxvADXcj?DT)ocmWwtfanXPH-LZjWh>tN z$XRlOmy#2|lU~j}&z#V$?Qyt>b z+a(?&=MHtnSkSYsGZuVm$xOTuiMbHKN#IjU#)1PN_mYJ;Kec2;XlR&53P6nrpIR~^ z%m!l$nKB}LYRQQ3E*P%^vK#A2w=|bglI=OIG zh9cU7R?PYJQQ7B0^bvGk17r*Vu_nqit_EcE0&yD12@)MZ-0wGyb%0C;5S$9m#DHmx z0R-oQcoWF;fR;-@@as^)Yk+KwHjU+g;93xYSks6Cq+gSd?dsQ5xkVXy!!QK-O#6j; zNYLF7&aBwFAiGv?};TXPgd98nP@? z(q>L}YOjIbQg*fuHni6K=8%d9S^?{Dh!|`|`%O%f0W0ktrGVdpi*yv6;V)59C=Z!4 z{H-qG?MkR-_@y$#zplmf<(|>DY9^;2u9ha5x~MqQzN>YXAl@7o|ND@wQ7}vM>C4qd zGoBz+mBT4>nr`QF_KTiTPbU<;^JF8ZcTTg?NSsDV z{|Hcxf0|WDSA2e)Y0Lzu#y`#K&c=Tnj6-BfXPjn@VLNYF%QWHuO{!wiG^eX3{R$Y5 zktt5v48{C1!88s4RO6qim`Sxw!vd(rKT9?KSHO4{&{6i=sw`9X+2$QknZZXJ*b7!! z_SX&3=(x`|BFQv{0%ZSd4Uij1aGz~AknJS6|COGM{cJ!c132qGTORk>N}=KGu0@2t z4fgi|@)>$QL(QbF-c3W#;ci+#aalDzeL6tD&$N43J%`ML-si;I7qOK<)q(Iw3jsvV-*^Bzpj|gO!5K z{X~H5U=0D%p9FWXHUhZ|(3(3~Tah{0wF=ZT4I3c4R%JkX0Pt5(rjy7X^fZ#l7Axye z_Mj;);rrEv$6dldlu&iA1=78mzRd99a-n-=pruOhuae#`U4q}CU^hdTC}^p5*(EwD zUE$}u_`@~-Qs~!yMTJfMS&DBhG_VPg=Mr4uG8m=#?3WLQ4KT(iCtUU+#=DI7YU9O- zZJLY!K{(LtuU&lA(b88qgwAoL0Nn|jC(ffASK(% zWR}h0Mv0u*o2i!1G%sarGPb2!8Qc#sI$gt}JjPd;=A}7FIp)a}w+Py>=PMm`8JW14Ph?f$6 z=Sd@4EQ9EGo^&Bv#UMrBd9q1#=BxHfkubb!@8sJEjel_)@I$6-%ETK{OnE0e4q9!P zk(EuIjI;@7q)j*@ZNeF8x>(kE>pitulntjF<_3ipH)Qo}@T8DmoXIS1@T3Z{ zlfhSMwO^@L3HP7;hedKxych~jlhl4c@Afb=5!JHW12$gO<@2V`GQZ5MaqHR zXoi}>Ml;k5HkzSku+a=RgN>%E8EiDe&0wRcngL4hUQ-H#rFWm{Y7zIDsztE$?lV=B zkkZ?v4BVxc;4ZyCO;_oiHbbR%+N>WgqrVitSjy-xQ$fcBlKcYmE!zGf;!meP6 z+}hkJkqWaVTV(@uj0&@}(=jT{!A{4hFeimNMuj=+g1HPSIqB2&#! zdz$7hk!h|HndUB$3tT0_y9&`SN<$?w9o=!cQwn%n=W??SQ_!$-nh*`bWwP9CB7~I5 zajB!XeOEjWb4qeSGwv-~%XD+*qZ42i)dK|)t&7B3cNm69W!st$n zn70AANm69GHc5(1Sy&u_>>YqQ6D=}_vh?btnnrCvQyCVD%nFv=P%s9PDZ@jNxq!^o zU|b7GW3d*QD_N{~9VEx{_Nt)Xfb;-BZKQNi%%+V@qdq`wq;xQ4BjqYEmXIkMDILtl z?3dFTV~qolJ(F0SQS6x@pXLx#?U}p@`9Xl}nfwXlR}$Pa>5p4%x&dU*qclPiBI9B3UQYxl6ZoEQ@^zEwQBvZJ+Gx zcdvx@z82JGVEalWi1B3h5+)|;eM32JGO!mVuwF8Yza+&Vb5>IXi4i*28KHa0r2UG_ zQ@v#DeMP3DEF5Cn?2!wY)+suw$tX#M?o!3gu{py!IfHfxp!r$iUB3C zw9qNerM*MNxm3Oh!V*}n;*zcD6*A5Dl7VzZJ%(uXo-)}mC#n-Oi--2zacDKMi3Ef< zR!=Ml1v#;VDe5InYO)IGNo38e5S&p>k*JvZDYdBErPtG}!|9T#UQL`oCI^QGW5;$SuP#|2x{*kiR^HeA8cFy5 z<8}18ZL9SE@iq+W|Kn|;^+!_wkC6WSkp3UudSU%Pyct@*g8HW{Cwy+cs_;))(&!v{c=w>38SBRFZ8V!(YwxVje4sDF2jHfD%Oj#7(vsqUJSK;>qV#STl<{` zY3-K=DdT{3Al$a}I50$y1Er~mqt{Vn+Im+!v|g7n_IDez8Oc~+9gc$v{<WqwWpOqQw+%z;=TAg!b*g(cQm#OZZ z2lN~U)O|ue(1}EQv_jLhI?rNf>#>D#bzUN!w1oUp$!D)Z!RtzTB%P&cg8!S@?5cDQ z(6+0}@9;@k%jzNVscuXry(F*$+%edstM0T`*sQBA291&d zJgDi0ntn{tT_}561!nZ&O`|s6_2c&CLE$bydFc-#(Q>jb41?zx`7j!|TO2{@Xu`PA|Uk-~Ks;mhJ^;Xlp%= z+tJ)fl?fus=rfuD;pP64yi#n1G8ucsA5qEJ(@qjM4e8v|pPSGs&3i_WtV@gbx)lhMvghBhvYdZoR3- zm;3X8qdNq*$ZD3#w{)bk(Ty+nxA}7ahjb{Hw~(@h^5wDvfVU!`KYMmGHfdmeL$!IJ zizPb~fpuZ_;gWcE$i1v6bk8oyh|!<^n)6IYn=7D(Kdc&86=1LWS;(>u;3tD`!MzTi z>MFXf4}f?Q$m1lcKzs`16B4(8h{-UG03d^J=4}h44ItYII&@re$6G2cIWCE~tM4N@ zEphxatk`&WQ>jiGUuMNWB(b~@3EK}4rb09}Zd<0@rCJxR38OK2U4CFgN z@HY^nvrOY0KpO@=+zB*<-Ry91N73Onh=&2(4E@yr3HlI_*GMqZm=-vu0!VVofb;+q zI>9=DNyN89vKG*mwRxeA<_0Ia9p0435ncXU5au7iPsX$Oc@z2v8De$);75@D0m&}_ z>~YT2;qYVU)%HNuiKL2lw^j=k=Cj_ERw&JC(Y9%c6%C-Uy1qm^8j^DWi1w*7M$6rJ zo`>Sptv@I5qguRxBU5qKV}XJ;UQo*Bd!|(8UF(D z43OO<)`Iv3$X6s*fv6qC*BAg9%R!U?=|EyWhzcN+NbrS(tASh($aYc_YM76^8|KCk zf!j@cNW*ldK;()J4BuLeYxNhJ||=2Rb~@lg=9TA9XgBzA*n&>A~EfQ*+wtOas0i8n#KmSY+(05U!X(LNVPHGl!fL12F; z_#3VVz<3T2^fX7`&%@C!AQ%VYH6TxuXaM5Fd=vyAm0I*OtCQ?8#wDVK zTxXxkP^0c7+BaR-n!BsziU(heOBkjc=3bHUjS z>Ipy&TjW6<8y<;cY^MT8F^uQ4tw@VYC^8K{Kw8`)ATvm?#rccT?g7%`W&oK)f-UYK zko_ds$lA5XNgE)O!3WvScYxXi2(rCD(ZMt-0YSF=ZJn^y1qibJo291lQ5O*G2aCFz z_`W9y_J_ZLd`p7;;^S_(B>_<01O%QvGF~b&jF#yje8X=g1{me^*ycd=H$^=`yaM)1A{q>;3ZjH!v|o8gV>#WogJ5NY6|4YJw+Hsa0Qk5& zsDvcUmJ}@nF#+sxBBD=M3ek9qt^~0e?E6GS_iheEmr`^qh&RA~MMU)Usvx?RqRk*0 z^u!S=z$mBBcMzg&6g>rE0@&w^i0)rPGMXAi2S7Xm_Jbm#BUlR2HxwNK5$uIV2QbR% z6V8FiY7g$WAO?dyKtyy8s~~Dj(Vrmh1p9Uo(NR1IQG1G_L3{!BQ4!H+Oi01)Zxl5I zk>4B56JV6ndn|=$HbvPWwt)SBi0DYpf#@2FI)Zo$>^DS2pRx)fzDpt4A4KCm*hmBz z<@7EOLbQjXb3s&qJwZftG!t;&%?A|C1o0TykBEpaXDLL#QnVOEPG7WBfH9EXXYn;^ zxag>_jXFT>ItYeBWiZvs>6Fev2zd}?tp{P0(=Dw6s~@!=2C)>Hmxwk!)T0npQ1mQ_ zLtwuqBKoQcxN~PYMQ?!UUxu$p0gQ6Gt)&p%Nzo@D=7Bw1MD$?iK=cSiStmgl1L?!= z*9rbuU*Dyr0cUV8tez7~y0%rY{FaspAdG?ZZjDs{{3SS7j03?`2)=>USF{|&@uGtk zV^Y!BIDN%pPI`P?KhuZ-s6m7SLLsOEayU8VbMVOL1SSK_x!{im6jl%JzcD9fkJ3?x zW{3a&#D$#ZaGzv;C_e{LCgv{ze+g3dJ|ruVs-*xUhokbM)lxbJ=z7pQ9(OJWWsbJH zptA!YBlNdGz9zvDI=(-qG=LhRfwUpPL3uQgk$_AFmc>E2#bW%d)sdi8F_K>c;&d*D z;!;}D>AVlfJtXLKz5?U`2|Ar8fqYMbPG{W#xTgz{$$)}%VmpKC00`2VT?}MCVBohP zs&uT+=xclAEO-oplhF8{CclEHk7tXM0J$D)!Z{|JwMk10OyBu8`Nv|wHL{)AmTvf9 zCX_DFU?!jU4e>Ag0X^@`nWb+pz<0yp2df8})~sIYgVK;WNc=rrQ9^w%NoEb>&p7_f zj5%toj1ZX zdIDtH8b8uBh67}BDy@$jPCFwLoSgKe1lEmU$)t1wir)f^a+#DMx|iCnNeQey)aInr zeiSBrfS!~ZVEm(qlhS2iuMm+;N)Y`@5htaW!QL+-nUo+(>;e%dr60jQAtITSAZkSs zC#90nXjA|_DM8emB2G$|fxS#bGAT90G({07r9)u9CL)=XAX-cjC#C*lF!llTqy*7z z6me3T2li|c$)p6)V-#^xdIs#>B9ci7qSqfZ5htZtW8wP&^rQq)K1H0A zZUK9Zh-6ZNs0T!@N$EzN;CuCTIxRUVeF>}2#Zo3EST3QZOiH<&l=f?j!}=-{QuH|Z zqyYYPf{Q%@k03zqX z#o|!pgBbY+d@GcZ^R}|PCgQdrfZSI0Jdiykcw5;qAm0EoX(P9iB~8Kr1CU$ECIC5~ z1RsXn0Aw8r-b!{7$T5IC47p54{e-^CZDr+?(bWKQTiFdjt_Co%JS~4#YkG~+C1QNU#|5qU2k>I)V{wb#M3?P%C$+`0RQ!(!Y z^8Xm4ATF34oj{J9?JkV9qsku3Y~DOb3AQxw4~T z*EDj@mAk;86F|m^Nu+@!l#_VG)(`Y*kw$Vt=m>tzv)6}6o+=3UU*0gyB1qd-0e;4htS)+cL-^6y|8Y}T5AjlB>9H~3;_ zm_{@}e64&Sxg_YqoC9PS3Hn+~fLuy~zSbrn8v&UNO?<6mpuPc!uazw9MUMOEk)1_mAf^u*3pZ6{ z&*g7~b{ZgiF6pyO+?E1@+bk1+j0R-VFv#timq9%b2y)w|<817}0D|1U`3J}ez`!3t zJf)+2UteeRhCRRU@!1@#0Rce|9HXcUapNi=Hy(szvQL||tOaJsWh_qxm4{U9W=M@d z>26j0Cro9s=?pps;#;S=?yK;s#R| zHcO+-($9-*Qs0bo!hjiruHaxrZR6;me?|@I{;0I?(o}4 z%|RxQ8$>CUXxM-ZuJKj^SxAC@bkck*0Rgg6bPwv8s?jeIf zwx$-H?V->ZC|aw*?m;#k?JBVD6!t-|$B<1=y3sP+-~}*-B%re9l1<-xDp(c5E(QB) zvgur32i7WK&jGuNY&zEOfOSaNTfu&kY&zA=mSb`R7(o6d8S zmAJtffLvza!EdtZIQIgpo3Km4o=rBL<~3m5AnZ9{UqLn<<|AOeBkZkU-$gc^<;=@W zqZz;$`tU8P;`Zz79;(o3{ujg>L?vylQfaQQpHqbn^NSGgqsow@2>cY-%2^(gkcsDQ z`a_G3@+oM1FIt1ZP9vL6a+k~Td<4K4vKs6nvgsi21nViXhpy7m-K4LhsX|BjQ;0tj z6-RWtR+$eKNjjG?=<=6-$ML<@10haT3fZ}jzLT65>-99Ryc zb+*%&d0sS_9T^Mq;e*+UWo6C|3}o&EU)b-L=r1BZ2(m=vGUW=_SKt>#hyMf$Jq5+7g>rBH0v}X{FwJ8=aOh2AQ5S7K{QngIEq?%x#Db(4K+M(1BxYfUCwwJw@lr+f8Ex zK&)T6(==8BB;0Q|peX|+#;Ut<`z%1x^4C44aTt)!Cn2_m!mVPshBxk+kx28K5KX_& zG$sQwUI1|n$eSc~fH<`YZa5(0VGzSNV^#uWYy|NHko6>P1F`>pbVoqODi9kUz|afG zWIVx-!5R7>7FB@Yw;+xK`GCZ)AfDcW#t#UZX_%QF!j2>$7!RV?!=_OJNT)BFS7peb z2M3Tydz2Lzh;|(IMfXDSIe-iY$ANrJf}=*}BM1VJNkbVECWGn=kTGG)RvcCWWK4+P z2G8nI-#s&-w*uli)&XHvt zQ$auU6pU_XC>#%7cnTQ@$as*n8%O@TKy-yED`u%Deb8Oi6Jc=8@KRMh> zx>Im0*-j#bxUVk|VBPX?Z`od~DFCu{ya&irBzU-&u@AR@17y2-K9CDZa3A?`Addht z8JZmK#l3(Y1vrOWp)GW5VXQ@!iXR7k%g;f@a0-xp`1@dU4?w)MSAo1tg44i{Kz<;> z$)V1RrjZN~pRXg3_9Qr?j018$pwNl5g^o&GyhkBf1rQhS(fy`T1P~X`dL5^tuYus9 zU)mvbwu2z(;$^&r#Uwynynle4Ai+bwuinP|4JdyWj$9s8pB{?r^U$ySU2JLqjBDyS=qHNk>+J)3w}|NeorEZU7)0D)Eqf1(4FL8JA>w&qON!|G zy$tsABBDFE6`URv(f=EE*fjbBjB@&Z2Il^;6w%r1aKtp)0gQ5bi{l`=m?FA|i@=^E zBD#iqAi9Mj`hx!k`%e+kJ>`Rh$8xl|@MF`+0~qCWAF)GWTtyN6#kpW#AR@Yu z;~?5d5q-wr!Two9bR)My^bAGx8y9_oG6WdqbS2XY;Ym_N-_bmZb+Cx&PA-G!XNu@E zZiDDyfKg6=?jS_9&^yFw`wr}HL_|L>p)EXZi1h9z{kG8?RF}F?U;EOM&Rg-PsA+&P zkp7$_UZ&NiG8A#(TGN*+MZn^;O@YN2TA>hm@bvu?DtK=QyYwl=!6B542*;uQEkH(* z+Mk(50zgKQ4nW$G;3%>X$UG7pIJN`X3Mh1fcLJ5es6pH%Ii({GV~&nIKdEk zvXlEc20wsomW%*0lms_RZUnNL1UE}|0(k;Z=mhTsDjO&9Utoy`scf9o`VxD8V8|hr zquxbl{;d%xFCJ2D{0a~G0%Y@~&Nr9^zeYm1d9sH^%7dw_W2Vs@07uw~O-`nm9vhBU z^U}dgr`a*`tjcV!%GoHGc(20vx`R@T*P+b>x@ow>C;T25c|;zs$ih2h@R}O!b#O7h zOqm6&Z{Jd3)m)JO;E_96LeCRsJ6=m@F<+La{w9FgZK@|Ms0GW&@xCxvIKVT991h;|s3CNcuo(8e*B<2D@@MRFge#F=S2)+v<>J%m~fVdJL z>9l){qfC2WPvE}MZdc;wpKvo2KwOF4K%OE&SK<#KzW_36D6T}$pE2_T#FZ%f#l#B^ zKyX`Y>aV8J2OzG*?>fr*_Zjln9TAEvVgGI#|NI6MZflJIF%%%Kgkxf9lSo%0m#)MZ zEqY|L3RT>Smk_{p0C6h@oW_b7Aa2Dqe`6vAh+FaJKc?{oK-`M7A|!`y#Z-^SI3K{j z5ga787Ndmvc>;CDqJ-#763~K9Lel*zSs2e5$|=`z z>2k|sECz^E@HCJeB<4?Fi0C7%hUhPf=p!U0c#K2|aUW>}*h59cttF!~7DE)Rhv;sw zt3<@@r96nnQ^b9xV_<(JB5pO!f#_0-xVKbP$78esC_iK?L~9{x$;~65UY-o(M$}&q zs6LzYpt?TI0Jsaa4aQp;z(9H{jkLI_zJ3Tb<++s8b2*9df1@S6l_RivhnBhYR(flT zbM#etDvWI4Z)tGSH2d}~D*n?LcY?n|kW|-W)B*&prr7!eQbr;HL~1>>Z9uRgh&ezm zAkhNEOF&*A(H4ZizQ;I5q8o@y8hDIRfPn)+Y}9c+qOXrK&S4Owrh1He0At{IP)}&_ z)B5@z)LK?R;1po)JP;pg=`no`R)RSVflOvV>a_R~ojJ=$>w4*k@Eodx#k|@S%4hC9tZLz2|n1nB*SAY0LTIC2_RpR-~sG; zndlXOOok>0urGjm79a<(Gh29!>3}RAz{BkJ z6{8joFIQ1(FGO;1>1~BskfEmYHEd4tSa=`;+Bo9f4sAKD9RbC`fJntCV-OW_toxCp z_%M_jB&`V`KJ|ka3+fN2t@1Jc#P`+ z8LxskuMlMn$k+qIYU?phlXx7&bP!_!84rN4+j)#1NNfNRRpc>#0VCr^5buFF1juAO z!7srH7JG~|K=34p%|PxZaT>&*Kz=6SZ-x}MhkpeKCWCkc$o&BE(6??^Y4;g>nD!lJ zU|t29Z|LB;V@HqC9v~k2L?B~H&_iDjV8hhrYIx$5;Un z5B;Ey@+W=$ax(0>*>`i6d|YK@-xKOuhHQwJ zp4i1>9A~K9{M%WIL<7W2Pw(b2q52V96*)@1Az1; z!DYeKKrSc2Wx-w`&ywKr(%(S-Ai-rpQE#|8fJ_E0%Ys#)W&>nd5Zl*dZ0iGpcUMjr z;4vBlWLYqAkjLl*kY&N=gFVJ409h8a90C^;Aj^WEfE)p+{XxX>(G9+Rh%MvaDR^S7~cbw3s_o) zm(5W`7jPLqV{<7#Wm8V)jvoEv6!GrwePHhq5gogu5FMn5j$P+59-{!En7+2W!lhx1;Qf277_+6v zK8gU&^y>FaDu|zDosZ^*IK|Jp62wA)_*ox~!!iYc@t1y9h8`87aAJhOvpx1jGsuM~ zeS*hm1`t2197rD$^s_#mh}j+>epcZmtPcR00Awy8>~C!cwUwNZzcoYWBE}fUT)^M@@B$7K z+1NjX;xT~uTfwPF8bJA5j#VvV53S&D)t(M3`dgErG!7vC);&PhixvGXr^Moo(gCo7 zzqN^0^tXP1(g}e0TaI2r$im^A!QXO3wQDLn{#N~I@D%~#Z*2y0AAr@!o97(+I>sC( z3jWq>NK|!yYmqJ{pRtu%@V8D=E97q-M2N34RPnc*;<1c`a%jWfN@vsH-EpxOVEqY* zRD{1pMfh6-9K|vy^`fHqTTc8QV;L14f9o13Tmgvix3=o8=QR#eH|Qy@Jrl9h-+CUp zdjR5ZeFNkx67;v?rhAMSKqhU(-zouB01$sGd4|XE0>t0yJQMQ(Anb1$17SpeYcJT3 z0mR>WWR}Oc3xL0ZJ6!(O5F|%@o*&P;qnWOJ9_QUycwf59{zk|C>^q{{)GbOO`|RIc z_7eA}XN~*OYPOh#+dslgsMi|e^@Zw;-RRF33vPW$i7NK1D-Mczh@TN-qqt{#jNO2Y zdLWYLc#L>JMspBTfs6xW<$)N3{ z0Qei_{$}22(>x6>A--qan8?rmfoyHUNe1wvfG`Yy%@2nBmH;8q=Y#0&XdG1m60pX% z;5!;8YGIkJzG!!09EN9T?z#lqKb!%~!*$V&3`>8;PJO!0^2n#_EcNL+FLn(K%arfe zSswX*ovprKXQ}VkNoG9P)gKEz55HgMxxOKBpFhffg|bZr*GpV|zs|z<>)@KI@7G!Q ze%(lj)c5Nwe7|lP73KSN7QSCcN`1f1!uRV)sqfcW_nwb~ZV4#${W=TZuOp?tUuWU_b)?ky>nwb~j+FX- zorUk$H3Fr+UuWU_bxf!Few~Hy*R4f-`ula3^Zhz&r=QuD@7GzoqzKga>#W^U0_yv9 z)*cBe!HDw1hsN)X2sn;a&OF4kk&(+<7w&xyH{$zs7QSCciT-|_h40sCav01le7{bS zQU2>ddyha>zF+6Pw>~SwRNt@j-se#Kew}xdL&ZSFZWzlfn`Yc6pt8^|Ya3oRPx*eG zo!XczyjwofkM&&KXPLw^kh&0>#F&X<1guv0N7rKeVN1l zw-0RFVK39{xM2us4?s$%jr=x|UsHZ9!@Hhwbz`9Z1ZpC#WzJ$&b?(p6&2{Hq5vMx$ zx=a7lx&PC-|I@ku$DR8m=ILNggSSXW=D4J{xv$ctvmN< z#ue(^ReEU9Gxw3iQ0Kl$ckYFY|I@ku)4BiCx&OzV+Z)lj_iurx%+B46Q*>zN-siAC zVV@6m?me0v*|}Fp=dR_Nx&69xZ;Y6^_voR4Yv_#lq!=r{VSFN%uKXmpC*6pN=?oUU zoH~XT-yx=BO#7I=N$@wc1fvYT@D&pSM}!xOqB0F${7I%29}@!;yM2raMj%dw0J3jV zF)X6PL1IfRq>dP<9;?+QLaN7^X5S=A;+rCZTySb7A;gkcIO2t_pu5D9m8e-_u2{9P zr)(r;;wKql`<=`%?35g{ORST>tXSs1H2T(Vv5c;c?aH~w_hdH|Ox;Fie$o*0sctb; z9T_t!W`rafYqR_$tyBN%6?nrw^zhaUpeWv3y2X-ecnt)e=r!F?$*BlDloAgZjUr+L zqp>?9I_M_gg{@SQ(qhcvNLka!ob*kK$V)RSF;mS$85r&hCqKO~ocs)xW+ph(L1~#4 zkzy5h3#PGeQeiA}&@wUwNEfVv?rdQZ?9LPx@b3IzMHz!7Wlj#-kE)}rSQQAqJQL0~ zmQikvzDY_aKL;fqk>>(t3Y*%zq@u3z;d@uwC1SC2fWMd5AKs>W=m#@M79xcXW{)%a6g?YB`4BlM*ZFS6SD-L+2jvAS-ODbtFcC+daTC3fu@nV3edT5k-29@d-a2JQ|B_xd`+MPFwoz#G-w?blXw zMKf3XZLZpH#P}PH@hTB*GBeT|GYtk|Cw16biVj6c?UrE@qpmaDJL7FAd#xBbMp|dw z%L$KrxuN)UC(-H6b2>>rjj#>N1Y%sJy7Wt}C*!NrQ8Bc#?DCUjwrf{CXvs{G?i5HI z>rZuyVt3hMgsu!ZTvoU*f()lfaHB$`oQdh-ZkD)Vj}u-mcQL3!=v{NT=%X#gufchjE(lGQ zxec76?5CTA%vSw%xoU#}x?DAhC-cI??!X#T=^$yc=pBRET$p8MX2=;vu%VGWR4tD1 zBYEJQaq0{YYyZ#qoM#%~lAQrArTPF@$270(hK|6pt=rU~r(4fG^j~FyQ@?tHR4oRR zVt5>bs~Oo(QmY$9w0OFn^eWxM8NJWyJbIt>%-niu5w>U{O?5kSD>aKSgi`bHV8yX3 zy+#*h5oEZ=$xJm)W~mXVMWntACM}&2EhvccPqV|rWh>WE4nLFq6uxGSfEaPE)5zg! zQo$Kba8{>A&jKe{YRfptC4n6t3dk>XhRwDNBU0AR-Q}I`TI4P{xSZ}n!$26BR2jxP zgm~fLF(`%$7q3W)ta;T~I=Q1)tj>(h@w>WkSSpQ?PTn;#fQW|E%{}UhzhLCkS=7oL^|UlRAM|m@;S^Qh$V8D{C~G#1gL*xO_Q&OeV)qNN5tXy5 z=wD-)8{iCc<>6Uzpwk#wr-P~&xHP@Nu95@Bgc=rMppek(H@?y7^D8b#Jr6^X>n=%ZM}7 z^@~y1zcN~21j8A2d>npF;0Eb=b0-?Pv*%Ri&YhY&Y4U=~*|TTNn_SttICt*s*_FBT z=grNXF>ONbl!+5_7ZtY~+pe(n+{u%sj<0MzW7@3wi*k!|r_Gu;WB#PchNx;Hcfz#F zc@Z2uUpRZx4fq-o=4O`bOocW!~4ID6*I*|QWruX56)$rZqH zXjggBoXJ$d*&0$ZZ8lIG8A2n3UNmp)q;Z{Fm& zT65mCIa9~an+gGo#>VTyJ*(>i!(Uz7PD)Bjwtd#crX8qnn}T#Hv`y>c5?fu%?AE{A zUGQ6J2Ye&#Y!-?R2Qxz9~pl1KaFp$5{(XKwrrcWID}GzUC^-peS}uN@9sFqLCF{ zVz-yljV-j>Sr_NnDWmQ79qia{c8YazWhoLoz;`*UQ|uTR`zw(8ekh3~yKYCI^I0ee z<_bHS(lWb2XS=M-ZkA&Y&awTI?D)>M{~XBs+hvgBOV3Gpc1{NhW2f1J+uJcrXy+tJ zrtO=?B0{LS5^DcWcD)iir8O9x?EVmBmf3Yj*}Xd2wQ@wsPSJLwk)0%8KJ%zjS%y$= zdf09Nqd{eMu*5DIX$MEzb#mgT8XReCS`Vhggqy>T3xi?j$_I61uwH$MC>8pPXjfL^Ao~U(Kq?T93TQU$U;L1S{~a?O$$pq|$0T#*Z5H zRY-1If@S$uWB-L$*DI=I zWSMUJN#>fBNCjG;)pP}N-P>PD9ou)V^rRHr=HiOteASi)*(pQ&GBxM}NC&V5_(exs ziP~+W(PUiPT!)q($1=2h)!-DN1rjhxC+%Qt~C*c@z}e zWxSLq3T;qPZPi7>%dw@{2Pnf56)c8NucZ>QlPJa*UaSSE(zptrSz#xQMANiplqr2H z(O*f0clqPVsLhLCS!xanZ4`>nXXSqpZV_3?lxZz0v1_&C74>;r4v`$Yo`p7DYXnOV zb&E#i8;wE0XKqmm@r`1zlH+jkND>FwJt!(sdL<4eMTm|||j-o}*V@Iax zl+O+Y;>lITxn4LZLQk*(iV#R*n(gm|1~tl8<{O3Pm~1_;l&#vg!i$2&_uZk>$+nw} z#9WA*%rK{UjPEch{U4jjor&^HllcF>iQ7Fj8>roYhwt0uAMVJKPLFQyK@&TH60(z% zQEvT#q@eF-_^j?|5Z1yHJA*9{SeaeRiq4Tqw;hugT=<$cx-OF0wQv%aelNHPNv zgH9!7VT096&7>q>ie0O>v}!fg^?#Ye(uS%#JCcd%jPnL(LR{}qqv`9M!#7A=A4JCG z3nd2{*1wjTzT^_SK`%Q{ZpY3At23Q7v!txVhjf&bReO}i{ZJ%u7fZ5*}g84CsdlAIrETksQ?tYS>{{e(~%%SDnljAnMzh!*?K4?NwOej z4wViFp#7XOkRTwGvSKMnf+p((p*f_Oc7y(QpaXs@kfw5s1xaaaC*9XGS(p+ro^a6R zg@d=r@mgVOz}Ssb1w5!nSO5Q%>pywo*o9~I`TzF~7g##bk4H9Zdi;|oD#@IJw(Z7N zj-N1NvZmV<7e>%+3-aBxd!dYa?JvhyrKcjNmoEaB63x`+?Re8;+ zg`w&d3w3D)FlHpB(5*yc^VdFQH?)#Z!GoSrVkcS&@Ufcgv|H~){q9b-8?qamXE$60 za(*2&vlVvyYRnYA{WY)@-}=$5eDC>IF8BFI`G2+pQ~b5LpODul&5EqV6k!3z6cS&f$Ji8D&v^g%gim-7ZFKClIvkm`^0!Jar8zq@c$bA0-Bx)2AvP&n5_)7dU;ZBk}16N5N1%4-l(AnoHs*Tmr zM@yJ)B=XiL- z8VKI<-E!c-%k0oFzi+AkT|35VbqWIIM%zA5jx&+0q+`7TB2UZz57y;hqGp?;(%Sg^ zSdg*WSFg5HxT-iH>ml1yl43_+2>NmeV@~-i?L>bmQuG2`*+j4cqrhkaM(!y86#o>Y zHqQ66b=6{oR2K!DRNjAip8?iIT+VQotK~}=g%ZakP)jZG`Z+bR$b?`l*z@0|0;?p+ zpNxXsAnl}+6g`Sk3U`4n;xiRJt6{!W2CJbnGZwHO_h4C?2XFg%)eMl3=vWY50Rnf)`texH#Qd6 zKI;RICj+rFU9#4~hC@?-J-bzf-L%AR1udVS%hF^!0n4Kic057Hm z7SAcnSuNef_Ji8y@>01bR&LpvHCPR?^(9!P?A=%stbks!9Z)M|n!slW+w_<9Pa4*4 zBe?XWQ=jHDv4-ZzjSTw-TdQl~Ln>+MwF{tb32 zC8H#^Ix|k$^*r6`RDNLx?n3CEK1nvWP#W*FQ}=U=MG(fjQ}J``)<4=LrP|o z)YwxaNA71{=mzfajh4lb^^0MyM9Qs?M0+K2O9ueqRb9Nkj?Gnk0vqmpU1>K<=O@Qs zu*TtzET6jnN34>5s!FPns)pVP$uYP#t5!vocAYI-(7ut8n>d0K1ARef++@xi7Dibka$876O4lP}YPj0s%S;I4C3mJKde814(+C zq&sQJ(&;5TNlawbkq(OkgXYB@ouG`2h=78)MMQ^DL0ra(3IjT*$TG%l{C}tFd{y_| zdtVX|9cTW(pnXrBd+Ka;s_InTy7&F14T*-m`~+6u=KuS4i%l)E7x9_hnD9}+>Qf35 zL*aX_%=K4H9uXA^ZPBQONFEn;Jcaf|j659`&|~dHlDh$IeiN|6qHz~R5#pw*Fo^?0 zbRqWYup4xV@b23i{$UGZ4=XL{ci6(I><7MpYyK-zFPDEp=zdX=3tx^C?oz^Ig%EMs zV(DH2-BpMu$FP*{(mdJ>%H9xSN{o+&g&&xuKE@_!UO3KbQ~53w&c)8B+4PI@pN+=l z>sne~up4@QBS|JXS(lly4G{0lH5iG1V!~tW00~N9?e1B1I0rg~XLex7tS|Kc@;8!_ zf7nzV5v#hhFbbwZll#mj54zq2lb8c}4aUZMWTUedqnT_`!h~bBcbh>Ph!?eNCjB_U zUpK;Xtxs7llu6KyF(d-ab%9uhTH1 z?l*3Xs;VP|chUbtmJIPXLc9!(!*@!lt1#(1g_=ClwOk(A`RqBGogWR(+7D!t>MgPZ zvuhWKWWPl=zr!ktJ^;g`BYzMLJ2N`+mT3H(=!i2xy-Q{!On}lvSfUwV1qS?@Xv8J5 z^&I7&L2Dn7q*PnGrDZR$jIgrpZ8eJWuD$=d5oQAX>A;-bk&gwm)1MLkcA0v@ha{87 zyJ&UMiCA2?;*RJ<^glCB-@BmzM~#Mi;Z;oLva9lqI}1DWg&q0uKD4aulm#X;ruRxS zoQD0A4ZR)t@F@^gg}25-1nCa{VNn%+cVMn)SN6FX(v8EbHtgF;0$gP>1&zeOC``lQ z70AxQku8(VKa`hBd0dO!dCDmL;0Ek!Vx@Qg)41`k1FgcYv`4vjMuWor>t$PX zkIA(@D2(M{(h}VG-g-O_z#5<+u{0Aw^Q~CW0JZZ_Bg9{KfEWw3$&99wFNW_bAY#r% zuNfA82@!EZct5)Ku<#3j&ka9o;4f~NGgtEUiQzvZTB7h#+?xh?hs-ngNf^nhM4X1z zi2MUT6CcA6RW0?vn`~a9;BUdYcgI4kyJS~v;fpUJBk#jnWEZZo4D2gei>yOdFS)%e z17mr6YAuovuQq|UJr-ysK~%slTwAULg?9gMRFc5Rt=#bx0%(&NX@;O5`Ggs1OcgAX zBp=ZeR=0$2-GNAXWc^;5f$lMp(tsHxe0V*Q7>lXA9u`aZ-2eZB@Ihx8iAjEBbo7PM z2}t8wqH)ODFTffvd>UH@Bg22dV1qFEfvi@KsEJOi3`+g)gEe)~t1N-?Zd>MC5Hi4hw&>vE^JWdSxY4vSQqjTZFad#g|=bqiZ7~6gfCH zBIKDcLa+EDHd~Ixf5(|vll7vk9hW1rWD`PGgc5@ieajJ9yUYsGta1U__2OK!cC_ox zg@qNs%PP~XA5p~GF(3XblJlzYDbwP1GAxNU88OoV_-@3H3BYhr$6iF>n)?t!!zHa* zw_66L;U?#j_2^N74edam#Rr&C_^*it+ z{T5WJyby)^!kY_buzPAf!mo5feD|G&g?X$)k>1<@R#oAT)))4f8K@{T(0gQw%6Z|k z=v2i15G<{7_vgbe1Us;_7vmPnfRoEtMTNyE73R5QdQkY~bsgAFs0{C`l=1aE8C9^l zaG4Bn|0na94_D?!!`4s5Y!%NigDIP{ksy`x{8b_1IXb4`y<)6MuQ8B(E5P2Rtn9E8 zYxed=Mm4`g;j?Cntwa(c`E(_YR>*Q)()#5Y(2B1a@?*mNTYE7Q?!n}QP491P#Wvtr znW4>dp5ZOg*tyY&3+3+^jJtTmate4J^Y-YJvr(ESkAh^lwfi`-J{^bKvWsaquf8kg zmZvsXT6j;Z+bfw`SUF*P6V!n2&{2+Y_g&5^zEVHZZnR!pdkhMgT%UI!~N^jGHR z@5;-H6yME2U;Otz=_?uIF^1zC2MNUwErl3VmB;FJ)Goh-DdzWKQ23(^5aBJ@@dDSc z_Z4=O4D7J%-IclU2H81MW|B~1-BBIhfIeFY_pN&Y!+0KF&xo-`>KwkO63z{uT32Vc zjNSukIVJ)-e-|J*Jr-MlC!Hg99$`$yp32W;CjH~q!ifBD%mQxO^_X-o!Zz1BoOc2$ z+$f`zY-I_n!qd{s!)t1WoBz-vxz7}_Q_~kstouoH^v-DFB-!ejc+S(Z1&0r{9DO$K zJRTkW9aO#%Gqo_e)CA^m>~NiuA03Uxf-Ag#GY;H@UmDO7O`98yzCi-(L@z6%M#Sx$kdZYkw_$^z|zDL-efwwLZ13f$Dn@1EFQw1$iz3>$QV<0r~ zye0o3?3&jUCL=en&svJe7VLhrJZrg8^8se5@~p)^xR9N6dE8+!vIC8$HL{^HA-p*h zAI;gf7d{Sugbg8SvuW2$8_toP&ihRt9bRLOwhYhDwQcDCf*vQec0?1eGtFLcV$BQD z#KLA90{|{8ZRv@oy|vj`Z)fboAV4V)lKBk&-)?-1*8v<%cFz-p^2xAo=0u z-H4v|52%y4`Pa=7C=xddZJ_Lhy}L^TMfzRE#9Hal$a&coY*K(=+j}KVzP#kjsp@y zG8QBvBt8~!U?^Zu7*9mwxBM`1!grD9Lz9Dy6pxzb|7SM8wD^N1BgH@4k>XK5Qr!1S zM~Z9RNb#F;BZaj3Pyg4p`h)RSe-UQLL(cDf=S9T-gz&3+)9gX-#%LJ7`BMC5vgRj^ z>#;80gn?M5zuK^;<38E4&W8_e&ee_t;*auNZ?sIgqo&W8G4sNivfnlr#gPjXkQLTk z^vmhdG2tJA9nlftHQNkMDoIzJD>?Rm;iQcmD>)B++g|ag-IU8+_a^RRO{SJ3RFQkjw&hjP$ij8z z@z+V%r5xGh!Amm0d<&d1I=n#wDF4n;Hc?AF3+k5*#k=m$7xrm>R(L=j-o+jTm3a=d z3lraAKL-joVbZKPMV=+x7LD53(SlP86LYeChlhhBqoJ_RF9+Ul6}>2`J_S#1gk)B} z;`kByVjjEV(_@4eq1s@XYKv&`=S+)7qkuayd>0-nPM8y&iVP%t0Z(d%yb%DBEI84I z0sJYWvqZ$J0rR==nq2O-!U&vkjAn(sSbd$?g42oNCApS;K%8W3o3&dkO#h9-A-i#e zJM7(OJb=B@>uUgd?0$8@3VrJFuNnDd*Z|szNicA-?m)mqctdnM8By3(>H> z(Nrv3!ngOeL@nX(aaKOU;l8Tyzl}%qS%}+ZFi$eVmj~?_-+_q1IQ3jFRtNd;IyvPY z{u=w_$vuhRV`+l69Fl7>p6@d!5{8;ckz81I3aZaTYv70lb_^=9^M%khM+V*l&^%Vd zwP;!u=gOn}m-JzOzA(2aQPewrQU!ib2JI(@q(T4K-3oX69F@&Q~SBs{RSe-iYEV(&0Z>R-u(R9kzg2}bPyOvl-@${kjNN3pko z0SG-}6!uCXWL$4_|H4Vc+Ont{0l+YijktYp$hk*sN#}2F-92)}m4! z$pj9G}j-0Ql#7T2;&s>}wb!536bvNLh9h@fxagBMH zS}p2>2q*iokx_R<9R_8&DMNHg)w+?Wghi@KK&>K9w0hPZ;F{ktd|`?+_6_mutWG9l z&p1{w!B|f9^&KAPz2J-!vI(8bvj%5u%Ea!M)%iZO;83IZn>qdA zLxDVc%RdnJPr?f8o|eOK4~#%0<3L>#Z0R+U1HbiKuPrQoWc9@a-Dta5jC)FqFGCJ}r?QUgya!VQBw!_tx z>2T5r^A6eJQg&pUVLKf9MXJMLt91mvG`7Qa+%nzmaC=*eL=T!yq9CKYeGzxUk=Q#N z6W$>aEw6+X!Y2@fQU2zinyh#@cHFMSWP{vQhyEAMz+Eexv85@UE5E{w`T+LG?1Hp< z3=Yk7MtC|GHQ|+x7IgBkA6zkDL<7S|a0qYcns*^4N!u9|{*DUe3Bnx7Y!H^nrDQgkizY|o&Wobv{Nnsx z8P#)U^p4&a<(EcPk^o^0ub4DqKp5V#wPgoVufgH$`>;a8REVbsvd^&}iXVC=kXKVu zp^lz?r+HHtz8M_ey|v}E=)~|*%xsnNDr)#~Eat7TmB+$PlOVk!JB#J)!~|~o*j{)D zoy_zC>16PF9v_vL7elM?7z!Sfg(H^THsU^sNl&(C;FVH)^5MTDN0XSFU4`*A=Th-`ORp?Vd ze-*t*o|{O2t3elSM&j6lr%FPLmo5f}wK!gcjT(8U_v7G?&C|t_YF0MpJB+AkN`98) zd>7OLLTjMf`Oy*QMPue+orl*Xkx-uu`~mSF?Ra_l zX;_Fk67PjcCy9W-xY?55@dR=RC>Q<=(SV?ymMc5~C*tOZuauN3lBa}rNf<58Kcd<6 zgBS#F`m`n~P#IyGKLSiQBF+Yl0T4@lA+q9ipz%3vX5v*k5A4VfZ>gyZ2j%d>LFQD9 z^mGpLQ@n;{5l}}kc;GN_D`LIOcGaNlDOD?Lzy>JlKxc~ zNM5+Dz$YB#uO*Olt^zZfMX9W!lwPSQLoe^+R#+)UVEz(8$jfgPMv~PcI#Lj|R@&JD zTjES*=E{AqjFF(q?~q%0%#3oy5<)K1<&V|CvXioh#JPeAyG>=u`tiCT+9#IvW6@@o zUNYayi|#Y9Y&LJ08$!8h@=Q$QHuXnQ-Vd}(7gWMPFCy}N^4Du_8$^>SpOAr2bDqJAquiO%;9rB(o>IaSkvT1RHDHK&|8Q>p zD>d>WSk2Dp_;xwwG?*QDxs7Dx`X<<*s6^3wquj-)oyT)2IXG?xTj}WNMQ6&T*L2SM73qMa8T~%?8RhHup+gRfl+nD~3x#{PoR}N)HV0 z9xx{wv@ROhEjMbgyOR&Ux;ZzgSKc8jgr6QD8=W^n#E<21W^FBUH!_%$)24r#_zDcrc(^%$mSm||Q&qz8u@>yvD_~#WQ z*rl6j<-ISQvBh)P2{!b}%H1>4>sPvomd*JRtYqx$>+F>+31!MwMsEUo5vzo{L7?gh9$m z#gKF|cpib%3l~KvpCyZI`P_=UbSzslc<&icn1)V?CY%*bygaIIK;@n}*rptW4}XMf zb7sK9YJ5;fH12$eQnpyzccT86Yb~SmaZG=-;b&y+5Lv@;)B+n06f_Y-{Dg}k>M~4d zc!N1Dr9;Hz{-2n?ywfBI&@fRo@=CM|o&=UOzi*g{2;RyweGFh}^;Z}J<0RBJL=&gW z-&nkr+J)3h!mSdUHg&cGsa^R=`Q-=SysFIKh!u=++N@}T>|!lPH^XyL*=m)|vMR8Q zMq{+VF>MSPau{hG5`}QkoM=S2u2(*rFtsiku{@fJQ`>W*apvGTo^6Ao4#$e{X~Kzl z@TxHhXU&Z0xC`anvz%g(L+8iMiT?b!-Uv_9A$J50G|BOpVlB?<$`P1f~G~BXj<2i8~oJbrh|Z7{YG^}_}FL)n48%LGOnmc8M_6Ku3hWE)%M_uBJszsn;Zc|- z$YbKkadJf{4;E8T$n6saOb2*4SBZB&Q%@C2GH`4&KsRivOXsYydP)XeldrDB>B-UP zlCq_{6B_~Y*1DL2yCwU%HdbS)_--t!!_#-{#&=-w%xNr~fx-S80p!Z(E3iB=yACq3 zjh-2eJ=I`jzXC&++`h>ynDICh@nwfYihG&)`j&_8zcK;I|$Q3pD$LimndNL2s<>RblVCs>RqR~5}BhSG$ z*s#mzG&*X%WY$O7Q)||l@w&?2lXuE?vL_c=>qM4>e(B?XC!tIg+4vX@t&jS6 zq5EzCt0`sB?=iq}KXW_{rjtL0;sYqh6qB+O(+x(0wU7Wa6 z1~bs8*o~bT4L>D16;XSdJ!LRSs)J9pd@$oQtwp_N$nZW~lo)%FIhue<=4667*oFdh z#=BOP`8G9aPRt}$Jr%l6ibhS0#$anqh((GxK>CGw!kIUY`XwASDty1mg=C9%G@APr zo?H+P2oRiYICXh6=G16xXEf$4@#KVaP7_7prs_%2h^c6h+i=7|c50uEaLTt3{u_4J zYQhgx#I|V>&PIdR`p5(F*Lvv&ui(hTJs_`(z(7rZ_l4$3diyT34_h* zYifqVE$V;!C1NC-2j2@nYZlJ9NsNCr=rHGu4%&c+^hO7oFY}NuPFIT&?N{NnK1bNVR51M|MS(8_@UgZjwy!mFG!f zHr#BiZZdN_PVz|xVso{*cyk#!T5nW+mteui8e3yXE6?xgsY$g2hmc2f~@F^08@si{S0=^#0do*`hp}En9lH3S0shP-rXL76B@G6rQ zF`ruT%9EGnkj~`gcAUB!5`M<+Pb88Te}EBbf@Cj9EF@{cv^z7x%VL%JGt)W9si3p@ z3#cc|lsAmx=N+RXPqCQ@^Os~Ma-rld6EKrw#KcsNtU?Y2m~>V zDTT3j7JSejBeiUxh5dSx@bB~_q2EKRGka+A z2*RwV>@h&3P=|c}fHhAI-s~HJgDK`DU}ec+6m;d+`~gIK1Fhug12=8rTTj@!nX+4^ zo$ZO|4|d<_h#hv{tmG-jBrFcFN5e-Cup$101KR>-;zPzhR(6KQ;jOeOl41P#RZEzZ z5K(52ZVFBzrcX;&A9UkMmP5&nCw!xHKrZatk$*p?lkgG5LRE+l-ebhY9zs=ku}R=0 ztCHn4rkD;)?a|QD7^Kecz;ibIheIQ{g`vIEJ#Ov)E7>(B{r_WXRKm zOw>1I0;K46ziM{iwk|2P9Jfg@#c1b^NNP8yBf<~u48H(uXVO;B&NPCtLfFjAV@+uI z%}iR0yJy)M)0m5`eQ{Htx=B7^9^naK9v=%Biub$aMYH(f=cmH2ROEUKlUl-0=kPN& zE#Y^r#OvC9gmtX4zw5X9)!vnB!&UTwJZPg5L}ao>js|hLpAVHr^FnjpZv7rWED$A{d*4 zO>+FjoKkr+4$jEIrf=Y_1f1cJ85-HIY{vf7EDc}Lxqmyl`XfyE<_>a~gB@Y|>TA3H zl+6GvJ#mC-$!qjZfF5DOOG~$dcL5)w!$_EMmI=pr3j&qxlzxg>l$2-td?jR_rvHotUK||?+C9cVtcX0yi)JKy@iKVh(?}5lAra$M&U(s&I0N(C{dYz zR9a|AojgIp>9-o$CbDnOFE-E0qTSI&($;t_;R16-E6BADFJ}*vUlYTuhrKzpb3eZI zFb^*>?8fGt80wJmrojq?kzW(qzJfS2CzCQQ|nqQM6tdCE@nt<5>% zvKD;X4DX=h!wFS)$vMLC*MT|7C7)QWnG)sxE~sc-LSz6&=#mT)wo9b z;b5cM{hEQx7eMi;Y@9K~8(;XDj8Wl_*5&Y7vwZkLeBH=>e;kJ43{{lBNWR;;I~s&n zSMbO|*j3^i?EO&e_H9qVgl7Z!uxI}^*nkY6`UUfu*Fnb5^n9yHljT>=@NsY0BwsF& zUvj`m@OtyP+fg&4V=jwMZj45p7M*;KJmIUp1a}uA;g=5pjF1K~N5=+4BIH3N(lyfJ zvJs8Jq!w>h$3B*BzDV^jz6d3Gr@YtdTl{7-AV&EOMoWB-Cw>dLM{WEO6ph)Z3BNdt$yOzc&{`?BGSUUJtq z_zO!fc~PSub2j!MB-|d{_LRQ5gf|l9OyO=oK2G7ih2Aci+XrPeR9U7+< zqrPaMob8^w2la-B`%E;p+6X9ZDS6r)`_kOaHZ1dZ<_q%T)$#=@)tt;(;PxQl- zhvl~p%!pitjx_kRD4K-N(ZT?U7raN}_q_G}vN4zI9ySsQ*~Y|>e$>UX9~?DBRhJkJ zGTSNxX+F2ev&-Hx4AA{9$Eo+vRpxf)heIuSMyGGNi53gFy5!pV<0?G%mfH*Aa|H|x zBX%eH5i(BnBdnZb{Rl1QIucy72%V`WyxV?`5`!qZHl~$h!iNj}vTYNd(}M3oFGNqc zd)o`H%MM5SEqlwjzy67ua0I^Lga*RHoN&ccyD<)6e;%*!**23A!yfp=Hr`wJDG!_t zwmfWK{{H%XWxw7J2g}#{@!c#tcNQ*{et75)w#at`O)FSM5B}l)-7p$K@ec@f7-stK z@x2AUJr@4mdVC5@<^lFabc@D*na<_G0=`m?%|fvx{AQ4=m@c1vX~Z|S<-9j;hTlWu z6vmtTA6ws2n1uI-@%B7E3Q>3hzhPo>r#)ZN-061`?=qXo7+d>YIdy6?5`4SQp6oY= z<;}5qeCe_hAHF*p@mqysvF1sIE1Bnl(oeCh_>y^L;mrIZGw=-!*N=||PlMp=W1`+C z-whaxCnIJ~!2fGxq!!GXc5x?uM8SBXY6qqz%lISZ7)w_g-x1ZyWLyUiD(_=8 zPs8{x!eYE9jxa~Ej>ba_jQ(hOYm*$)s@_p|yD>wg$!?CCfph>bR>+50WIVvsU;7M% ziD&RREt%~43muYE;Bbp@5uQ-I8m!O_PI>}&%tsXPyAcRle7+wa{n#uY7I8TRwxq`4 z_e3yco1AqJxZprBIOFgzy8YXu5xZrUG>suqDYH9f+Y6#0i=`W2mba9-@RSxbKDx(+ z@+Isu@%@|;VLb++{J9d?Q8hkpBmHzybSz4P%=geacit?60M0o>SBVRBF4Jv41>MYa zpx7Jbs;`EA8Sjdk%mrVhz_et^WGt4i=nTydm3QRc9e?3fwsOpeDdZ_(RWuA^8@@M* z=Sq0GB+r%1Q>>wQMkF;)6GqqqL#iW(0t+TPlUzy%WqzpV7NZ&V!tq08Kii1`E~-2# zil##QiI`0`-DigpxV~20+gElFm?LA>)%XdI2_rCWm^u2!W}pr-3_wfl6b!~H4I{C! zn?K%xFB@n5c!wPPsS5F(apX2f;eEb^Hr>k?ns6u`gV##5QP_)_5nURe>4~1*DWA%( z!nA*BZ=LDg|FLN=z6e_J<|_I92%J2qXzW5sJ`^+l z`_Tz9hZe3fp^9{1^vx*tqwPCd@Cm6{>x-L9k}LXIC%-AMTg2gUY!PXSG`~_+TdT;P5K@=`ntJtlU*L3tssb$y&_B za~>QgY2$f#V-$Yqjb;^k%;%@_JN*Z^OxJ9OZa3Ss7^A~wQKkIe(=7Qy*e;kXjmTbi zk&LG1S7ES`{6FypuHQX@kBSvK5I$&&Pa#sPp<87;CRhw~XqVw=2b)*+W`Bw+{&6n( zELX=q8;ZY??9+YSsxS^lzgt2S1581FlglPoQT_umfA^QHsBSc|A|Ep<7nDVtkxkwC zc0-yw&3=!oO+Hg~jOk7*_R4QagrlX0b;>7bMo+?rvtZ*gIWE&D_l}f%_@&)kc%aHvXo5zwa;bv)%IR;PPAB_Sd-a5hnf`H$HI0 zU*pCPbA!VC8n=KYzs3zRxo3Wx4>x1Kz_(O>ojdryWu5;$!T*ca`Cmu0*0r{->F8+f z4O%aJOKW#~+p^ZK-tM4v>58__)j?~|iZ$K6m-lr9U7hVq+gn$*uMT=TH?@NtA$3~G zN2rzt@^kSZ>9D+}woYk9(BLQCTMch;X}!Fyr#)D?X7%#%=1<@1p3dc~+n0?;WCd&b zdJX^O?Y*t5+c)&KF6&(0+1uK^GFCz8&g<;Gq;vJMHS1d&<^^xQc)|ELPC0Y@^hwhu zO&LFR@|3eCPn$Aj{D}=53eqp*uA{-%oXi#MS#m#Au_D-CKy`l8_sWPTG;xg1sA`u>B6^M+}avkzOlDG zHm2BUFa~$G_uv;>gKl&@bgI?M&4A>8)4FrDj8!YwU_9%a-n#}KQ=j&o@rIa(Ay??S zWKdjfe>Aoyzz^LrhFh1nc40aY)cPK@z;gU9?dsmvwq?tLOV)H>(Y3N|X}jL+?16JT z5oO(Ny-QcX&w1^=w67>rCl4XR?b#*O3|ei zpCD|V8gxx*RWl5a)qSfjN8}mr=zt}oKb2e66&NL2d)KID(h-1Czu3mZ&6uh(xEcSp zt!(QS?}|f~u552x-Pfgj(NA$NfRFKQ#wk;$O9z-S9J~Jf6y&<}oRHkbUq8W_?v-w?*(c2K6vH<^}}=xSfuh4Dd^Xxi9iTp5pl5u>fYfxt!ro5T;RFat`LXgz;v zy|_|%w#lE%;op*oLUf7D5-&&x1QXN0)?=cyvD~fAhaqmI8B$GeO0|@&xO9yKHWV%C z#Na5C;)ac`XGxDUZZZ|TP{Y>tj6|H9wo}{QsH&l!aWGZ&>2Ocb)z;nH*|rjGw7Qq{ zMq)RHMf70pQY8-PXj|Hg$%|c4{9&rNZe=>49Vx7paV6Cr<2B6aofuoqpea4RXT9yb zDYw~vYsO#e1u>Bd$l}0ifaYpn+Xr*dA-c?;snS$7wB6W@?JM?^{R zx-j`6Vub(`-&@<4_I4s`fSqj}9ms0T7;f~zr&uA|q-ky98<{3sHN<=R5LQy&U@vHS zDQ!v&br_vmSFJ({x~99m4+_di(%QOqvc)1U+PgZTikP?#9`9VX!Su&qS!YK_uyj?I z#Ged}=-%rw2x2aqB7dfeo2HnEMEhg_&+ZOfW}m3H9Tc~0i;@iB*w^m@v z_R4T<_$)<|gX9Y4$mHrBi*64OyS&g*tW;|aUl};<{3cEmPfAX*3Kct{aEwHTJxByS zKES&ai6drH;EV=l>7c{uatsfWfe9yLjZAVYx?5o;7_XbU3==YZ3oA@XoMNO|-@)Z@ z8rnB5+KmxLSzRfJD?p9B-OReeb5$oA-|${>ruYYIm9ZzfG)=TU zMO2?8!hT0Uvb+=6nAV{&SrdC5vAXY4Q5C`DBH_sKYfkfPPV$qz60Zw+#QFW!IrFkK zzsr*RurCwi_YSQa2Ho3=EO-Uyry0&qG89(@!H1O5b9x;XY!1#ie#js3Z)|UnKh8DZ zD78LCut;xolp{zA_GJpcONAd9Tp3J%-IQYoLHL&7=qrQ5AIA!O+}dDlkwkYp;_f(c zcL_0xXx1q(YYLvI<&V3$A|}BjpG}LizBDlw)S_x7I5!6&4z-XV^$3GqZ{NlO)exoTXDBtFO8r(Dn%XQ-Q(HS*Nn)w&NT*o? zK`N6A788u?)sUfALsBo)rB-Z1(W;@y5_JV3Rm#3nQTi21o9X^3!4P`?xO0TomTcJ*(&dBB8RDuJ-`k?3%Q(vp!dCw!CM%LNSt|K8cqohyDp z3%~PpH9GXLl~6TpY0@Crm?lapHZWKhmUWg`yTwoItfM8m)`=XBrPeu zn^dm!F6HowZj|fP(eN5Ka2944IplsNj$|!fZ71{`HYxGYVAo#sJ|?t9;NOWE zOcMpcyY=>m9a;Tn6nxO5vT9cA?J$!B zprs3K2#%X_)UPLQ2!1{B$X^FV&{mU%*KuWO8$dpUWTRB#u?HicE)ohPrFADAs>)h) zcj#HXslY04P-%y(y3ti-mFZgbxI;;;zp0SbOpj?N{{cIDFrOg3p9?Z}4T69*zwK%^ z5M)i8D<{Qj#7aAd;Q+GvwX(5od=!g+P;^1;TL^!TA!dkLK3MO}$IV(IdF4%M+|kiw!m`#NJj>yx6bbWM5lnTsH#@p%MZ(CNRcPVEMQ@yZRU28&k~_!*rZ zu+c)0E)lz1iYz_mB()HXOKM3;62|DAct5P9kK)DGl5)V!>p{WpLSK7N7f#jm5O=kz zn+q1{XXAs_ZctuC@S6^`fZ($Z)%0Hq9^))+B1nrd_&LyLp6<1aHK~OJi(z_ z2yS$!1q68=8uSH)@wK(bk3MF??AIMzB>qaRGQ9MDFBUv(h)+7MiwLqI;x1Irxl3r$ z#Q{O6|9MC-6|r=ZRXElPS3LJx-G;}2#H~`Ip+Q$r{qrC0dhy+l{@~NgPH;mNdpK4a zY`BkV6`<}>@Vg%M9}2$1HC+9z3VzO`*u2kq6q|RTYu@@J6`bW!^Aud;QCk!&deq$t z{?emPR_4?Blyv(DPD7f9D2=ZD5Po3)jfya0P7cSR9g2SJwiJ1&I$lG{&K&jVp=!kkVqhVPik! zQA`OQ_b9gi2G_F9*C@z1055_cc2o=hS;0?x6r+S!EZPV%T9B+0#JptwA!lIVoa|9k z6guQg>MZw!WiV^n>kNSy%j65t=336SG@oI#&#xZ&Yig7v1 zqb^dg(W4luD?EyW4`UL%2y#h36gyV&@rw9eo=bXsYR-yBMv6AQyU3(a5y)6%{|Ox6 z{{!;*fddt1FN`sXI~=Xrc=@vSUgGvCB}`zDZE=AypAmJZM=^YAT?5Q#6mXURFM_8# zs)YpKm6RsAor=P5 zE}4HB`vX1^qPj0@rCe|s!78mk2$JyIH3>o zAhFw>A`7X&mmI2zAaxihx)r7$pGr&fE^ryQ2>g_~6}-u7MzB@7TAnDyDNTe0(g#Mk zsva2NWHK1SU~M6#e^9~Oyk;Lq)Me>oj&K3Nb#J%w zk#7==N?L=Zt)IgvUHOtEH$-UX}oGhyD|F{q|xGnrXov!>&$2(_%4T9Opr#~ zx-8Ld2q9SE6kbe_M%%h9?eK&IX|yF|$-7{2+UQ*H8yzuz>wMq1QCX8i*7lRmAwjd+ z+V5;$LQ@7f4VO^qw|f+sd-b>hm(X&xa_)8#>IrUks74BX*rO7BOtD9AU+>83S@Uxq zl~waP^-thTSVWN4W%M(+3IC%A`WpLetV3S|b+{e@Lt6PguQNd}qcJU`F)gD$%h+t( z_f^`9Ug}E<4$&xr3#t@+okzW1!I>U4OTkM#szt#rk6NqXbslxSg75dJ4=8xQM?Ik6 zw>|1{1%K{Qzf#cqte!p_>6$s^pj^OMi1nGI$HK!QVx@=PW}&C`igB0VQ0MDLg0+g0 zZoZ(%($S7^0of+66!U#2ritKiSG$=Y8Qal>B`>Ba$vy~vsElhIx3ZI)RPNtyS=_5v zm`(6lr{W@luUC{co2Ano;R1rQO9)x|q$4~moj&VyY9ctnaac@{T38>kL`5*H6QmZF zkR`8E#?WkiL4rt-9u_T|iY(E|=z;|4VN1vooeYiy>15O;_#x--W`gvvWyjJtoxht2(!-XJ zr8ej9W`aMC`Mase5}gbM3DUEcW403yhNXj_cMhIU@ELV5jzR9<%mSS%^5$o_cz%|P z=NFSMHayc#o=+#w>9k54Iu__yE1RVgyJDm)(6yG7r9tasq%6?6mXxJxjboz#3k+vV z%F-QiQWoOva`1@37T7A5l%WGuFu(yPir3d4rEWEtUin3f;`mJJ(t}MiZB>j*$=OW`C?VKmJS(Gfo2(v@x zf>wfTULj-0+oBVP;0RMZsya~$c-f_QsL7Vgy(WYy9y=QZvoy&s_f-jBpg2@rq#!#z zPy`uG@Zr8KENs)z0v$nylA&XP-5qoU8ApbW1@DwarKX$J8&Hp_vpDaE*x}E!z{JLG$`CWUg zX=xp19X_A6;PbpFtNcV+&+sHoI_Ca~40qjeWxi{SX^62!GCfn7_JzHfgip%IJ7;$VHCkA*MFUAQmIZ`3+9}y)uT0|-5yBuvX!TE~HBN(s5 zyM!)+6~GhDLSfJ#Q)1xqD&31PuUUaE9f$X+N<}cONVre)ayepl_GT;i8odfGsgoTS znALNN9VjznenLf&2(pzYK@GqsSrdP7_8etn11=ex0W!(eAd@VEfZFz|zd`npjxVLe zB%~0`LP-%B6BBsgIE4ITeJ0@$w0|=TA9n#zPw*b6P}jC13lDobg5Pqej5F*M>YbIj zz$F=NgKqb3Nm^%+#*~sjth>?ayX#qvkrF!R01Cl*(xiy8Z~9S)x1*7uXSXQLE;T25 zl?H1%NIueO2rtvXhsk$sS)m0lsGfq>s-cFiFVRCXwp4@QQkB}R*9;;Fmma-MnGo>g zW=drjG)Qldg(|XZ@5yS;J*hws5w4Wos&>Z$eWjY15$IVpp`Z^V)-}ka)@5pYtz)$h zPwNto#cDs9ip?^zpLPC@)lNrtR_$11vu;LYXV-K=>}zHRaqb-&BRBX^BFLtL6ZU7B zu|MSm1f65Z+E}(T@mipJn-BW%V)7l3AFvfCw7R&7^mJ(NF$lBOdOUG5}@JB^J zqC<>#8D!}pB9q&_DRt9i8ADx=rCEApNRwp@0$D_hlKmmEm>Dvps%q%aVZ$8R$$b{& zRdPMTyp}F%h~>4+qK3D5J>;T>gzlQTSjt-Hj7@2bMNP&+E3+;aA!ZHYWUE)Os5x9d zvZBGlCb6hVGQ^_hPhyA#jVuIYX_&UU=`~`$>i|r_I>WBZk|zA^pF_&7yRcXrU&gM^ zKc~c9+qdS|LUO6GKhgl``-_R*buT<{qI!Vhf2nHhkfmgLT`J4Pj5X|7iAB4VEDc9S zk2J8{XB*S|;tRpk9VI$Zm*1;SH+r2)7O^pa{?c_GJ%2H5n z(Qni(=N>aGCRnAYLoAAi3>iAqjEKpwmmEKhOAnT^Fiz7=%fP+C;iz^+aC(t2r>2VF zj3Q^T?`R?+I5&bTU{{KKh{fGxw}2*sY`IWQvL^oE?76KN+hHVQWM%udB)J-7k|o}2 z(>9r`SCBoFnpdS72`L0KYf?n!WXlCK>$iD9`!}<&T9HUr2(EK4qTjeV40`!tn2M)Bn^m(Uj9Awo53{z{I#&Dev@Y>j ztakPSI%zX%KkNJ*tDR1hv+PEq%(i0PjNCc9rVC z0ZoRijRkbtjLh*P$Tg`FEnXRdWCvxgbx}y`3^ExFrkq=>tlB(Ff-#l{vg|9jfbLLM zZ}lt*##la|#j?x-I)`sgntwf>CBYcW{w%}GER}N`l+_l`l3*Mmcy4u9m2X!0s4!z3am@u!Ui(_JWEwec0ZC;O+Cw}I^ zUD@Y$B<1y$Jo956USI7qKi22SVj+`u|ydx+dp$JygzDH~r7*wideeivv~1YzG$q3YF}dp5L{v zoLBGoD^z$b6uwnlt%{er`YxT*?*8ARdDlZhzVKx`0IbmSrmNh!)5QcgDyrN*Pn64r z*c2Z)u(ERS;HoOO6`r2!C#UB6todK|dpHvFDhDA5^D2iP2=glYJ%o9cy&b~5Rs?4{ z98IqXrWXnG;8#U(R*}iwL`@w9$J0(c#wj?PIs3nM|47OoRS)v;qT53vg5tPWM3FpK zMm)<@#W70i<8F9$ER5}d={HPaB9GQQzxuW10hiV|mNHkST-M|vH_ATC=6dXGoPKH2{LFtw3=v_#@H>=6+ z-9k&q(omK%^ChxnM8IrI#F{9IG)r5jR##z@OsV%Q%YJ06?wGU705|71dXYT~~>9h6YK;^D6r~WXReW%hJkZ z4{y0IsuKIWG6cyEa<6q!7*pn24JxXl*WA~Y)xUa{1Y;}@WZ7445AX?P^*zs$V2tJS zSuD#8CAoiBRzLA93C39VXBl2@5Aa!K^_*u(FvjxMESBZ=0Dq;dUiK^r##nC8Vwt@M zNQSJ9J-~FVWb6TwC^ibEdt^nBL6+|JnPgdefJtr{!&i_cGTqzLWEmYhizwBHeQIgr z{SJK%;q6OpS*9bxw3iZ*7sUP;B+86Qt_$iUi^F^i7HgIoq`3-CKCS(xE{}3DZa=O`0jBG?~^aDT{p5 zNJt6O2TIB!-!u}^q(=nD*NX;jw`Obgw`q}YxG37vB>u{TZT`(uSJ6-SS_?tC32peS zYi+(uVvtEU7-Z65gG`!ckV)GNl8Pm+DTU|zHYP~LBY8PzLN$vqJGO6O)W+=Cz9qws z?OQVJ*uEvhj_q4A>`0Gaut$2IvxD}r0b*MEH~sh?kbT$e;IF{NEP8TthDHBt-ixzd z%J9qntSH>?Y~`z&2&44lM(=(y=1av$I0(kw-BiqSw|`fc?nZSwn;lPDE8}alIca=K zrzm{*==r%&j>5>6_#|)Q89we>j{En^a5wl2?gsC;Dlm|Um<5Zq16GQ=^AiS6dtH&J zHrF>VCCJVg2Aj4PSzye^SS0&r>=u<}JI8KOy^^bTwJTJa9;Z}2K~4aePLpzhqC5`A zK(VI}+-@ZSl^k_}D$xQ3JbB|k*Zmm>|DamQ%uD!AuPH%#3bB3dmZdsxy;ZOHj2+eg zsm@(M5oAP}sGovc{T#v>=V$7c-VH`ySE^f-z$cY^Jg7 zFwpowY8(*nWtetgbB1XLvQm!&S*b@lq0h@89_s^CPWD3yQ&G_=*{g+)dUCW79K*w1 z^&KczR)8M*HyqH@l3%B~VU#8~#i5!A z{*9svcz1Bx@$wmHV&3fUY_oTWp-X%nV*Gf~Ow(y4)JWP0REC9$`h+&tNlxd51St)l zT+g}o@uC-|MK4T?UYHc^7YO&N=+Emlf^YB@N*3>P8eK||!j&?uz@=#gQa|Ql21vAQ zvbCf)C7TPem24*y{mCW*UDD1VI7SViA2U8vC?96#ziJ(87rHTbF~K%Pg~65EiY)LG zF_;cG2yl!BimsxMfMSTyM;Y@7wV^JPoM3b)7EX5xUPh23lj(TWrbTB8gQS(bQWDGf z{H(Ga;blIynFR`v#R>Vp#mz*`1nB@FqX!DxtPH{3rtrsNxc^X?o)S8`s(HJwyHw%s z7|!1Hf1OpacJ-Fg2sq^V&9s6l8zgmpN<+sWSvW@(MX(XPK~V_G4Mi4c5a8m}32?wss@#csl@3PuOlM0IL8>1Hz1y5EY%qL1$9vgA zp}iPS)0vOBkZ2(IBSq!$p7cj@9;PJ;%5UITmplm)sDy_b&jwx^CKhv?BI|B_k< z8&#j3dX)!`gx~3KXBG+H;&5ja3Ga5e(~E>Z;&5*$68@yaO)C<<-{Gbf34g)irW6S? zE~VAzvoC8{iq6TMCBr|2mc}a*c7=rv73^oz@#h1D6Q(>+AVh=z3lHt!xnFd*< z(q5-mRDQjJGd*gSf|qzyi-KJqwN}CFJnDJ{-|tZ$Q1E__dO*Q%d(`6!{@kN}pb_Dqu96U6qpI>%Ouqer>e7R9suk<2T zDR{LKykMpPr3f6hl3JkOJ zJgQeg@1S}*=vwEX)I3xXFh!c?8b#yZ`)+_E;wNr0cF`+>0Reeen{heZTy9BMwn7Kd6yu+yRD6ZG1odW2EN{Gr*O zSZpxDxtYDQk1r!;o;Ojl= z1O;b#)NBP?JZhnWYdxx4!RtNh9SVNHqduab_gOvLB9)zeN$R31WKp=RY>p8EoGg)oYdNfcEO2D$<-fir#G|wR8 z26;HivLaYlox$_2ES`65^L#u+j?@Svcv7FtK|OG-;%hER*VHEP^6a2Tsni{TO_1#1 zg*&p$xFcl-ezr{;j2_I;I86irX_sV@-J23A_E0DXR|F72uZMPEZ@;fcqD(!~WEnQa zxdy==UFH2qub8d~Zq>;L(-py8m)Y8Ox?-u)jXli-k5-f=Wa(r_xPahvhe}U%C7M#v zC!L~A1e=_qiwIIRk>6BgiP}j=R=HHo60$_?um~pT71f$??Q+4XsslyA@u3n@RCclw z1kb5OwayidX`!i6&`y7>OYs;ksR6|Ubr|f7HQ@P@Dl=q(wGVxapqJ5_meHD)ks96O z9xH{bRNCvj)YmIG)1zi7c!@`~DA?suYZbiCqpnx*{T}rJ1@HH$2Ne9aM?J3K&pqlF z3g%tV)eltg7>^pSp!ZoleOA;yl$jqeerp|3s^NnmO{61P+^Hn$P)#sk+?p{Wk!+zS z+j9^y>Se~+xHt=w8-Iqf%qT^&elPUNt>w9WOLvqrwokL1k?Nln&SM`}fwJS6{Yd$OdL=a%qMp2U2wlPQ+)ui0vtbrLn%G1muh7p#)?8yf&lm zqgs<>8P8`b0^Vdl&6qj|91fAF>i_j$Y~j!974s{>**ZW%8-f)&`r2uerHyXNYbN-P z5<-@4c7zKEa@x!=*(`Td2a1BxJ<5cl%1v7jsYP#dLL1XUQ=^xiwpf=-B+OCNfZ~BV z40gu3;JHtg+3(z3PteO~P0MIa%XkIT){j)$Z@kpsDmdaTw%swx*C=?3N1dwR-+0vd z3NH4jB?_+dsPzio;8Fbw-r-RnRq*p3^{|59^QiAD_@YO>q@ed%J$*LJHFJi8CM)h* zZErN5?*fFW2Y^;N`w9L27U7 z#+9W$L2#1lMjv7TKSeoFnB)OTmYL%`C45O+>uwkH&9wInr)6_m@n%Ztaa8jO(w2(!I)4Q^m-kQZUomj}io^Gc~7|)Yd zW+W1J3!8Om7J4*6vXc=e$uE1|t;K2ND*IiScZa{DtL|(($I@(^OSLAI3S2$E7!IciRfZ!@c$wa%L z$kJL*=w)R=kDYI^uYZ%hLO#Je9jcMwJr1>i;66oJ`7Ax_2?cq*WH1<#dmuQD-~m z^9fRCGa|7-tr7kNsj`ThUu20|gODJ#H4Kx=8l>0jU{G4;2I~AaXT~Ce)LhhS$Y_X$ zEIS%9>}a4JOW$m@!!m*3feS6l3So%`gODJvmN4lAi#?d_yqEStOWFs`Sw3jV@IgzK z4_Y#O&_W-)RSiaRN03&F5iLcQXfOzq)&fOy4t`~y+UQ!hp5T=ZwU{7{#wWtwSv)c&bCy6MXLlR$1_(<*U^hgK_e+F#h<-@|Bw+k#xl1V4c57r1ws0 z)oQ0sD~qj7dt_BYo7i-M+o#5TNOcq(VTwdB5~Oq?OE!++%D2i)6|}^;zn&oV!rGL< zLZ72W2vRhtl9DqYKzLOuR3yW_BG?cR_Oe^)iYJ|htpur-)FkZnX-(^s+Oae1l-zs` z4tf~*583bv6xn^m%{3`@YFv(^$z~sQ1ig&ZP=W?c%Q(c|f_JAtTU6dHUhcaU{Deo{ zrQlaR>JbHh;!#g2_y>>rZv{uYo>MI1F48hMkls>?XtMQa_8S98rgHRCsl+u+bdtB(%yOf*x(DF(py5*p( zPSv|>^qR@)biH}eL0QF(4T8JQw&nae_6n~PoaIo93HB(;x|pSHj&K3N>l|t^!O1hN z1Y4J-vlR=22=||55~O~XkR>Vzjs)Yn9{T5Q zscp5B*g%jfV!9$2*S5iFyUo`n_%nxELXawp0S!f#=D3(yLNIPX!$GEK>-Dq&ElC5= zl+S0zOiP9dEi~aXYJ#cF0@W5HTAUGdy&+{GZbr+&%y2J9`Y=ixwJ>QECdI5)S(stc zLYnleIx7No3653&L-p<3ScqG>&{@g$L2ZJYIuHzp&AL&LuhP*zi@HVNH7*Bd$-Yl z=R2=7W(39FZFK42*$j$Cf{X)rW$!i?PH{oeNRZw(bS!x9rFPw{Ao0Sg^(y!)&07;i-1z`}Vv%Ddx_lKd8QRj3GMdmx@QlEF|q;s2} ze70}>A?TgiK#+prqW*13(FU0mZjcGVC|<4N$T)jB4nm_Osed-ZauRC7 z|E)NL5J74wWJx6jM;#y6hR=>ZBZ~Uf#Ux*?@a>6zmL0X;>=mY$4889r4bCVB(_%>DT6JAAv)C&i62vS88)k!4{ zl4?>XgLDpYKvBh!aoPAcHAsDw27^!&euLr=#006OkR_EA9CiFh=gM>npqf&@*4Y*z z)o)k$lX`_@f=@YAQa(c$i(+nFNffi^Q`fpB1qBTm2`|RQ!u5NsNw>0r)nc@^BI--FJ3l5 z3Pd;)r0g<5`k*o)xd`w&l|s~Tk#kKwtJi6mNp-?aKJ*AunS)88Cfn4HLVLf$-*mpM zCpf@KX=lkwNDFVFa8`!!{Red$ zE8smCg0Z@{9@K3#sv_7`peg67DT1>`#r~S_;85!+p0b+o9L42>UDf$1M-^G7O5j=@ z~f#hF!`JdmwJM%4uAhX=lGj4+K zs^IKh|5sFDT}lOAkWtrHQYfn~+F<{tWMzX)Rxjs-1xY8M_LEsGpG~xJ-v5 z*%~Fso1Fw%GrPaBVvH)KelAE-!L#X9Ad@WZ*-Wym-jfuXk(>`mX_m44j8a5Ue|xIC z=CjE9Q)C0P$PR2wI!$^n4PZ+kjU`BTLz6pFA}U?Y7}=f_*`O@4TT^6%9oZEc91!|Y zifo7@iwWJABCEx*GdZdFG$LmzUm0pi@9}XSa4o`M% zDmn)^G78Oz&Rp=IM$L}1ZA+Ai9+I7M2FVr@WXnZTppW^KlnG|TziG5__&(a80re83WL5vk%e_0SzX+& zh4*-VmT}47vcj7vlvk{L2vQ!N3uX!L%@Uq^SV%Q!ci!napCC<;y`A~apnvd$1Zkrs zBau-qY1s9tBMuE(hn62LW1M;!KEc+sntEs zY$W)1C4?+J;0X!xL4f7RQm1=7&`9ulZD~tb;?ax(oxIiA-$am}MXr=~=aRJJn&`NX zIma!bi$Z765;}v1fqmMVB^j!kUL41#b)Qe&-|oz5CU~u)!eHIDA`9Ne=CqB?X&dLK zZEQ~4*qpYpIc;Ne+!ldzNrWjcQoX6F^v$HMf}^sX=U6s^Bm5r4p=T20*$23vAR9?) z5+0mxxDgs)LPmIk8(!)Op5#zV2r@LKW~Qx&K;DyZ1n>Fmh($FabsS_1IK&J&SP77X~7Q8swd^STTmcs9I4rwO%u%gVs$bxrVGd22_3(#hQ zN4hA(xx=KI=GtgacNPUyyrQ7u zhKO=S5fue}Pj&siRsB?VPbP4$zMuDR_%P>Jr%#=8>eQ*~>gwfrn)yR}zM*cP9l|^S zq#gOQmgQ&-l%rKzyV4T729X_dtIJ-DwI?VkV#_wbu(U;(yA}YM;q>@r*@4o0)8X1_ zd6#CBo9WVYvf-KLQU3U4nnET=^dj9&@rw=Vj|V*>7`y7s#p%lOgbA4Qld;lMg0a%s z-&n)9v8-%kS=q+2vW@c8BctVZEGXMpP`0t4Y@@p0WM{VGb+f4JJMf3%DgV~9KcWJG zwccyAQkU%1dh6M#Q#mtrD`(aPILmPB`C5IspKaY|TFIW+sYS6>P#%( zuGk!+5ZHDtkZAN~Z@c^K?%o&gQgSgKNxh6mQb)}|wC<75Z#?;tJnGC&-O!pMx8{g$ zlbw-uzwM#3yC)buHJiQHZjEf)ty-y(yl!eH%l4NRT39g-s)S03TqRVQiH$~TvNId` zkJdu@ah|AMYQIJBU6GagZ`&XxbuOjR7OO5yt9Dsci*l)Y9w+MKg7pya?efM>&l_44 zqMcGt+O2O}U!-j=I*I0nLNR{J@W56JLhv7Ihb9=bVr=Enqws;x%})2PPJ8Y#xY7LZB_1$LTXh^90)~CrD;Bzi<(M(X!EcBq46I1=!QG^zR<6WfxPc!vl4Kd z;P7G~m*cj*-)Lbe(0qLTLb`dSYofiyR2ZpkBRwCe2>w|WUpQ2S`bo!66e#(-lpWBn z>}31(+0(Nr#i?V)rc{RJ35>8IQWabxiRp^YmJ@$dCb zRh`{MCuZx40dH$w9&iNrQH2){RiVD~e85q%uaq6ouIv;Gxc%&8TfjG^vfNC4g&8Atfjzv+UipJX%HL)J``9>fseG+ zr8FgcM006H%StSo`rM#@0JtQu<^yS*YwAFY(#=6|0C;;~%?HvrUzgI)qaZL-3%nqu zp3tuOK$jG(?uS@B^AlL*x7+4E{ zbfvFLiPly;ND~|S0%?0y(Ao#QF0huNlGwT@D-_lF#lev|WIrK}z&n*Z4MX)2r-n09%1 zrwaE6=7#kx3J*r+h8Dedxq2YKx}}^tcrRb>a3LdCF2i|o$X3NA+ z3*H-9JkzpgNRH(|!f9i7rH+z`6-!QAdldfBVb75zx5NV<6s-3Fqp77pdd}6P_lS$# zqyduLwyy{zr%bBgQ4Zr8)D>~^(1MfTCDBPBo>{KmSjzM&H*>+%Q72gTw6t0-JwPA4 zB^#Y0FnM6(4R~{C)amoUg%(^lWDDqLYr%CJ)~oZ+3n?-Hq;d93f%CwG-}#ruKg-aJ z(#q=+S8dfCU-@mCUhQ!a;LT$B36s)2QLt>bsIeIYn?Q8<^C6|Eu{pHHw*-y-Ky)~b z{VhsSV`CV>XjVdIJCjnpp2*P z6TkUoc$K?jLMOWB;~$iDP}$$XvcIcq{9R>Rzr_d=DHlOIQZnj{@258HFKSBKd+1<*WwM&cQ{HPO1N=uUFLp!p=REJhqO~zS}!bSU#KPsS|87fFMyI1T2 zhXAz4Kv^{JVQLb{Ms^gnB0WPMpBY+vWIPBuRR^P{l^lu`4N<71snJ7+LA$d*JpMq` z5m0AIvZ^1uN>UZ~w97(Oz0&9;icrRS@JXPn2MK6*=0{X2IdU`-(3(yx3s$7W7NMW% zjxKLEHCq;}(AF^mEzm|bM5mHVjjYtE-5DAXayO`|rU~!p-CKLQ#WtSWY7)4OSbjB0 zY3C@IHnmRUK$S*&N?Dqs#)08#Y*uM(R%onQpW2fnYIkR7PCpRcw!{SDs$aBHijLPT zTBDi2$(-o~qT2=u5XF8aODUQutz@g?m1W~!=8qgDYP|{^tuJWjS1=SNiRrtV(sXgH zHgH~>AfRBE;;t%-s_g5kZPv@(Qd0k9aF zp})sm4o5%XpzU_?1f;cgcL+#RolpH04ezJn_~iC^lYhnQKz9hIUaJmqCr0r3p_BT6 zcxSsgK)iD`@eoHG4@|JFDv)5?Yy^z1m$r-I6?CypG~l8_1Hhk;4FKY`?U@0G+kj;u zOZtE`#Iylvh-*5S^f58uvXDuAz}WQV#RhsjR>pC<;=M>=ujz0x7HwG{rjZ3e=2X+xXi=b{PMg{q8@M2P*^cm;=326peOZbx(ZLR(Ez*zBb)aWjr+Pz*eX|0K}L4wM+`pu>oKVT|c3VQ7SFjI^8Rx#eeNd zYNcB=RKG0Rk{2Cg08^?~=i7WmD9w@(ZFzQEhN1->Eh=C;6}3B1`YFezL4 zd?}$j8{`&UQjv~jp%Ly*TxsXRMn{8DK!({`4M=|F$(E)>u`Z+7&Y-|p z*9LT2H+W(7ysmt6b{QtgS-mRsad1Uvg5~F$&H-$Tw-8XlJ%zLyH0*K(|H^r79$U@;X_jA_Qkoci?+4Rs7wk- z#7qhpBW16$sFg&_#DD~>7(4=IVnAYNHi0ppN~^*Vg-AI#RJ49vh!%K!j02Dm+2t3I zRyo(f2dky#Cyu{T$lnKLYS77P(FosqDX-ikO+WoLW*?|?YZ$0YB2qA5$ z8f;niX}J~sD6QwS##&|YM$wAwsuC(WRV7r)40keY1e0%+$^4BT3bzD520l}At<)Et zrjHh&!36^xTQ!(QF?XfGXO^!BX8VDdw@bT5i$YXbie;V`K_MO#y+QL9c4KVP>3So2 zN((kN>~N!SxXSVO$lYs2d6|cDbhGqKzIPJ^R|N%Y^4tBC<0sdfKy-H7;|A_=hYG*M z+Fu*_OGRzH4LmZimI7ZZmS3w=IxPwUzuG3aIpzm2e{|3~ABaI`exOC^3sDeQG(Xg) zGOa&2sAvLD2&`p54Ej|xrLROmVA1?g8@HIJ$+k=d9uu@K0AkQDgeiS73IdDf>wX4r znX1vVcAi1wg+XH<5RLZXx5LuTbV>RqRk>Q!jU+I2?IF#os#*5>q_UmNsC$DBJ8Wh*g ztX$piRPG3s`+>#E)xAdLV?yPHz+&aVd%C$2 z!TUmm4Mmx91q2^bgglf z;R}HaL-f|k+vX3W z(D`FWT9n)USyb;&IXZ)7Z~QY8RnhU!MG+mW4)I)6V>`umhtM5;Kyt&j@^9IY^ryaQ zkGoS;yUX^>?ZGIDdq$?(=b z@*!1M7OLu&Mkir}x;1On^F3WXNI>0luT_#GMBX{OMNVuHa)SQo@^;e(mjx@d zb&Nm@wDQR)dX;3Vd@>3R2-Q6q6(_E#^4Wd{oAK z=w}M@D3LAYfXC{PElYrJ70a*gD19&p4gzlttkMRKju^rA!9jQch-znOphfBZQ4si{ zz-j`q?d$4zCBXr`+Gc0pCXmV3ZVLnP!s%@WpWYK40DdB{<^zj9Rj+Ja9sFT4!ClWt zSJ8NXFn(#U)DJ9Ls$K?PsY=AltN^K8vA5?cX-6l#E>!T3Ai3aFo24=lt`4?*Ya`S= zSX}qylwi?p-GwUE$?Kt0yr^-o)#ir^{i1BMm^(l!SH_R?N))Ob8;Bh%Gj7%guMNCe z6|Q|mM{gCi+!bmgh>@Gl0QgIithx!+$nMtB$3$%!{OF#Q(_n?<2Zk;A&S6VlJZ#C= z4_k8euq98ZmehMA*;JhkEK2{mM`e^MB(EE`G%+a0pK+XgSibPGQMtII0(htLnxX+%vo<; zxq-ro!FCgfptX(6c zGZ}L3bkm_uV01Yiy}>|oyrpvFNKwa2+iv?f;oobOmNeMjyaN*2yiF8nu*m^w?lWq; zlDXEeUfZ@gcxSg;fqUN=>4n{f&cQod*t@5+;F0*FZNsRWgD`1Iu_8R$6wSe*mBm`{ z=v`mSJzfKc{w~%EZL9)e-mrrOye8?U(YC{7pLd%(tr(Gw654`;J}9t%6ArKTb^T%3 z`)D@W!d^_xRr|xRnT*ESugh%cE(madd1;*0o;9r?zyZ>_q=5tUUP%K7CTkws(sk>s zY4*n=;N7HinctEaz-FQ=ncx7EUdc%gFz6Bkut}tn0S=H)Z9NE+gi4gdCaXf-s#Ggk zPSdQBeOyE5$D&)>qhJ0u$E-bU+jO1VHckFna=7$qu*#v=ZN;4Sud(Qj2g8YHJ^?0B z6-(_p8#b|AxgoWZGgCV`Gqsd6ljhiuW7M^0L2AjC8>t;*rB;kpVI#4^+!d!6IK;C! zQKXI(kEI?JkEN~^j}70)!kGZ)ERv6|Prb^SsXI9{^&@Ad4&;+k<2{<2m~Gr?3!RKz z$4f_H)#(ij%zIs75j%f7K^j!Z-X&2AzcE&ks@QN8JNWKC3Oj3BD-?s`<(S`5tj=ux z`WA)g({e%_eOg}jsq`=*KH<-Ab)L692Mk9W{bd{dWgA?$qdHJ*#Mmw?+gMh%v8-&P z=82pb*Jxuw*+v+xF;-z{#{Me}&Crli@8wBa?z<&r(@VHBq->D?Xqe@4xZ z&g|um*uO(XZEJg-;Q4_y@R;DA0&DPNvMLJ8RL1{78P>>ev9t8Chuj%FwJPkRb4ZSjz7WqJzLz zVD)`d@GenT+ufF@{M{fr_-n!67DV0lK4n5~aRpj;<^OC8Ye&JUq9g6rfSo;^Em(U* z=>r8{Cd%zD%Jik#0xk))7p@jOTU55(-9%XDN9p$pULnd24$35nT`U1V5o!;7OYnQ5 zg?7REag^>+zU(b({x<~|iAsU{=mD%(N9i{S-WXZm5WHQK+YFRRU$X_gH`H$aM3D5& z&k>q&;kidc#3H+$SURG~yz;PS|I%lJ{WYV?Xi;AhuYr{|E(4#0cP@aTxIp~cKc(D>KR8u_yq`48V4@@2Pb0%sW~i#LZEt`GR}kTqvy;Lk)cAm3MtZekl>+_ z1-v$N=ouOKBT=l}A!o#%5bDTJc&S~VW`}*8igEnz$m?Zr{yy@?Gtwr61}p^9Tr@o6dU|q{HqhN~*-l1?{22Qwh4tODCyab@hpAmHxK{*M z7BV957c2kb7zNH7#@x`Nz_Q3DytEz8gR~*-9^{U<{TWnWtO$KlYPgdpr5L{5S>L6- z%}aYJ)1_nW$%Q}9{qvru|j)C-ij7yx9qf6?6?T6@rRM`~&B-W5l zVd(bI18dSTFr1b=q3S*1>@ZO70ZweJDrjt3GRxBC2C}RaHnIVQVN1vhU8$xs{^D|vL(Pq|CpABvHbM)!%dDD3lYTBG--;n%6 zLz+!4+$vT`jf|ZxPTDnlkExiuDOr9hrmU`FOR&+|G2%6H4QgU+LP4u)W^8e?Up~~1 zZB~-5P+1nT09?7DoVTgvif!ylUFEx%wrbICKdrDeQ`ulysN#{EvQWhiUMgh2w$xFv z0!qayPIj)>5W7%~a2H|V2g7ZQ(j1{gt*rhrRr_41-v4dE{}S!B#mmgy-6b-d`*dV% zcAEWEqV1V<`{QXO?e{t*`9aZ&bBJH>Ac#LUV1N~_;Xu^`P40#^ccs78>s_+!q320kJ9*}!VvDj0)Uy2{JXPcFS&Cq9jh)$P<6+RI)H<(09q zz+(cd?`?vYiMrbEL#mYD9YhB{CU{dp)a{~DCb||v;MYR!{+|f`N>rPL&K9gkqqHst zvr!7T+eLL7u9WFEvjv32j}m1Uk}~;V6AEx`sNH|5;Cn?2 z?Sgf6l)gjoslXc8UMVt3R0>>cVeK9gYT*9}u8XX<2)<3!b)oAQ%4Dj=3fKy@o7W1G zsct?5Lv11flE_Ysad}91aA*L?3_&vbDJ1^2=8w>n>S^(BR<(=zq)xe{yK?{x#Tw;P zl~7I=OhU8gNSTziUIs!7Gsm3;jbPFijg(1D(+J#E-R>L$lZo!Tt?mRtnOrmLz;g@L z!6X-Lr~K8JVI&>Y5&_tw-ggdx$u{;-DU*7(hYEz6M&P*xjbPG_Jygn2%P(M6evwSh z$(TYO4QIcUGr(Y&U;2QjhyFYx1HV3s0Xbo~9Z2w(qS$u??~N=V=M`5IykqE^z8QkE zA`8gr$JGR{j$-Ev{zqg1Ia|4!oUxvWVx!eVTZ-Cx0=O!4-WeJA^eC1NcxNE}XJ@gF zxMxb}_YdZqK-!e=hEl+F%LqI_E7)%WFAS_cAbFE(OZ_x$she&#N%vNr3{wYZPYVw4 zxX`;{hWLkAZhw_AzFbW;UhfIQH%H!hhF)xH#qy$$;dE?lDy`Z(Ot*c&eFJL{cz{^u z#+r0iu2@03hFDB`oTF(B+zJtIqd$WT*$>La&TMs~MS;_bF*md*ut2gIF?FeG73%tf z1Y*E)Fn%gSvuq464PFENujLYGAt__ z&i)66?pH&e=Ke>X?-pX#m3AU?5l{c6GdIm;CTGlt9;k0Fse0sS=n%$!qDDo$kXfrR^P`+P0bkK1i=}Q=2B*c4LwlbTvVMBdf@5ZB}mV} zxWs8Vx}+W$YKJscHk>_b3|$g>;A!0@_`IrfVzLEiIpH`PvyPy#Wyvf{7Z}L0%6Oqp z7+Y(eU2Qw0XAQYSnra-*bc?lZWNoTV(a8?!aOUX!RQ;u*HTjvYmS{7pr;9_I{Tb>k zYx__;q+HZ}d?>TG>L81sigk|Lt?U@_kOZN&al`YuP-F2<0kmqp?H)+z&c^70;>Ds? z`9Qsh!1K=qeY~S!tWvsEs`DE>sYcJmxu~?9t(8h`(UEF2R;tcDu{$S!+J1PhmY%{+ zZIlF3i{T+}_lSRL)Rtt8u55G&_+$m#bqzRnLSJg!iKX_cd$p0xljG*Wkfb=$foZv)0X(a{}FGVejHDfM?898ne(Yo z&4y+pm9u=&FQ3jAbvupu zqim&6m3FLib&Yc+cu`Prdai)-TgA5@4Fl5TZaWD$Td7~J50K%Vn32{v{hS!ALv%x6 zlzUC4=BLIwpUz7lx@Br^;lwYj-jwsT><0!*zL{f82o;v*^_mc>S(5~d$kp79kFK$ns#t%I z$rs!CR5@=#srRD_Y*p;ea9^G_LS4c>qTu{3?2h(tsW@#b8t==)*-=L}eP90jQv0)@ zzVz&jTb*SYg7{-AB4CAUI8e1C+K~|o-mZXJTJI=%K8?CtD~HEHU6bb2w4`| zfRiq0x63QMGlRbq>yN=cKyM3_M z1pa6|4lD!yRxH^Kkg{wP3s-h&kWglu&OIC9r6z`a5k{ zp@z*Hz+&a_A2R6(RZq9}r8VN*1MwgErL6RY+C$0!GlB#fr0gkAl-Mo;6;J8_-erq ziMkGVXJN`DwZ#fZQd{N%Nou$50Ygm;NX|PkW)za2OrsnJL+N|vF{w%JwpWUI3@#); zsZVk{^I$0EDX&oOI9V|1?3QhA`;qdMA@!D!yHE=o@UsPtV3HP%lu1k5`wTGTL71VQ zEtc~UOlqQ$GRbEefvXGE!DJiZp!}&|eKA=GwI%|0RT4Rezz2uKTAv5)aFxkLs}6im zp*onPvn&EuWf9rpEc@v@{>@(i9yKby5^QT!cUiz+P6y4+&HC``+=-S8|zfl<1OdYAc zKDgA!#7D}SRO+RBHpf4ogNFwOcV@K+!ecULL;4n}XYppg3y2x!Q@1Swj;2drU&%t> zF&wxfpE~Kv={P}_!SXh_&HHz!*S|YkRyLf6X)tu63_Y!fY1|e%{mxLPC6vhro|CC< zNtUHcor>k$_+anDa(p^^{$g*_JW~YU! z=BD!|&1D{Ch=y*eZ!W5OHH@a%%ExvL3h!2~EBhUTg)PAeP^E zqJ*W&H(;xq*iRFG7VORkqR#Ixc^~3mw(Xm$c#^1F--GWIFMm{?!gqqDLEuk{a?ylG z#XB8kW3z&>)lo0->cCnE{HR#&E{DCEYIiwOC#>Hel+f!!zEaeE+{!&%M>#rNdYr0}ohR#;h*pdP*DA#R zBZxIG6^u=3roEI$qA^N-Z4q4V18x&oOMtY-BA%)$l(&;+8%KF$q%j-=E1+`~!oQKH#BZ+3g~3O2CQ%?Mq$E%Z*)CcUDll2sl?Pf1AO!x9ncgtZDW+ zF?a8PgT%n!W$tnh(4) zum*v5iRGt2O5cuxRaPDEa*1H>8CtG0lWpyfj2AUCz+D1sK5#Fwd}}D}69h~77|cp! zn;<#>e0E?B0#WSD474akGXp_wJCLTGg2pBg9ZqAjLSt!MI>lp$tFPS)N>rzzHjx2o zs6`uC^sw%9hemp6b2;@ctJ}0?GZErFW<|vydb54nL!ZvWwE> z0wu?5r5DAzK&Diy3w*7z(ATAOQOM23z>C`iDP120feaU~ zkrKnhOamDkUXT)F!32Q}1TRSGcfoW&kl|r304 zA^#TwNnEdy(zK9@3xQ;*7o_x#C%$4eglr|?5j zeUcz12>f@hENuPXkSle0MGkQuwo@UH9J0BN1mdJ?EMPH#{(b(vNT)f@xNiLQw018+nGdZlkjc>3rNl|s>H?V}tuB!H z(buKKN!RKEnKi90kSWvGrNl|s>H?WatuC-Qrw;48O;Tk1rbPQTU{V&?GmP0F@gX8_}Xh2=}X$i933D>*`2c8 zB49B`2f}iZ-6<0Ua_QrOKG34X?vx1vSxI_9N?ZW_d!tI%6+S%7vg}S-cz{fzUXT*I zQzi&x#`J=e*qt&#U~#gn+x4znDtJD*#kO?y4mIh<9<*&*1B>Z47}AYBXj2CyZ>%mb zrqKT_+tF8QjsJk?=xoi1%SPx^17rlJ(YAwR0q4oKgG2XmJc@bNgmx+h#>r)<<>8>N zI$dV=x7fuyAufb~Y-V^tTE?2;U%h-F4xbJ?SA9Tw#@=n*4Y%nKyLFv*L&e=}A8t&r zz_9m}7)7imjD-aTa?RUJu?Hh68`#XnOtCMUp)c8nwX-v@*q6-~F0*-QXLewW)4yaN zlZeDr9_l<i_*|n`RAfil$jM%`!Y`fU)R2?y}kZ3?#En z3dmhHlLE#>T@h2!Bc4ier5iP{m|gx^6HV$K567v<1byv3L8`j)L?5U+xZjVo3jRoaC_A*3&o|t2&7H zmeayyt0QQ#n1nVmEFHG9=XGSyuaL@u92W~VdjYBH7oDhvmQC0-I|rfq?xB0Nu>GG2 z;2|eJ_ox~8?YhgE|9}{UcZOS^3xQV`}{oywXNjg#dUT?T<2EAb)Sm3&Z~&)3o7FJqKdfgR}t6!E8_Z+ zQu@26KWwUTUmzIj{{|5zgf6d+RLqE-EsjXj@9B^e1Cxe!)&q`K_PNh0^L(KDsfGi@ zCrhmgaCJ?U8^kAxtqSlbHC47zPLtzS1$c-KrH*Y7pCMpXfS;(T@@w%KAyx(WYz>Um z%6#z|Kvo5KK~0s5Y1I9AzaUqsKqlf|=-5CC5qSWAG1iRE6vcJDM(J|>9v0oRCSM#h6L4r0rI z9}lc0z?;Rw2<2}F(LUhM#4;n3z>f#9Wx!`E!EN{hCy9j-$}bF}eZa%SG9xp=D}vZE z;2Q#K3GgDZFhcp7Ale7KS**@%-NuZelIr|XdW@e%jBJY~-KcC{QQ8;|Tu6dmF7IDV)Pw;U&ij3Es* zL!5gUo5lh%HXGS;;B%Glqs{O9n>*{xeVCk+Y<~jCU^J~j2BT>OUS6dY=AB`P%?C32 zOe>JlXIg=sO4T-BVRB|OUx5ra(+Xs`nO5M5Ra#+k@-wYKhL>ptGQ3PH@cUI-VRC*n ztw4s8X$3NzOe^pJC1_g&U~&pItw4s4X$3NTOe^q)Dy=Xd4r5||fMHBD853KJHP)tf z7CLSqz~8RoxclA*{2g?Be4+ljzt~T;wm7nXFxm%XblDibu>EqfdzE52FNS`>c~&ad{X62_mQF>pW_ z3xmKz#OkuwZA_BlpxE{)hVf3rJ5;_QY5;zsT?550Mh%mkhJUEcGST*XfIBIBxi-YS-iQM^xVQ}Jl7f`nz}Hx)qAvC9@W*0OZMCqo^r{@<+_(*@ZS zzaT5ThTQ(uZyRi3vGx-snX6;#t0C(kOM*_%^R>N}%iw~N{FP_qN$A~d6=?m~UNL8- zHPcn#6u$~Ah^;EUVBJ)TlKf`PC4XYgu?lK(Khx#laIAe+))**eZBp5qW2M&8b>VQV z?V^llP?yGYbp56T{TL?9$%lm-ezW`+mY_adm)tr#tiVERSwT_$+X? zRD_XdiLxQ#v&djUjePXjBRBtb>QxAKPTj89m-S)*`{7kPWz3`0kGI;Y?u4O{yIQq3 zxT;(%J83(oXk?$Z_MTCdMx3V6`E3U@((0U9RlCZc#ng`e)I4dPYP8SZbn9oILT3<6 zx32~63`?4qoMk@?Kyh4PALQ5+X<1j6OXJ-))w5k$E=`dpOFDHi>)u{jg4L>wC`;KZ zx|>#I>*TV~)``8U*W0_xLgkk$OF|>E6y8gc|E8v7pAfRV=8nrflykP8YRnhI0hp7+4E` zAo!!e8l3xVUvZwO={i#IHG$O!TqV}n>}~Jf&}}cu+ZLU>428cwR=H5{oso5=;D;mY zlY(D}tXl=Y6Iu5Q{yMV$BuKVZZ|im0$Qj0`7cB%s{0?!&(fpH+`kEbItBbTj|I_Jq zQ3r%toPmcc5A2DNa7EUF3AK&?<0N;os6H9!c1dBa(;<_7o8V=lZl}dMtVOwyb-<6r z+TR!aVW_<(uTA;KQS>i@e+!}~=c1vkY_%4X*5d7mdQp^~FStOIMo}&d z65vU(_T_@_3$=ZtC|?;xKO^}0AnF@MxiIvA--)#!5qw;<&?s1ckJ8&~H0~(s8s!ER zWyZFRY2eH-fEO+nTo!7t$!k+SGK!uqxV9kbwvZ_^V_5b8-x6vMUN3l)s2b&R3f5<$ z^j(7A5#=|gDKiyWRseq$YA^55=pH93TP`ZFwheQ^@;wD-in^_F=N4t=II{(ONvOSW zvEZ^$+Yc1VOoukZ0GaM=Tmzvd1!M+vXJ|0g#DL6-P7Dk+F(5Og69Yp{40x+r;l#jD z69Y1%Ix#TR#DL7QP7Dk+F(8w$6Z5B&_;*A{2Wyx7){Pw*n);*de>>6{)mdWxgtpC} zFc)f8auvYLlHE2?+*LW{_l8MrIa4Ckh6M2Df<`dYAsQ+FBWh&sgPKO*4w?&`k6YLUr)AVFt)g#4XBm#W&}HhZcqznAw3J z{iY1H*#bD!fGK?S)PMW5_}8{U?W!vI%bN1gkZpZS1z#OmK=RmqSrmL-6#Iu2yZ;u1I|_M63xUzPTKQX9p*mK>W+)C>#{!fG-cMJ|Ky2Kk;L( zxbu11vL5|PIUjuO%9zUEq?UEq(*Y#z?<235mc2qPGr933+b1G#ds?=&dcou-F)6Kz zyxo{-z8QHlnLc(=)2!}1=7fInIw7Ruo{sDV;ac#* z5TX}`e^{T8VjbB5rQ~wm z!ctTd$3A3 zGU-u~GFcodPU?2`cP_QPCmSEUc)1)N&W|qRz#SSw!>Lmh1;s zd<8b0=c)LhoQhFU#ocP7V83Tq;mL4Xg_lRm+o^Vyk$kUpb?L@P>iKXC(W-~lx?vfr zig~&TVC$#!YSY$4Y0dlzM`JSkusR^d{;2>6VI|ewk%M#k$@aZ+(Rq*K9`4 z;=t~jx~JGmzx@-z>q{M#MuBp=Afhp>ieeO$dVDuGU13m>Wk!sGD$cCU*`5q9zPuSx zz=4-O!ziRXJeEalC7dPI6*C`M#QBPqB4MD+={h6>@k^IpRAec}c{x<9i=WFPycoF| zvltFs5aPEc$)YvG&Z2a2Ok<|WpBM!t1D`rhSDRF1$r+=dit}o-$j^MKC&QVL@N&=1 znUGS?r`Y~x`yecbk5*l)kWaNb$rM|z#7HgDbf?gAmMy98Z8~RJPjQVx&?&Q=45>$N zrHg(lauL9~F;uMUEtj)+am;4qEDk&na&~nR^ztdH7`Gx$FUx2Q*Jd#aN2(ej zx!55Jg1Ye98INd(B>`ON(jfHfP zayiAdAEBenMaFp6iM652y4l%eMO7->C(;&FQSy|4DajMr1!uZYx*bVC^i4 zRo!cJABaZXX5UjTR*tu8YhF1l_MgMmm4|t+*D3g!qJZ0-*_j(N3Xkbvm-`mO)cu`& z`#)-P$F?dst_E_O-M&~gns{O9dZWsOy-T+-E4_Kvoxggwe@TN~Avg4|qocFa!GhaQ zDGqM`5Ik*`vuZDp*tIkG<$*W51wJ|O=Cr_<1>W2i`166ccMJUEz}u$<9;p|s-L*6L zxq&yY1>QICp5Fq;@Hf5l@$ZOk*I>8h*RUp8TICym^c#(K0idya$+@w11DmHi-D@oH z=j!;L+1bg1FlVjO#{aBkFX}&#M6#8T<#eb|l2gGq_Kkc82<*e_Cbn7+Wjis9FB%3iG|VvY12u->Gg{0rkj_fq z--3Tr;-o_nK10&n12SV; zj*$sPnvOx1PU%482X4X^TTw~GXHWF_1EOso^x%U?-TJmn+d)1tvrE;%Xkb$a2l%3@ zbvKYNs@glgK)$GIQo!q`coQbY*Ms=7i?J@&FuXnt$C|IC(bnGu!GF#-&FbSrWN4`6 z2u}VnIN1c!NA8Oubj?=k8mkGUx189fO~=?SD#vzFIkt;%5O3`Lah$=jvFZ)`BjuKd zZ%5;idq2DxJ{LuYdoF(Q;XBVQyY@`K=e4P3WEl%O$qzy1BdWH}9n=T;!niP-^ z_?r|E*G($*+bwALcapw-f2yckQi9(w-AkEP;AMfe5crkA8l)Z9grPVHjC0LGOhb$A zWZ644=`!K{tL8qugNDUP&PcuVUm?L~W@i5Z5lYNiUX~J>;bqh0@Lb|b5IvU?L%R0E zB<`v-{;P2P%8pir>&C5c-MAI58@IxB<5swC+-leDKy=e1dy3Qkt<*yA_(pFo}oj&8{*$aMoy5p?oM(% z?vWeP$T7Ls&htZ6Ce^CfHfha@ubdPdL6@82z|WuLb=W@3h8Bf=#kBVjfUhXZQMgJ> zrx4sb*(-GW5a88;H@gM?ap28qfe+NG&E3NXw*qhP7I>)0SAL_!T%tE zD1Bp9fQxmg=$Nze7V+OL+HKn-j-Ms}{3kyiQ%*wdA`ti|9b%(_aznwYxL)iq8&rQv z)$LjUNUvLOC(gL!asS*_WWF7lpdz;&XR9XVHM2L0np?mN#NwkKl&_DXz?;Q#AN2r# zE{OGiQ;RtaJ&eIOZTvFZhrVs=&l{+DWouN|CfT@Q0a3?y^aHi6Xyl4fRUdoX!smVo=K zW}79LCkM6tOmVLdtR|2wGOfVttF*%WVNlV}EJ)f|@POoqX$3w@z1HR{%om3)?PsD~ z5LithX<|8ZYseY0!rq+&o~f$E-8A>}mhd?(R!oJKKO_&-ILb0l;WtQ{GeUp6H-l|2 z-TihY%yV>5pIy*VxL4?Cmz_1;R|QmjK-3%r{z|OT_L$YIX{UQ5FqzcM$oBT)wT{Bw zV{(@N>#{k>jO?r8A);mk_)4+75xec-S^{%G2gl?d*emAwQMgQbTV(5YGZ#2~tt$Oz zGzPr6${5Vgw;P-3jlunrj+(J~&X^95Q@`&RQl}3%MXa`#!JMvxrtVh%Re-!{ut__8 zAYqN9&ka@<0?&(z?sbavkqy|K1Xk?Bs{4TM%|ZWvqa(|n-W%YqIeN#Nm=kDs;SPot`hnm( zF)-A`fOLox14B&=NPjsoI*eYjwI>j2Yfs=j^^QCH+h%0`!MGMosP({d$sH-`-n?_M zrhI(p<>luJo>vfc_w^~0E2b6ro=|)KM!~Oy+Nb7*D1S4EF8_t#uL`2h5M?sZnhSg~ z)E=CmjGHK0cuyJDZZRqM7d%ju_mnA<+SVxG!ccqu2ElVf?Ncp&Q(BZSj-pozelUpU z4`#L~GhoaR@Rm?}>3<3SSX7O2OMFH%@%O$Faqb#6r3aKE~(v9 z0F)WDmZv~QrYQtMO$x}kb=h2+_BuB4qHug6*bswqsPW;fFdCq3qXFhilsm2hn6&TC z&T_-2MVZ95OD`bQvJrT7K_mE^A(_2K%4D!<1VSyEz;5-V^ASuI<0EDA)HDL2<|FW! zf=2L%#j~2gjRi31{HNk(0VxttO@gatNKu(LUCU_u<5&csl3&`2i z)dYVsihWh^_Q(Qm5dwck299IAeBSJ~b7eFsE#HGXfl^rx%8)h&H-gFJRi}Uhf3cM)!Irm^QjwLtxtI zUhf1mtlXL$%p~j{Q3cagu5E>gMA)Fko4ve@IwE2PGe+IZ16q{Fi9d`tFSnEEuA(;R zqn(JzUFHTXQYQJv+4GidZ(T+e5v8*V%9vWBGQHKn>u^zpM?D#;4ww5=Y$k1gHRjaf z4eR`hJk^qAEXXb#Itb}Bhu=(ljJ6PjdcRS1Y4H2$y-|R6bO7k5j8(g9sT~a7{RjC}xva;di zC5E0YN2XdXC$DS`Cz)A@zf5XsMs#}qq`90=IVFT1sBbQ+nzA^YH-yrlbs8f*f8!D- z@#vCzfY+o_WutvabuSLPXFyVA!|7iP-6?}l^Udq@0?d}WX=hjOjWuU#slut*uJY5Gwo=Oup6%sMNjbYrNp;#4h5bu) z_L$Cz_Cd&!(h=@Jc(@I{o|~%9vPND%=sdTngSNYEvZeTCtp~ z_T<;jt&fUvW0VDcLac6k3czivQ2ufh{h=TkV3vTt2(|t1k5K+ytPLbT#`u?!EM?p$ zHQ_#`3O-zvdO~pe$ffPX@`98mM?o@dZkr&b{eocSNV1!scHLwD8vZ#GA9DT82;*l% z>zcsZ0&6Ld0c8ULNF>v-1^+ie%W~jjfz<>Ov%QLuoO%xb8u{y5?YBPmbh~)egPLQ& zQ6Vh-KmyKhV^D?`#`m;X8%Qrun=;gL2zWrO4P-*&86KtxCIWZ4R31`UmW~O|80o;^ zg=-re)o&U*<#fuIclD#e@H4A$tU%ylqw%v!{Y9 zo}djcQo5HYgO|6)) zondV$xyhl*oIAf-+2#!vGK*|^M(LV%c5irdgO|~&=KY?$+P~lN(3-CCFMr3wcSsgG zkC##MbqIxD?dE&iRvq?X2TDD=2kzZjixRzWvJYgX#ax{^zn-bEcVkDDy^S4J_Ue zRXwrv8qq1~J{1?B^6g~5K8vl+7=}xw~`!Df$L^mk&|0>$Zjs*Ta zuvSKSkGkyV2u5VoB_8fcbTDHme@dJJL&%tSrz-99lD+m{s?$WT?5I$BV@HM3jrkRD zNptpTwd9MjML!h$S!B^(Le|Ji?H;|ws4=6);3KryZd`3^H?CH;yIQC91FE3LLJ`zh zX=}%2W9>g&qvdU3r0vFxVWjoW@lqJQ(yXMm;3Y~6UXn=00%D~iwqv(mslI@AXMgC} zOFKx#WXSUD}Z9lPL%D8r7OV##_w7bZ?sDrkjzzTW`C$NHEJAtKoowFSy$VjMV0ug{3 zi}ph+@?}I9*WW9ZH&yGgvQ)(`MOi2hV%mW2{6P)3+_!&?MrUX6;Oo13+0Ja_KUx%i zFQz?)0{nAe^#Pw1CZHwT3+^9Tz=Hy-4|qgiEd&yXv4!)Zy%OAl4}C@9c-!?z+ez6z z-dngnYCAN;zp3lqH!gK^kK2dr=m@d7T5WcN0!)bXfumW|@?S8R+#*gmYBwB!(B|-b z-;4!EsRj1hssBhg4jO>wW;NgiV<-x$ucaK|?mjrA5KqBdWQ{6d68Jg_FwP(DmkOtYN z09gLrBL0Tx6Iz}zqkMY^^&s%CVr?SS`L+nMPle7sId2i=5ux$(frQ-DZ(r;>_u@>U zCv)}4P7AU1>M8FL)b|1D4pTqAsL!saip5+#vdu(2=yt`Zv)~~ASc`J2) zX#H>>B-z-g$ zSt$zT2n5clDKrL8ksX= zT6*NKwO*yc85=bGsU+3tuOw5Ab}eCBXSj5cT=HB>q_h93>Jg>j`!jEa=8cUi&BjeN z`%etnfz;`)oUx52q^Y9rJ3XiB6E$r&pxV|6ey6McxZmkIE!$yj`*(Ua=HKbT)-JN? zzSC1_b9LKUwZdq-z|dB)cABiN&sMj6r>Fgv%KyGUX@7KNOpT^8buz&ueq zWt1yZ6%%%DONGLGJ|h2ThpEKO>;@`$r|0_m`PXDbrEYV-|Ch_JHTgMW(zoUb@VFqq*2}w(pSU#rW60e5E$t8@jG99`?vh-iX~3#G3b&qEmVzNt<>)sl2iZe3*i9gs3h3fGfq~ zOEQ$ti=x1{h-JI58Tjo{40uCeEd$;WSWAF+i{-9eUEC-?5=8ree-g{=jtBoWiUGG% zPc*V+z~=?l65xwMe|fuTvj?fJoc z6gjOh`$GU0F^XOjSWO^7HUD=56GF2De5-1XwWoI&;?5X+rd-QvKLX-kHWD@K#-Y(5 z!t+CL+`Ioahq&)~z+~Rhmq~OK?s2NxWkcUS8ba~4Vt3mxv9B4lKBY18HXkNA4gaC?J4I~*1zs+ewb6YjWUY?? zT&B6?Ga@m<9%&lNpUy~Umf?JZgIVWjwcORQXFm(uC2bGTZH+iWybeoAvcy?+PnPHUPdT` zp!QM2-ZONy!8Ksj3Z+q!vPmFyr%I^wiG#9`zv>u{veJ66Yuvct*kjM}D%|n`9Gf(| zbOO%CWxeawbmU#r|0X@LZh56!U3XqZ-SWpQ&C6i-6S8F=kx0$jJeP*V)m$f!PYpE} z{W)>C;&F86FEweat<1|cOWjpnb8%YJ?$(SiMY!lEV(n?8`X{rL~V|~Lhu8D zweXLEe+jJl18VKU5P*f(3Vt}S7JX0f2Z1#o_^?>+&3Ah_!97XdnBhY`O4OX$S#WY- zEmqX#9v3Opd@;*^C?Q&ZHcG<=72;;l8U}t9)@|E09 zc%y50pQI!^fYJWpHUAX|m{3c+Z%Xbi(UJbOclQ-HSl^9(`H0}7 zqV5HBCrX*_H^sn?(4h;b3+^sTSSimAqJ4)7zA_P|Oj22kfv*m==dTkyTXdwYY;3*Z zJcaefDE&UcmT0$0ySF1KldX2)0lX>JzFF}9iL5&Xzb)$SWH^PC$#sho@Mod+0w8Js z@{sn0(^Gm<-7{sB&azWlC}ciy^DYC4(PK#kgxU%NI76dmw4KsfzqMdOZPorV$sI1L zZ&tXG3+q*304_U0@FY?96DTfRlo`gR7XjQ;=jI0nTf}20hwSd)#j+y3!=hwt_k1G zum|Mxf9-U{h>q^jL&!Aj8$-S6tm2Y_IRx4^hrql=Q-G@gW~OjawftyNW-hRn0>>!f zU3D^uJ5CXoopb^X{M z9A{u?)!1`9MjEtjq`}-<>E|kd8Bcr?gfb(>o~Qs`Qm77Qh;W~mGK0V-0U*?J6!@Eh zMlb^bjg(1s(+Gr`Mj!*hHIWez*LO2pV5pNzhe!UPxm_sQB~AX3_c9 ziz5rjvd5VOpBu$46MRo(0a+cnn&2Nru|Ej@F|vTHoGjgdbdfom_E5*Tju3xFhMj?E zW~^Dda^ZU-P-dkE)fw)aB1|%s}qy2+Y~v zJ&OY-=I$vlFw}i5gecH*=L?vYJ72)G-1!2IQJ7mXlJ~9{$(2`NSwm50$0TVg;j9dJ;QuUh(=FSHcYW?o%T9ycjodsxc$RWXVZ34kK4=Xd4NE0GKihM)`y-z zq^AKYrn5YJrux{Ir+S5SNjk|>k(oaBr7Ge{dxQM%N4vl7KVNb*JyTAx>%sPLx4n&& zhnrLB*EITEo%SueavfxE4Rux}b;|p7bi(!_eK!4>72BQUAQ-0gE4&4wGI4K zhZ`;E_^5oe$NiEqvbOlpa6U%R&oX#8J&@YY#<35~mVbd@ZbF=C;81 zi`Q%O?q<#Q*GrAq&uyHahYy1DPZi3(v^W-pZR|sU3w&I7g2Ym2R<Qf&;3spT9#|sMB_WvmgE{ z9BNmWzjlqDlY#?n8-nE-2f>q7A$bqD%|!ca>+QO7>nI`qiLxPHsIO3l66oY?b^FuU z?LUd;&U%QxNsU?O?uc5g;yc@I@!Twr3X$J)NLMOffY;80&3!{<_VYu(wVgKGIx$Zi z(*6ilc&3Sio};DjfKno!nV$sovhq3SG&Y%wX>UBEY$y!P9QI~BbjVXlRRh|sRkI+; zBZL2bJkj-HW5z%K@x=E2;2}!8CpoD_;W9lkmA_U-fj+i7(Du@K-l>H@)moiwqomfj zcQ;xUdLJl1+*+;I9!D%?_n#U|Lyx?E^1Z|8<+Eru1yg~N4Ew5C{t*NqX zsgjmPxy1^Yyl|Un;Gr}Y^<5AiB|H*%abT5RxpuFbmpxfGsq6_4X64T3f7~nOX_?AFW&Py%Ua3hFT+y!wV3uy z(W8RT3gdMEh|})nXig3G9!3j3)V&k0yhIZW~zg@0@ zZx&BKhBs?k{*LVA7W`Y%ak=l$i zd?{Wd^8~2M0C!u47SbYjE(6mfcZLGvxQj9vTK9T&u?M?8rjXMGyw*$kRvovk0^om% z#oN%7p9rE0fSEc3t&~TGj_L#AHKLTE$whr>NmUATXr@olMx%=~{A_4|{RE<2k5axP zG@u{&?I7yk7p8n)5M2bM&2|CY{=V?c((A&AK9y*v+!?~N2uK)sU6?X-sPN=hq9Gh@ z;K~DhajTbjYBL*fl34DQ!oe1$1yQg~Q7E8sd=MM}qQk$WNGWP8KP)M&=-eo8ZIcR! z7XO|nrRl+V6Nniv7~GA3dCcgiWapt^Z(uuVgxbsu+)0Nz?FM!WbNd7j27m{OHOlsv z=hzS5Pnp`=f(LaUT+WY$Blumc6`c-fNbd)66>8lKjNY%V@_w+|d;2Y=TJPQOEYY5J z?|rS{a|K8v@8-4CQ|tXS%1$hGv@=`P2!6aGbVnZ$*K)ZESK3$|D)|>Fx!;y$qs8A* z^k<@f5&ddIAR&jVyg>A#gx;<4J)$W=|8>%TqiCJI22&yy%-mD@?Spwoqw&8#fl8*jb%2wd`&m{+~lix#kqmE7}dQ$!OzR+`eU*zdK_LIbm#TVTz zq0dzry1&Z*eW0&*+CkEjkVpT?_GYMEGe!3n-9hcVSpME9dao$$NZilvRsDze^+(eB zsXTV3$lgJU(;=dViyomf#@Vu;>cy{A|MvTP&V-u!sr(W0;|-!msors-Cnb8)`tvj& zzDRz)P87dW`5j*BIlGCzT6C4@X`){e-Q4Q+|^Co4yJ9P90C&&+6*e$$vn8Un_cx=;uW@it^B6uhx#I)~q2% z^m&hZMaPJa7u{NPlIS$iJw#`U&Jmp_dSU68D!d)|DaFq;KHrt!_ln*x`cu*0iteEW z!@HMw4V_C1X*Y(il3?cO8I@F=qk~V z>t}=aU+!xhD0+zKO`@s3uc%&1(UZ#GD?Rs#{zmjM(Z7hkWQDJJgy@-~slKNqpAA#~ zCzAWM=x;@LJJM@@;5DAU;^=mIgvzT#&k;@iLC;yQ_D7KWgXA9<{cBDA>r`*!QNI53 z&+_z7qOG%idE$Cc?Pq}VfBPr&1MeE`*UhQ6)wEt&n|EBbMEAcP=carL#EV@=SN_sR?{>~A7 zvFKYxQ+e_vrE`?WsXY9RHF=)OA90N5oO7b5`=9CQC8DYP;IW>wSoC!XU90kN_3eF} z*S8|E|JoY+$oHwd_w*l)%)OP*2mAZ--%1w{w+`UoNYzzS1Iy;(7jb2uD-`5Z@)H`|0C}{SJVH< zk3Yl9&k-GN{Tt8q^`3Zxr@iNSI$Cr~(Y2!fX#9KT8$Dhx`lcHCg!r+hM|Jh<>894_Z*F+GcO>+rF3(>w%F_o$kI+WTdeN_L;g8=Y>PzwOM(K4g`?`PIiM~b@ zeXH5P@nYfc{v95^Ty#)$p=b~ksFPbF`4yroYwDjP{`sQs6m8YW*U8n%Un4!&iGD=% z?y;U@AU!B}{Yvg|@{%=KpC;C{8e4X5%YUJTR!SPOc3{4u4%8ioTSkbAXyVcaM zliQ<4evbGr6Fo%ql{NBpa?Kif_yan=B%w+3vsCUV$sa3vw&=N{Y5h96^K0baEdCXu z9}vB!M!rt&`WkuoAJOqoBsBFumHV9JH;R5w^oOEp{W`fH*U0};{NIZ{F4{99)$GeN z#NSJF?}VncQn?pP{vgpsqRU0o`gL-zu90Won0?|6l6zB){1xI~D|)@?jWzOha&_`| zO3%Hb_ly3dMnCgDlzAVT#^>1N{IjX^&1%V?A$tC1*1uclr6&{mtzPfh-a1cl-b($Y zKJ;Pf`Lk%9{C$bN)c$tezUFg8hwBe|#;D$SQS_z$9IWGqi!K*EMl_YLldF?|t@ON3 z^iG9wTWaL%r;4ttk*|}h zlYfWwv_wBBdTovVhs1|ort=AO=@=g&Xd16EBRyxa=z)^&OX?k~a$0|d>K!k7qUgsH z`e~KZ`gL-5NFI8K&bw)Sj@Qvt{!!_LKCbfLL_1}tr^eo<>ZSJ32SxAb8vV#Yk=v?9 z{xj+Q zBU_4YEt<;L$sxbJ>g^~xQFLmJzE_BUxaeR)Q~Rmh3dye&T`js!G_7AJcedou5q)D# z{Z#Hs$z3h_p@gRPFV^w8dZ|46KCF5-B{Y>!db*U24O zBM<*59X}zVssE|mYRRt^eT(R&qG|m)xp&pbZ#CX)*j99>gr@paxm_jy9MKnv9w3_5 zuai4i@~;p*yrzD?_$x(^7CpX3{u1%uCHfxG8*1bq-O_vfxai+SM?K5)cM_c>nzrvr z@u8U>sOk{y7TqqP=c%0POXbq?rsQ{!-btcUM5ou-nJxsJuG_}8}dZ|46 zpy(Z_(T^MyxurGomy3U!=mm zd6g)?ZUp7=W$2G*dU@zkb9_1d`*zuTm*|z7uzydY7ybNV$8_1Lv-fG~|E%an(XWbr zU-Yk{wEwW3Q_p?*YQ<+?9fuyc3HcAH-p53568)s;r$xUk`Zdu%i2gO9ojZDeMvIOW z-9>bU=u*+65_+P_t3}s{zE$)cqF)!iGojyC`6r@36MaJTAEGlSct7VQ^Z=C)5j{+F zrRZ^@?-9K!p*N`f3DKKHza{!z(QGGgzc-;jE^KF5JYVtd@4kw(MlJ3dC7Z8-pu>reE>nn1`Fy`mr}H2Dvm~_mRhTH z>7Y>Ylg==$trV;6Xv=`JT4!`@ai;1lYi0Ji=l@S$cHUWGX4aa!7Wuui&))yD&$;K` zci(-Fdk}v%SPPyH_ItWl+HWrWNbOG@)|2xQ_ZWV-y9;~{{2{nsQR`D@5%iiB8UJJG z98}bLTIWjWtpeA8YeB91E9f5v-vd7cb$dSD4bb=LeC*NNh`2kzJHc(>z2N=e7(7Dn z4Df7l5~%Y%UR~<@bkFhVGwxf+?_ov8O+|dQqRv^nE%}kKS((_b&Jc@EBNud2lk=37szRTCm%rf4sWX_vvo(=re94@~c#2+>MC8 zRZ)+x);S$|XM;1q22ktvK>u#=``|86x98Kn0Qx?iJs!O##9aZd1g`?4U<`Z?ItRg5 zz<=`SAFnR;eY(H)=rgVZ`K1*ZcNp<+D(dmoI_sf#Ew}~z2B>x4h5mcs@Y7riV?f=W zPq!EPKAmyUn*e^wqyKH_9Pj(uSK z54a!vDflb!4e)*NBd`M3vwHu$f$RO>gCBr@QXF36BBy}Uz(rsSxCUGg-T~eR?gjUO zhrqYNk+rU!N>Jy^&qqakPWmfw$0X;u6XfS6vT~}c=h}jLQAU2Q(e3>W^dA7f1MUNV z0dwZ8V72mgg&6l@1|ywC41JpOB7-wfUa-s181`EBv|(|$YZ?^4wHYrpOA z-vPb=?gw?e&+kQ#|I4ty3BCpX&g1X%`wx#l?eC%fBSoFR_B(ls^B4tw8k_>^c%R?7 z9{=gEH-QVmi#`56zh;j=?U$kcN=2Q&_6y+O26iZ3kMfP6)}z1nyV>Kv74`?f2f>Ft z{yx7)JpQzQAN5Zv>io6ev+&;sz6!n$>Uf{uA^0Bwf8&YQeib;6p8}2tKj}HYPlA0a zcpf;*|?5!k>H;<;TDmJp4!4 z4}!0PZz{fz@`s?#M~{myk0%iS1MnG8=jY4oHTWL_-vD*K@4&9}{up+hzi&U#K9qki zbiW0D8{|0Xct^5lVP2#je?6Wob6j;pq4@B}lG{2|uea_MOXnn4#p2mLf zjkpNv>-cHYoh1U+gAL#u@FH*t$kk5QqRd5QHTBA}kHVj8m>xozOU060h4Ku1j^&D_ z7o*HYV96-#Tw0l{zg`dfW>EM4I*b#aP5#HvI}fh;;`8TvRb0cP2Re)&HqAwz2o49e zp4Q>AE2K~7&!ESpQAn-Nyr@TV0TC_~@^8qWOT2KM5H57bhuw3z7cK|l%i}Z1kBg`A zG5B1zg^PP!3%{>`TmX&F$mfzSTpUC9kNwz={JEqc$$tD1^(SEelI#Z;_h>~u$$oGl zk7>x0)cxR!a3u5Qq8>*OPwM{Yemsf1xx$6+2iGj)Did78FoJ&QesM)It}wxM2)p60 z`&o~Cxw=F%%3lPz-`HO+E`P<*KG6k zlPj?K`t>E`>+1&>CiCUZWyW+bUc>(M9e1;_AAHB%&8X+1koTj^C6}&7-oE2*H|l-I z*=USA7YF<-%3MZC_s5q9SDVnwQu=hc(uCHh4p+LQ9?3YaP@&`XdU<*|L+!7Zsp7Ix zzW0N-F#df1(A4@|(tx}I<9iht1NG_-T;xFO@!{n71bTq4hY=IsPQ) z>GAr{@{G^4I;U`v;@45W9sC}s+tYEnJd}SUbQgk)!KI$|R>MxVqx_d(9$W|N_J@ko z{?sF>dyPk*ekA?A>hbSsa4qfw|MLP@{s?^PLRUWbBFAaqV#P~QCRd^Sci@CCxcI5y zQqWoZ|LT1HzuW)ZY?sSZ=R2;(IP3(ssebim?p`fH{4(&%;70Io!TZ4N;KTpR_8Jkl z1iTWw6V&F7O_352&N|L1*kDSJMe*!ESK*5?9{_z71+U z`rn7R?ckH3_TRGDS#AgK1%D4}{~^j1vR=*pVS}A2WR?4)W$hJ)|E0Y&szR0~;D3D{ zXg|rEIkwc|URTIN<9C*|4>t$O+DDk4%5pj*&EYaXO|CGb%+a#;(T0y0DOIa5V@%!8 zN-fOu6w_GNKGwYW@Tfrn6=t02e59Pc()8@bwQWgMg&A*p%i1TH9cAsGFgwfIKWVz3 zDW@;LE9N!(fObD+s-G+8kKd1!_}Z5hW}>pVVud-)V?W(v$M14gZG|~gSzNJ#zn@jL z73OSZk*A}JYO_i> z%$#B-9(0Cruos2p^t;7wbq=U}u7};IUGNRq8ppiMesiW{}ImJe97Z~wbIZvj-Zj`+V_M<;{y7a#a_QS9NK3+P~%e?IVPSnZf6`-JyN(`R#eJ8(ES?pKo6Y{ZAcq9yk^fY?*do9(2LK_nXc<7dki7j#D)5gc$qC z9IJoSo+xDd1@ylMJ0F?biUHaSdv?F`-yvnY{X|%429N*G;op6+^BV!3BVrHp$NMJ7 z{{#3RzTNrrkw(MBVM3YrW&0=`n}7A4&VM=b9~;`8t@Q6ykNrZi+kCcTJf#?J&9LuR zd9Dg|Mw{;W&TlT-O@?*^m!KQ|hyUIgUqs!l9{>A2_Fd5F4V=KyD#sUK?}nZ4tOvvn z7w3q-_7OLB+@9U&3|GVc7VM4o1R~oU*&lZMQ0#VmcBt_gagx*N{h{-_+rgYF_DXp_ zYEah|r^CMr1MoWZ&xO5un-iFixAa=E+jjS<@o%Eer=9;~w7Wv=wq1Qab2a?C@rF=^ z{nZZrUYrNa-7cXV{14ydgqxv%4g5E$^TsXkKY-)wEAYPu_MPWD!@iM@J7I6caZv;R zr(v(U-Wl>3ANy#0I}Y8d-9zy2ZE^lRcq9B**tZ~YK04<;>SKaD?M{E@Pq6R&2dA?O z`3#rS3*WO~3NcyiRiy^JzA*G3Z5lDpIUkn5z8d4x2>(^EFUNlT8TuQ8{V2|3ynMHh z-m&wx68mK)bgqHDce693Vc!gU_iks1VZYl)^h|LH zR~;8GLuX636PSc{{~7iJPdWRKcmXuMn9og5CR(RQA{I02rnlt^iAct@MU%;(Bb7-9 z`9d^TF!8ovT|UxgnU}g~E|SRSqLG>!R}-Y;>w;`1kuF5qGRat^rq%?(@)ZkOT2=-N zFK=#YS#oJ}5JYCw)z=$oAzvuAw~JaVo{M)R@`ZRVD5Qe6WF{TYOJFP$bR;va(PR)S zWODf+T3m11GO27bUWmscvuYZwdKssnJ&{fX(OfRt6~xnpT$gFjMN{!0R!pV3B&4Ji zh-YDdYbq0qug?a>LLzB9S~mUqy4fb5$aY5aoj#X3Nlu1M#=%5mu~ab`$;$XeJmWE= zre>yTOJxITy_hWK5mQs!;KJ(5=P^@;F~6o5&BdMDtnzNNYG;PI1d>J}=!mD|xrC=@ zGin-UmKT{(TV3O;sh#bsnOW_rsji=4vbFUygF>`58JAJY&SZB~4;o)O>lcU@=@5&tD;?mSs&0TD0`id2^Qr zmo8lR#RV-v%iMWO7X+^Tv}-3{l1<)pL<^nqoJ^Z|ys>f7(k1hng4#%Jq~3JI3o^&o z7lK%#LnclxX=JiUE@7fiOVZ+T~IlWAflZEGf+ zkF6rTE|HF9*4Y;9G?IC`Hpu1@sklDSTy=XclL}h93ih~($D)NO+-$zV<$8(ZUG?5(G{Zu?9T^MK!cO0_KCpN@gV|~LaXA0Y~ z0KGIKArpO|gzI5Gh|63~hUc72oAQvTY}Y_rcrL*+QsHJ@sgRms$sBW*Gb_iCV;b&Jb}yB6VuN%MKwy^3Xuc0wXq&OsTR zY$l&rAIJ`pvFS(;9PDsv^DI4hV#~nGOdm9RC3~DFT{CWmhQpXHrds6?b19|c9nK+N zY?ZNVTOYMEGTcQ2(+ERza=^)SheA02Je>~TO4vhpl-UE!m`J`WB?p19kaO(ht8}Ii zk94Gqk=9}&89Of#GhxY|>`f%rm6k}yLeAB!jpy=-OnN{ekh)wv8MOg;m6d4|30sfY z!`(#eyOh*r!oxKZ@5K93XG~&QauMzg%0=+Cjj~OMK$uQ6CFk@=M@EF@Pb6$j=Ae-` z;#5lB1;r`eTI`VUXu3mA6DTIq?Ka+3wYKKsYgtMrWQU?g#)dDG8EMA(LkSlt{|DI1 zL3`Y0KhV77-OZ~?s z@w}f+Rv}*J53`BM3tLA$-uEWCAK1R`zrEhI@$=-L-FSbTwD%Y6W^t z+;<(u-j^p&{6T4J_A}nVZIg=U{d*E0 zyZVB3{$E2p)8u`A@|M>JDpd6;xffeiJnv7DcdH4f+wWEJ{N8}P0QVDJYyJC=<%i^j z-A9}s{C=Tl@2Jp)``F+KXA>t(@++LEucJ48r z-)rndJkK8-H|EWG@Jop;ZJ*zNbU)+z-!1i}8{^4eOJ!+%-~Ga8U3|6Le~cr4EAjR< z^XL7C>gURjKl{O)-bVY?G=Pj>sq9RL`~%{ZoB3G-LL*W;Jj=Hj=XQW7jL8Bf~pEBLz9 z^Aq23@vr50W^lFI_Y0o*cg}Ek>bKzj47GK +# 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 Crypto.Cipher import AES +from Crypto.Hash import SHA512 +from Crypto.Protocol.KDF import _bcrypt_hash +from Crypto.Util.strxor import strxor +from Crypto.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/server/www/packages/packages-linux/x64/Crypto/Random/__init__.py b/server/www/packages/packages-linux/x64/Crypto/Random/__init__.py new file mode 100644 index 0000000..0f83a07 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Random/__init__.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# +# Random/__init__.py : PyCrypto 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/server/www/packages/packages-linux/x64/Crypto/Random/random.py b/server/www/packages/packages-linux/x64/Crypto/Random/random.py new file mode 100644 index 0000000..5389b3b --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/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 Crypto import Random + +from Crypto.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 Crypto.Util.number import ceil_div, bytes_to_long, long_to_bytes, size + +# vim:set ts=4 sw=4 sts=4 expandtab: diff --git a/server/www/packages/packages-linux/x64/Crypto/Signature/DSS.py b/server/www/packages/packages-linux/x64/Crypto/Signature/DSS.py new file mode 100644 index 0000000..4092d42 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Signature/DSS.py @@ -0,0 +1,416 @@ +# +# Signature/DSS.py : DSS.py +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +__all__ = ['new'] + + +from Crypto.Util.asn1 import DerSequence +from Crypto.Util.number import long_to_bytes +from Crypto.Math.Numbers import Integer + +from Crypto.Hash import HMAC +from Crypto.PublicKey.ECC import EccKey +from Crypto.PublicKey.DSA import DsaKey + + +class DssSigScheme(object): + """A (EC)DSA signature object. + Do not instantiate directly. + Use :func:`Crypto.Signature.DSS.new`. + """ + + def __init__(self, key, encoding, order): + """Create a new Digital Signature Standard (DSS) object. + + Do not instantiate this object directly, + use `Crypto.Signature.DSS.new` instead. + """ + + self._key = key + self._encoding = encoding + self._order = order + + self._order_bits = self._order.size_in_bits() + self._order_bytes = (self._order_bits - 1) // 8 + 1 + + def can_sign(self): + """Return ``True`` if this signature object can be used + for signing messages.""" + + return self._key.has_private() + + def _compute_nonce(self, msg_hash): + raise NotImplementedError("To be provided by subclasses") + + def _valid_hash(self, msg_hash): + raise NotImplementedError("To be provided by subclasses") + + def sign(self, msg_hash): + """Produce the DSA/ECDSA signature of a message. + + :parameter msg_hash: + The hash that was carried out over the message. + The object belongs to the :mod:`Crypto.Hash` package. + + Under mode *'fips-186-3'*, the hash must be a FIPS + approved secure hash (SHA-1 or a member of the SHA-2 family), + of cryptographic strength appropriate for the DSA key. + For instance, a 3072/256 DSA key can only be used + in combination with SHA-512. + :type msg_hash: hash object + + :return: The signature as a *byte string* + :raise ValueError: if the hash algorithm is incompatible to the (EC)DSA key + :raise TypeError: if the (EC)DSA key has no private half + """ + + if not self._valid_hash(msg_hash): + raise ValueError("Hash is not sufficiently strong") + + # Generate the nonce k (critical!) + nonce = self._compute_nonce(msg_hash) + + # Perform signature using the raw API + z = Integer.from_bytes(msg_hash.digest()[:self._order_bytes]) + sig_pair = self._key._sign(z, nonce) + + # Encode the signature into a single byte string + if self._encoding == 'binary': + output = b"".join([long_to_bytes(x, self._order_bytes) + for x in sig_pair]) + else: + # Dss-sig ::= SEQUENCE { + # r INTEGER, + # s INTEGER + # } + # Ecdsa-Sig-Value ::= SEQUENCE { + # r INTEGER, + # s INTEGER + # } + output = DerSequence(sig_pair).encode() + + return output + + def verify(self, msg_hash, signature): + """Check if a certain (EC)DSA signature is authentic. + + :parameter msg_hash: + The hash that was carried out over the message. + This is an object belonging to the :mod:`Crypto.Hash` module. + + Under mode *'fips-186-3'*, the hash must be a FIPS + approved secure hash (SHA-1 or a member of the SHA-2 family), + of cryptographic strength appropriate for the DSA key. + For instance, a 3072/256 DSA key can only be used in + combination with SHA-512. + :type msg_hash: hash object + + :parameter signature: + The signature that needs to be validated + :type signature: byte string + + :raise ValueError: if the signature is not authentic + """ + + if not self._valid_hash(msg_hash): + raise ValueError("Hash is not sufficiently strong") + + if self._encoding == 'binary': + if len(signature) != (2 * self._order_bytes): + raise ValueError("The signature is not authentic (length)") + r_prime, s_prime = [Integer.from_bytes(x) + for x in (signature[:self._order_bytes], + signature[self._order_bytes:])] + else: + try: + der_seq = DerSequence().decode(signature, strict=True) + except (ValueError, IndexError): + raise ValueError("The signature is not authentic (DER)") + if len(der_seq) != 2 or not der_seq.hasOnlyInts(): + raise ValueError("The signature is not authentic (DER content)") + r_prime, s_prime = Integer(der_seq[0]), Integer(der_seq[1]) + + if not (0 < r_prime < self._order) or not (0 < s_prime < self._order): + raise ValueError("The signature is not authentic (d)") + + z = Integer.from_bytes(msg_hash.digest()[:self._order_bytes]) + result = self._key._verify(z, (r_prime, s_prime)) + if not result: + raise ValueError("The signature is not authentic") + # Make PyCrypto code to fail + return False + + +class DeterministicDsaSigScheme(DssSigScheme): + # Also applicable to ECDSA + + def __init__(self, key, encoding, order, private_key): + super(DeterministicDsaSigScheme, self).__init__(key, encoding, order) + self._private_key = private_key + + def _bits2int(self, bstr): + """See 2.3.2 in RFC6979""" + + result = Integer.from_bytes(bstr) + q_len = self._order.size_in_bits() + b_len = len(bstr) * 8 + if b_len > q_len: + # Only keep leftmost q_len bits + result >>= (b_len - q_len) + return result + + def _int2octets(self, int_mod_q): + """See 2.3.3 in RFC6979""" + + assert 0 < int_mod_q < self._order + return long_to_bytes(int_mod_q, self._order_bytes) + + def _bits2octets(self, bstr): + """See 2.3.4 in RFC6979""" + + z1 = self._bits2int(bstr) + if z1 < self._order: + z2 = z1 + else: + z2 = z1 - self._order + return self._int2octets(z2) + + def _compute_nonce(self, mhash): + """Generate k in a deterministic way""" + + # See section 3.2 in RFC6979.txt + # Step a + h1 = mhash.digest() + # Step b + mask_v = b'\x01' * mhash.digest_size + # Step c + nonce_k = b'\x00' * mhash.digest_size + + for int_oct in (b'\x00', b'\x01'): + # Step d/f + nonce_k = HMAC.new(nonce_k, + mask_v + int_oct + + self._int2octets(self._private_key) + + self._bits2octets(h1), mhash).digest() + # Step e/g + mask_v = HMAC.new(nonce_k, mask_v, mhash).digest() + + nonce = -1 + while not (0 < nonce < self._order): + # Step h.C (second part) + if nonce != -1: + nonce_k = HMAC.new(nonce_k, mask_v + b'\x00', + mhash).digest() + mask_v = HMAC.new(nonce_k, mask_v, mhash).digest() + + # Step h.A + mask_t = b"" + + # Step h.B + while len(mask_t) < self._order_bytes: + mask_v = HMAC.new(nonce_k, mask_v, mhash).digest() + mask_t += mask_v + + # Step h.C (first part) + nonce = self._bits2int(mask_t) + return nonce + + def _valid_hash(self, msg_hash): + return True + + +class FipsDsaSigScheme(DssSigScheme): + + #: List of L (bit length of p) and N (bit length of q) combinations + #: that are allowed by FIPS 186-3. The security level is provided in + #: Table 2 of FIPS 800-57 (rev3). + _fips_186_3_L_N = ( + (1024, 160), # 80 bits (SHA-1 or stronger) + (2048, 224), # 112 bits (SHA-224 or stronger) + (2048, 256), # 128 bits (SHA-256 or stronger) + (3072, 256) # 256 bits (SHA-512) + ) + + def __init__(self, key, encoding, order, randfunc): + super(FipsDsaSigScheme, self).__init__(key, encoding, order) + self._randfunc = randfunc + + L = Integer(key.p).size_in_bits() + if (L, self._order_bits) not in self._fips_186_3_L_N: + error = ("L/N (%d, %d) is not compliant to FIPS 186-3" + % (L, self._order_bits)) + raise ValueError(error) + + def _compute_nonce(self, msg_hash): + # hash is not used + return Integer.random_range(min_inclusive=1, + max_exclusive=self._order, + randfunc=self._randfunc) + + def _valid_hash(self, msg_hash): + """Verify that SHA-1, SHA-2 or SHA-3 are used""" + return (msg_hash.oid == "1.3.14.3.2.26" or + msg_hash.oid.startswith("2.16.840.1.101.3.4.2.")) + + +class FipsEcDsaSigScheme(DssSigScheme): + + def __init__(self, key, encoding, order, randfunc): + super(FipsEcDsaSigScheme, self).__init__(key, encoding, order) + self._randfunc = randfunc + + def _compute_nonce(self, msg_hash): + return Integer.random_range(min_inclusive=1, + max_exclusive=self._key._curve.order, + randfunc=self._randfunc) + + def _valid_hash(self, msg_hash): + """Verify that SHA-[23] (256|384|512) bits are used to + match the security of P-256 (128 bits), P-384 (192 bits) + or P-521 (256 bits)""" + + modulus_bits = self._key.pointQ.size_in_bits() + + sha256 = ( "2.16.840.1.101.3.4.2.1", "2.16.840.1.101.3.4.2.8" ) + sha384 = ( "2.16.840.1.101.3.4.2.2", "2.16.840.1.101.3.4.2.9" ) + sha512 = ( "2.16.840.1.101.3.4.2.3", "2.16.840.1.101.3.4.2.10") + + if msg_hash.oid in sha256: + return modulus_bits <= 256 + elif msg_hash.oid in sha384: + return modulus_bits <= 384 + else: + return msg_hash.oid in sha512 + + +def new(key, mode, encoding='binary', randfunc=None): + """Create a signature object :class:`DSS_SigScheme` that + can perform (EC)DSA signature or verification. + + .. note:: + Refer to `NIST SP 800 Part 1 Rev 4`_ (or newer release) for an + overview of the recommended key lengths. + + :parameter key: + The key to use for computing the signature (*private* keys only) + or verifying one: it must be either + :class:`Crypto.PublicKey.DSA` or :class:`Crypto.PublicKey.ECC`. + + For DSA keys, let ``L`` and ``N`` be the bit lengths of the modulus ``p`` + and of ``q``: the pair ``(L,N)`` must appear in the following list, + in compliance to section 4.2 of `FIPS 186-4`_: + + - (1024, 160) *legacy only; do not create new signatures with this* + - (2048, 224) *deprecated; do not create new signatures with this* + - (2048, 256) + - (3072, 256) + + For ECC, only keys over P-256, P384, and P-521 are accepted. + :type key: + a key object + + :parameter mode: + The parameter can take these values: + + - *'fips-186-3'*. The signature generation is randomized and carried out + according to `FIPS 186-3`_: the nonce ``k`` is taken from the RNG. + - *'deterministic-rfc6979'*. The signature generation is not + randomized. See RFC6979_. + :type mode: + string + + :parameter encoding: + How the signature is encoded. This value determines the output of + :meth:`sign` and the input to :meth:`verify`. + + The following values are accepted: + + - *'binary'* (default), the signature is the raw concatenation + of ``r`` and ``s``. It is defined in the IEEE P.1363 standard. + + For DSA, the size in bytes of the signature is ``N/4`` bytes + (e.g. 64 for ``N=256``). + + For ECDSA, the signature is always twice the length of a point + coordinate (e.g. 64 bytes for P-256). + + - *'der'*, the signature is a ASN.1 DER SEQUENCE + with two INTEGERs (``r`` and ``s``). It is defined in RFC3279_. + The size of the signature is variable. + :type encoding: string + + :parameter randfunc: + A function that returns random *byte strings*, of a given length. + If omitted, the internal RNG is used. + Only applicable for the *'fips-186-3'* mode. + :type randfunc: callable + + .. _FIPS 186-3: http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf + .. _FIPS 186-4: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf + .. _NIST SP 800 Part 1 Rev 4: http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf + .. _RFC6979: http://tools.ietf.org/html/rfc6979 + .. _RFC3279: https://tools.ietf.org/html/rfc3279#section-2.2.2 + """ + + # The goal of the 'mode' parameter is to avoid to + # have the current version of the standard as default. + # + # Over time, such version will be superseded by (for instance) + # FIPS 186-4 and it will be odd to have -3 as default. + + if encoding not in ('binary', 'der'): + raise ValueError("Unknown encoding '%s'" % encoding) + + if isinstance(key, EccKey): + order = key._curve.order + private_key_attr = 'd' + elif isinstance(key, DsaKey): + order = Integer(key.q) + private_key_attr = 'x' + else: + raise ValueError("Unsupported key type " + str(type(key))) + + if key.has_private(): + private_key = getattr(key, private_key_attr) + else: + private_key = None + + if mode == 'deterministic-rfc6979': + return DeterministicDsaSigScheme(key, encoding, order, private_key) + elif mode == 'fips-186-3': + if isinstance(key, EccKey): + return FipsEcDsaSigScheme(key, encoding, order, randfunc) + else: + return FipsDsaSigScheme(key, encoding, order, randfunc) + else: + raise ValueError("Unknown DSS mode '%s'" % mode) diff --git a/server/www/packages/packages-linux/x64/Crypto/Signature/PKCS1_PSS.py b/server/www/packages/packages-linux/x64/Crypto/Signature/PKCS1_PSS.py new file mode 100644 index 0000000..c39d388 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Signature/PKCS1_PSS.py @@ -0,0 +1,55 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +Legacy module for PKCS#1 PSS signatures. + +:undocumented: __package__ +""" + +import types + +from Crypto.Signature import pss + + +def _pycrypto_verify(self, hash_object, signature): + try: + self._verify(hash_object, signature) + except (ValueError, TypeError): + return False + return True + + +def new(rsa_key, mgfunc=None, saltLen=None, randfunc=None): + pkcs1 = pss.new(rsa_key, mask_func=mgfunc, + salt_bytes=saltLen, rand_func=randfunc) + pkcs1._verify = pkcs1.verify + pkcs1.verify = types.MethodType(_pycrypto_verify, pkcs1) + return pkcs1 diff --git a/server/www/packages/packages-linux/x64/Crypto/Signature/PKCS1_v1_5.py b/server/www/packages/packages-linux/x64/Crypto/Signature/PKCS1_v1_5.py new file mode 100644 index 0000000..ac888ed --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Signature/PKCS1_v1_5.py @@ -0,0 +1,53 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +""" +Legacy module for PKCS#1 v1.5 signatures. + +:undocumented: __package__ +""" + +import types + +from Crypto.Signature import pkcs1_15 + +def _pycrypto_verify(self, hash_object, signature): + try: + self._verify(hash_object, signature) + except (ValueError, TypeError): + return False + return True + +def new(rsa_key): + pkcs1 = pkcs1_15.new(rsa_key) + pkcs1._verify = pkcs1.verify + pkcs1.verify = types.MethodType(_pycrypto_verify, pkcs1) + return pkcs1 + diff --git a/server/www/packages/packages-linux/x64/Crypto/Signature/__init__.py b/server/www/packages/packages-linux/x64/Crypto/Signature/__init__.py new file mode 100644 index 0000000..da028a5 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Signature/__init__.py @@ -0,0 +1,36 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +"""Digital signature protocols + +A collection of standardized protocols to carry out digital signatures. +""" + +__all__ = ['PKCS1_v1_5', 'PKCS1_PSS', 'DSS', 'pkcs1_15', 'pss'] diff --git a/server/www/packages/packages-linux/x64/Crypto/Signature/pkcs1_15.py b/server/www/packages/packages-linux/x64/Crypto/Signature/pkcs1_15.py new file mode 100644 index 0000000..54a4bf7 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Signature/pkcs1_15.py @@ -0,0 +1,222 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import Crypto.Util.number +from Crypto.Util.number import ceil_div, bytes_to_long, long_to_bytes +from Crypto.Util.asn1 import DerSequence, DerNull, DerOctetString, DerObjectId + +class PKCS115_SigScheme: + """A signature object for ``RSASSA-PKCS1-v1_5``. + Do not instantiate directly. + Use :func:`Crypto.Signature.pkcs1_15.new`. + """ + + def __init__(self, rsa_key): + """Initialize this PKCS#1 v1.5 signature scheme object. + + :Parameters: + rsa_key : an RSA key object + Creation of signatures is only possible if this is a *private* + RSA key. Verification of signatures is always possible. + """ + self._key = rsa_key + + def can_sign(self): + """Return ``True`` if this object can be used to sign messages.""" + return self._key.has_private() + + def sign(self, msg_hash): + """Create the PKCS#1 v1.5 signature of a message. + + This function is also called ``RSASSA-PKCS1-V1_5-SIGN`` and + it is specified in + `section 8.2.1 of RFC8017 `_. + + :parameter msg_hash: + This is an object from the :mod:`Crypto.Hash` package. + It has been used to digest the message to sign. + :type msg_hash: hash object + + :return: the signature encoded as a *byte string*. + :raise ValueError: if the RSA key is not long enough for the given hash algorithm. + :raise TypeError: if the RSA key has no private half. + """ + + # See 8.2.1 in RFC3447 + modBits = Crypto.Util.number.size(self._key.n) + k = ceil_div(modBits,8) # Convert from bits to bytes + + # Step 1 + em = _EMSA_PKCS1_V1_5_ENCODE(msg_hash, k) + # Step 2a (OS2IP) + em_int = bytes_to_long(em) + # Step 2b (RSASP1) + m_int = self._key._decrypt(em_int) + # Step 2c (I2OSP) + signature = long_to_bytes(m_int, k) + return signature + + def verify(self, msg_hash, signature): + """Check if the PKCS#1 v1.5 signature over a message is valid. + + This function is also called ``RSASSA-PKCS1-V1_5-VERIFY`` and + it is specified in + `section 8.2.2 of RFC8037 `_. + + :parameter msg_hash: + The hash that was carried out over the message. This is an object + belonging to the :mod:`Crypto.Hash` module. + :type parameter: hash object + + :parameter signature: + The signature that needs to be validated. + :type signature: byte string + + :raise ValueError: if the signature is not valid. + """ + + # See 8.2.2 in RFC3447 + modBits = Crypto.Util.number.size(self._key.n) + k = ceil_div(modBits, 8) # Convert from bits to bytes + + # Step 1 + if len(signature) != k: + raise ValueError("Invalid signature") + # Step 2a (O2SIP) + signature_int = bytes_to_long(signature) + # Step 2b (RSAVP1) + em_int = self._key._encrypt(signature_int) + # Step 2c (I2OSP) + em1 = long_to_bytes(em_int, k) + # Step 3 + try: + possible_em1 = [ _EMSA_PKCS1_V1_5_ENCODE(msg_hash, k, True) ] + # MD2/4/5 hashes always require NULL params in AlgorithmIdentifier. + # For all others, it is optional. + try: + algorithm_is_md = msg_hash.oid.startswith('1.2.840.113549.2.') + except AttributeError: + algorithm_is_md = False + if not algorithm_is_md: # MD2/MD4/MD5 + possible_em1.append(_EMSA_PKCS1_V1_5_ENCODE(msg_hash, k, False)) + except ValueError: + raise ValueError("Invalid signature") + # Step 4 + # By comparing the full encodings (as opposed to checking each + # of its components one at a time) we avoid attacks to the padding + # scheme like Bleichenbacher's (see http://www.mail-archive.com/cryptography@metzdowd.com/msg06537). + # + if em1 not in possible_em1: + raise ValueError("Invalid signature") + pass + + +def _EMSA_PKCS1_V1_5_ENCODE(msg_hash, emLen, with_hash_parameters=True): + """ + Implement the ``EMSA-PKCS1-V1_5-ENCODE`` function, as defined + in PKCS#1 v2.1 (RFC3447, 9.2). + + ``_EMSA-PKCS1-V1_5-ENCODE`` actually accepts the message ``M`` as input, + and hash it internally. Here, we expect that the message has already + been hashed instead. + + :Parameters: + msg_hash : hash object + The hash object that holds the digest of the message being signed. + emLen : int + The length the final encoding must have, in bytes. + with_hash_parameters : bool + If True (default), include NULL parameters for the hash + algorithm in the ``digestAlgorithm`` SEQUENCE. + + :attention: the early standard (RFC2313) stated that ``DigestInfo`` + had to be BER-encoded. This means that old signatures + might have length tags in indefinite form, which + is not supported in DER. Such encoding cannot be + reproduced by this function. + + :Return: An ``emLen`` byte long string that encodes the hash. + """ + + # First, build the ASN.1 DER object DigestInfo: + # + # DigestInfo ::= SEQUENCE { + # digestAlgorithm AlgorithmIdentifier, + # digest OCTET STRING + # } + # + # where digestAlgorithm identifies the hash function and shall be an + # algorithm ID with an OID in the set PKCS1-v1-5DigestAlgorithms. + # + # PKCS1-v1-5DigestAlgorithms ALGORITHM-IDENTIFIER ::= { + # { OID id-md2 PARAMETERS NULL }| + # { OID id-md5 PARAMETERS NULL }| + # { OID id-sha1 PARAMETERS NULL }| + # { OID id-sha256 PARAMETERS NULL }| + # { OID id-sha384 PARAMETERS NULL }| + # { OID id-sha512 PARAMETERS NULL } + # } + # + # Appendix B.1 also says that for SHA-1/-2 algorithms, the parameters + # should be omitted. They may be present, but when they are, they shall + # have NULL value. + + digestAlgo = DerSequence([ DerObjectId(msg_hash.oid).encode() ]) + + if with_hash_parameters: + digestAlgo.append(DerNull().encode()) + + digest = DerOctetString(msg_hash.digest()) + digestInfo = DerSequence([ + digestAlgo.encode(), + digest.encode() + ]).encode() + + # We need at least 11 bytes for the remaining data: 3 fixed bytes and + # at least 8 bytes of padding). + if emLen +# 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 Crypto.Util.py3compat import bchr, bord, iter_range +import Crypto.Util.number +from Crypto.Util.number import (ceil_div, + long_to_bytes, + bytes_to_long + ) +from Crypto.Util.strxor import strxor +from Crypto import Random + + +class PSS_SigScheme: + """A signature object for ``RSASSA-PSS``. + Do not instantiate directly. + Use :func:`Crypto.Signature.pss.new`. + """ + + def __init__(self, key, mgfunc, saltLen, randfunc): + """Initialize this PKCS#1 PSS signature scheme object. + + :Parameters: + key : an RSA key object + If a private half is given, both signature and + verification are possible. + If a public half is given, only verification is possible. + mgfunc : callable + A mask generation function that accepts two parameters: + a string to use as seed, and the lenth of the mask to + generate, in bytes. + saltLen : integer + Length of the salt, in bytes. + randfunc : callable + A function that returns random bytes. + """ + + self._key = key + self._saltLen = saltLen + self._mgfunc = mgfunc + self._randfunc = randfunc + + def can_sign(self): + """Return ``True`` if this object can be used to sign messages.""" + return self._key.has_private() + + def sign(self, msg_hash): + """Create the PKCS#1 PSS signature of a message. + + This function is also called ``RSASSA-PSS-SIGN`` and + it is specified in + `section 8.1.1 of RFC8017 `_. + + :parameter msg_hash: + This is an object from the :mod:`Crypto.Hash` package. + It has been used to digest the message to sign. + :type msg_hash: hash object + + :return: the signature encoded as a *byte string*. + :raise ValueError: if the RSA key is not long enough for the given hash algorithm. + :raise TypeError: if the RSA key has no private half. + """ + + # Set defaults for salt length and mask generation function + if self._saltLen is None: + sLen = msg_hash.digest_size + else: + sLen = self._saltLen + + if self._mgfunc is None: + mgf = lambda x, y: MGF1(x, y, msg_hash) + else: + mgf = self._mgfunc + + modBits = Crypto.Util.number.size(self._key.n) + + # See 8.1.1 in RFC3447 + k = ceil_div(modBits, 8) # k is length in bytes of the modulus + # Step 1 + em = _EMSA_PSS_ENCODE(msg_hash, modBits-1, self._randfunc, mgf, sLen) + # Step 2a (OS2IP) + em_int = bytes_to_long(em) + # Step 2b (RSASP1) + m_int = self._key._decrypt(em_int) + # Step 2c (I2OSP) + signature = long_to_bytes(m_int, k) + return signature + + def verify(self, msg_hash, signature): + """Check if the PKCS#1 PSS signature over a message is valid. + + This function is also called ``RSASSA-PSS-VERIFY`` and + it is specified in + `section 8.1.2 of RFC8037 `_. + + :parameter msg_hash: + The hash that was carried out over the message. This is an object + belonging to the :mod:`Crypto.Hash` module. + :type parameter: hash object + + :parameter signature: + The signature that needs to be validated. + :type signature: bytes + + :raise ValueError: if the signature is not valid. + """ + + # Set defaults for salt length and mask generation function + if self._saltLen is None: + sLen = msg_hash.digest_size + else: + sLen = self._saltLen + if self._mgfunc: + mgf = self._mgfunc + else: + mgf = lambda x, y: MGF1(x, y, msg_hash) + + modBits = Crypto.Util.number.size(self._key.n) + + # See 8.1.2 in RFC3447 + k = ceil_div(modBits, 8) # Convert from bits to bytes + # Step 1 + if len(signature) != k: + raise ValueError("Incorrect signature") + # Step 2a (O2SIP) + signature_int = bytes_to_long(signature) + # Step 2b (RSAVP1) + em_int = self._key._encrypt(signature_int) + # Step 2c (I2OSP) + emLen = ceil_div(modBits - 1, 8) + em = long_to_bytes(em_int, emLen) + # Step 3/4 + _EMSA_PSS_VERIFY(msg_hash, em, modBits-1, mgf, sLen) + + +def MGF1(mgfSeed, maskLen, hash_gen): + """Mask Generation Function, described in `B.2.1 of RFC8017 + `_. + + :param mfgSeed: + seed from which the mask is generated + :type mfgSeed: byte string + + :param maskLen: + intended length in bytes of the mask + :type maskLen: integer + + :param hash_gen: + A module or a hash object from :mod:`Crypto.Hash` + :type hash_object: + + :return: the mask, as a *byte string* + """ + + T = b"" + for counter in iter_range(ceil_div(maskLen, hash_gen.digest_size)): + c = long_to_bytes(counter, 4) + hobj = hash_gen.new() + hobj.update(mgfSeed + c) + T = T + hobj.digest() + assert(len(T) >= maskLen) + return T[:maskLen] + + +def _EMSA_PSS_ENCODE(mhash, emBits, randFunc, mgf, sLen): + r""" + Implement the ``EMSA-PSS-ENCODE`` function, as defined + in PKCS#1 v2.1 (RFC3447, 9.1.1). + + The original ``EMSA-PSS-ENCODE`` actually accepts the message ``M`` + as input, and hash it internally. Here, we expect that the message + has already been hashed instead. + + :Parameters: + mhash : hash object + The hash object that holds the digest of the message being signed. + emBits : int + Maximum length of the final encoding, in bits. + randFunc : callable + An RNG function that accepts as only parameter an int, and returns + a string of random bytes, to be used as salt. + mgf : callable + A mask generation function that accepts two parameters: a string to + use as seed, and the lenth of the mask to generate, in bytes. + sLen : int + Length of the salt, in bytes. + + :Return: An ``emLen`` byte long string that encodes the hash + (with ``emLen = \ceil(emBits/8)``). + + :Raise ValueError: + When digest or salt length are too big. + """ + + emLen = ceil_div(emBits, 8) + + # Bitmask of digits that fill up + lmask = 0 + for i in iter_range(8*emLen-emBits): + lmask = lmask >> 1 | 0x80 + + # Step 1 and 2 have been already done + # Step 3 + if emLen < mhash.digest_size+sLen+2: + raise ValueError("Digest or salt length are too long" + " for given key size.") + # Step 4 + salt = randFunc(sLen) + # Step 5 + m_prime = bchr(0)*8 + mhash.digest() + salt + # Step 6 + h = mhash.new() + h.update(m_prime) + # Step 7 + ps = bchr(0)*(emLen-sLen-mhash.digest_size-2) + # Step 8 + db = ps + bchr(1) + salt + # Step 9 + dbMask = mgf(h.digest(), emLen-mhash.digest_size-1) + # Step 10 + maskedDB = strxor(db, dbMask) + # Step 11 + maskedDB = bchr(bord(maskedDB[0]) & ~lmask) + maskedDB[1:] + # Step 12 + em = maskedDB + h.digest() + bchr(0xBC) + return em + + +def _EMSA_PSS_VERIFY(mhash, em, emBits, mgf, sLen): + """ + Implement the ``EMSA-PSS-VERIFY`` function, as defined + in PKCS#1 v2.1 (RFC3447, 9.1.2). + + ``EMSA-PSS-VERIFY`` actually accepts the message ``M`` as input, + and hash it internally. Here, we expect that the message has already + been hashed instead. + + :Parameters: + mhash : hash object + The hash object that holds the digest of the message to be verified. + em : string + The signature to verify, therefore proving that the sender really + signed the message that was received. + emBits : int + Length of the final encoding (em), in bits. + mgf : callable + A mask generation function that accepts two parameters: a string to + use as seed, and the lenth of the mask to generate, in bytes. + sLen : int + Length of the salt, in bytes. + + :Raise ValueError: + When the encoding is inconsistent, or the digest or salt lengths + are too big. + """ + + emLen = ceil_div(emBits, 8) + + # Bitmask of digits that fill up + lmask = 0 + for i in iter_range(8*emLen-emBits): + lmask = lmask >> 1 | 0x80 + + # Step 1 and 2 have been already done + # Step 3 + if emLen < mhash.digest_size+sLen+2: + raise ValueError("Incorrect signature") + # Step 4 + if ord(em[-1:]) != 0xBC: + raise ValueError("Incorrect signature") + # Step 5 + maskedDB = em[:emLen-mhash.digest_size-1] + h = em[emLen-mhash.digest_size-1:-1] + # Step 6 + if lmask & bord(em[0]): + raise ValueError("Incorrect signature") + # Step 7 + dbMask = mgf(h, emLen-mhash.digest_size-1) + # Step 8 + db = strxor(maskedDB, dbMask) + # Step 9 + db = bchr(bord(db[0]) & ~lmask) + db[1:] + # Step 10 + if not db.startswith(bchr(0)*(emLen-mhash.digest_size-sLen-2) + bchr(1)): + raise ValueError("Incorrect signature") + # Step 11 + if sLen > 0: + salt = db[-sLen:] + else: + salt = b"" + # Step 12 + m_prime = bchr(0)*8 + mhash.digest() + salt + # Step 13 + hobj = mhash.new() + hobj.update(m_prime) + hp = hobj.digest() + # Step 14 + if h != hp: + raise ValueError("Incorrect signature") + + +def new(rsa_key, **kwargs): + """Create an object for making or verifying PKCS#1 PSS signatures. + + :parameter rsa_key: + The RSA key to use for signing or verifying the message. + This is a :class:`Crypto.PublicKey.RSA` object. + Signing is only possible when ``rsa_key`` is a **private** RSA key. + :type rsa_key: RSA object + + :Keyword Arguments: + + * *mask_func* (``callable``) -- + A function that returns the mask (as `bytes`). + It must accept two parameters: a seed (as `bytes`) + and the length of the data to return. + + If not specified, it will be the function :func:`MGF1` defined in + `RFC8017 `_ and + combined with the same hash algorithm applied to the + message to sign or verify. + + If you want to use a different function, for instance still :func:`MGF1` + but together with another hash, you can do:: + + from Crypto.Hash import SHA256 + from Crypto.Signature.pss import MGF1 + mgf = lambda x, y: MGF1(x, y, SHA256) + + * *salt_bytes* (``integer``) -- + Length of the salt, in bytes. + It is a value between 0 and ``emLen - hLen - 2``, where ``emLen`` + is the size of the RSA modulus and ``hLen`` is the size of the digest + applied to the message to sign or verify. + + The salt is generated internally, you don't need to provide it. + + If not specified, the salt length will be ``hLen``. + If it is zero, the signature scheme becomes deterministic. + + Note that in some implementations such as OpenSSL the default + salt length is ``emLen - hLen - 2`` (even though it is not more + secure than ``hLen``). + + * *rand_func* (``callable``) -- + A function that returns random ``bytes``, of the desired length. + The default is :func:`Crypto.Random.get_random_bytes`. + + :return: a :class:`PSS_SigScheme` signature object + """ + + mask_func = kwargs.pop("mask_func", None) + salt_len = kwargs.pop("salt_bytes", None) + rand_func = kwargs.pop("rand_func", None) + if rand_func is None: + rand_func = Random.get_random_bytes + if kwargs: + raise ValueError("Unknown keywords: " + str(kwargs.keys())) + return PSS_SigScheme(rsa_key, mask_func, salt_len, rand_func) diff --git a/server/www/packages/packages-linux/x64/Crypto/Util/Counter.py b/server/www/packages/packages-linux/x64/Crypto/Util/Counter.py new file mode 100644 index 0000000..c67bc95 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Util/Counter.py @@ -0,0 +1,77 @@ +# -*- coding: ascii -*- +# +# Util/Counter.py : Fast counter for use with CTR-mode ciphers +# +# Written in 2008 by Dwayne C. Litzenberger +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +def new(nbits, prefix=b"", suffix=b"", initial_value=1, little_endian=False, allow_wraparound=False): + """Create a stateful counter block function suitable for CTR encryption modes. + + Each call to the function returns the next counter block. + Each counter block is made up by three parts: + + +------+--------------+-------+ + |prefix| counter value|postfix| + +------+--------------+-------+ + + The counter value is incremented by 1 at each call. + + Args: + nbits (integer): + Length of the desired counter value, in bits. It must be a multiple of 8. + prefix (byte string): + The constant prefix of the counter block. By default, no prefix is + used. + suffix (byte string): + The constant postfix of the counter block. By default, no suffix is + used. + initial_value (integer): + The initial value of the counter. Default value is 1. + Its length in bits must not exceed the argument ``nbits``. + little_endian (boolean): + If ``True``, the counter number will be encoded in little endian format. + If ``False`` (default), in big endian format. + allow_wraparound (boolean): + This parameter is ignored. + Returns: + An object that can be passed with the :data:`counter` parameter to a CTR mode + cipher. + + It must hold that *len(prefix) + nbits//8 + len(suffix)* matches the + block size of the underlying block cipher. + """ + + if (nbits % 8) != 0: + raise ValueError("'nbits' must be a multiple of 8") + + iv_bl = initial_value.bit_length() + if iv_bl > nbits: + raise ValueError("Initial value takes %d bits but it is longer than " + "the counter (%d bits)" % + (iv_bl, nbits)) + + # Ignore wraparound + return {"counter_len": nbits // 8, + "prefix": prefix, + "suffix": suffix, + "initial_value": initial_value, + "little_endian": little_endian + } diff --git a/server/www/packages/packages-linux/x64/Crypto/Util/Padding.py b/server/www/packages/packages-linux/x64/Crypto/Util/Padding.py new file mode 100644 index 0000000..da69e55 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Util/Padding.py @@ -0,0 +1,108 @@ +# +# Util/Padding.py : Functions to manage padding +# +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +__all__ = [ 'pad', 'unpad' ] + +from Crypto.Util.py3compat import * + + +def pad(data_to_pad, block_size, style='pkcs7'): + """Apply standard padding. + + Args: + data_to_pad (byte string): + The data that needs to be padded. + block_size (integer): + The block boundary to use for padding. The output length is guaranteed + to be a multiple of :data:`block_size`. + style (string): + Padding algorithm. It can be *'pkcs7'* (default), *'iso7816'* or *'x923'*. + + Return: + byte string : the original data with the appropriate padding added at the end. + """ + + padding_len = block_size-len(data_to_pad)%block_size + if style == 'pkcs7': + padding = bchr(padding_len)*padding_len + elif style == 'x923': + padding = bchr(0)*(padding_len-1) + bchr(padding_len) + elif style == 'iso7816': + padding = bchr(128) + bchr(0)*(padding_len-1) + else: + raise ValueError("Unknown padding style") + return data_to_pad + padding + + +def unpad(padded_data, block_size, style='pkcs7'): + """Remove standard padding. + + Args: + padded_data (byte string): + A piece of data with padding that needs to be stripped. + block_size (integer): + The block boundary to use for padding. The input length + must be a multiple of :data:`block_size`. + style (string): + Padding algorithm. It can be *'pkcs7'* (default), *'iso7816'* or *'x923'*. + Return: + byte string : data without padding. + Raises: + ValueError: if the padding is incorrect. + """ + + pdata_len = len(padded_data) + if pdata_len == 0: + raise ValueError("Zero-length input cannot be unpadded") + if pdata_len % block_size: + raise ValueError("Input data is not padded") + if style in ('pkcs7', 'x923'): + padding_len = bord(padded_data[-1]) + if padding_len<1 or padding_len>min(block_size, pdata_len): + raise ValueError("Padding is incorrect.") + if style == 'pkcs7': + if padded_data[-padding_len:]!=bchr(padding_len)*padding_len: + raise ValueError("PKCS#7 padding is incorrect.") + else: + if padded_data[-padding_len:-1]!=bchr(0)*(padding_len-1): + raise ValueError("ANSI X.923 padding is incorrect.") + elif style == 'iso7816': + padding_len = pdata_len - padded_data.rfind(bchr(128)) + if padding_len<1 or padding_len>min(block_size, pdata_len): + raise ValueError("Padding is incorrect.") + if padding_len>1 and padded_data[1-padding_len:]!=bchr(0)*(padding_len-1): + raise ValueError("ISO 7816-4 padding is incorrect.") + else: + raise ValueError("Unknown padding style") + return padded_data[:-padding_len] + diff --git a/server/www/packages/packages-linux/x64/Crypto/Util/RFC1751.py b/server/www/packages/packages-linux/x64/Crypto/Util/RFC1751.py new file mode 100644 index 0000000..9ed52d2 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Util/RFC1751.py @@ -0,0 +1,386 @@ +# rfc1751.py : Converts between 128-bit strings and a human-readable +# sequence of words, as defined in RFC1751: "A Convention for +# Human-Readable 128-bit Keys", by Daniel L. McDonald. +# +# Part of the Python Cryptography Toolkit +# +# Written by Andrew M. Kuchling and others +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +from __future__ import print_function + +import binascii + +from Crypto.Util.py3compat import bord, bchr + +binary = {0: '0000', 1: '0001', 2: '0010', 3: '0011', 4: '0100', 5: '0101', + 6: '0110', 7: '0111', 8: '1000', 9: '1001', 10: '1010', 11: '1011', + 12: '1100', 13: '1101', 14: '1110', 15: '1111'} + + +def _key2bin(s): + "Convert a key into a string of binary digits" + kl = map(lambda x: bord(x), s) + kl = map(lambda x: binary[x >> 4] + binary[x & 15], kl) + return ''.join(kl) + + +def _extract(key, start, length): + """Extract a bitstring(2.x)/bytestring(2.x) from a string of binary digits, and return its + numeric value.""" + + result = 0 + for y in key[start:start+length]: + result = result * 2 + ord(y) - 48 + return result + + +def key_to_english(key): + """Transform an arbitrary key into a string containing English words. + + Example:: + + >>> from Crypto.Util.RFC1751 import key_to_english + >>> key_to_english(b'66666666') + 'RAM LOIS GOAD CREW CARE HIT' + + Args: + key (byte string): + The key to convert. Its length must be a multiple of 8. + Return: + A string of English words. + """ + + if len(key) % 8 != 0: + raise ValueError('The length of the key must be a multiple of 8.') + + english = '' + for index in range(0, len(key), 8): # Loop over 8-byte subkeys + subkey = key[index:index + 8] + # Compute the parity of the key + skbin = _key2bin(subkey) + p = 0 + for i in range(0, 64, 2): + p = p + _extract(skbin, i, 2) + # Append parity bits to the subkey + skbin = _key2bin(subkey + bchr((p << 6) & 255)) + for i in range(0, 64, 11): + english = english + wordlist[_extract(skbin, i, 11)] + ' ' + + return english.strip() + + +def english_to_key(s): + """Transform a string into a corresponding key. + + Example:: + + >>> from Crypto.Util.RFC1751 import english_to_key + >>> english_to_key('RAM LOIS GOAD CREW CARE HIT') + b'66666666' + + Args: + s (string): the string with the words separated by whitespace; + the number of words must be a multiple of 6. + Return: + A byte string. + """ + + L = s.upper().split() + key = b'' + for index in range(0, len(L), 6): + sublist = L[index:index + 6] + char = 9 * [0] + bits = 0 + for i in sublist: + index = wordlist.index(i) + shift = (8 - (bits + 11) % 8) % 8 + y = index << shift + cl, cc, cr = (y >> 16), (y >> 8) & 0xff, y & 0xff + if (shift > 5): + char[bits >> 3] = char[bits >> 3] | cl + char[(bits >> 3) + 1] = char[(bits >> 3) + 1] | cc + char[(bits >> 3) + 2] = char[(bits >> 3) + 2] | cr + elif shift > -3: + char[bits >> 3] = char[bits >> 3] | cc + char[(bits >> 3) + 1] = char[(bits >> 3) + 1] | cr + else: + char[bits >> 3] = char[bits >> 3] | cr + bits = bits + 11 + + subkey = b'' + for y in char: + subkey = subkey + bchr(y) + + # Check the parity of the resulting key + skbin = _key2bin(subkey) + p = 0 + for i in range(0, 64, 2): + p = p + _extract(skbin, i, 2) + if (p & 3) != _extract(skbin, 64, 2): + raise ValueError("Parity error in resulting key") + key = key + subkey[0:8] + return key + + +wordlist = [ + "A", "ABE", "ACE", "ACT", "AD", "ADA", "ADD", + "AGO", "AID", "AIM", "AIR", "ALL", "ALP", "AM", "AMY", "AN", "ANA", + "AND", "ANN", "ANT", "ANY", "APE", "APS", "APT", "ARC", "ARE", "ARK", + "ARM", "ART", "AS", "ASH", "ASK", "AT", "ATE", "AUG", "AUK", "AVE", + "AWE", "AWK", "AWL", "AWN", "AX", "AYE", "BAD", "BAG", "BAH", "BAM", + "BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", "BEN", "BET", + "BEY", "BIB", "BID", "BIG", "BIN", "BIT", "BOB", "BOG", "BON", "BOO", + "BOP", "BOW", "BOY", "BUB", "BUD", "BUG", "BUM", "BUN", "BUS", "BUT", + "BUY", "BY", "BYE", "CAB", "CAL", "CAM", "CAN", "CAP", "CAR", "CAT", + "CAW", "COD", "COG", "COL", "CON", "COO", "COP", "COT", "COW", "COY", + "CRY", "CUB", "CUE", "CUP", "CUR", "CUT", "DAB", "DAD", "DAM", "DAN", + "DAR", "DAY", "DEE", "DEL", "DEN", "DES", "DEW", "DID", "DIE", "DIG", + "DIN", "DIP", "DO", "DOE", "DOG", "DON", "DOT", "DOW", "DRY", "DUB", + "DUD", "DUE", "DUG", "DUN", "EAR", "EAT", "ED", "EEL", "EGG", "EGO", + "ELI", "ELK", "ELM", "ELY", "EM", "END", "EST", "ETC", "EVA", "EVE", + "EWE", "EYE", "FAD", "FAN", "FAR", "FAT", "FAY", "FED", "FEE", "FEW", + "FIB", "FIG", "FIN", "FIR", "FIT", "FLO", "FLY", "FOE", "FOG", "FOR", + "FRY", "FUM", "FUN", "FUR", "GAB", "GAD", "GAG", "GAL", "GAM", "GAP", + "GAS", "GAY", "GEE", "GEL", "GEM", "GET", "GIG", "GIL", "GIN", "GO", + "GOT", "GUM", "GUN", "GUS", "GUT", "GUY", "GYM", "GYP", "HA", "HAD", + "HAL", "HAM", "HAN", "HAP", "HAS", "HAT", "HAW", "HAY", "HE", "HEM", + "HEN", "HER", "HEW", "HEY", "HI", "HID", "HIM", "HIP", "HIS", "HIT", + "HO", "HOB", "HOC", "HOE", "HOG", "HOP", "HOT", "HOW", "HUB", "HUE", + "HUG", "HUH", "HUM", "HUT", "I", "ICY", "IDA", "IF", "IKE", "ILL", + "INK", "INN", "IO", "ION", "IQ", "IRA", "IRE", "IRK", "IS", "IT", + "ITS", "IVY", "JAB", "JAG", "JAM", "JAN", "JAR", "JAW", "JAY", "JET", + "JIG", "JIM", "JO", "JOB", "JOE", "JOG", "JOT", "JOY", "JUG", "JUT", + "KAY", "KEG", "KEN", "KEY", "KID", "KIM", "KIN", "KIT", "LA", "LAB", + "LAC", "LAD", "LAG", "LAM", "LAP", "LAW", "LAY", "LEA", "LED", "LEE", + "LEG", "LEN", "LEO", "LET", "LEW", "LID", "LIE", "LIN", "LIP", "LIT", + "LO", "LOB", "LOG", "LOP", "LOS", "LOT", "LOU", "LOW", "LOY", "LUG", + "LYE", "MA", "MAC", "MAD", "MAE", "MAN", "MAO", "MAP", "MAT", "MAW", + "MAY", "ME", "MEG", "MEL", "MEN", "MET", "MEW", "MID", "MIN", "MIT", + "MOB", "MOD", "MOE", "MOO", "MOP", "MOS", "MOT", "MOW", "MUD", "MUG", + "MUM", "MY", "NAB", "NAG", "NAN", "NAP", "NAT", "NAY", "NE", "NED", + "NEE", "NET", "NEW", "NIB", "NIL", "NIP", "NIT", "NO", "NOB", "NOD", + "NON", "NOR", "NOT", "NOV", "NOW", "NU", "NUN", "NUT", "O", "OAF", + "OAK", "OAR", "OAT", "ODD", "ODE", "OF", "OFF", "OFT", "OH", "OIL", + "OK", "OLD", "ON", "ONE", "OR", "ORB", "ORE", "ORR", "OS", "OTT", + "OUR", "OUT", "OVA", "OW", "OWE", "OWL", "OWN", "OX", "PA", "PAD", + "PAL", "PAM", "PAN", "PAP", "PAR", "PAT", "PAW", "PAY", "PEA", "PEG", + "PEN", "PEP", "PER", "PET", "PEW", "PHI", "PI", "PIE", "PIN", "PIT", + "PLY", "PO", "POD", "POE", "POP", "POT", "POW", "PRO", "PRY", "PUB", + "PUG", "PUN", "PUP", "PUT", "QUO", "RAG", "RAM", "RAN", "RAP", "RAT", + "RAW", "RAY", "REB", "RED", "REP", "RET", "RIB", "RID", "RIG", "RIM", + "RIO", "RIP", "ROB", "ROD", "ROE", "RON", "ROT", "ROW", "ROY", "RUB", + "RUE", "RUG", "RUM", "RUN", "RYE", "SAC", "SAD", "SAG", "SAL", "SAM", + "SAN", "SAP", "SAT", "SAW", "SAY", "SEA", "SEC", "SEE", "SEN", "SET", + "SEW", "SHE", "SHY", "SIN", "SIP", "SIR", "SIS", "SIT", "SKI", "SKY", + "SLY", "SO", "SOB", "SOD", "SON", "SOP", "SOW", "SOY", "SPA", "SPY", + "SUB", "SUD", "SUE", "SUM", "SUN", "SUP", "TAB", "TAD", "TAG", "TAN", + "TAP", "TAR", "TEA", "TED", "TEE", "TEN", "THE", "THY", "TIC", "TIE", + "TIM", "TIN", "TIP", "TO", "TOE", "TOG", "TOM", "TON", "TOO", "TOP", + "TOW", "TOY", "TRY", "TUB", "TUG", "TUM", "TUN", "TWO", "UN", "UP", + "US", "USE", "VAN", "VAT", "VET", "VIE", "WAD", "WAG", "WAR", "WAS", + "WAY", "WE", "WEB", "WED", "WEE", "WET", "WHO", "WHY", "WIN", "WIT", + "WOK", "WON", "WOO", "WOW", "WRY", "WU", "YAM", "YAP", "YAW", "YE", + "YEA", "YES", "YET", "YOU", "ABED", "ABEL", "ABET", "ABLE", "ABUT", + "ACHE", "ACID", "ACME", "ACRE", "ACTA", "ACTS", "ADAM", "ADDS", + "ADEN", "AFAR", "AFRO", "AGEE", "AHEM", "AHOY", "AIDA", "AIDE", + "AIDS", "AIRY", "AJAR", "AKIN", "ALAN", "ALEC", "ALGA", "ALIA", + "ALLY", "ALMA", "ALOE", "ALSO", "ALTO", "ALUM", "ALVA", "AMEN", + "AMES", "AMID", "AMMO", "AMOK", "AMOS", "AMRA", "ANDY", "ANEW", + "ANNA", "ANNE", "ANTE", "ANTI", "AQUA", "ARAB", "ARCH", "AREA", + "ARGO", "ARID", "ARMY", "ARTS", "ARTY", "ASIA", "ASKS", "ATOM", + "AUNT", "AURA", "AUTO", "AVER", "AVID", "AVIS", "AVON", "AVOW", + "AWAY", "AWRY", "BABE", "BABY", "BACH", "BACK", "BADE", "BAIL", + "BAIT", "BAKE", "BALD", "BALE", "BALI", "BALK", "BALL", "BALM", + "BAND", "BANE", "BANG", "BANK", "BARB", "BARD", "BARE", "BARK", + "BARN", "BARR", "BASE", "BASH", "BASK", "BASS", "BATE", "BATH", + "BAWD", "BAWL", "BEAD", "BEAK", "BEAM", "BEAN", "BEAR", "BEAT", + "BEAU", "BECK", "BEEF", "BEEN", "BEER", + "BEET", "BELA", "BELL", "BELT", "BEND", "BENT", "BERG", "BERN", + "BERT", "BESS", "BEST", "BETA", "BETH", "BHOY", "BIAS", "BIDE", + "BIEN", "BILE", "BILK", "BILL", "BIND", "BING", "BIRD", "BITE", + "BITS", "BLAB", "BLAT", "BLED", "BLEW", "BLOB", "BLOC", "BLOT", + "BLOW", "BLUE", "BLUM", "BLUR", "BOAR", "BOAT", "BOCA", "BOCK", + "BODE", "BODY", "BOGY", "BOHR", "BOIL", "BOLD", "BOLO", "BOLT", + "BOMB", "BONA", "BOND", "BONE", "BONG", "BONN", "BONY", "BOOK", + "BOOM", "BOON", "BOOT", "BORE", "BORG", "BORN", "BOSE", "BOSS", + "BOTH", "BOUT", "BOWL", "BOYD", "BRAD", "BRAE", "BRAG", "BRAN", + "BRAY", "BRED", "BREW", "BRIG", "BRIM", "BROW", "BUCK", "BUDD", + "BUFF", "BULB", "BULK", "BULL", "BUNK", "BUNT", "BUOY", "BURG", + "BURL", "BURN", "BURR", "BURT", "BURY", "BUSH", "BUSS", "BUST", + "BUSY", "BYTE", "CADY", "CAFE", "CAGE", "CAIN", "CAKE", "CALF", + "CALL", "CALM", "CAME", "CANE", "CANT", "CARD", "CARE", "CARL", + "CARR", "CART", "CASE", "CASH", "CASK", "CAST", "CAVE", "CEIL", + "CELL", "CENT", "CERN", "CHAD", "CHAR", "CHAT", "CHAW", "CHEF", + "CHEN", "CHEW", "CHIC", "CHIN", "CHOU", "CHOW", "CHUB", "CHUG", + "CHUM", "CITE", "CITY", "CLAD", "CLAM", "CLAN", "CLAW", "CLAY", + "CLOD", "CLOG", "CLOT", "CLUB", "CLUE", "COAL", "COAT", "COCA", + "COCK", "COCO", "CODA", "CODE", "CODY", "COED", "COIL", "COIN", + "COKE", "COLA", "COLD", "COLT", "COMA", "COMB", "COME", "COOK", + "COOL", "COON", "COOT", "CORD", "CORE", "CORK", "CORN", "COST", + "COVE", "COWL", "CRAB", "CRAG", "CRAM", "CRAY", "CREW", "CRIB", + "CROW", "CRUD", "CUBA", "CUBE", "CUFF", "CULL", "CULT", "CUNY", + "CURB", "CURD", "CURE", "CURL", "CURT", "CUTS", "DADE", "DALE", + "DAME", "DANA", "DANE", "DANG", "DANK", "DARE", "DARK", "DARN", + "DART", "DASH", "DATA", "DATE", "DAVE", "DAVY", "DAWN", "DAYS", + "DEAD", "DEAF", "DEAL", "DEAN", "DEAR", "DEBT", "DECK", "DEED", + "DEEM", "DEER", "DEFT", "DEFY", "DELL", "DENT", "DENY", "DESK", + "DIAL", "DICE", "DIED", "DIET", "DIME", "DINE", "DING", "DINT", + "DIRE", "DIRT", "DISC", "DISH", "DISK", "DIVE", "DOCK", "DOES", + "DOLE", "DOLL", "DOLT", "DOME", "DONE", "DOOM", "DOOR", "DORA", + "DOSE", "DOTE", "DOUG", "DOUR", "DOVE", "DOWN", "DRAB", "DRAG", + "DRAM", "DRAW", "DREW", "DRUB", "DRUG", "DRUM", "DUAL", "DUCK", + "DUCT", "DUEL", "DUET", "DUKE", "DULL", "DUMB", "DUNE", "DUNK", + "DUSK", "DUST", "DUTY", "EACH", "EARL", "EARN", "EASE", "EAST", + "EASY", "EBEN", "ECHO", "EDDY", "EDEN", "EDGE", "EDGY", "EDIT", + "EDNA", "EGAN", "ELAN", "ELBA", "ELLA", "ELSE", "EMIL", "EMIT", + "EMMA", "ENDS", "ERIC", "EROS", "EVEN", "EVER", "EVIL", "EYED", + "FACE", "FACT", "FADE", "FAIL", "FAIN", "FAIR", "FAKE", "FALL", + "FAME", "FANG", "FARM", "FAST", "FATE", "FAWN", "FEAR", "FEAT", + "FEED", "FEEL", "FEET", "FELL", "FELT", "FEND", "FERN", "FEST", + "FEUD", "FIEF", "FIGS", "FILE", "FILL", "FILM", "FIND", "FINE", + "FINK", "FIRE", "FIRM", "FISH", "FISK", "FIST", "FITS", "FIVE", + "FLAG", "FLAK", "FLAM", "FLAT", "FLAW", "FLEA", "FLED", "FLEW", + "FLIT", "FLOC", "FLOG", "FLOW", "FLUB", "FLUE", "FOAL", "FOAM", + "FOGY", "FOIL", "FOLD", "FOLK", "FOND", "FONT", "FOOD", "FOOL", + "FOOT", "FORD", "FORE", "FORK", "FORM", "FORT", "FOSS", "FOUL", + "FOUR", "FOWL", "FRAU", "FRAY", "FRED", "FREE", "FRET", "FREY", + "FROG", "FROM", "FUEL", "FULL", "FUME", "FUND", "FUNK", "FURY", + "FUSE", "FUSS", "GAFF", "GAGE", "GAIL", "GAIN", "GAIT", "GALA", + "GALE", "GALL", "GALT", "GAME", "GANG", "GARB", "GARY", "GASH", + "GATE", "GAUL", "GAUR", "GAVE", "GAWK", "GEAR", "GELD", "GENE", + "GENT", "GERM", "GETS", "GIBE", "GIFT", "GILD", "GILL", "GILT", + "GINA", "GIRD", "GIRL", "GIST", "GIVE", "GLAD", "GLEE", "GLEN", + "GLIB", "GLOB", "GLOM", "GLOW", "GLUE", "GLUM", "GLUT", "GOAD", + "GOAL", "GOAT", "GOER", "GOES", "GOLD", "GOLF", "GONE", "GONG", + "GOOD", "GOOF", "GORE", "GORY", "GOSH", "GOUT", "GOWN", "GRAB", + "GRAD", "GRAY", "GREG", "GREW", "GREY", "GRID", "GRIM", "GRIN", + "GRIT", "GROW", "GRUB", "GULF", "GULL", "GUNK", "GURU", "GUSH", + "GUST", "GWEN", "GWYN", "HAAG", "HAAS", "HACK", "HAIL", "HAIR", + "HALE", "HALF", "HALL", "HALO", "HALT", "HAND", "HANG", "HANK", + "HANS", "HARD", "HARK", "HARM", "HART", "HASH", "HAST", "HATE", + "HATH", "HAUL", "HAVE", "HAWK", "HAYS", "HEAD", "HEAL", "HEAR", + "HEAT", "HEBE", "HECK", "HEED", "HEEL", "HEFT", "HELD", "HELL", + "HELM", "HERB", "HERD", "HERE", "HERO", "HERS", "HESS", "HEWN", + "HICK", "HIDE", "HIGH", "HIKE", "HILL", "HILT", "HIND", "HINT", + "HIRE", "HISS", "HIVE", "HOBO", "HOCK", "HOFF", "HOLD", "HOLE", + "HOLM", "HOLT", "HOME", "HONE", "HONK", "HOOD", "HOOF", "HOOK", + "HOOT", "HORN", "HOSE", "HOST", "HOUR", "HOVE", "HOWE", "HOWL", + "HOYT", "HUCK", "HUED", "HUFF", "HUGE", "HUGH", "HUGO", "HULK", + "HULL", "HUNK", "HUNT", "HURD", "HURL", "HURT", "HUSH", "HYDE", + "HYMN", "IBIS", "ICON", "IDEA", "IDLE", "IFFY", "INCA", "INCH", + "INTO", "IONS", "IOTA", "IOWA", "IRIS", "IRMA", "IRON", "ISLE", + "ITCH", "ITEM", "IVAN", "JACK", "JADE", "JAIL", "JAKE", "JANE", + "JAVA", "JEAN", "JEFF", "JERK", "JESS", "JEST", "JIBE", "JILL", + "JILT", "JIVE", "JOAN", "JOBS", "JOCK", "JOEL", "JOEY", "JOHN", + "JOIN", "JOKE", "JOLT", "JOVE", "JUDD", "JUDE", "JUDO", "JUDY", + "JUJU", "JUKE", "JULY", "JUNE", "JUNK", "JUNO", "JURY", "JUST", + "JUTE", "KAHN", "KALE", "KANE", "KANT", "KARL", "KATE", "KEEL", + "KEEN", "KENO", "KENT", "KERN", "KERR", "KEYS", "KICK", "KILL", + "KIND", "KING", "KIRK", "KISS", "KITE", "KLAN", "KNEE", "KNEW", + "KNIT", "KNOB", "KNOT", "KNOW", "KOCH", "KONG", "KUDO", "KURD", + "KURT", "KYLE", "LACE", "LACK", "LACY", "LADY", "LAID", "LAIN", + "LAIR", "LAKE", "LAMB", "LAME", "LAND", "LANE", "LANG", "LARD", + "LARK", "LASS", "LAST", "LATE", "LAUD", "LAVA", "LAWN", "LAWS", + "LAYS", "LEAD", "LEAF", "LEAK", "LEAN", "LEAR", "LEEK", "LEER", + "LEFT", "LEND", "LENS", "LENT", "LEON", "LESK", "LESS", "LEST", + "LETS", "LIAR", "LICE", "LICK", "LIED", "LIEN", "LIES", "LIEU", + "LIFE", "LIFT", "LIKE", "LILA", "LILT", "LILY", "LIMA", "LIMB", + "LIME", "LIND", "LINE", "LINK", "LINT", "LION", "LISA", "LIST", + "LIVE", "LOAD", "LOAF", "LOAM", "LOAN", "LOCK", "LOFT", "LOGE", + "LOIS", "LOLA", "LONE", "LONG", "LOOK", "LOON", "LOOT", "LORD", + "LORE", "LOSE", "LOSS", "LOST", "LOUD", "LOVE", "LOWE", "LUCK", + "LUCY", "LUGE", "LUKE", "LULU", "LUND", "LUNG", "LURA", "LURE", + "LURK", "LUSH", "LUST", "LYLE", "LYNN", "LYON", "LYRA", "MACE", + "MADE", "MAGI", "MAID", "MAIL", "MAIN", "MAKE", "MALE", "MALI", + "MALL", "MALT", "MANA", "MANN", "MANY", "MARC", "MARE", "MARK", + "MARS", "MART", "MARY", "MASH", "MASK", "MASS", "MAST", "MATE", + "MATH", "MAUL", "MAYO", "MEAD", "MEAL", "MEAN", "MEAT", "MEEK", + "MEET", "MELD", "MELT", "MEMO", "MEND", "MENU", "MERT", "MESH", + "MESS", "MICE", "MIKE", "MILD", "MILE", "MILK", "MILL", "MILT", + "MIMI", "MIND", "MINE", "MINI", "MINK", "MINT", "MIRE", "MISS", + "MIST", "MITE", "MITT", "MOAN", "MOAT", "MOCK", "MODE", "MOLD", + "MOLE", "MOLL", "MOLT", "MONA", "MONK", "MONT", "MOOD", "MOON", + "MOOR", "MOOT", "MORE", "MORN", "MORT", "MOSS", "MOST", "MOTH", + "MOVE", "MUCH", "MUCK", "MUDD", "MUFF", "MULE", "MULL", "MURK", + "MUSH", "MUST", "MUTE", "MUTT", "MYRA", "MYTH", "NAGY", "NAIL", + "NAIR", "NAME", "NARY", "NASH", "NAVE", "NAVY", "NEAL", "NEAR", + "NEAT", "NECK", "NEED", "NEIL", "NELL", "NEON", "NERO", "NESS", + "NEST", "NEWS", "NEWT", "NIBS", "NICE", "NICK", "NILE", "NINA", + "NINE", "NOAH", "NODE", "NOEL", "NOLL", "NONE", "NOOK", "NOON", + "NORM", "NOSE", "NOTE", "NOUN", "NOVA", "NUDE", "NULL", "NUMB", + "OATH", "OBEY", "OBOE", "ODIN", "OHIO", "OILY", "OINT", "OKAY", + "OLAF", "OLDY", "OLGA", "OLIN", "OMAN", "OMEN", "OMIT", "ONCE", + "ONES", "ONLY", "ONTO", "ONUS", "ORAL", "ORGY", "OSLO", "OTIS", + "OTTO", "OUCH", "OUST", "OUTS", "OVAL", "OVEN", "OVER", "OWLY", + "OWNS", "QUAD", "QUIT", "QUOD", "RACE", "RACK", "RACY", "RAFT", + "RAGE", "RAID", "RAIL", "RAIN", "RAKE", "RANK", "RANT", "RARE", + "RASH", "RATE", "RAVE", "RAYS", "READ", "REAL", "REAM", "REAR", + "RECK", "REED", "REEF", "REEK", "REEL", "REID", "REIN", "RENA", + "REND", "RENT", "REST", "RICE", "RICH", "RICK", "RIDE", "RIFT", + "RILL", "RIME", "RING", "RINK", "RISE", "RISK", "RITE", "ROAD", + "ROAM", "ROAR", "ROBE", "ROCK", "RODE", "ROIL", "ROLL", "ROME", + "ROOD", "ROOF", "ROOK", "ROOM", "ROOT", "ROSA", "ROSE", "ROSS", + "ROSY", "ROTH", "ROUT", "ROVE", "ROWE", "ROWS", "RUBE", "RUBY", + "RUDE", "RUDY", "RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE", + "RUSH", "RUSK", "RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE", + "SAID", "SAIL", "SALE", "SALK", "SALT", "SAME", "SAND", "SANE", + "SANG", "SANK", "SARA", "SAUL", "SAVE", "SAYS", "SCAN", "SCAR", + "SCAT", "SCOT", "SEAL", "SEAM", "SEAR", "SEAT", "SEED", "SEEK", + "SEEM", "SEEN", "SEES", "SELF", "SELL", "SEND", "SENT", "SETS", + "SEWN", "SHAG", "SHAM", "SHAW", "SHAY", "SHED", "SHIM", "SHIN", + "SHOD", "SHOE", "SHOT", "SHOW", "SHUN", "SHUT", "SICK", "SIDE", + "SIFT", "SIGH", "SIGN", "SILK", "SILL", "SILO", "SILT", "SINE", + "SING", "SINK", "SIRE", "SITE", "SITS", "SITU", "SKAT", "SKEW", + "SKID", "SKIM", "SKIN", "SKIT", "SLAB", "SLAM", "SLAT", "SLAY", + "SLED", "SLEW", "SLID", "SLIM", "SLIT", "SLOB", "SLOG", "SLOT", + "SLOW", "SLUG", "SLUM", "SLUR", "SMOG", "SMUG", "SNAG", "SNOB", + "SNOW", "SNUB", "SNUG", "SOAK", "SOAR", "SOCK", "SODA", "SOFA", + "SOFT", "SOIL", "SOLD", "SOME", "SONG", "SOON", "SOOT", "SORE", + "SORT", "SOUL", "SOUR", "SOWN", "STAB", "STAG", "STAN", "STAR", + "STAY", "STEM", "STEW", "STIR", "STOW", "STUB", "STUN", "SUCH", + "SUDS", "SUIT", "SULK", "SUMS", "SUNG", "SUNK", "SURE", "SURF", + "SWAB", "SWAG", "SWAM", "SWAN", "SWAT", "SWAY", "SWIM", "SWUM", + "TACK", "TACT", "TAIL", "TAKE", "TALE", "TALK", "TALL", "TANK", + "TASK", "TATE", "TAUT", "TEAL", "TEAM", "TEAR", "TECH", "TEEM", + "TEEN", "TEET", "TELL", "TEND", "TENT", "TERM", "TERN", "TESS", + "TEST", "THAN", "THAT", "THEE", "THEM", "THEN", "THEY", "THIN", + "THIS", "THUD", "THUG", "TICK", "TIDE", "TIDY", "TIED", "TIER", + "TILE", "TILL", "TILT", "TIME", "TINA", "TINE", "TINT", "TINY", + "TIRE", "TOAD", "TOGO", "TOIL", "TOLD", "TOLL", "TONE", "TONG", + "TONY", "TOOK", "TOOL", "TOOT", "TORE", "TORN", "TOTE", "TOUR", + "TOUT", "TOWN", "TRAG", "TRAM", "TRAY", "TREE", "TREK", "TRIG", + "TRIM", "TRIO", "TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE", + "TUCK", "TUFT", "TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK", + "TWIG", "TWIN", "TWIT", "ULAN", "UNIT", "URGE", "USED", "USER", + "USES", "UTAH", "VAIL", "VAIN", "VALE", "VARY", "VASE", "VAST", + "VEAL", "VEDA", "VEIL", "VEIN", "VEND", "VENT", "VERB", "VERY", + "VETO", "VICE", "VIEW", "VINE", "VISE", "VOID", "VOLT", "VOTE", + "WACK", "WADE", "WAGE", "WAIL", "WAIT", "WAKE", "WALE", "WALK", + "WALL", "WALT", "WAND", "WANE", "WANG", "WANT", "WARD", "WARM", + "WARN", "WART", "WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY", + "WAYS", "WEAK", "WEAL", "WEAN", "WEAR", "WEED", "WEEK", "WEIR", + "WELD", "WELL", "WELT", "WENT", "WERE", "WERT", "WEST", "WHAM", + "WHAT", "WHEE", "WHEN", "WHET", "WHOA", "WHOM", "WICK", "WIFE", + "WILD", "WILL", "WIND", "WINE", "WING", "WINK", "WINO", "WIRE", + "WISE", "WISH", "WITH", "WOLF", "WONT", "WOOD", "WOOL", "WORD", + "WORE", "WORK", "WORM", "WORN", "WOVE", "WRIT", "WYNN", "YALE", + "YANG", "YANK", "YARD", "YARN", "YAWL", "YAWN", "YEAH", "YEAR", + "YELL", "YOGA", "YOKE" ] diff --git a/server/www/packages/packages-linux/x64/Crypto/Util/__init__.py b/server/www/packages/packages-linux/x64/Crypto/Util/__init__.py new file mode 100644 index 0000000..f12214d --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Util/__init__.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Miscellaneous modules + +Contains useful modules that don't belong into any of the +other Crypto.* subpackages. + +======================== ============================================= +Module Description +======================== ============================================= +`Crypto.Util.number` Number-theoretic functions (primality testing, etc.) +`Crypto.Util.Counter` Fast counter functions for CTR cipher modes. +`Crypto.Util.RFC1751` Converts between 128-bit keys and human-readable + strings of words. +`Crypto.Util.asn1` Minimal support for ASN.1 DER encoding +`Crypto.Util.Padding` Set of functions for adding and removing padding. +======================== ============================================= + +:undocumented: _galois, _number_new, cpuid, py3compat, _raw_api +""" + +__all__ = ['RFC1751', 'number', 'strxor', 'asn1', 'Counter', 'Padding'] + diff --git a/server/www/packages/packages-linux/x64/Crypto/Util/_cpu_features.py b/server/www/packages/packages-linux/x64/Crypto/Util/_cpu_features.py new file mode 100644 index 0000000..b3039b5 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Util/_cpu_features.py @@ -0,0 +1,46 @@ +# =================================================================== +# +# Copyright (c) 2018, Helder Eijs +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +from Crypto.Util._raw_api import load_pycryptodome_raw_lib + + +_raw_cpuid_lib = load_pycryptodome_raw_lib("Crypto.Util._cpuid_c", + """ + int have_aes_ni(void); + int have_clmul(void); + """) + + +def have_aes_ni(): + return _raw_cpuid_lib.have_aes_ni() + + +def have_clmul(): + return _raw_cpuid_lib.have_clmul() diff --git a/server/www/packages/packages-linux/x64/Crypto/Util/_cpuid_c.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Util/_cpuid_c.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..45331178c8a05570704646d21a85e5f12dcb5a5d GIT binary patch literal 12776 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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. +# =================================================================== + +import os + + +def pycryptodome_filename(dir_comps, filename): + """Return the complete file name for the module + + dir_comps : list of string + The list of directory names in the PyCryptodome package. + The first element must be "Crypto". + + filename : string + The filename (inclusing extension) in the target directory. + """ + + if dir_comps[0] != "Crypto": + raise ValueError("Only available for modules under 'Crypto'") + + dir_comps = list(dir_comps[1:]) + [filename] + + util_lib, _ = os.path.split(os.path.abspath(__file__)) + root_lib = os.path.join(util_lib, "..") + + return os.path.join(root_lib, *dir_comps) + diff --git a/server/www/packages/packages-linux/x64/Crypto/Util/_raw_api.py b/server/www/packages/packages-linux/x64/Crypto/Util/_raw_api.py new file mode 100644 index 0000000..cf565da --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Util/_raw_api.py @@ -0,0 +1,319 @@ +# =================================================================== +# +# Copyright (c) 2014, Legrandin +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# =================================================================== + +import os +import abc +import sys +from Crypto.Util.py3compat import byte_string +from Crypto.Util._file_system import pycryptodome_filename + +# +# List of file suffixes for Python extensions +# +if sys.version_info[0] < 3: + + import imp + extension_suffixes = [] + for ext, mod, typ in imp.get_suffixes(): + if typ == imp.C_EXTENSION: + extension_suffixes.append(ext) + +else: + + from importlib import machinery + extension_suffixes = machinery.EXTENSION_SUFFIXES + +# Which types with buffer interface we support (apart from byte strings) +_buffer_type = (bytearray, memoryview) + + +class _VoidPointer(object): + @abc.abstractmethod + def get(self): + """Return the memory location we point to""" + return + + @abc.abstractmethod + def address_of(self): + """Return a raw pointer to this pointer""" + return + + +try: + # Starting from v2.18, pycparser (used by cffi for in-line ABI mode) + # stops working correctly when PYOPTIMIZE==2 or the parameter -OO is + # passed. In that case, we fall back to ctypes. + # Note that PyPy ships with an old version of pycparser so we can keep + # using cffi there. + # See https://github.com/Legrandin/pycryptodome/issues/228 + if '__pypy__' not in sys.builtin_module_names and sys.flags.optimize == 2: + raise ImportError("CFFI with optimize=2 fails due to pycparser bug.") + + from cffi import FFI + + ffi = FFI() + null_pointer = ffi.NULL + uint8_t_type = ffi.typeof(ffi.new("const uint8_t*")) + + _Array = ffi.new("uint8_t[1]").__class__.__bases__ + + def load_lib(name, cdecl): + """Load a shared library and return a handle to it. + + @name, either an absolute path or the name of a library + in the system search path. + + @cdecl, the C function declarations. + """ + + if hasattr(ffi, "RTLD_DEEPBIND"): + lib = ffi.dlopen(name, ffi.RTLD_DEEPBIND) + else: + lib = ffi.dlopen(name) + ffi.cdef(cdecl) + return lib + + def c_ulong(x): + """Convert a Python integer to unsigned long""" + return x + + c_ulonglong = c_ulong + c_uint = c_ulong + c_ubyte = c_ulong + + def c_size_t(x): + """Convert a Python integer to size_t""" + return x + + def create_string_buffer(init_or_size, size=None): + """Allocate the given amount of bytes (initially set to 0)""" + + if isinstance(init_or_size, bytes): + size = max(len(init_or_size) + 1, size) + result = ffi.new("uint8_t[]", size) + result[:] = init_or_size + else: + if size: + raise ValueError("Size must be specified once only") + result = ffi.new("uint8_t[]", init_or_size) + return result + + def get_c_string(c_string): + """Convert a C string into a Python byte sequence""" + return ffi.string(c_string) + + def get_raw_buffer(buf): + """Convert a C buffer into a Python byte sequence""" + return ffi.buffer(buf)[:] + + def c_uint8_ptr(data): + if isinstance(data, _buffer_type): + # This only works for cffi >= 1.7 + return ffi.cast(uint8_t_type, ffi.from_buffer(data)) + elif byte_string(data) or isinstance(data, _Array): + return data + else: + raise TypeError("Object type %s cannot be passed to C code" % type(data)) + + class VoidPointer_cffi(_VoidPointer): + """Model a newly allocated pointer to void""" + + def __init__(self): + self._pp = ffi.new("void *[1]") + + def get(self): + return self._pp[0] + + def address_of(self): + return self._pp + + def VoidPointer(): + return VoidPointer_cffi() + + backend = "cffi" + +except ImportError: + + import ctypes + from ctypes import (CDLL, c_void_p, byref, c_ulong, c_ulonglong, c_size_t, + create_string_buffer, c_ubyte, c_uint) + from ctypes.util import find_library + from ctypes import Array as _Array + + null_pointer = None + cached_architecture = [] + + def c_ubyte(c): + if not (0 <= c < 256): + raise OverflowError() + return ctypes.c_ubyte(c) + + def load_lib(name, cdecl): + if not cached_architecture: + # platform.architecture() creates a subprocess, so caching the + # result makes successive imports faster. + import platform + cached_architecture[:] = platform.architecture() + bits, linkage = cached_architecture + if "." not in name and not linkage.startswith("Win"): + full_name = find_library(name) + if full_name is None: + raise OSError("Cannot load library '%s'" % name) + name = full_name + return CDLL(name) + + def get_c_string(c_string): + return c_string.value + + def get_raw_buffer(buf): + return buf.raw + + # ---- Get raw pointer --- + + _c_ssize_t = ctypes.c_ssize_t + + _PyBUF_SIMPLE = 0 + _PyObject_GetBuffer = ctypes.pythonapi.PyObject_GetBuffer + _PyBuffer_Release = ctypes.pythonapi.PyBuffer_Release + _py_object = ctypes.py_object + _c_ssize_p = ctypes.POINTER(_c_ssize_t) + + # See Include/object.h for CPython + # and https://github.com/pallets/click/blob/master/src/click/_winconsole.py + class _Py_buffer(ctypes.Structure): + _fields_ = [ + ('buf', c_void_p), + ('obj', ctypes.py_object), + ('len', _c_ssize_t), + ('itemsize', _c_ssize_t), + ('readonly', ctypes.c_int), + ('ndim', ctypes.c_int), + ('format', ctypes.c_char_p), + ('shape', _c_ssize_p), + ('strides', _c_ssize_p), + ('suboffsets', _c_ssize_p), + ('internal', c_void_p) + ] + + # Extra field for CPython 2.6/2.7 + if sys.version_info[0] == 2: + _fields_.insert(-1, ('smalltable', _c_ssize_t * 2)) + + def c_uint8_ptr(data): + if byte_string(data) or isinstance(data, _Array): + return data + elif isinstance(data, _buffer_type): + obj = _py_object(data) + buf = _Py_buffer() + _PyObject_GetBuffer(obj, byref(buf), _PyBUF_SIMPLE) + try: + buffer_type = ctypes.c_ubyte * buf.len + return buffer_type.from_address(buf.buf) + finally: + _PyBuffer_Release(byref(buf)) + else: + raise TypeError("Object type %s cannot be passed to C code" % type(data)) + + # --- + + class VoidPointer_ctypes(_VoidPointer): + """Model a newly allocated pointer to void""" + + def __init__(self): + self._p = c_void_p() + + def get(self): + return self._p + + def address_of(self): + return byref(self._p) + + def VoidPointer(): + return VoidPointer_ctypes() + + backend = "ctypes" + + +class SmartPointer(object): + """Class to hold a non-managed piece of memory""" + + def __init__(self, raw_pointer, destructor): + self._raw_pointer = raw_pointer + self._destructor = destructor + + def get(self): + return self._raw_pointer + + def release(self): + rp, self._raw_pointer = self._raw_pointer, None + return rp + + def __del__(self): + try: + if self._raw_pointer is not None: + self._destructor(self._raw_pointer) + self._raw_pointer = None + except AttributeError: + pass + + +def load_pycryptodome_raw_lib(name, cdecl): + """Load a shared library and return a handle to it. + + @name, the name of the library expressed as a PyCryptodome module, + for instance Crypto.Cipher._raw_cbc. + + @cdecl, the C function declarations. + """ + + split = name.split(".") + dir_comps, basename = split[:-1], split[-1] + attempts = [] + for ext in extension_suffixes: + try: + filename = basename + ext + full_name = pycryptodome_filename(dir_comps, filename) + if not os.path.isfile(full_name): + attempts.append("Not found '%s'" % filename) + continue + return load_lib(full_name, cdecl) + except OSError as exp: + attempts.append("Cannot load '%s': %s" % (filename, str(exp))) + raise OSError("Cannot load native module '%s': %s" % (name, ", ".join(attempts))) + + +def is_buffer(x): + """Return True if object x supports the buffer interface""" + return isinstance(x, (bytes, bytearray, memoryview)) + + +def is_writeable_buffer(x): + return (isinstance(x, bytearray) or + (isinstance(x, memoryview) and not x.readonly)) diff --git a/server/www/packages/packages-linux/x64/Crypto/Util/_strxor.abi3.so b/server/www/packages/packages-linux/x64/Crypto/Util/_strxor.abi3.so new file mode 100644 index 0000000000000000000000000000000000000000..a745f81507912b1746272ae12e7c4bbaca60077a GIT binary patch literal 14960 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 0 + + +class BytesIO_EOF(object): + """This class differs from BytesIO in that a ValueError exception is + raised whenever EOF is reached.""" + + def __init__(self, initial_bytes): + self._buffer = initial_bytes + self._index = 0 + self._bookmark = None + + def set_bookmark(self): + self._bookmark = self._index + + def data_since_bookmark(self): + assert self._bookmark is not None + return self._buffer[self._bookmark:self._index] + + def remaining_data(self): + return len(self._buffer) - self._index + + def read(self, length): + new_index = self._index + length + if new_index > len(self._buffer): + raise ValueError("Not enough data for DER decoding: expected %d bytes and found %d" % (new_index, len(self._buffer))) + + result = self._buffer[self._index:new_index] + self._index = new_index + return result + + def read_byte(self): + return bord(self.read(1)[0]) + + +class DerObject(object): + """Base class for defining a single DER object. + + This class should never be directly instantiated. + """ + + def __init__(self, asn1Id=None, payload=b'', implicit=None, + constructed=False, explicit=None): + """Initialize the DER object according to a specific ASN.1 type. + + :Parameters: + asn1Id : integer + The universal DER tag number for this object + (e.g. 0x10 for a SEQUENCE). + If None, the tag is not known yet. + + payload : byte string + The initial payload of the object (that it, + the content octets). + If not specified, the payload is empty. + + implicit : integer + The IMPLICIT tag number to use for the encoded object. + It overrides the universal tag *asn1Id*. + + constructed : bool + True when the ASN.1 type is *constructed*. + False when it is *primitive*. + + explicit : integer + The EXPLICIT tag number to use for the encoded object. + """ + + if asn1Id is None: + # The tag octet will be read in with ``decode`` + self._tag_octet = None + return + asn1Id = self._convertTag(asn1Id) + + self.payload = payload + + # In a BER/DER identifier octet: + # * bits 4-0 contain the tag value + # * bit 5 is set if the type is 'constructed' + # and unset if 'primitive' + # * bits 7-6 depend on the encoding class + # + # Class | Bit 7, Bit 6 + # ---------------------------------- + # universal | 0 0 + # application | 0 1 + # context-spec | 1 0 (default for IMPLICIT/EXPLICIT) + # private | 1 1 + # + if None not in (explicit, implicit): + raise ValueError("Explicit and implicit tags are" + " mutually exclusive") + + if implicit is not None: + self._tag_octet = 0x80 | 0x20 * constructed | self._convertTag(implicit) + return + + if explicit is not None: + self._tag_octet = 0xA0 | self._convertTag(explicit) + self._inner_tag_octet = 0x20 * constructed | asn1Id + return + + self._tag_octet = 0x20 * constructed | asn1Id + + def _convertTag(self, tag): + """Check if *tag* is a real DER tag. + Convert it from a character to number if necessary. + """ + if not _is_number(tag): + if len(tag) == 1: + tag = bord(tag[0]) + # Ensure that tag is a low tag + if not (_is_number(tag) and 0 <= tag < 0x1F): + raise ValueError("Wrong DER tag") + return tag + + @staticmethod + def _definite_form(length): + """Build length octets according to BER/DER + definite form. + """ + if length > 127: + encoding = long_to_bytes(length) + return bchr(len(encoding) + 128) + encoding + return bchr(length) + + def encode(self): + """Return this DER element, fully encoded as a binary byte string.""" + + # Concatenate identifier octets, length octets, + # and contents octets + + output_payload = self.payload + + # In case of an EXTERNAL tag, first encode the inner + # element. + if hasattr(self, "_inner_tag_octet"): + output_payload = (bchr(self._inner_tag_octet) + + self._definite_form(len(self.payload)) + + self.payload) + + return (bchr(self._tag_octet) + + self._definite_form(len(output_payload)) + + output_payload) + + def _decodeLen(self, s): + """Decode DER length octets from a file.""" + + length = s.read_byte() + + if length > 127: + encoded_length = s.read(length & 0x7F) + if bord(encoded_length[0]) == 0: + raise ValueError("Invalid DER: length has leading zero") + length = bytes_to_long(encoded_length) + if length <= 127: + raise ValueError("Invalid DER: length in long form but smaller than 128") + + return length + + def decode(self, der_encoded, strict=False): + """Decode a complete DER element, and re-initializes this + object with it. + + Args: + der_encoded (byte string): A complete DER element. + + Raises: + ValueError: in case of parsing errors. + """ + + if not byte_string(der_encoded): + raise ValueError("Input is not a byte string") + + s = BytesIO_EOF(der_encoded) + self._decodeFromStream(s, strict) + + # There shouldn't be other bytes left + if s.remaining_data() > 0: + raise ValueError("Unexpected extra data after the DER structure") + + return self + + def _decodeFromStream(self, s, strict): + """Decode a complete DER element from a file.""" + + idOctet = s.read_byte() + if self._tag_octet is not None: + if idOctet != self._tag_octet: + raise ValueError("Unexpected DER tag") + else: + self._tag_octet = idOctet + length = self._decodeLen(s) + self.payload = s.read(length) + + # In case of an EXTERNAL tag, further decode the inner + # element. + if hasattr(self, "_inner_tag_octet"): + p = BytesIO_EOF(self.payload) + inner_octet = p.read_byte() + if inner_octet != self._inner_tag_octet: + raise ValueError("Unexpected internal DER tag") + length = self._decodeLen(p) + self.payload = p.read(length) + + # There shouldn't be other bytes left + if p.remaining_data() > 0: + raise ValueError("Unexpected extra data after the DER structure") + + +class DerInteger(DerObject): + """Class to model a DER INTEGER. + + An example of encoding is:: + + >>> from Crypto.Util.asn1 import DerInteger + >>> from binascii import hexlify, unhexlify + >>> int_der = DerInteger(9) + >>> print hexlify(int_der.encode()) + + which will show ``020109``, the DER encoding of 9. + + And for decoding:: + + >>> s = unhexlify(b'020109') + >>> try: + >>> int_der = DerInteger() + >>> int_der.decode(s) + >>> print int_der.value + >>> except ValueError: + >>> print "Not a valid DER INTEGER" + + the output will be ``9``. + + :ivar value: The integer value + :vartype value: integer + """ + + def __init__(self, value=0, implicit=None, explicit=None): + """Initialize the DER object as an INTEGER. + + :Parameters: + value : integer + The value of the integer. + + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for INTEGER (2). + """ + + DerObject.__init__(self, 0x02, b'', implicit, + False, explicit) + self.value = value # The integer value + + def encode(self): + """Return the DER INTEGER, fully encoded as a + binary string.""" + + number = self.value + self.payload = b'' + while True: + self.payload = bchr(int(number & 255)) + self.payload + if 128 <= number <= 255: + self.payload = bchr(0x00) + self.payload + if -128 <= number <= 255: + break + number >>= 8 + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False): + """Decode a complete DER INTEGER DER, and re-initializes this + object with it. + + Args: + der_encoded (byte string): A complete INTEGER DER element. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict=strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER INTEGER from a file.""" + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + if strict: + if len(self.payload) == 0: + raise ValueError("Invalid encoding for DER INTEGER: empty payload") + if len(self.payload) >= 2 and struct.unpack('>H', self.payload[:2])[0] < 0x80: + raise ValueError("Invalid encoding for DER INTEGER: leading zero") + + # Derive self.value from self.payload + self.value = 0 + bits = 1 + for i in self.payload: + self.value *= 256 + self.value += bord(i) + bits <<= 8 + if self.payload and bord(self.payload[0]) & 0x80: + self.value -= bits + + +class DerSequence(DerObject): + """Class to model a DER SEQUENCE. + + This object behaves like a dynamic Python sequence. + + Sub-elements that are INTEGERs behave like Python integers. + + Any other sub-element is a binary string encoded as a complete DER + sub-element (TLV). + + An example of encoding is: + + >>> from Crypto.Util.asn1 import DerSequence, DerInteger + >>> from binascii import hexlify, unhexlify + >>> obj_der = unhexlify('070102') + >>> seq_der = DerSequence([4]) + >>> seq_der.append(9) + >>> seq_der.append(obj_der.encode()) + >>> print hexlify(seq_der.encode()) + + which will show ``3009020104020109070102``, the DER encoding of the + sequence containing ``4``, ``9``, and the object with payload ``02``. + + For decoding: + + >>> s = unhexlify(b'3009020104020109070102') + >>> try: + >>> seq_der = DerSequence() + >>> seq_der.decode(s) + >>> print len(seq_der) + >>> print seq_der[0] + >>> print seq_der[:] + >>> except ValueError: + >>> print "Not a valid DER SEQUENCE" + + the output will be:: + + 3 + 4 + [4, 9, b'\x07\x01\x02'] + + """ + + def __init__(self, startSeq=None, implicit=None): + """Initialize the DER object as a SEQUENCE. + + :Parameters: + startSeq : Python sequence + A sequence whose element are either integers or + other DER objects. + + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for SEQUENCE (16). + """ + + DerObject.__init__(self, 0x10, b'', implicit, True) + if startSeq is None: + self._seq = [] + else: + self._seq = startSeq + + # A few methods to make it behave like a python sequence + + def __delitem__(self, n): + del self._seq[n] + + def __getitem__(self, n): + return self._seq[n] + + def __setitem__(self, key, value): + self._seq[key] = value + + def __setslice__(self, i, j, sequence): + self._seq[i:j] = sequence + + def __delslice__(self, i, j): + del self._seq[i:j] + + def __getslice__(self, i, j): + return self._seq[max(0, i):max(0, j)] + + def __len__(self): + return len(self._seq) + + def __iadd__(self, item): + self._seq.append(item) + return self + + def append(self, item): + self._seq.append(item) + return self + + def hasInts(self, only_non_negative=True): + """Return the number of items in this sequence that are + integers. + + Args: + only_non_negative (boolean): + If ``True``, negative integers are not counted in. + """ + + items = [x for x in self._seq if _is_number(x, only_non_negative)] + return len(items) + + def hasOnlyInts(self, only_non_negative=True): + """Return ``True`` if all items in this sequence are integers + or non-negative integers. + + This function returns False is the sequence is empty, + or at least one member is not an integer. + + Args: + only_non_negative (boolean): + If ``True``, the presence of negative integers + causes the method to return ``False``.""" + return self._seq and self.hasInts(only_non_negative) == len(self._seq) + + def encode(self): + """Return this DER SEQUENCE, fully encoded as a + binary string. + + Raises: + ValueError: if some elements in the sequence are neither integers + nor byte strings. + """ + self.payload = b'' + for item in self._seq: + if byte_string(item): + self.payload += item + elif _is_number(item): + self.payload += DerInteger(item).encode() + else: + self.payload += item.encode() + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False, nr_elements=None, only_ints_expected=False): + """Decode a complete DER SEQUENCE, and re-initializes this + object with it. + + Args: + der_encoded (byte string): + A complete SEQUENCE DER element. + nr_elements (None or integer or list of integers): + The number of members the SEQUENCE can have + only_ints_expected (boolean): + Whether the SEQUENCE is expected to contain only integers. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + + DER INTEGERs are decoded into Python integers. Any other DER + element is not decoded. Its validity is not checked. + """ + + self._nr_elements = nr_elements + result = DerObject.decode(self, der_encoded, strict=strict) + + if only_ints_expected and not self.hasOnlyInts(): + raise ValueError("Some members are not INTEGERs") + + return result + + def _decodeFromStream(self, s, strict): + """Decode a complete DER SEQUENCE from a file.""" + + self._seq = [] + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + # Add one item at a time to self.seq, by scanning self.payload + p = BytesIO_EOF(self.payload) + while p.remaining_data() > 0: + p.set_bookmark() + + der = DerObject() + der._decodeFromStream(p, strict) + + # Parse INTEGERs differently + if der._tag_octet != 0x02: + self._seq.append(p.data_since_bookmark()) + else: + derInt = DerInteger() + #import pdb; pdb.set_trace() + data = p.data_since_bookmark() + derInt.decode(data, strict=strict) + self._seq.append(derInt.value) + + ok = True + if self._nr_elements is not None: + try: + ok = len(self._seq) in self._nr_elements + except TypeError: + ok = len(self._seq) == self._nr_elements + + if not ok: + raise ValueError("Unexpected number of members (%d)" + " in the sequence" % len(self._seq)) + + +class DerOctetString(DerObject): + """Class to model a DER OCTET STRING. + + An example of encoding is: + + >>> from Crypto.Util.asn1 import DerOctetString + >>> from binascii import hexlify, unhexlify + >>> os_der = DerOctetString(b'\\xaa') + >>> os_der.payload += b'\\xbb' + >>> print hexlify(os_der.encode()) + + which will show ``0402aabb``, the DER encoding for the byte string + ``b'\\xAA\\xBB'``. + + For decoding: + + >>> s = unhexlify(b'0402aabb') + >>> try: + >>> os_der = DerOctetString() + >>> os_der.decode(s) + >>> print hexlify(os_der.payload) + >>> except ValueError: + >>> print "Not a valid DER OCTET STRING" + + the output will be ``aabb``. + + :ivar payload: The content of the string + :vartype payload: byte string + """ + + def __init__(self, value=b'', implicit=None): + """Initialize the DER object as an OCTET STRING. + + :Parameters: + value : byte string + The initial payload of the object. + If not specified, the payload is empty. + + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for OCTET STRING (4). + """ + DerObject.__init__(self, 0x04, value, implicit, False) + + +class DerNull(DerObject): + """Class to model a DER NULL element.""" + + def __init__(self): + """Initialize the DER object as a NULL.""" + + DerObject.__init__(self, 0x05, b'', None, False) + + +class DerObjectId(DerObject): + """Class to model a DER OBJECT ID. + + An example of encoding is: + + >>> from Crypto.Util.asn1 import DerObjectId + >>> from binascii import hexlify, unhexlify + >>> oid_der = DerObjectId("1.2") + >>> oid_der.value += ".840.113549.1.1.1" + >>> print hexlify(oid_der.encode()) + + which will show ``06092a864886f70d010101``, the DER encoding for the + RSA Object Identifier ``1.2.840.113549.1.1.1``. + + For decoding: + + >>> s = unhexlify(b'06092a864886f70d010101') + >>> try: + >>> oid_der = DerObjectId() + >>> oid_der.decode(s) + >>> print oid_der.value + >>> except ValueError: + >>> print "Not a valid DER OBJECT ID" + + the output will be ``1.2.840.113549.1.1.1``. + + :ivar value: The Object ID (OID), a dot separated list of integers + :vartype value: string + """ + + def __init__(self, value='', implicit=None, explicit=None): + """Initialize the DER object as an OBJECT ID. + + :Parameters: + value : string + The initial Object Identifier (e.g. "1.2.0.0.6.2"). + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for OBJECT ID (6). + explicit : integer + The EXPLICIT tag to use for the encoded object. + """ + DerObject.__init__(self, 0x06, b'', implicit, False, explicit) + self.value = value + + def encode(self): + """Return the DER OBJECT ID, fully encoded as a + binary string.""" + + comps = [int(x) for x in self.value.split(".")] + if len(comps) < 2: + raise ValueError("Not a valid Object Identifier string") + self.payload = bchr(40*comps[0]+comps[1]) + for v in comps[2:]: + if v == 0: + enc = [0] + else: + enc = [] + while v: + enc.insert(0, (v & 0x7F) | 0x80) + v >>= 7 + enc[-1] &= 0x7F + self.payload += b''.join([bchr(x) for x in enc]) + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False): + """Decode a complete DER OBJECT ID, and re-initializes this + object with it. + + Args: + der_encoded (byte string): + A complete DER OBJECT ID. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER OBJECT ID from a file.""" + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + # Derive self.value from self.payload + p = BytesIO_EOF(self.payload) + comps = [str(x) for x in divmod(p.read_byte(), 40)] + v = 0 + while p.remaining_data(): + c = p.read_byte() + v = v*128 + (c & 0x7F) + if not (c & 0x80): + comps.append(str(v)) + v = 0 + self.value = '.'.join(comps) + + +class DerBitString(DerObject): + """Class to model a DER BIT STRING. + + An example of encoding is: + + >>> from Crypto.Util.asn1 import DerBitString + >>> from binascii import hexlify, unhexlify + >>> bs_der = DerBitString(b'\\xaa') + >>> bs_der.value += b'\\xbb' + >>> print hexlify(bs_der.encode()) + + which will show ``040300aabb``, the DER encoding for the bit string + ``b'\\xAA\\xBB'``. + + For decoding: + + >>> s = unhexlify(b'040300aabb') + >>> try: + >>> bs_der = DerBitString() + >>> bs_der.decode(s) + >>> print hexlify(bs_der.value) + >>> except ValueError: + >>> print "Not a valid DER BIT STRING" + + the output will be ``aabb``. + + :ivar value: The content of the string + :vartype value: byte string + """ + + def __init__(self, value=b'', implicit=None, explicit=None): + """Initialize the DER object as a BIT STRING. + + :Parameters: + value : byte string or DER object + The initial, packed bit string. + If not specified, the bit string is empty. + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for OCTET STRING (3). + explicit : integer + The EXPLICIT tag to use for the encoded object. + """ + DerObject.__init__(self, 0x03, b'', implicit, False, explicit) + + # The bitstring value (packed) + if isinstance(value, DerObject): + self.value = value.encode() + else: + self.value = value + + def encode(self): + """Return the DER BIT STRING, fully encoded as a + binary string.""" + + # Add padding count byte + self.payload = b'\x00' + self.value + return DerObject.encode(self) + + def decode(self, der_encoded, strict=False): + """Decode a complete DER BIT STRING, and re-initializes this + object with it. + + Args: + der_encoded (byte string): a complete DER BIT STRING. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER BIT STRING DER from a file.""" + + # Fill-up self.payload + DerObject._decodeFromStream(self, s, strict) + + if self.payload and bord(self.payload[0]) != 0: + raise ValueError("Not a valid BIT STRING") + + # Fill-up self.value + self.value = b'' + # Remove padding count byte + if self.payload: + self.value = self.payload[1:] + + +class DerSetOf(DerObject): + """Class to model a DER SET OF. + + An example of encoding is: + + >>> from Crypto.Util.asn1 import DerBitString + >>> from binascii import hexlify, unhexlify + >>> so_der = DerSetOf([4,5]) + >>> so_der.add(6) + >>> print hexlify(so_der.encode()) + + which will show ``3109020104020105020106``, the DER encoding + of a SET OF with items 4,5, and 6. + + For decoding: + + >>> s = unhexlify(b'3109020104020105020106') + >>> try: + >>> so_der = DerSetOf() + >>> so_der.decode(s) + >>> print [x for x in so_der] + >>> except ValueError: + >>> print "Not a valid DER SET OF" + + the output will be ``[4, 5, 6]``. + """ + + def __init__(self, startSet=None, implicit=None): + """Initialize the DER object as a SET OF. + + :Parameters: + startSet : container + The initial set of integers or DER encoded objects. + implicit : integer + The IMPLICIT tag to use for the encoded object. + It overrides the universal tag for SET OF (17). + """ + DerObject.__init__(self, 0x11, b'', implicit, True) + self._seq = [] + + # All elements must be of the same type (and therefore have the + # same leading octet) + self._elemOctet = None + + if startSet: + for e in startSet: + self.add(e) + + def __getitem__(self, n): + return self._seq[n] + + def __iter__(self): + return iter(self._seq) + + def __len__(self): + return len(self._seq) + + def add(self, elem): + """Add an element to the set. + + Args: + elem (byte string or integer): + An element of the same type of objects already in the set. + It can be an integer or a DER encoded object. + """ + + if _is_number(elem): + eo = 0x02 + elif isinstance(elem, DerObject): + eo = self._tag_octet + else: + eo = bord(elem[0]) + + if self._elemOctet != eo: + if self._elemOctet is not None: + raise ValueError("New element does not belong to the set") + self._elemOctet = eo + + if elem not in self._seq: + self._seq.append(elem) + + def decode(self, der_encoded, strict=False): + """Decode a complete SET OF DER element, and re-initializes this + object with it. + + DER INTEGERs are decoded into Python integers. Any other DER + element is left undecoded; its validity is not checked. + + Args: + der_encoded (byte string): a complete DER BIT SET OF. + strict (boolean): + Whether decoding must check for strict DER compliancy. + + Raises: + ValueError: in case of parsing errors. + """ + + return DerObject.decode(self, der_encoded, strict) + + def _decodeFromStream(self, s, strict): + """Decode a complete DER SET OF from a file.""" + + self._seq = [] + + # Fill up self.payload + DerObject._decodeFromStream(self, s, strict) + + # Add one item at a time to self.seq, by scanning self.payload + p = BytesIO_EOF(self.payload) + setIdOctet = -1 + while p.remaining_data() > 0: + p.set_bookmark() + + der = DerObject() + der._decodeFromStream(p, strict) + + # Verify that all members are of the same type + if setIdOctet < 0: + setIdOctet = der._tag_octet + else: + if setIdOctet != der._tag_octet: + raise ValueError("Not all elements are of the same DER type") + + # Parse INTEGERs differently + if setIdOctet != 0x02: + self._seq.append(p.data_since_bookmark()) + else: + derInt = DerInteger() + derInt.decode(p.data_since_bookmark(), strict) + self._seq.append(derInt.value) + # end + + def encode(self): + """Return this SET OF DER element, fully encoded as a + binary string. + """ + + # Elements in the set must be ordered in lexicographic order + ordered = [] + for item in self._seq: + if _is_number(item): + bys = DerInteger(item).encode() + elif isinstance(item, DerObject): + bys = item.encode() + else: + bys = item + ordered.append(bys) + ordered.sort() + self.payload = b''.join(ordered) + return DerObject.encode(self) diff --git a/server/www/packages/packages-linux/x64/Crypto/Util/number.py b/server/www/packages/packages-linux/x64/Crypto/Util/number.py new file mode 100644 index 0000000..8d0e34c --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Util/number.py @@ -0,0 +1,1495 @@ +# +# number.py : Number-theoretic functions +# +# Part of the Python Cryptography Toolkit +# +# Written by Andrew M. Kuchling, Barry A. Warsaw, and others +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== +# + +import math +import sys +import struct +from Crypto import Random +from Crypto.Util.py3compat import iter_range + +# Backward compatibility +_fastmath = None + + +def ceil_div(n, d): + """Return ceil(n/d), that is, the smallest integer r such that r*d >= n""" + + if d == 0: + raise ZeroDivisionError() + if (n < 0) or (d < 0): + raise ValueError("Non positive values") + r, q = divmod(n, d) + if (n != 0) and (q != 0): + r += 1 + return r + + +def size (N): + """Returns the size of the number N in bits.""" + + if N < 0: + raise ValueError("Size in bits only avialable for non-negative numbers") + + bits = 0 + while N >> bits: + bits += 1 + return bits + + +def getRandomInteger(N, randfunc=None): + """Return a random number at most N bits long. + + If :data:`randfunc` is omitted, then :meth:`Random.get_random_bytes` is used. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. Use :func:`Crypto.Random.random.getrandbits` instead. + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + + S = randfunc(N>>3) + odd_bits = N % 8 + if odd_bits != 0: + rand_bits = ord(randfunc(1)) >> (8-odd_bits) + S = struct.pack('B', rand_bits) + S + value = bytes_to_long(S) + return value + +def getRandomRange(a, b, randfunc=None): + """Return a random number *n* so that *a <= n < b*. + + If :data:`randfunc` is omitted, then :meth:`Random.get_random_bytes` is used. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. Use :func:`Crypto.Random.random.randrange` instead. + """ + + range_ = b - a - 1 + bits = size(range_) + value = getRandomInteger(bits, randfunc) + while value > range_: + value = getRandomInteger(bits, randfunc) + return a + value + +def getRandomNBitInteger(N, randfunc=None): + """Return a random number with exactly N-bits, + i.e. a random number between 2**(N-1) and (2**N)-1. + + If :data:`randfunc` is omitted, then :meth:`Random.get_random_bytes` is used. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. + """ + + value = getRandomInteger (N-1, randfunc) + value |= 2 ** (N-1) # Ensure high bit is set + assert size(value) >= N + return value + +def GCD(x,y): + """Greatest Common Denominator of :data:`x` and :data:`y`. + """ + + x = abs(x) ; y = abs(y) + while x > 0: + x, y = y % x, x + return y + +def inverse(u, v): + """The inverse of :data:`u` *mod* :data:`v`.""" + + u3, v3 = u, v + u1, v1 = 1, 0 + while v3 > 0: + q = u3 // v3 + u1, v1 = v1, u1 - v1*q + u3, v3 = v3, u3 - v3*q + while u1<0: + u1 = u1 + v + return u1 + +# Given a number of bits to generate and a random generation function, +# find a prime number of the appropriate size. + +def getPrime(N, randfunc=None): + """Return a random N-bit prime number. + + If randfunc is omitted, then :meth:`Random.get_random_bytes` is used. + """ + if randfunc is None: + randfunc = Random.get_random_bytes + + number=getRandomNBitInteger(N, randfunc) | 1 + while (not isPrime(number, randfunc=randfunc)): + number=number+2 + return number + + +def _rabinMillerTest(n, rounds, randfunc=None): + """_rabinMillerTest(n:long, rounds:int, randfunc:callable):int + Tests if n is prime. + Returns 0 when n is definitely composite. + Returns 1 when n is probably prime. + Returns 2 when n is definitely prime. + + If randfunc is omitted, then Random.new().read is used. + + This function is for internal use only and may be renamed or removed in + the future. + """ + # check special cases (n==2, n even, n < 2) + if n < 3 or (n & 1) == 0: + return n == 2 + # n might be very large so it might be beneficial to precalculate n-1 + n_1 = n - 1 + # determine m and b so that 2**b * m = n - 1 and b maximal + b = 0 + m = n_1 + while (m & 1) == 0: + b += 1 + m >>= 1 + + tested = [] + # we need to do at most n-2 rounds. + for i in iter_range (min (rounds, n-2)): + # randomly choose a < n and make sure it hasn't been tested yet + a = getRandomRange (2, n, randfunc) + while a in tested: + a = getRandomRange (2, n, randfunc) + tested.append (a) + # do the rabin-miller test + z = pow (a, m, n) # (a**m) % n + if z == 1 or z == n_1: + continue + composite = 1 + for r in iter_range(b): + z = (z * z) % n + if z == 1: + return 0 + elif z == n_1: + composite = 0 + break + if composite: + return 0 + return 1 + +def getStrongPrime(N, e=0, false_positive_prob=1e-6, randfunc=None): + r""" + Return a random strong *N*-bit prime number. + In this context, *p* is a strong prime if *p-1* and *p+1* have at + least one large prime factor. + + Args: + N (integer): the exact length of the strong prime. + It must be a multiple of 128 and > 512. + e (integer): if provided, the returned prime (minus 1) + will be coprime to *e* and thus suitable for RSA where + *e* is the public exponent. + false_positive_prob (float): + The statistical probability for the result not to be actually a + prime. It defaults to 10\ :sup:`-6`. + Note that the real probability of a false-positive is far less. This is + just the mathematically provable limit. + randfunc (callable): + A function that takes a parameter *N* and that returns + a random byte string of such length. + If omitted, :func:`Crypto.Random.get_random_bytes` is used. + Return: + The new strong prime. + + .. deprecated:: 3.0 + This function is for internal use only and may be renamed or removed in + the future. + """ + + # This function was implemented following the + # instructions found in the paper: + # "FAST GENERATION OF RANDOM, STRONG RSA PRIMES" + # by Robert D. Silverman + # RSA Laboratories + # May 17, 1997 + # which by the time of writing could be freely downloaded here: + # http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.17.2713&rep=rep1&type=pdf + + if randfunc is None: + randfunc = Random.get_random_bytes + + # Use the accelerator if available + if _fastmath is not None: + return _fastmath.getStrongPrime(long(N), long(e), false_positive_prob, + randfunc) + + if (N < 512) or ((N % 128) != 0): + raise ValueError ("bits must be multiple of 128 and > 512") + + rabin_miller_rounds = int(math.ceil(-math.log(false_positive_prob)/math.log(4))) + + # calculate range for X + # lower_bound = sqrt(2) * 2^{511 + 128*x} + # upper_bound = 2^{512 + 128*x} - 1 + x = (N - 512) >> 7; + # We need to approximate the sqrt(2) in the lower_bound by an integer + # expression because floating point math overflows with these numbers + lower_bound = (14142135623730950489 * (2 ** (511 + 128*x))) // 10000000000000000000 + upper_bound = (1 << (512 + 128*x)) - 1 + # Randomly choose X in calculated range + X = getRandomRange (lower_bound, upper_bound, randfunc) + + # generate p1 and p2 + p = [0, 0] + for i in (0, 1): + # randomly choose 101-bit y + y = getRandomNBitInteger (101, randfunc) + # initialize the field for sieving + field = [0] * 5 * len (sieve_base) + # sieve the field + for prime in sieve_base: + offset = y % prime + for j in iter_range((prime - offset) % prime, len (field), prime): + field[j] = 1 + + # look for suitable p[i] starting at y + result = 0 + for j in range(len(field)): + composite = field[j] + # look for next canidate + if composite: + continue + tmp = y + j + result = _rabinMillerTest (tmp, rabin_miller_rounds) + if result > 0: + p[i] = tmp + break + if result == 0: + raise RuntimeError ("Couln't find prime in field. " + "Developer: Increase field_size") + + # Calculate R + # R = (p2^{-1} mod p1) * p2 - (p1^{-1} mod p2) * p1 + tmp1 = inverse (p[1], p[0]) * p[1] # (p2^-1 mod p1)*p2 + tmp2 = inverse (p[0], p[1]) * p[0] # (p1^-1 mod p2)*p1 + R = tmp1 - tmp2 # (p2^-1 mod p1)*p2 - (p1^-1 mod p2)*p1 + + # search for final prime number starting by Y0 + # Y0 = X + (R - X mod p1p2) + increment = p[0] * p[1] + X = X + (R - (X % increment)) + while 1: + is_possible_prime = 1 + # first check candidate against sieve_base + for prime in sieve_base: + if (X % prime) == 0: + is_possible_prime = 0 + break + # if e is given make sure that e and X-1 are coprime + # this is not necessarily a strong prime criterion but useful when + # creating them for RSA where the p-1 and q-1 should be coprime to + # the public exponent e + if e and is_possible_prime: + if e & 1: + if GCD(e, X-1) != 1: + is_possible_prime = 0 + else: + if GCD(e, (X-1) // 2) != 1: + is_possible_prime = 0 + + # do some Rabin-Miller-Tests + if is_possible_prime: + result = _rabinMillerTest (X, rabin_miller_rounds) + if result > 0: + break + X += increment + # abort when X has more bits than requested + # TODO: maybe we shouldn't abort but rather start over. + if X >= 1 << N: + raise RuntimeError ("Couln't find prime in field. " + "Developer: Increase field_size") + return X + +def isPrime(N, false_positive_prob=1e-6, randfunc=None): + r"""Test if a number *N* is a prime. + + Args: + false_positive_prob (float): + The statistical probability for the result not to be actually a + prime. It defaults to 10\ :sup:`-6`. + Note that the real probability of a false-positive is far less. + This is just the mathematically provable limit. + randfunc (callable): + A function that takes a parameter *N* and that returns + a random byte string of such length. + If omitted, :func:`Crypto.Random.get_random_bytes` is used. + + Return: + `True` is the input is indeed prime. + """ + + if randfunc is None: + randfunc = Random.get_random_bytes + + if _fastmath is not None: + return _fastmath.isPrime(long(N), false_positive_prob, randfunc) + + if N < 3 or N & 1 == 0: + return N == 2 + for p in sieve_base: + if N == p: + return 1 + if N % p == 0: + return 0 + + rounds = int(math.ceil(-math.log(false_positive_prob)/math.log(4))) + return _rabinMillerTest(N, rounds, randfunc) + + +# Improved conversion functions contributed by Barry Warsaw, after +# careful benchmarking + +import struct + +def long_to_bytes(n, blocksize=0): + """Convert a positive integer to a byte string using big endian encoding. + + If :data:`blocksize` is absent or zero, the byte string will + be of minimal length. + + Otherwise, the length of the byte string is guaranteed to be a multiple + of :data:`blocksize`. If necessary, zeroes (``\\x00``) are added at the left. + + .. note:: + In Python 3, if you are sure that :data:`n` can fit into + :data:`blocksize` bytes, you can simply use the native method instead:: + + >>> n.to_bytes(blocksize, 'big') + + For instance:: + + >>> n = 80 + >>> n.to_bytes(2, 'big') + b'\\x00P' + + However, and unlike this ``long_to_bytes()`` function, + an ``OverflowError`` exception is raised if :data:`n` does not fit. + """ + + if n < 0 or blocksize < 0: + raise ValueError("Values must be non-negative") + + result = [] + pack = struct.pack + + # Fill the first block independently from the value of n + bsr = blocksize + while bsr >= 8: + result.insert(0, pack('>Q', n & 0xFFFFFFFFFFFFFFFF)) + n = n >> 64 + bsr -= 8 + + while bsr >= 4: + result.insert(0, pack('>I', n & 0xFFFFFFFF)) + n = n >> 32 + bsr -= 4 + + while bsr > 0: + result.insert(0, pack('>B', n & 0xFF)) + n = n >> 8 + bsr -= 1 + + if n == 0: + if len(result) == 0: + bresult = b'\x00' + else: + bresult = b''.join(result) + else: + # The encoded number exceeds the block size + while n > 0: + result.insert(0, pack('>Q', n & 0xFFFFFFFFFFFFFFFF)) + n = n >> 64 + result[0] = result[0].lstrip(b'\x00') + bresult = b''.join(result) + # bresult has minimum length here + if blocksize > 0: + target_len = ((len(bresult) - 1) // blocksize + 1) * blocksize + bresult = b'\x00' * (target_len - len(bresult)) + bresult + + return bresult + + +def bytes_to_long(s): + """Convert a byte string to a long integer (big endian). + + In Python 3.2+, use the native method instead:: + + >>> int.from_bytes(s, 'big') + + For instance:: + + >>> int.from_bytes(b'\x00P', 'big') + 80 + + This is (essentially) the inverse of :func:`long_to_bytes`. + """ + acc = 0 + + unpack = struct.unpack + + # Up to Python 2.7.4, struct.unpack can't work with bytearrays nor + # memoryviews + if sys.version_info[0:3] < (2, 7, 4): + if isinstance(s, bytearray): + s = bytes(s) + elif isinstance(s, memoryview): + s = s.tobytes() + + length = len(s) + if length % 4: + extra = (4 - length % 4) + s = b'\x00' * extra + s + length = length + extra + for i in range(0, length, 4): + acc = (acc << 32) + unpack('>I', s[i:i+4])[0] + return acc + + +# For backwards compatibility... +import warnings +def long2str(n, blocksize=0): + warnings.warn("long2str() has been replaced by long_to_bytes()") + return long_to_bytes(n, blocksize) +def str2long(s): + warnings.warn("str2long() has been replaced by bytes_to_long()") + return bytes_to_long(s) + + +# The first 10000 primes used for checking primality. +# This should be enough to eliminate most of the odd +# numbers before needing to do a Rabin-Miller test at all. +sieve_base = ( + 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, + 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, + 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, + 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, + 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, + 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, + 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, + 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, + 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, + 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, + 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, + 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, + 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, + 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, + 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, + 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, + 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, + 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, + 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, + 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, + 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, + 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, + 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, + 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, + 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, + 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, + 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, + 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, + 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, + 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, + 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, + 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, + 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, + 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, + 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, + 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, + 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, + 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, + 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, + 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, + 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, + 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, + 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, + 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, + 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, + 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, + 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, + 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, + 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, + 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, + 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, + 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, + 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, + 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, + 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, + 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, + 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, + 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, + 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, + 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, + 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, + 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, + 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, + 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, + 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, + 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, + 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, + 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, + 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, + 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, + 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, + 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, + 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, + 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, + 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, + 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, + 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, + 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, + 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, + 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, + 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, + 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, + 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, + 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, + 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, + 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, + 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, + 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, + 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, + 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, + 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, + 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, + 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, + 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, + 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, + 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, + 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, + 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, + 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, + 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, + 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, + 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, + 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, + 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, + 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, + 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, + 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, + 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, + 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, + 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, + 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, + 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, + 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, + 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, + 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, + 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, + 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, + 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, + 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, + 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, + 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, + 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, + 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, + 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, + 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, + 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, + 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, + 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, + 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, + 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, + 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, + 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, + 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, + 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, + 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, + 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, + 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, + 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, + 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, + 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, + 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, + 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, + 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, + 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, + 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, + 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, + 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, + 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, + 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, + 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, + 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, + 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, + 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, + 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, + 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, + 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, + 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, + 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, + 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, + 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, + 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, + 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, + 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, + 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, + 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, + 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, + 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, + 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, + 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, + 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, + 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, + 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, + 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, + 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, + 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, + 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, + 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, + 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, + 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, + 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, + 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, + 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, + 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, + 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, + 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, + 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, + 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, + 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, + 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, + 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, + 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, + 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, + 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, + 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, + 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, + 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, + 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, + 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, + 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, + 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, + 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, + 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, + 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, + 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, + 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, + 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, + 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, + 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, + 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, + 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, + 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, + 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, + 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, + 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, + 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, + 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, + 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, + 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, + 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, + 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, + 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, + 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, + 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, + 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, + 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, + 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, + 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, + 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, + 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, + 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, + 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, + 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, + 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, + 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, + 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, + 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, + 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, + 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, + 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, + 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, + 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, + 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, + 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, + 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, + 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, + 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, + 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, + 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, + 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, + 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, + 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, + 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, + 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, + 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, + 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, + 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, + 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, + 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, + 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, + 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, + 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, + 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, + 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, + 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, + 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, + 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, + 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, + 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, + 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, + 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, + 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, + 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, + 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, + 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, + 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, + 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, + 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, + 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, + 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, + 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, + 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, + 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, + 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, + 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, + 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, + 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, + 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, + 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, + 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, + 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, + 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, + 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, + 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, + 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, + 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, + 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, + 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, + 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, + 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, + 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, + 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, + 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, + 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, + 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, + 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, + 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, + 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, + 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, + 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, + 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, + 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, + 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, + 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, + 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, + 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, + 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, + 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, + 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, + 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, + 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, + 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, + 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, + 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, + 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, + 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, + 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, + 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, + 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, + 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, + 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, + 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, + 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, + 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, + 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, + 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, + 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, + 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, + 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, + 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, + 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, + 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, + 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, + 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, + 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, + 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, + 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, + 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, + 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, + 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, + 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, + 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, + 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, + 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, + 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, + 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, + 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, + 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, + 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, + 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, + 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, + 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, + 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, + 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, + 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, + 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, + 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, + 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, + 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, + 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, + 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, + 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, + 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, + 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, + 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, + 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, + 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, + 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, + 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, + 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, + 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, + 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, + 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, + 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, + 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, + 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, + 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, + 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, + 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, + 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, + 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, + 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, + 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, + 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, + 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, + 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, + 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, + 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, + 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, + 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, + 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, + 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, + 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, + 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, + 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, + 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, + 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, + 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, + 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, + 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, + 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, + 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, + 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, + 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, + 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, + 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, + 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, + 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, + 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, + 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, + 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, + 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, + 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, + 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, + 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, + 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, + 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, + 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, + 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, + 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, + 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, + 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, + 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, + 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, + 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, + 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, + 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, + 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, + 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, + 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, + 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, + 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, + 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, + 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, + 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, + 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, + 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, + 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, + 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, + 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, + 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, + 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, + 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, + 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, + 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, + 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, + 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, + 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, + 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, + 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, + 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, + 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, + 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, + 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, + 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, + 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, + 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, + 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, + 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, + 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, + 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, + 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, + 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, + 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, + 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, + 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, + 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, + 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, + 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, + 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, + 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, + 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, + 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, + 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, + 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, + 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, + 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, + 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, + 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, + 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, + 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, + 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, + 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, + 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, + 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, + 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, + 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, + 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, + 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, + 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, + 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, + 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, + 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, + 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, + 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, + 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, + 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, + 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, + 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, + 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, + 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, + 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, + 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, + 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, + 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, + 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, + 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, + 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, + 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, + 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, + 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, + 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, + 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, + 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, + 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, + 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, + 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, + 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, + 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, + 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, + 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, + 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, + 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, + 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, + 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, + 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, + 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, + 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, + 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, + 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, + 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, + 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, + 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, + 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, + 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, + 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, + 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, + 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, + 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, + 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, + 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, + 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, + 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, + 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, + 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, + 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, + 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, + 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, + 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, + 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, + 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, + 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, + 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, + 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, + 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, + 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, + 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, + 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, + 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, + 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, + 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, + 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, + 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, + 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, + 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, + 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, + 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, + 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, + 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, + 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, + 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, + 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, + 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, + 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, + 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, + 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, + 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, + 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, + 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, + 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, + 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, + 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, + 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, + 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, + 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, + 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, + 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, + 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, + 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, + 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, + 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, + 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, + 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, + 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, + 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, + 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, + 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, + 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, + 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, + 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, + 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, + 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, + 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, + 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, + 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, + 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, + 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, + 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, + 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, + 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, + 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, + 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, + 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, + 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, + 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, + 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, + 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, + 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, + 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, + 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, + 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, + 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, + 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, + 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, + 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, + 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, + 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, + 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, + 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, + 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, + 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, + 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, + 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, + 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, + 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, + 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, + 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, + 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, + 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, + 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, + 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, + 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, + 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, + 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, + 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, + 65519, 65521, 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581, + 65587, 65599, 65609, 65617, 65629, 65633, 65647, 65651, 65657, 65677, + 65687, 65699, 65701, 65707, 65713, 65717, 65719, 65729, 65731, 65761, + 65777, 65789, 65809, 65827, 65831, 65837, 65839, 65843, 65851, 65867, + 65881, 65899, 65921, 65927, 65929, 65951, 65957, 65963, 65981, 65983, + 65993, 66029, 66037, 66041, 66047, 66067, 66071, 66083, 66089, 66103, + 66107, 66109, 66137, 66161, 66169, 66173, 66179, 66191, 66221, 66239, + 66271, 66293, 66301, 66337, 66343, 66347, 66359, 66361, 66373, 66377, + 66383, 66403, 66413, 66431, 66449, 66457, 66463, 66467, 66491, 66499, + 66509, 66523, 66529, 66533, 66541, 66553, 66569, 66571, 66587, 66593, + 66601, 66617, 66629, 66643, 66653, 66683, 66697, 66701, 66713, 66721, + 66733, 66739, 66749, 66751, 66763, 66791, 66797, 66809, 66821, 66841, + 66851, 66853, 66863, 66877, 66883, 66889, 66919, 66923, 66931, 66943, + 66947, 66949, 66959, 66973, 66977, 67003, 67021, 67033, 67043, 67049, + 67057, 67061, 67073, 67079, 67103, 67121, 67129, 67139, 67141, 67153, + 67157, 67169, 67181, 67187, 67189, 67211, 67213, 67217, 67219, 67231, + 67247, 67261, 67271, 67273, 67289, 67307, 67339, 67343, 67349, 67369, + 67391, 67399, 67409, 67411, 67421, 67427, 67429, 67433, 67447, 67453, + 67477, 67481, 67489, 67493, 67499, 67511, 67523, 67531, 67537, 67547, + 67559, 67567, 67577, 67579, 67589, 67601, 67607, 67619, 67631, 67651, + 67679, 67699, 67709, 67723, 67733, 67741, 67751, 67757, 67759, 67763, + 67777, 67783, 67789, 67801, 67807, 67819, 67829, 67843, 67853, 67867, + 67883, 67891, 67901, 67927, 67931, 67933, 67939, 67943, 67957, 67961, + 67967, 67979, 67987, 67993, 68023, 68041, 68053, 68059, 68071, 68087, + 68099, 68111, 68113, 68141, 68147, 68161, 68171, 68207, 68209, 68213, + 68219, 68227, 68239, 68261, 68279, 68281, 68311, 68329, 68351, 68371, + 68389, 68399, 68437, 68443, 68447, 68449, 68473, 68477, 68483, 68489, + 68491, 68501, 68507, 68521, 68531, 68539, 68543, 68567, 68581, 68597, + 68611, 68633, 68639, 68659, 68669, 68683, 68687, 68699, 68711, 68713, + 68729, 68737, 68743, 68749, 68767, 68771, 68777, 68791, 68813, 68819, + 68821, 68863, 68879, 68881, 68891, 68897, 68899, 68903, 68909, 68917, + 68927, 68947, 68963, 68993, 69001, 69011, 69019, 69029, 69031, 69061, + 69067, 69073, 69109, 69119, 69127, 69143, 69149, 69151, 69163, 69191, + 69193, 69197, 69203, 69221, 69233, 69239, 69247, 69257, 69259, 69263, + 69313, 69317, 69337, 69341, 69371, 69379, 69383, 69389, 69401, 69403, + 69427, 69431, 69439, 69457, 69463, 69467, 69473, 69481, 69491, 69493, + 69497, 69499, 69539, 69557, 69593, 69623, 69653, 69661, 69677, 69691, + 69697, 69709, 69737, 69739, 69761, 69763, 69767, 69779, 69809, 69821, + 69827, 69829, 69833, 69847, 69857, 69859, 69877, 69899, 69911, 69929, + 69931, 69941, 69959, 69991, 69997, 70001, 70003, 70009, 70019, 70039, + 70051, 70061, 70067, 70079, 70099, 70111, 70117, 70121, 70123, 70139, + 70141, 70157, 70163, 70177, 70181, 70183, 70199, 70201, 70207, 70223, + 70229, 70237, 70241, 70249, 70271, 70289, 70297, 70309, 70313, 70321, + 70327, 70351, 70373, 70379, 70381, 70393, 70423, 70429, 70439, 70451, + 70457, 70459, 70481, 70487, 70489, 70501, 70507, 70529, 70537, 70549, + 70571, 70573, 70583, 70589, 70607, 70619, 70621, 70627, 70639, 70657, + 70663, 70667, 70687, 70709, 70717, 70729, 70753, 70769, 70783, 70793, + 70823, 70841, 70843, 70849, 70853, 70867, 70877, 70879, 70891, 70901, + 70913, 70919, 70921, 70937, 70949, 70951, 70957, 70969, 70979, 70981, + 70991, 70997, 70999, 71011, 71023, 71039, 71059, 71069, 71081, 71089, + 71119, 71129, 71143, 71147, 71153, 71161, 71167, 71171, 71191, 71209, + 71233, 71237, 71249, 71257, 71261, 71263, 71287, 71293, 71317, 71327, + 71329, 71333, 71339, 71341, 71347, 71353, 71359, 71363, 71387, 71389, + 71399, 71411, 71413, 71419, 71429, 71437, 71443, 71453, 71471, 71473, + 71479, 71483, 71503, 71527, 71537, 71549, 71551, 71563, 71569, 71593, + 71597, 71633, 71647, 71663, 71671, 71693, 71699, 71707, 71711, 71713, + 71719, 71741, 71761, 71777, 71789, 71807, 71809, 71821, 71837, 71843, + 71849, 71861, 71867, 71879, 71881, 71887, 71899, 71909, 71917, 71933, + 71941, 71947, 71963, 71971, 71983, 71987, 71993, 71999, 72019, 72031, + 72043, 72047, 72053, 72073, 72077, 72089, 72091, 72101, 72103, 72109, + 72139, 72161, 72167, 72169, 72173, 72211, 72221, 72223, 72227, 72229, + 72251, 72253, 72269, 72271, 72277, 72287, 72307, 72313, 72337, 72341, + 72353, 72367, 72379, 72383, 72421, 72431, 72461, 72467, 72469, 72481, + 72493, 72497, 72503, 72533, 72547, 72551, 72559, 72577, 72613, 72617, + 72623, 72643, 72647, 72649, 72661, 72671, 72673, 72679, 72689, 72701, + 72707, 72719, 72727, 72733, 72739, 72763, 72767, 72797, 72817, 72823, + 72859, 72869, 72871, 72883, 72889, 72893, 72901, 72907, 72911, 72923, + 72931, 72937, 72949, 72953, 72959, 72973, 72977, 72997, 73009, 73013, + 73019, 73037, 73039, 73043, 73061, 73063, 73079, 73091, 73121, 73127, + 73133, 73141, 73181, 73189, 73237, 73243, 73259, 73277, 73291, 73303, + 73309, 73327, 73331, 73351, 73361, 73363, 73369, 73379, 73387, 73417, + 73421, 73433, 73453, 73459, 73471, 73477, 73483, 73517, 73523, 73529, + 73547, 73553, 73561, 73571, 73583, 73589, 73597, 73607, 73609, 73613, + 73637, 73643, 73651, 73673, 73679, 73681, 73693, 73699, 73709, 73721, + 73727, 73751, 73757, 73771, 73783, 73819, 73823, 73847, 73849, 73859, + 73867, 73877, 73883, 73897, 73907, 73939, 73943, 73951, 73961, 73973, + 73999, 74017, 74021, 74027, 74047, 74051, 74071, 74077, 74093, 74099, + 74101, 74131, 74143, 74149, 74159, 74161, 74167, 74177, 74189, 74197, + 74201, 74203, 74209, 74219, 74231, 74257, 74279, 74287, 74293, 74297, + 74311, 74317, 74323, 74353, 74357, 74363, 74377, 74381, 74383, 74411, + 74413, 74419, 74441, 74449, 74453, 74471, 74489, 74507, 74509, 74521, + 74527, 74531, 74551, 74561, 74567, 74573, 74587, 74597, 74609, 74611, + 74623, 74653, 74687, 74699, 74707, 74713, 74717, 74719, 74729, 74731, + 74747, 74759, 74761, 74771, 74779, 74797, 74821, 74827, 74831, 74843, + 74857, 74861, 74869, 74873, 74887, 74891, 74897, 74903, 74923, 74929, + 74933, 74941, 74959, 75011, 75013, 75017, 75029, 75037, 75041, 75079, + 75083, 75109, 75133, 75149, 75161, 75167, 75169, 75181, 75193, 75209, + 75211, 75217, 75223, 75227, 75239, 75253, 75269, 75277, 75289, 75307, + 75323, 75329, 75337, 75347, 75353, 75367, 75377, 75389, 75391, 75401, + 75403, 75407, 75431, 75437, 75479, 75503, 75511, 75521, 75527, 75533, + 75539, 75541, 75553, 75557, 75571, 75577, 75583, 75611, 75617, 75619, + 75629, 75641, 75653, 75659, 75679, 75683, 75689, 75703, 75707, 75709, + 75721, 75731, 75743, 75767, 75773, 75781, 75787, 75793, 75797, 75821, + 75833, 75853, 75869, 75883, 75913, 75931, 75937, 75941, 75967, 75979, + 75983, 75989, 75991, 75997, 76001, 76003, 76031, 76039, 76079, 76081, + 76091, 76099, 76103, 76123, 76129, 76147, 76157, 76159, 76163, 76207, + 76213, 76231, 76243, 76249, 76253, 76259, 76261, 76283, 76289, 76303, + 76333, 76343, 76367, 76369, 76379, 76387, 76403, 76421, 76423, 76441, + 76463, 76471, 76481, 76487, 76493, 76507, 76511, 76519, 76537, 76541, + 76543, 76561, 76579, 76597, 76603, 76607, 76631, 76649, 76651, 76667, + 76673, 76679, 76697, 76717, 76733, 76753, 76757, 76771, 76777, 76781, + 76801, 76819, 76829, 76831, 76837, 76847, 76871, 76873, 76883, 76907, + 76913, 76919, 76943, 76949, 76961, 76963, 76991, 77003, 77017, 77023, + 77029, 77041, 77047, 77069, 77081, 77093, 77101, 77137, 77141, 77153, + 77167, 77171, 77191, 77201, 77213, 77237, 77239, 77243, 77249, 77261, + 77263, 77267, 77269, 77279, 77291, 77317, 77323, 77339, 77347, 77351, + 77359, 77369, 77377, 77383, 77417, 77419, 77431, 77447, 77471, 77477, + 77479, 77489, 77491, 77509, 77513, 77521, 77527, 77543, 77549, 77551, + 77557, 77563, 77569, 77573, 77587, 77591, 77611, 77617, 77621, 77641, + 77647, 77659, 77681, 77687, 77689, 77699, 77711, 77713, 77719, 77723, + 77731, 77743, 77747, 77761, 77773, 77783, 77797, 77801, 77813, 77839, + 77849, 77863, 77867, 77893, 77899, 77929, 77933, 77951, 77969, 77977, + 77983, 77999, 78007, 78017, 78031, 78041, 78049, 78059, 78079, 78101, + 78121, 78137, 78139, 78157, 78163, 78167, 78173, 78179, 78191, 78193, + 78203, 78229, 78233, 78241, 78259, 78277, 78283, 78301, 78307, 78311, + 78317, 78341, 78347, 78367, 78401, 78427, 78437, 78439, 78467, 78479, + 78487, 78497, 78509, 78511, 78517, 78539, 78541, 78553, 78569, 78571, + 78577, 78583, 78593, 78607, 78623, 78643, 78649, 78653, 78691, 78697, + 78707, 78713, 78721, 78737, 78779, 78781, 78787, 78791, 78797, 78803, + 78809, 78823, 78839, 78853, 78857, 78877, 78887, 78889, 78893, 78901, + 78919, 78929, 78941, 78977, 78979, 78989, 79031, 79039, 79043, 79063, + 79087, 79103, 79111, 79133, 79139, 79147, 79151, 79153, 79159, 79181, + 79187, 79193, 79201, 79229, 79231, 79241, 79259, 79273, 79279, 79283, + 79301, 79309, 79319, 79333, 79337, 79349, 79357, 79367, 79379, 79393, + 79397, 79399, 79411, 79423, 79427, 79433, 79451, 79481, 79493, 79531, + 79537, 79549, 79559, 79561, 79579, 79589, 79601, 79609, 79613, 79621, + 79627, 79631, 79633, 79657, 79669, 79687, 79691, 79693, 79697, 79699, + 79757, 79769, 79777, 79801, 79811, 79813, 79817, 79823, 79829, 79841, + 79843, 79847, 79861, 79867, 79873, 79889, 79901, 79903, 79907, 79939, + 79943, 79967, 79973, 79979, 79987, 79997, 79999, 80021, 80039, 80051, + 80071, 80077, 80107, 80111, 80141, 80147, 80149, 80153, 80167, 80173, + 80177, 80191, 80207, 80209, 80221, 80231, 80233, 80239, 80251, 80263, + 80273, 80279, 80287, 80309, 80317, 80329, 80341, 80347, 80363, 80369, + 80387, 80407, 80429, 80447, 80449, 80471, 80473, 80489, 80491, 80513, + 80527, 80537, 80557, 80567, 80599, 80603, 80611, 80621, 80627, 80629, + 80651, 80657, 80669, 80671, 80677, 80681, 80683, 80687, 80701, 80713, + 80737, 80747, 80749, 80761, 80777, 80779, 80783, 80789, 80803, 80809, + 80819, 80831, 80833, 80849, 80863, 80897, 80909, 80911, 80917, 80923, + 80929, 80933, 80953, 80963, 80989, 81001, 81013, 81017, 81019, 81023, + 81031, 81041, 81043, 81047, 81049, 81071, 81077, 81083, 81097, 81101, + 81119, 81131, 81157, 81163, 81173, 81181, 81197, 81199, 81203, 81223, + 81233, 81239, 81281, 81283, 81293, 81299, 81307, 81331, 81343, 81349, + 81353, 81359, 81371, 81373, 81401, 81409, 81421, 81439, 81457, 81463, + 81509, 81517, 81527, 81533, 81547, 81551, 81553, 81559, 81563, 81569, + 81611, 81619, 81629, 81637, 81647, 81649, 81667, 81671, 81677, 81689, + 81701, 81703, 81707, 81727, 81737, 81749, 81761, 81769, 81773, 81799, + 81817, 81839, 81847, 81853, 81869, 81883, 81899, 81901, 81919, 81929, + 81931, 81937, 81943, 81953, 81967, 81971, 81973, 82003, 82007, 82009, + 82013, 82021, 82031, 82037, 82039, 82051, 82067, 82073, 82129, 82139, + 82141, 82153, 82163, 82171, 82183, 82189, 82193, 82207, 82217, 82219, + 82223, 82231, 82237, 82241, 82261, 82267, 82279, 82301, 82307, 82339, + 82349, 82351, 82361, 82373, 82387, 82393, 82421, 82457, 82463, 82469, + 82471, 82483, 82487, 82493, 82499, 82507, 82529, 82531, 82549, 82559, + 82561, 82567, 82571, 82591, 82601, 82609, 82613, 82619, 82633, 82651, + 82657, 82699, 82721, 82723, 82727, 82729, 82757, 82759, 82763, 82781, + 82787, 82793, 82799, 82811, 82813, 82837, 82847, 82883, 82889, 82891, + 82903, 82913, 82939, 82963, 82981, 82997, 83003, 83009, 83023, 83047, + 83059, 83063, 83071, 83077, 83089, 83093, 83101, 83117, 83137, 83177, + 83203, 83207, 83219, 83221, 83227, 83231, 83233, 83243, 83257, 83267, + 83269, 83273, 83299, 83311, 83339, 83341, 83357, 83383, 83389, 83399, + 83401, 83407, 83417, 83423, 83431, 83437, 83443, 83449, 83459, 83471, + 83477, 83497, 83537, 83557, 83561, 83563, 83579, 83591, 83597, 83609, + 83617, 83621, 83639, 83641, 83653, 83663, 83689, 83701, 83717, 83719, + 83737, 83761, 83773, 83777, 83791, 83813, 83833, 83843, 83857, 83869, + 83873, 83891, 83903, 83911, 83921, 83933, 83939, 83969, 83983, 83987, + 84011, 84017, 84047, 84053, 84059, 84061, 84067, 84089, 84121, 84127, + 84131, 84137, 84143, 84163, 84179, 84181, 84191, 84199, 84211, 84221, + 84223, 84229, 84239, 84247, 84263, 84299, 84307, 84313, 84317, 84319, + 84347, 84349, 84377, 84389, 84391, 84401, 84407, 84421, 84431, 84437, + 84443, 84449, 84457, 84463, 84467, 84481, 84499, 84503, 84509, 84521, + 84523, 84533, 84551, 84559, 84589, 84629, 84631, 84649, 84653, 84659, + 84673, 84691, 84697, 84701, 84713, 84719, 84731, 84737, 84751, 84761, + 84787, 84793, 84809, 84811, 84827, 84857, 84859, 84869, 84871, 84913, + 84919, 84947, 84961, 84967, 84977, 84979, 84991, 85009, 85021, 85027, + 85037, 85049, 85061, 85081, 85087, 85091, 85093, 85103, 85109, 85121, + 85133, 85147, 85159, 85193, 85199, 85201, 85213, 85223, 85229, 85237, + 85243, 85247, 85259, 85297, 85303, 85313, 85331, 85333, 85361, 85363, + 85369, 85381, 85411, 85427, 85429, 85439, 85447, 85451, 85453, 85469, + 85487, 85513, 85517, 85523, 85531, 85549, 85571, 85577, 85597, 85601, + 85607, 85619, 85621, 85627, 85639, 85643, 85661, 85667, 85669, 85691, + 85703, 85711, 85717, 85733, 85751, 85781, 85793, 85817, 85819, 85829, + 85831, 85837, 85843, 85847, 85853, 85889, 85903, 85909, 85931, 85933, + 85991, 85999, 86011, 86017, 86027, 86029, 86069, 86077, 86083, 86111, + 86113, 86117, 86131, 86137, 86143, 86161, 86171, 86179, 86183, 86197, + 86201, 86209, 86239, 86243, 86249, 86257, 86263, 86269, 86287, 86291, + 86293, 86297, 86311, 86323, 86341, 86351, 86353, 86357, 86369, 86371, + 86381, 86389, 86399, 86413, 86423, 86441, 86453, 86461, 86467, 86477, + 86491, 86501, 86509, 86531, 86533, 86539, 86561, 86573, 86579, 86587, + 86599, 86627, 86629, 86677, 86689, 86693, 86711, 86719, 86729, 86743, + 86753, 86767, 86771, 86783, 86813, 86837, 86843, 86851, 86857, 86861, + 86869, 86923, 86927, 86929, 86939, 86951, 86959, 86969, 86981, 86993, + 87011, 87013, 87037, 87041, 87049, 87071, 87083, 87103, 87107, 87119, + 87121, 87133, 87149, 87151, 87179, 87181, 87187, 87211, 87221, 87223, + 87251, 87253, 87257, 87277, 87281, 87293, 87299, 87313, 87317, 87323, + 87337, 87359, 87383, 87403, 87407, 87421, 87427, 87433, 87443, 87473, + 87481, 87491, 87509, 87511, 87517, 87523, 87539, 87541, 87547, 87553, + 87557, 87559, 87583, 87587, 87589, 87613, 87623, 87629, 87631, 87641, + 87643, 87649, 87671, 87679, 87683, 87691, 87697, 87701, 87719, 87721, + 87739, 87743, 87751, 87767, 87793, 87797, 87803, 87811, 87833, 87853, + 87869, 87877, 87881, 87887, 87911, 87917, 87931, 87943, 87959, 87961, + 87973, 87977, 87991, 88001, 88003, 88007, 88019, 88037, 88069, 88079, + 88093, 88117, 88129, 88169, 88177, 88211, 88223, 88237, 88241, 88259, + 88261, 88289, 88301, 88321, 88327, 88337, 88339, 88379, 88397, 88411, + 88423, 88427, 88463, 88469, 88471, 88493, 88499, 88513, 88523, 88547, + 88589, 88591, 88607, 88609, 88643, 88651, 88657, 88661, 88663, 88667, + 88681, 88721, 88729, 88741, 88747, 88771, 88789, 88793, 88799, 88801, + 88807, 88811, 88813, 88817, 88819, 88843, 88853, 88861, 88867, 88873, + 88883, 88897, 88903, 88919, 88937, 88951, 88969, 88993, 88997, 89003, + 89009, 89017, 89021, 89041, 89051, 89057, 89069, 89071, 89083, 89087, + 89101, 89107, 89113, 89119, 89123, 89137, 89153, 89189, 89203, 89209, + 89213, 89227, 89231, 89237, 89261, 89269, 89273, 89293, 89303, 89317, + 89329, 89363, 89371, 89381, 89387, 89393, 89399, 89413, 89417, 89431, + 89443, 89449, 89459, 89477, 89491, 89501, 89513, 89519, 89521, 89527, + 89533, 89561, 89563, 89567, 89591, 89597, 89599, 89603, 89611, 89627, + 89633, 89653, 89657, 89659, 89669, 89671, 89681, 89689, 89753, 89759, + 89767, 89779, 89783, 89797, 89809, 89819, 89821, 89833, 89839, 89849, + 89867, 89891, 89897, 89899, 89909, 89917, 89923, 89939, 89959, 89963, + 89977, 89983, 89989, 90001, 90007, 90011, 90017, 90019, 90023, 90031, + 90053, 90059, 90067, 90071, 90073, 90089, 90107, 90121, 90127, 90149, + 90163, 90173, 90187, 90191, 90197, 90199, 90203, 90217, 90227, 90239, + 90247, 90263, 90271, 90281, 90289, 90313, 90353, 90359, 90371, 90373, + 90379, 90397, 90401, 90403, 90407, 90437, 90439, 90469, 90473, 90481, + 90499, 90511, 90523, 90527, 90529, 90533, 90547, 90583, 90599, 90617, + 90619, 90631, 90641, 90647, 90659, 90677, 90679, 90697, 90703, 90709, + 90731, 90749, 90787, 90793, 90803, 90821, 90823, 90833, 90841, 90847, + 90863, 90887, 90901, 90907, 90911, 90917, 90931, 90947, 90971, 90977, + 90989, 90997, 91009, 91019, 91033, 91079, 91081, 91097, 91099, 91121, + 91127, 91129, 91139, 91141, 91151, 91153, 91159, 91163, 91183, 91193, + 91199, 91229, 91237, 91243, 91249, 91253, 91283, 91291, 91297, 91303, + 91309, 91331, 91367, 91369, 91373, 91381, 91387, 91393, 91397, 91411, + 91423, 91433, 91453, 91457, 91459, 91463, 91493, 91499, 91513, 91529, + 91541, 91571, 91573, 91577, 91583, 91591, 91621, 91631, 91639, 91673, + 91691, 91703, 91711, 91733, 91753, 91757, 91771, 91781, 91801, 91807, + 91811, 91813, 91823, 91837, 91841, 91867, 91873, 91909, 91921, 91939, + 91943, 91951, 91957, 91961, 91967, 91969, 91997, 92003, 92009, 92033, + 92041, 92051, 92077, 92083, 92107, 92111, 92119, 92143, 92153, 92173, + 92177, 92179, 92189, 92203, 92219, 92221, 92227, 92233, 92237, 92243, + 92251, 92269, 92297, 92311, 92317, 92333, 92347, 92353, 92357, 92363, + 92369, 92377, 92381, 92383, 92387, 92399, 92401, 92413, 92419, 92431, + 92459, 92461, 92467, 92479, 92489, 92503, 92507, 92551, 92557, 92567, + 92569, 92581, 92593, 92623, 92627, 92639, 92641, 92647, 92657, 92669, + 92671, 92681, 92683, 92693, 92699, 92707, 92717, 92723, 92737, 92753, + 92761, 92767, 92779, 92789, 92791, 92801, 92809, 92821, 92831, 92849, + 92857, 92861, 92863, 92867, 92893, 92899, 92921, 92927, 92941, 92951, + 92957, 92959, 92987, 92993, 93001, 93047, 93053, 93059, 93077, 93083, + 93089, 93097, 93103, 93113, 93131, 93133, 93139, 93151, 93169, 93179, + 93187, 93199, 93229, 93239, 93241, 93251, 93253, 93257, 93263, 93281, + 93283, 93287, 93307, 93319, 93323, 93329, 93337, 93371, 93377, 93383, + 93407, 93419, 93427, 93463, 93479, 93481, 93487, 93491, 93493, 93497, + 93503, 93523, 93529, 93553, 93557, 93559, 93563, 93581, 93601, 93607, + 93629, 93637, 93683, 93701, 93703, 93719, 93739, 93761, 93763, 93787, + 93809, 93811, 93827, 93851, 93871, 93887, 93889, 93893, 93901, 93911, + 93913, 93923, 93937, 93941, 93949, 93967, 93971, 93979, 93983, 93997, + 94007, 94009, 94033, 94049, 94057, 94063, 94079, 94099, 94109, 94111, + 94117, 94121, 94151, 94153, 94169, 94201, 94207, 94219, 94229, 94253, + 94261, 94273, 94291, 94307, 94309, 94321, 94327, 94331, 94343, 94349, + 94351, 94379, 94397, 94399, 94421, 94427, 94433, 94439, 94441, 94447, + 94463, 94477, 94483, 94513, 94529, 94531, 94541, 94543, 94547, 94559, + 94561, 94573, 94583, 94597, 94603, 94613, 94621, 94649, 94651, 94687, + 94693, 94709, 94723, 94727, 94747, 94771, 94777, 94781, 94789, 94793, + 94811, 94819, 94823, 94837, 94841, 94847, 94849, 94873, 94889, 94903, + 94907, 94933, 94949, 94951, 94961, 94993, 94999, 95003, 95009, 95021, + 95027, 95063, 95071, 95083, 95087, 95089, 95093, 95101, 95107, 95111, + 95131, 95143, 95153, 95177, 95189, 95191, 95203, 95213, 95219, 95231, + 95233, 95239, 95257, 95261, 95267, 95273, 95279, 95287, 95311, 95317, + 95327, 95339, 95369, 95383, 95393, 95401, 95413, 95419, 95429, 95441, + 95443, 95461, 95467, 95471, 95479, 95483, 95507, 95527, 95531, 95539, + 95549, 95561, 95569, 95581, 95597, 95603, 95617, 95621, 95629, 95633, + 95651, 95701, 95707, 95713, 95717, 95723, 95731, 95737, 95747, 95773, + 95783, 95789, 95791, 95801, 95803, 95813, 95819, 95857, 95869, 95873, + 95881, 95891, 95911, 95917, 95923, 95929, 95947, 95957, 95959, 95971, + 95987, 95989, 96001, 96013, 96017, 96043, 96053, 96059, 96079, 96097, + 96137, 96149, 96157, 96167, 96179, 96181, 96199, 96211, 96221, 96223, + 96233, 96259, 96263, 96269, 96281, 96289, 96293, 96323, 96329, 96331, + 96337, 96353, 96377, 96401, 96419, 96431, 96443, 96451, 96457, 96461, + 96469, 96479, 96487, 96493, 96497, 96517, 96527, 96553, 96557, 96581, + 96587, 96589, 96601, 96643, 96661, 96667, 96671, 96697, 96703, 96731, + 96737, 96739, 96749, 96757, 96763, 96769, 96779, 96787, 96797, 96799, + 96821, 96823, 96827, 96847, 96851, 96857, 96893, 96907, 96911, 96931, + 96953, 96959, 96973, 96979, 96989, 96997, 97001, 97003, 97007, 97021, + 97039, 97073, 97081, 97103, 97117, 97127, 97151, 97157, 97159, 97169, + 97171, 97177, 97187, 97213, 97231, 97241, 97259, 97283, 97301, 97303, + 97327, 97367, 97369, 97373, 97379, 97381, 97387, 97397, 97423, 97429, + 97441, 97453, 97459, 97463, 97499, 97501, 97511, 97523, 97547, 97549, + 97553, 97561, 97571, 97577, 97579, 97583, 97607, 97609, 97613, 97649, + 97651, 97673, 97687, 97711, 97729, 97771, 97777, 97787, 97789, 97813, + 97829, 97841, 97843, 97847, 97849, 97859, 97861, 97871, 97879, 97883, + 97919, 97927, 97931, 97943, 97961, 97967, 97973, 97987, 98009, 98011, + 98017, 98041, 98047, 98057, 98081, 98101, 98123, 98129, 98143, 98179, + 98207, 98213, 98221, 98227, 98251, 98257, 98269, 98297, 98299, 98317, + 98321, 98323, 98327, 98347, 98369, 98377, 98387, 98389, 98407, 98411, + 98419, 98429, 98443, 98453, 98459, 98467, 98473, 98479, 98491, 98507, + 98519, 98533, 98543, 98561, 98563, 98573, 98597, 98621, 98627, 98639, + 98641, 98663, 98669, 98689, 98711, 98713, 98717, 98729, 98731, 98737, + 98773, 98779, 98801, 98807, 98809, 98837, 98849, 98867, 98869, 98873, + 98887, 98893, 98897, 98899, 98909, 98911, 98927, 98929, 98939, 98947, + 98953, 98963, 98981, 98993, 98999, 99013, 99017, 99023, 99041, 99053, + 99079, 99083, 99089, 99103, 99109, 99119, 99131, 99133, 99137, 99139, + 99149, 99173, 99181, 99191, 99223, 99233, 99241, 99251, 99257, 99259, + 99277, 99289, 99317, 99347, 99349, 99367, 99371, 99377, 99391, 99397, + 99401, 99409, 99431, 99439, 99469, 99487, 99497, 99523, 99527, 99529, + 99551, 99559, 99563, 99571, 99577, 99581, 99607, 99611, 99623, 99643, + 99661, 99667, 99679, 99689, 99707, 99709, 99713, 99719, 99721, 99733, + 99761, 99767, 99787, 99793, 99809, 99817, 99823, 99829, 99833, 99839, + 99859, 99871, 99877, 99881, 99901, 99907, 99923, 99929, 99961, 99971, + 99989, 99991, 100003, 100019, 100043, 100049, 100057, 100069, 100103, 100109, +100129, 100151, 100153, 100169, 100183, 100189, 100193, 100207, 100213, 100237, +100267, 100271, 100279, 100291, 100297, 100313, 100333, 100343, 100357, 100361, +100363, 100379, 100391, 100393, 100403, 100411, 100417, 100447, 100459, 100469, +100483, 100493, 100501, 100511, 100517, 100519, 100523, 100537, 100547, 100549, +100559, 100591, 100609, 100613, 100621, 100649, 100669, 100673, 100693, 100699, +100703, 100733, 100741, 100747, 100769, 100787, 100799, 100801, 100811, 100823, +100829, 100847, 100853, 100907, 100913, 100927, 100931, 100937, 100943, 100957, +100981, 100987, 100999, 101009, 101021, 101027, 101051, 101063, 101081, 101089, +101107, 101111, 101113, 101117, 101119, 101141, 101149, 101159, 101161, 101173, +101183, 101197, 101203, 101207, 101209, 101221, 101267, 101273, 101279, 101281, +101287, 101293, 101323, 101333, 101341, 101347, 101359, 101363, 101377, 101383, +101399, 101411, 101419, 101429, 101449, 101467, 101477, 101483, 101489, 101501, +101503, 101513, 101527, 101531, 101533, 101537, 101561, 101573, 101581, 101599, +101603, 101611, 101627, 101641, 101653, 101663, 101681, 101693, 101701, 101719, +101723, 101737, 101741, 101747, 101749, 101771, 101789, 101797, 101807, 101833, +101837, 101839, 101863, 101869, 101873, 101879, 101891, 101917, 101921, 101929, +101939, 101957, 101963, 101977, 101987, 101999, 102001, 102013, 102019, 102023, +102031, 102043, 102059, 102061, 102071, 102077, 102079, 102101, 102103, 102107, +102121, 102139, 102149, 102161, 102181, 102191, 102197, 102199, 102203, 102217, +102229, 102233, 102241, 102251, 102253, 102259, 102293, 102299, 102301, 102317, +102329, 102337, 102359, 102367, 102397, 102407, 102409, 102433, 102437, 102451, +102461, 102481, 102497, 102499, 102503, 102523, 102533, 102539, 102547, 102551, +102559, 102563, 102587, 102593, 102607, 102611, 102643, 102647, 102653, 102667, +102673, 102677, 102679, 102701, 102761, 102763, 102769, 102793, 102797, 102811, +102829, 102841, 102859, 102871, 102877, 102881, 102911, 102913, 102929, 102931, +102953, 102967, 102983, 103001, 103007, 103043, 103049, 103067, 103069, 103079, +103087, 103091, 103093, 103099, 103123, 103141, 103171, 103177, 103183, 103217, +103231, 103237, 103289, 103291, 103307, 103319, 103333, 103349, 103357, 103387, +103391, 103393, 103399, 103409, 103421, 103423, 103451, 103457, 103471, 103483, +103511, 103529, 103549, 103553, 103561, 103567, 103573, 103577, 103583, 103591, +103613, 103619, 103643, 103651, 103657, 103669, 103681, 103687, 103699, 103703, +103723, 103769, 103787, 103801, 103811, 103813, 103837, 103841, 103843, 103867, +103889, 103903, 103913, 103919, 103951, 103963, 103967, 103969, 103979, 103981, +103991, 103993, 103997, 104003, 104009, 104021, 104033, 104047, 104053, 104059, +104087, 104089, 104107, 104113, 104119, 104123, 104147, 104149, 104161, 104173, +104179, 104183, 104207, 104231, 104233, 104239, 104243, 104281, 104287, 104297, +104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383, 104393, 104399, +104417, 104459, 104471, 104473, 104479, 104491, 104513, 104527, 104537, 104543, +104549, 104551, 104561, 104579, 104593, 104597, 104623, 104639, 104651, 104659, +104677, 104681, 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729, +) diff --git a/server/www/packages/packages-linux/x64/Crypto/Util/py3compat.py b/server/www/packages/packages-linux/x64/Crypto/Util/py3compat.py new file mode 100644 index 0000000..0a0e2d5 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Util/py3compat.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# +# Util/py3compat.py : Compatibility code for handling Py3k / Python 2.x +# +# Written in 2010 by Thorsten Behrens +# +# =================================================================== +# The contents of this file are dedicated to the public domain. To +# the extent that dedication to the public domain is not available, +# everyone is granted a worldwide, perpetual, royalty-free, +# non-exclusive license to exercise all rights associated with the +# contents of this file for any purpose whatsoever. +# No rights are reserved. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# =================================================================== + +"""Compatibility code for handling string/bytes changes from Python 2.x to Py3k + +In Python 2.x, strings (of type ''str'') contain binary data, including encoded +Unicode text (e.g. UTF-8). The separate type ''unicode'' holds Unicode text. +Unicode literals are specified via the u'...' prefix. Indexing or slicing +either type always produces a string of the same type as the original. +Data read from a file is always of '''str'' type. + +In Python 3.x, strings (type ''str'') may only contain Unicode text. The u'...' +prefix and the ''unicode'' type are now redundant. A new type (called +''bytes'') has to be used for binary data (including any particular +''encoding'' of a string). The b'...' prefix allows one to specify a binary +literal. Indexing or slicing a string produces another string. Slicing a byte +string produces another byte string, but the indexing operation produces an +integer. Data read from a file is of '''str'' type if the file was opened in +text mode, or of ''bytes'' type otherwise. + +Since PyCrypto aims at supporting both Python 2.x and 3.x, the following helper +functions are used to keep the rest of the library as independent as possible +from the actual Python version. + +In general, the code should always deal with binary strings, and use integers +instead of 1-byte character strings. + +b(s) + Take a text string literal (with no prefix or with u'...' prefix) and + make a byte string. +bchr(c) + Take an integer and make a 1-character byte string. +bord(c) + Take the result of indexing on a byte string and make an integer. +tobytes(s) + Take a text string, a byte string, or a sequence of character taken from + a byte string and make a byte string. +""" + +import sys +import abc + + +if sys.version_info[0] == 2: + def b(s): + return s + def bchr(s): + return chr(s) + def bstr(s): + return str(s) + def bord(s): + return ord(s) + def tobytes(s, encoding="latin-1"): + if isinstance(s, unicode): + return s.encode(encoding) + elif isinstance(s, str): + return s + elif isinstance(s, bytearray): + return bytes(s) + elif isinstance(s, memoryview): + return s[start:end].tobytes() + else: + return ''.join(s) + def tostr(bs): + return bs + def byte_string(s): + return isinstance(s, str) + + from StringIO import StringIO + BytesIO = StringIO + + from sys import maxint + + iter_range = xrange + + def is_native_int(x): + return isinstance(x, (int, long)) + + def is_string(x): + return isinstance(x, basestring) + + def is_bytes(x): + return isinstance(x, basestring) or \ + isinstance(x, bytearray) or \ + isinstance(x, memoryview) + + ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()}) + + FileNotFoundError = IOError + +else: + def b(s): + return s.encode("latin-1") # utf-8 would cause some side-effects we don't want + def bchr(s): + return bytes([s]) + def bstr(s): + if isinstance(s,str): + return bytes(s,"latin-1") + else: + return bytes(s) + def bord(s): + return s + def tobytes(s, encoding="latin-1"): + if isinstance(s, bytes): + return s + elif isinstance(s, bytearray): + return bytes(s) + elif isinstance(s,str): + return s.encode(encoding) + elif isinstance(s, memoryview): + return s[start:end].tobytes() + else: + return bytes([s]) + def tostr(bs): + return bs.decode("latin-1") + def byte_string(s): + return isinstance(s, bytes) + + from io import BytesIO + from io import StringIO + from sys import maxsize as maxint + + iter_range = range + + def is_native_int(x): + return isinstance(x, int) + + def is_string(x): + return isinstance(x, str) + + def is_bytes(x): + return isinstance(x, bytes) or \ + isinstance(x, bytearray) or \ + isinstance(x, memoryview) + + from abc import ABC + + FileNotFoundError = FileNotFoundError + + +def _copy_bytes(start, end, seq): + """Return an immutable copy of a sequence (byte string, byte array, memoryview) + in a certain interval [start:seq]""" + + if isinstance(seq, memoryview): + return seq[start:end].tobytes() + elif isinstance(seq, bytearray): + return bytes(seq[start:end]) + else: + return seq[start:end] + +del sys +del abc diff --git a/server/www/packages/packages-linux/x64/Crypto/Util/strxor.py b/server/www/packages/packages-linux/x64/Crypto/Util/strxor.py new file mode 100644 index 0000000..2bff250 --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/Util/strxor.py @@ -0,0 +1,137 @@ +# =================================================================== +# +# 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 Crypto.Util._raw_api import (load_pycryptodome_raw_lib, c_size_t, + create_string_buffer, get_raw_buffer, + c_uint8_ptr, is_writeable_buffer) + +_raw_strxor = load_pycryptodome_raw_lib("Crypto.Util._strxor", + """ + void strxor(const uint8_t *in1, + const uint8_t *in2, + uint8_t *out, size_t len); + void strxor_c(const uint8_t *in, + uint8_t c, + uint8_t *out, + size_t len); + """) + + +def strxor(term1, term2, output=None): + """XOR two byte strings. + + Args: + term1 (bytes/bytearray/memoryview): + The first term of the XOR operation. + term2 (bytes/bytearray/memoryview): + The second term of the XOR operation. + output (bytearray/memoryview): + The location where the result must be written to. + If ``None``, the result is returned. + :Return: + If ``output`` is ``None``, a new ``bytes`` string with the result. + Otherwise ``None``. + """ + + if len(term1) != len(term2): + raise ValueError("Only byte strings of equal length can be xored") + + if output is None: + result = create_string_buffer(len(term1)) + else: + # Note: output may overlap with either input + result = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(term1) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(term1)) + + _raw_strxor.strxor(c_uint8_ptr(term1), + c_uint8_ptr(term2), + c_uint8_ptr(result), + c_size_t(len(term1))) + + if output is None: + return get_raw_buffer(result) + else: + return None + + +def strxor_c(term, c, output=None): + """XOR a byte string with a repeated sequence of characters. + + Args: + term(bytes/bytearray/memoryview): + The first term of the XOR operation. + c (bytes): + The byte that makes up the second term of the XOR operation. + output (None or bytearray/memoryview): + If not ``None``, the location where the result is stored into. + + Return: + If ``output`` is ``None``, a new ``bytes`` string with the result. + Otherwise ``None``. + """ + + if not 0 <= c < 256: + raise ValueError("c must be in range(256)") + + if output is None: + result = create_string_buffer(len(term)) + else: + # Note: output may overlap with either input + result = output + + if not is_writeable_buffer(output): + raise TypeError("output must be a bytearray or a writeable memoryview") + + if len(term) != len(output): + raise ValueError("output must have the same length as the input" + " (%d bytes)" % len(term)) + + _raw_strxor.strxor_c(c_uint8_ptr(term), + c, + c_uint8_ptr(result), + c_size_t(len(term)) + ) + + if output is None: + return get_raw_buffer(result) + else: + return None + + +def _strxor_direct(term1, term2, result): + """Very fast XOR - check conditions!""" + _raw_strxor.strxor(term1, term2, result, c_size_t(len(term1))) + diff --git a/server/www/packages/packages-linux/x64/Crypto/__init__.py b/server/www/packages/packages-linux/x64/Crypto/__init__.py new file mode 100644 index 0000000..faa4a3d --- /dev/null +++ b/server/www/packages/packages-linux/x64/Crypto/__init__.py @@ -0,0 +1,6 @@ +__all__ = ['Cipher', 'Hash', 'Protocol', 'PublicKey', 'Util', 'Signature', + 'IO', 'Math'] + +version_info = (3, 10, '4') + +__version__ = ".".join([str(x) for x in version_info]) diff --git a/server/www/packages/packages-linux/x64/Crypto/py.typed b/server/www/packages/packages-linux/x64/Crypto/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/server/www/teleport/webroot/app/base/controller.py b/server/www/teleport/webroot/app/base/controller.py index 6ac1f4a..7c71773 100644 --- a/server/www/teleport/webroot/app/base/controller.py +++ b/server/www/teleport/webroot/app/base/controller.py @@ -31,9 +31,18 @@ class TPBaseHandler(tornado.web.RequestHandler): self._user = None def initialize(self): + self.set_header('Access-Control-Allow-Origin', '*') + # self.set_header('Access-Control-Allow-Headers', 'X-Requested-With') + self.set_header('Access-Control-Allow-Headers', '*') + self.set_header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS') + # self.set_header('Content-Type', 'application/json; charset=UTF-8') + # self.set_header('Access-Control-Allow-Headers', 'Content-Type') template_path = self.get_template_path() self.lookup = mako.lookup.TemplateLookup(directories=[template_path], input_encoding='utf-8', output_encoding='utf-8') + def options(self, *args, **kwargs): + pass + def render_string(self, template_name, **kwargs): template = self.lookup.get_template(template_name) namespace = self.get_template_namespace() @@ -64,7 +73,8 @@ class TPBaseHandler(tornado.web.RequestHandler): _ret = {'code': code, 'message': message, 'data': data} - self.set_header("Content-Type", "application/json") + # self.set_header("Content-Type", "application/json") + self.set_header('Content-Type', 'application/json; charset=UTF-8') self.write(json_encode(_ret)) self.finish() @@ -77,7 +87,8 @@ class TPBaseHandler(tornado.web.RequestHandler): if data is None: data = list() - self.set_header("Content-Type", "application/json") + # self.set_header("Content-Type", "application/json") + self.set_header('Content-Type', 'application/json; charset=UTF-8') self.write(json_encode(data)) self.finish() diff --git a/server/www/teleport/webroot/app/base/db.py b/server/www/teleport/webroot/app/base/db.py index 812c6b9..83c99d0 100644 --- a/server/www/teleport/webroot/app/base/db.py +++ b/server/www/teleport/webroot/app/base/db.py @@ -784,7 +784,7 @@ class SQL: for k in _o: if k in self._output_fields: - print('---', k, '---', self._output_fields) + # print('---', k, '---', self._output_fields) raise RuntimeError('duplicated output field: {}'.format(k)) self._select_fields.extend(['{}.{}'.format(_j['a'], k) for k in fields]) diff --git a/server/www/teleport/webroot/app/base/webapp.py b/server/www/teleport/webroot/app/base/webapp.py index a66f213..c3e2baf 100644 --- a/server/www/teleport/webroot/app/base/webapp.py +++ b/server/www/teleport/webroot/app/base/webapp.py @@ -141,7 +141,7 @@ class WebApp: body = rep.read().decode() x = json.loads(body) if 'code' not in x or x['code'] != 0: - print(x) + # print(x) log.e('connect core-server for set runtime-config failed.\n') else: log.d('set runtime-config for core-server succeeded.\n') diff --git a/server/www/teleport/webroot/app/controller/__init__.py b/server/www/teleport/webroot/app/controller/__init__.py index a980181..b7e9f4f 100755 --- a/server/www/teleport/webroot/app/controller/__init__.py +++ b/server/www/teleport/webroot/app/controller/__init__.py @@ -15,6 +15,7 @@ from . import system from . import user from . import ws from . import api_v1 +from . import api_v2 __all__ = ['controllers', 'fix_controller'] @@ -291,6 +292,9 @@ controllers = [ (r'/api/v1/get_host', api_v1.GetHostHandler), (r'/api/v1/request_session', api_v1.RequestSessionHandler), + # api v2 + (r'/api/v2/request_session', api_v2.RequestSessionHandler), + (r'/.*', index.CatchAllHandler), ] diff --git a/server/www/teleport/webroot/app/controller/api_v2.py b/server/www/teleport/webroot/app/controller/api_v2.py new file mode 100644 index 0000000..7d91d2b --- /dev/null +++ b/server/www/teleport/webroot/app/controller/api_v2.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- + +import hmac +import base64 +import hashlib +import json +from Crypto.Cipher import AES + +import tornado.gen +from app.const import * +from app.model import host +from app.base.logger import * +from app.base.controller import TPBaseJsonHandler +from app.base.utils import tp_bin, tp_str, tp_timestamp_sec +from app.base.extsrv import tp_ext_srv_cfg +from .ops import api_v2_request_session_id + + +def pkcs7unpadding(data): + length = len(data) + pad_len = ord(data[length - 1]) + for i in range(pad_len): + if ord(data[length - 1 - i]) != pad_len: + return False, None + return True, data[0:length - pad_len] + + +@tornado.gen.coroutine +def _parse_api_args(handler): + raw_req = handler.request.body.decode('utf-8') + if raw_req == '': + return False, handler.write_json(TPE_PARAM) + + try: + raw_req = json.loads(raw_req) + + if 'auth' not in raw_req or 'arg' not in raw_req or 'sign' not in raw_req: + return False, handler.write_json(TPE_PARAM) + except: + return False, handler.write_json(TPE_JSON_FORMAT) + + _auth = raw_req['auth'].split(':') + if len(_auth) <= 1: + return False, handler.write_json(TPE_PARAM) + + if _auth[0] == '2': # 目前的API请求格式版本为1 + if len(_auth) != 4: # VERSION:ACCESS_KEY:TIMESTAMP:EXPIRES + return False, handler.write_json(TPE_PARAM) + req_access_key = _auth[1] + req_timestamp = int(_auth[2]) + req_expires = int(_auth[3]) + else: + return False, handler.write_json(TPE_PARAM) + + # 从数据库中根据access-key查找access-secret + sec_info = tp_ext_srv_cfg().get_secret_info(req_access_key) + if sec_info is None: + return False, handler.write_json(TPE_INVALID_API_KEY) + access_secret = sec_info['secret'] + + # 是否超时 + # if tp_timestamp_sec() > req_timestamp + req_expires: + # return False, handler.write_json(TPE_EXPIRED) + + # 验证 + be_sign = '{}|{}'.format(raw_req['auth'], raw_req['arg']) + _h = hmac.new(tp_bin(access_secret), tp_bin(be_sign), hashlib.sha1) + _s = base64.urlsafe_b64decode(tp_bin(raw_req['sign'])) + if _s != _h.digest(): + return False, handler.write_json(TPE_INVALID_API_SIGN) + + enc_data = base64.urlsafe_b64decode(tp_bin(raw_req['arg'])) + + # 解密 + hash_sha1 = hashlib.sha1() + hash_sha1.update(tp_bin(raw_req['auth'])) + iv = hash_sha1.digest()[:16] + hash_sha1 = hashlib.sha1() + hash_sha1.update(tp_bin(access_secret)) + key = hash_sha1.digest()[:16] + cipher = AES.new(key, AES.MODE_CBC, iv) + dec_data = cipher.decrypt(enc_data) + ok, dec_arg = pkcs7unpadding(tp_str(dec_data)) + if not ok: + return False, handler.write_json(TPE_INVALID_API_SIGN) + + # 一切都OK,解码得到实际参数 + # _param = base64.urlsafe_b64decode(tp_bin(dec_arg)) + try: + # args = json.loads(tp_str(_param)) + args = json.loads(dec_arg) + except: + return False, handler.write_json(TPE_JSON_FORMAT) + + args['_srv_name_'] = sec_info['name'] + + return True, args + + +class RequestSessionHandler(TPBaseJsonHandler): + + @tornado.gen.coroutine + def post(self): + ok, args = yield _parse_api_args(self) + if not ok: + return + + try: + operator = args['operator'] + remote_ip = args['remote_ip'] + remote_port = args['remote_port'] + remote_auth_type = args['remote_auth_type'] + remote_user = args['remote_user'] + remote_secret = args['remote_secret'] + protocol_type = args['protocol_type'] + protocol_sub_type = args['protocol_sub_type'] + except: + return self.write_json(TPE_PARAM) + + operator = '[{}] {}'.format(args['_srv_name_'], operator) + + ret = yield api_v2_request_session_id( + remote_ip, remote_port, remote_auth_type, remote_user, remote_secret, + protocol_type, protocol_sub_type, self.request.remote_ip, operator + ) + + if ret['code'] != TPE_OK: + return self.write_json(ret['code'], ret['message']) + + return self.write_json(TPE_OK, data=ret['data']) diff --git a/server/www/teleport/webroot/app/controller/ops.py b/server/www/teleport/webroot/app/controller/ops.py index 045cf8a..369b293 100644 --- a/server/www/teleport/webroot/app/controller/ops.py +++ b/server/www/teleport/webroot/app/controller/ops.py @@ -5,6 +5,7 @@ import threading import time import tornado.httpclient +import tornado.gen from app.base.logger import log from app.base.configs import tp_cfg from app.base.controller import TPBaseHandler, TPBaseJsonHandler @@ -194,6 +195,85 @@ def api_request_session_id(acc_id, protocol_sub_type, client_ip, operator): return ret +@tornado.gen.coroutine +def api_v2_request_session_id( + remote_ip, remote_port, remote_auth_type, remote_user, remote_secret, + protocol_type, protocol_sub_type, client_ip, operator): + ret = { + 'code': TPE_OK, + 'message': '', + 'data': {} + } + + # 直接连接(无需授权,第三方服务操作,已经经过授权检查了) + conn_info = dict() + conn_info['_enc'] = 0 + conn_info['host_id'] = 1 + conn_info['client_ip'] = client_ip + conn_info['user_id'] = 1 + conn_info['user_username'] = operator + + conn_info['host_ip'] = remote_ip + conn_info['conn_ip'] = remote_ip + conn_info['conn_port'] = remote_port + + conn_info['acc_id'] = 0 + conn_info['acc_username'] = remote_user + conn_info['username_prompt'] = '' + conn_info['password_prompt'] = '' + conn_info['protocol_flag'] = TP_FLAG_ALL + conn_info['record_flag'] = TP_FLAG_ALL + + conn_info['protocol_type'] = protocol_type + conn_info['protocol_sub_type'] = protocol_sub_type + + conn_info['auth_type'] = remote_auth_type + conn_info['acc_secret'] = remote_secret + + with tmp_conn_id_lock: + global tmp_conn_id_base + tmp_conn_id_base += 1 + conn_id = tmp_conn_id_base + + # log.v('CONN-INFO:', conn_info) + tp_session().set('tmp-conn-info-{}'.format(conn_id), conn_info, 10) + + req = {'method': 'request_session', 'param': {'conn_id': conn_id}} + _yr = core_service_async_post_http(req) + _code, ret_data = yield _yr + if _code != TPE_OK: + ret['code'] = _code + ret['message'] = '无法连接到核心服务' + return ret + if ret_data is None: + ret['code'] = TPE_FAILED + ret['message'] = '调用核心服务获取会话ID失败' + return ret + + if 'sid' not in ret_data: + ret['code'] = TPE_FAILED + ret['message'] = '核心服务获取会话ID时返回错误数据' + return ret + + data = dict() + data['session_id'] = ret_data['sid'] + data['host_ip'] = remote_ip + data['host_name'] = '' + data['protocol_flag'] = TP_FLAG_ALL + + if conn_info['protocol_type'] == TP_PROTOCOL_TYPE_RDP: + data['teleport_port'] = tp_cfg().core.rdp.port + elif conn_info['protocol_type'] == TP_PROTOCOL_TYPE_SSH: + data['teleport_port'] = tp_cfg().core.ssh.port + elif conn_info['protocol_type'] == TP_PROTOCOL_TYPE_TELNET: + data['teleport_port'] = tp_cfg().core.telnet.port + + ret['code'] = TPE_OK + ret['message'] = '' + ret['data'] = data + return ret + + class DoGetSessionIDHandler(TPBaseJsonHandler): @tornado.gen.coroutine def post(self):

    jH(EaTh(hxmqK_b}y4#6{psA|J=T* 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 ?gFS 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